MODOS DE DIRECCIONAMIENTO µP MOTOROLA 6800 Autor: Ing. Julio César Doumecq - @ 2008-2012 Estructura básica de una computadora Estructura interna del µP Motorola 6800 R Descripción de los Registros La ALU (Arithmetic and Logic Unit) puede efectuar operaciones aritméticas y lógicas tales como: • Suma, Resta, Incremento_en_1, Decremento_en_1, Puesta_a_0, Puesta_a_1, Comparación, Rotación, Desplazamiento, AND_lógica, OR_lógica, OR_exclusiva, Complemento_a_1, Complemento_a_2, etc. • Esta unidad procesa 8 bits en paralelo y opera conjuntamente con dos acumuladores (A y B) vía el bus bidireccional de datos/instrucciones también de 8 líneas. • Asociado a ella se encuentra un registro de estados “Code Condition Register" (CCR) o “Registro de Códigos de Condición” de 8 bits llamados "flags" o banderas. • El sentido de cada flag se indica a continuación: El Registro de Códigos de Condición (CCR) b7 b6 b5 b4 b3 b2 b1 b0 1 1 H I N Z V C H : (Half) medio acarreo. Se pone en 1 si en la operación efectuada se produjo un transporte del primer al 2°nibble (bit 3 al bit 4). l : Máscara de interrupciones. Se pone en 1 cuando se está atendiendo una interrupción o si se desea inhibir las "interrupciones enmascarables" que se verán algo más adelante. N : Negativo. Bit de signo. Se pone en 1 si la operación efectuada da resultado negativo. (8°bit del resultado = 1). Z : (Zero) bit de cero. Se pone en 1 si el resultado de la última operación efectuada es cero. V : (overflow) bit de desborde. Se pone en 1 si como resultado de una operación aritmética se excede la capacidad del acumulador en complemento a 2 (resultado mayor de 127 o menor de -128). C : (carry) acarreo o bit de arrastre. Se pone en 1 si como resultado de la operación efectuada se origina un transporte desde el bit más significativo del acumulador. Constituye un 9°bit. Otros Registros accesibles al programador PC : (Program Counter) contador de programa. Es un registro de 16 bits que apunta (contiene la dirección) al primer byte de la próxima instrucción a leer. Su valor se incrementa automáticamente cada vez que la instrucción o sus operandos son leídos (transferidos a la CPU). Este registro barre ordenadamente la secuencia de instrucciones (programa) salvo que una instrucción de salto lo direccione de otra manera. En el 6800 puede direccionar 64 KBytes de memoria. IX : (IndeX Register) registro índice. Es también un registro de 16 bits que se utiliza para efectuar direccionamientos de memoria del tipo "indexado" o como contador. Puede incrementarse, decrementarse, cargarse desde memoria o por programa, almacenarse en memoria, compararse, etc. SP : (Stack Pointer) puntero de pila o "stack". Registro de 16 bits que contiene una dirección de memoria (RAM) en la cual "apilar" o salvar los registros: Acc A, Acc B, CCR, IX y PC cuando el microprocesador debe atender interrupciones o alguna subrutina. Definiciones Instrucción: es una configuración de dígitos binarios que debe ser interpretada por la UC a fin de determinar QUÉ debe hacer (código de operación OP), sobre CUÁLES datos o registros tiene que operar (operando) y CÓMO debe acceder a ellos (direccionamiento). El MC6800 tiene un "set" (conjunto) de 72 instrucciones que con las variantes de direccionamiento posibles totalizan un máximo de197 y que le requieren, según los casos, de uno a tres bytes de programa. Código mnemotécnico o nemónico: es una asignación alfabética simple, representativa de la instrucción codificada. Lenguaje de máquina: lenguaje binario que puede entender una computadora. Programa ensamblador (assembler): programa que permite convertir el programa fuente o programa expresado en código mnemotécnico, a lenguaje máquina. Modos de Direccionamiento (I) Direccionamiento Implícito o Inherente: Se utiliza en instrucciones de 1 Byte que se refieren a los acumuladores o a otro registro de la CPU. Ejemplos: (se indica el código operación OP en hexadecimal, luego el código mnemotécnico y finalmente se explica la operación). ABA Hace Acc A = Acc A + Acc B . Suma los acumuladores. CLRA Hace Acc A = 0. Limpia el acumulador A. DECB Hace Acc B = Acc B - 1 . Decrementa el acumulador B. TSTA Prueba si el Acc A = 0 y pone en consecuencia los bits N y Z del registro de códigos de condición CCR. No afecta los acumuladores. INX Incrementa el registro índice. Hace IX = IX+1 TSX Hace IX = SP+1. Carga el registro índice con el valor del puntero de pila + 1. NOP No opera. Es un retardo de 2 ciclos de reloj. Sirve para rellenar espacios entre instrucciones (ajustar lazos de tiempo) Modos de Direccionamiento (II) Direccionamiento lnmediato: estas instrucciones requieren 2 bytes si involucran a los acumuladores y 3 cuando afectan a IX o SP: el primer byte es propiamente la instrucción y el resto es un número que se OPERA con el registro que corresponda. Modo inmediato ADDB, #$8D hace Acc B = Acc B + $8D. Suma al Acc B el número $8D CMPA, #$56 compara el Acc A con el número $56 y pone el registro CCR en consecuencia EORB #$39 hace Acc B = Acc B OREXC $39 LDX #$483C carga IX con el operando. Hace IX = $483C Modos de Direccionamiento (III) Direccionamiento Directo/Extendido: consiste en dar justamente la dirección donde se encuentra el operando, a continuación del OP. Se requerirán en total 3 bytes si el direccionamiento es Extendido, o sólo 2 bytes si se da por sobreentendida parte de la dirección. Motorola denomina Directo a un direccionamiento en el que se sobreentiende la parte alta de la dirección como 00 (direccionamiento Directo a Página Cero), lo que permite dirigirse mediante un único byte de dirección (luego de la instrucción) a las primeras 256 posiciones de memoria. STAB $FF Guarda el acumulador B en la dirección $00FF ADDA $05 Hace Acc A = Acc A+ ($0005). (M) indica contenido de M. En este ejemplo, suma al acumulador A el contenido de la posición de memoria $0005 y coloca el resultado en A ADDA $1805 Hace Acc A = Acc A+ ($1805) (Extendido) LDX $48 Carga IX con el contenido de $0048 y $0049: IX = (0048)(0049) JSR $0436 Salta a $0436, esto es: guarda en la pila (stack) el valor actual del PC, continúa el programa en $0436 (hace PC = $0436) y cuando encuentra una instrucción 39 (RTS: Return from Subroutine) restituye PC con el valor antes guardado en el stack. Modos de Direccionamiento (IV) Direccionamiento Indexado: requiere 2 bytes; el 1°es el OP y el 2°es un desplazamiento positivo que se suma al IX para dar la dirección del operando. El valor máximo del desplazamiento es de 255 ($FF). Ejemplos: si suponemos que (IX) = $2047 entonces: ADDB $48,X hace Acc B = AccB + ($2047+$48) = Acc B + ($208F) CLR $6A,X pone a 0 el lugar de memoria ($2047+$6A) ($20B1) = 00 LDX $08 hace (IX) = ($204F) ($2050) Carga el byte más significativo de IX con el contenido de $2047+$08 = ($204F) y el menos significativo con ($204F+1) = ($2050) Importante: al ejecutar una instrucción con este modo de direccionamiento no se altera el contenido del registro Indice IX Modos de Direccionamiento (V) Direccionamiento Relativo al PC: el anterior lo era para al registro índice. Motorola utiliza este tipo de direccionamiento sólo en las instrucciones de bifurcación. Las instrucciones con este tipo de direccionamiento requieren 2 bytes, el 2°de los cuales constituye un corrimiento u "offset" en complemento a 2, respecto al contador de programa. De esta manera, se puede bifurcar como máximo hasta 127 lugares hacia adelante y hasta 128 hacia atrás, contados desde el valor del PC luego de leída esta instrucción. Ejemplos: Si a partir de (PC) = $1018 se tiene: BRA $32 Bifurca incondicionalmente (Always) 32 lugares (hexadec.) hacia adelante desde PC=$101A. La próxima instrucción leída será la ubicada en PC=$101A+$32=$104C. BEQ $0F Prueba Z, si es "1" bifurca a $101A+$0F=$1029, si no, sigue el programa con PC=$101A. BPL $D6 Prueba N, si es "0" salta $D6 lugares (en Ca 2), o sea $2A lugares hacia atrás, contando desde $101A => PC = $0FF0. Si el resultado de la operación antes del salto era negativo (N=1) continuará el programa con PC = $101A CONTINUARÁ (en Sistemas Digitales)