Universidad de Alcalá Departamento de Automática I. T. Informática de Sistemas Laboratorio de Microprocesadores El microprocesador de 8 bits M6800 INTRODUCCIÓN El microprocesador M6800, fabricado en 1974 por Motorola, fue uno de los primeros microprocesadores comerciales y ampliamente utilizado. De él se derivan muchos otros microprocesadores, como la familia 65XX. MODELO DE PROGRAMACIÓN 7 0 ACCA 7 0 A c um ul ad or A ACCB 15 0 A c um ul ad or B X 15 0 R e gi st ro í nd ic e PC 15 0 C o nt ad or d e pr og ra ma SP P u nt er o de p il a 7 6 5 4 3 2 1 0 CCR 1 1 H I N Z V C R e gi st ro d e es ta do CARACTERÍSTICAS DEL M6800 Alimentación única de +5 V. Bus de datos bidireccional de 8 bits. Bus de direcciones de 16 bits. Dos entradas de reloj desfasadas 180º. Línea de salida R/W para indicar lectura/escritura en memoria. Dos terminales de interrupción: /IRQ (Enmascarable) y /NMI (No enmascarable). Terminal /RESET que inicializa el sistema y da paso a una rutina específica. Terminal /HALT que provoca la parada del procesador, con todos los buses en estado de alta impedancia. Terminal de salida BA (Bus available) que indica que la CPU se encuentra en un estado HALT o en estado WAIT que se produce al ejecutar la instrucción WAIT que suspende la actividad de la CPU hasta la llegada de una interrupción. Terminal de entrada DBE (Data Bus Enable) que permite controlar el estado de alta impedancia del bus de datos. Terminal de entrada TSC (Tri-State Control) que permite controlar el estado de alta impedancia del bus de direcciones y de la línea R/W. Terminal de salida VMA (Valid Memory Address) que valida la dirección presente en el bus de direcciones. M6800 Página 1 Universidad de Alcalá Departamento de Automática I. T. Informática de Sistemas Laboratorio de Microprocesadores BITS SIGNIFICATIVOS EN EL REGISTRO DE ESTADO (CCR) C V Z N I H (carry) es el indicador de acarreo. (overflow) es el indicador de desbordamiento. (zero) es el indicador de cero (resultado nulo). (negative) es el indicador de resultado negativo. (interruption) es el bit de máscara de interrupción. (half carry) es el indicador de acarreo del bit 3 al bit 4. MODOS DE DIRECCIONAMIENTO IMPLÍCITO o INHERENTE: El código de operación indica implícitamente la localización de los datos: ABA Sumar acumuladores INMEDIATO: El operando está contenido en la propia instrucción (2º byte de la instrucción): ADDA #71 DIRECTO o ABSOLUTO: La instrucción incluye un byte con la dirección de memoria en página cero que contiene el operando: LDAB 10 Resta al acumulador B el contenido de la posición de memoria cuya dirección es 1000. INDEXADO: La dirección efectiva se obtiene sumando el contenido del registro índice X con el operando que se incluye en la instrucción en el byte siguiente al del código de operación, sin modificar el contenido del registro índice: ADDA 10,X Carga el acumulador B con el contenido de la posición de memoria cuya dirección es 10 (en página 0). EXTENDIDO: Los dos bytes que siguen al del código de operación representan la dirección de memoria que contiene el operando: SUBB 1000 Sumar al acumulador el número 71. Suma al acumulador A el dato cuya dirección de memoria se obtiene sumando 10 al contenido del registro X. RELATIVO: El operando de la instrucción es un offset (de un byte y expresado en complemento a 2), que se suma al contenido actualizado del contador de programa (PC), para obtener la dirección de la próxima instrucción a ejecutar. Solo se utiliza en las instrucciones de salto condicional. INTERRUPCIONES La línea /NMI provoca una interrupción no enmascarable (siempre será atendida) cuyo vector de interrupción se encuentra en las posiciones FFFCh y FFFDh. M6800 Página 2 Universidad de Alcalá Departamento de Automática I. T. Informática de Sistemas Laboratorio de Microprocesadores La línea /IRQ provoca una petición de interrupción que será atendida si el bit I del registro de estado (CCR) está a 1. El vector de interrupción se encuentra en FFF8h y FFF9h. La instrucción SWI permite también la interrupción por software; su vector de interrupción se encuentra en las posiciones FFFAh y FFFBh. Al activarse el terminal de RESET todos los registros, contadores y flags se ponen a cero y en el contador de programa se carga el vector contenido en las posiciones FFFEh y FFFFh. Cuando se produce una interrupción y esta es atendida, se completa la ejecución de la instrucción en curso, se guardan todos los registros en la pila (por orden: PC, X, ACCA, ACCB y CCR) y se coloca en el contador de programa el vector correspondiente a esa interrupción. EJEMPLOS DE PROGRAMAS PARA EL M6800 Programa que carga en la memoria del simulador, a partir de la dirección 0000h un programa que suma sin signo los contenidos de las direcciones 00A0h y 00A1h y guarda el resultado en las posiciones 00B0h y 00B1h, con el orden que el M6800 guarda los datos en memoria (bytes de mayor peso en las direcciones más bajas). 0000 0001 0003 0005 0007 0009 000B 0000 INICIO: CLRB LDAA ADDA ADCB STAA STAB FIN: NOP END 0A0h 0A1h #0 0B1h 0B0h ;Pone B a 0 ;Carga el primer operando ;Realiza la suma sin acarreo ;Pone el acarreo en B ;Guarda el byte de menor peso ;Guarda el byte de mayor peso Programa que inicializa a FFh las posiciones de memoria comprendidas entre la 0080h y 008Fh. 0000 0003 0005 0007 0008 000B 000D 0000 5F 96A0 9BA1 C900 97B1 D7B0 01 CE0080 86FF A700 08 8C0090 26F8 01 INICIO: LDX #0080h LDAA #0FFh BUCLE: STAA 0,X INX CPX #0090h BNE BUCLE FIN: NOP END ;X Apunta a la primera posición ;En A el dato a almacenar ;Guarda A en la posición (0h+X) ;Incrementa el contenido de X ;¿Terminó? Programa que inicializa el bloque de memoria entre las direcciones 100h y 11Fh con los valores 0, 1, 2, ..., 1Fh. 0000 0003 0004 0006 0007 0008 M6800 CE0100 4F A700 08 4C 8C0120 INICIO: LDX #0100h CLRA BUCLE: STAA 0,X INX INCA CPX #0120h ;X Apunta a la primera posición ;Pone el acumulador a cero ;Guarda el acumulador ;Incrementa el contenido de X ;Incrementa el acumulador ;¿Terminó? Página 3 Universidad de Alcalá Departamento de Automática 000B 26F7 000D 01 0000 CE0100 861F A700 08 4A 8C0120 26F7 01 INICIO: LDX #0100h LDAA #01Fh BUCLE: STAA 0,X INX DECA CPX #0120h BNE BUCLE FIN: NOP END ;X Apunta a la primera posición ;Dato inicial en A ;Guarda el acumulador ;Incrementa el contenido de X ;Decrementa el acumulador ;¿Terminó? Programa que copia el bloque de memoria comprendido entre las direcciones 00h y 1Fh a partir de la dirección 100h. 0000 0003 0005 0006 0008 000B 000D 0000 BNE BUCLE NOP END Modificación del programa anterior para que la inicialización se realice en orden inverso (de la 100h a la 11Fh con los valores 1Fh, 1Eh, ...0). 0000 0003 0005 0007 0008 0009 000C 000E 0000 FIN: I. T. Informática de Sistemas Laboratorio de Microprocesadores CE0000 A600 08 A7FF 8C0020 26F6 01 INICIO: LDX BUCLE: LDAA INX STAA CPX BNE FIN: NOP END #00h 0,X 0FFh,X #0020h BUCLE ;Indice a cero ;Carga en A el dato a transferir ;Incrementa el índice ;Se guarda el dato en (FFh+X) ;¿Llegó al final? ;Salta si no es igual (-10) Programa que localiza el mayor y el menor de los 16 datos de un byte almacenados a partir de la posición 50h y los almacena, respectivamente, en las posiciones A0h y B0h. ;Números CON SIGNO 0000 CE000F INICIO: 0003 A650 0005 E650 0007 09 BUCLE: 0008 A150 000A 2E02 000C A650 000E E150 NOMAX: 0010 2D02 0012 E650 0014 8C0000 NOMIN: 0017 26EE 0019 97A0 001B D7B0 001D 01 FIN: 0000 M6800 LDX LDAA LDAB DEX CMPA BGT LDAA CMPB BLT LDAB CPX BNE STAA STAB NOP END #0Fh 50h,X 50h,X 50h,X NOMAX 50h,X 50h,X NOMIN 50h,X #00 BUCLE 0A0h 0B0h ;En A el mayor ;En B el menor ;Compara con el mayor ;Salta si es menor (+2) ;Carga el dato en A ;Compara con el menor ;Salta si es mayor (+2) ;Carga el dato en B ;No es el último (-18) ;Guarda el mayor ;Guarda el menor Página 4 Universidad de Alcalá Departamento de Automática ;Números SIN signo 0000 CE000F INICIO: 0003 A650 0005 E650 0007 09 BUCLE: 0008 A150 000A 2402 000C A650 000E E150 NOMAX: 0010 2502 0012 E650 0014 8C0000 NOMIN: 0017 26EE 0019 97A0 001B D7B0 001D 01 FIN: 0000 I. T. Informática de Sistemas Laboratorio de Microprocesadores LDX LDAA LDAB DEX CMPA BCC LDAA CMPB BCS LDAB CPX BNE STAA STAB NOP END #0Fh 50h,X 50h,X 50h,X NOMAX 50h,X 50h,X NOMIN 50h,X #00 BUCLE 0A0h 0B0h ;En A el mayor ;En B el menor ;Compara con el mayor ;Salta si es menor (+2) ;Carga el dato en A ;Compara con el menor ;Salta si es mayor (+2) ;Carga el dato en B ;No es el último (-18) ;Guarda el mayor ;Guarda el menor Programa que suma dos datos de 16 bytes que comienzan en las posiciones 0050h y 0060h y almacena el resultado a partir de la dirección 00A0h. Como el M6800 almacena los datos en memoria con los bytes de pesos mayores en las direcciones menores, los bytes de mayor peso de los operandos se encuentran en las direcciones 0050h y 0060h, por lo que el acarreo final se almacenará en la dirección 009Fh. 0000 0003 0004 0006 0008 000A 000B 000D 000F 0011 0013 0015 0017 0019 0000 M6800 CE000F 0C A650 A960 A7A0 09 26F7 9650 9960 97A0 8600 8900 979F 01 INICIO: LDX CLC BUCLE: LDAA ADCA STAA DEX BNE LDAA ADCA STAA LDAA ADCA STAA FIN: NOP END #0Fh ;Número de datos 50h,X ;Primer operando en 005Fh 60h,X ;Segundo operando en 006Fh 0A0h,X ;No cambia C. Solo cambia Z BUCLE ;No es el penúltimo (Salta -12) 50h ;El último (mayor peso) 60h 0A0h #00 ;El acarreo final #00 9Fh Página 5 Universidad de Alcalá Departamento de Automática I. T. Informática de Sistemas Laboratorio de Microprocesadores REPERTORIO DE INSTRUCCIONES En el M6800 hay alrededor de 200 códigos de operación (de un byte) mediante los cuales se codifican todas las instrucciones con los modos de direccionamiento disponibles. (Se muestran a continuación). M6800 Página 6 Universidad de Alcalá Departamento de Automática M6800 I. T. Informática de Sistemas Laboratorio de Microprocesadores Página 7 Universidad de Alcalá Departamento de Automática M6800 I. T. Informática de Sistemas Laboratorio de Microprocesadores Página 8 Universidad de Alcalá Departamento de Automática M6800 I. T. Informática de Sistemas Laboratorio de Microprocesadores Página 9 Universidad de Alcalá Departamento de Automática M6800 I. T. Informática de Sistemas Laboratorio de Microprocesadores Página 10 Universidad de Alcalá Departamento de Automática M6800 I. T. Informática de Sistemas Laboratorio de Microprocesadores Página 11