Micro Motorola MC68000

lunes 2 de julio, 2001
 

Nota preliminar: Este artículo fue publicado en el número 6 de NetSearch Ezine, en 2001.

 

Esto pretende ser el primero de una serie de artículos (si es que veo interés y tengo tiempo) sobre Eleectronica Digital. Voy a intentar enfocarlo para que cualquiera pueda empezar en este tema. No obstante, dare por hecho ciertos conocimientos básicos sobre informática (numeración hexadecimal, binaria,…).

La electronica digital es un tema muy amplio, por tanto esto será algo así como una guía básica a partir de la cual podreis investigar vosotros mismos y profundizar. Existen multitud de microprocesadores; yo voy a escribir sobre el MC68000 de Motorola, ya que es el que conozco y es un buen micro con el que aprender. Esta claro que despues utilizareis otros, pero sabiendo uno no tendreis problemas en aprender otros.

Estoy hablando de micros, ya que en este artículo voy a empezar con la estructura y la programación del micro. Decidí empezar por aquí porque creo que es lo más interesante para empezar en electrónica, ademas será una buena guía de iniciación a lenguaje ensamblador para la gente que no sabe utilizarlo. Si veo que interesa, en otros artículos escribiré sobre mapeo de memorias, circuiteria de selección,…

En la web podreis encontrar un simulador del MC68000 y un manual de funcionamiento con el que podreis compilar y simular los programas que hagais.

Puede que os esteis preguntando cual es la aplicación de todo el royo que vais a leer, sobre todo aplicado a los temas que os interesan. Programando un micro (en la práctica, lo más seguro es que programeis un PIC, que es un poco más limitado que un micro, pero os llegará de sobra) y creando un circuito digital controlado por el, podeis hacer desde una calculadora hasta un selector entre multiples tarjetas SIM segun el PIN introducido, cerraduras controladas por una tarjeta EPROM, emuladores de… cualquier circuito que conozcais.

Bueno, sin más preambulos empiezo.

1. Indice

  1. Indice
  2. Propiedades hardware
  3. Modelo de programación
  4. La Memoria
  5. Modos de Direccionamiento
  6. Juego de instrucciones
  7. Subrutinas
  8. Excepciones
  9. Interrupciones
  10. Ejemplo práctico

 

2. Propiedades hardware

  • Bus interno: 16 bits
  • Unidad Aritmetico Lógica (ALU) puede operar sobre 16 bits directamente
  • Registros internos de 32 bits (Datos y Direcciones)
  • La Entrada/Salida esta mapeada en memoria (Intel utiliza buses diferentes para entrada/salida)
  • Bus de datos: 16 bits
  • Bus de direcciones: 32 bits (pero solo utiliza las 24 líneas menos significativas)

Micro Motorola MC68000     

* Físicamente solo hay 23 lineas de dirección. A0 se sustituye por UDS y LDS de una forma especial.

[Nota:] Las líneas negadas (con una línea por encima) quieren decir que esa línea se activa con un “0″ lógico, en lugar de un “1″.

  • GND (Ground):  Masa.
  • CLK (Clock):  Señal de reloj.
  • D0-D13 (Data): Bus de datos.
  • A1-A23 (Address): Bus de direcciones.
  • AS# (Address Strobe): Validación de dirección.
  • R/W# (Read/Write): Control Lectura/Escritura.
  • UDS# (Upper Data Strobe): Transferencia por los 8 bits altos del bus de datos.
  • LDS# (Lower Data Strobe): Transferencia por los 8 bits bajos del bus de datos.
  • DTACK# (Data Transfer Acknowledge): Indicador de transferencia completa.  (la recibe del subsistema de memoria)
  • IPL*# (Interrupt Priority Level): Entradas de peticion de interrupción. Codifican un número de 3 bits con el nivel de interrupción.
  • BERR# (Bus Error): Error en el subsistema de memoria o en E/S.
  • RESET#: Es una linea bidireccional: De forma entrante inicializa el micro.    De forma saliente fuerza la inicializacion del entorno.
  • HALT#: Es bidireccional: Como entrada detiene la CPU. Como salida indica al subsistema que la CPU se ha detenido.
  • BR# (Bus Request): Peticion de bus para DMA.
  • BG# (Bus Grant): Concesion de bus.
  • BGACK# (Bus Acknowledge): Reconocimiento de concesión.
  • E: Salida de reloj para perifericos de la familia 68000.  Frecuencia de 1/10 CLK
  • VMA# (Valid Memory Address): Indica que el bus de direcciones contiene una  direccion válida.
  • VPA# (Valid Peripherial Address): Indica que la dirección pertenece a un periférico síncrono.
  • FC* (Function Codes): Señales de status.

 

3. El Modelo de Programación

   El MC68000 tiene dos modos de funcionamiento:

   - Modo Usuario: No se pueden ejecutar ciertas instrucciones y solo se accede al byte bajo del registro de estado.

  • 8 registros de Datos de 32 bits (D0-D7)
  • 7 registros de direcciones de 32 bits (A0-A6)
  • PC (Contador de programa) de 32 bits
  • SP (Stack Pointer o Puntero de Pila de Usuario) de 32 bits (A7)
  • SR (Registro de estado) 8 bits

   - Modo Supervisor: Se accede a todo el juego de instrucciones y a todos los registros.

  • 8 registros de Datos de 32 bits (D0-D7)
  • 7 registros de direcciones de 32 bits (A0-A6)
  • PC (Contador de programa) de 32 bits
  • SSP (Stack Pointer o Puntero de Pila de Usuario) de 32 bits (A7)
  • SR (Registro de estado) 16 bits

[Nota:] Los registros de datos, direcciones y contador de programa son físicamente los mismos para los dos modos.

Los punteros de pila hay uno físicamente para cada modo.

El Registro de estado es físicamente el mismo: El usuario solo utiliza el byte menos significativo, y el supervisor el registro entero.

[Nota:] Los registros que almacenan direcciones (A*, Sp, CP) son de 32 bits pero solo utilizan los 24 bits menos significativos.

[Nota:] Cuando vallamos a utilizar la pila en un programa (ya sea de usuario, para las subrutinas, o de supervisor para las interrupciones) es necesario inicializarla, sino el micro generará un error.

La de usuario la podemos inicializar así:

   MOVE #$40000,A7

La de supervisor:

   ORG $00000

   DC.L $40000

  • Registro de Estados (SR):

bit        15 14 13 12 11 10  9  8 | 7  6  5  4  3  2  1  0

flag        T  #  S  #  # I2 I1 I0 | #  #  #  X  N  Z  V  C

[Nota:] El byte más significativo no es accesible por el modo usuario

  •   T (Trace): Si está a “1″ el micro funciona en modo traza (Paso a paso)
  •   S (Status): Si está a “1″ estamos en modo Supervisor  Si esta a “0″ estamos en modo Usuario
  •   I2 I1 I0 (Máscara de interrupción): Si un periférico solicita una interrupción, el nivel de prioridad debe ser superior al codificado por la máscara.
  •   X (Bit de Extension): Indica el acarreo en operaciones BCD
  •   N (Flag de Signo): Nos indica si la ultima operacion genero un numero negativo.
  •   Z (Flag de Zero): Indica que en la ultima operacion se obtuvo un 0.
  •   V (Flag de Overflow): Cuando esta a “1″ indica que la ultima operacion genero un desbordamiento.
  •    C (Flag de Carry): Indica ke en la ultima operacion se genero un acarreo

 

4. La Memoria

   El 68000 utiliza el formato Big Endian para el almacenamiento de datos superiores al byte en memoria. Esto quiere decir que el byte más significativo se almacena en posiciones de memoria bajas (cercanas al $00000).

              $00000

                 .

                 .

             byte alto

             byte bajo

                 .

                 .

              $FFFFF

La señal R/W# nos indica si vamos a leer o a escribir en memoria:

   

  •   R/W#   Acción

            0    Escribir

            1    Leer

 

La señal AS# se envia al sistema de memoria para decir si la dirección que se ha puesto en el bus de direcciones es válida.

  •    AS#     Indicación

             0    Dirección válida

             1    Dirección no válida

 

  • UDS# y LDS#:

  UDS#    LDS#      Acceso

   0       0        Tamaño palabra (16 bits)

   0       1        Byte bajo

   1       0        Byte alto

   1       1        No hay acceso a memoria

 

  • La señal DTACK# viene del sistema de memoria, e indica si se ha conseguido acceder con exito:

  DTACK#    Indicación

    0       Se ha accedido

    1       No se ha accedido

 

 

5.  Modos de direccionamiento

   Los modos de direccionamiento son los formas de indicar al micro donde encontrar un dato determinado, es decir, cual es su dirección efectiva (direccion física del dato).  En el 68000 tenemos 13 modos de direccionamiento:

  •  Direccionamiento Implícito:

       No se necesita operando. Se refiere a un registro definido en la operación.

       Ej: MOVE $23345,CCR

  • Direccionamiento Inmediato:

       Se expresa la dirección explicitamente en la operación.  Se utiliza el caracter # antes de la dirección.

       Ej: MOVE #$9F,D5

  • Direccionamiento Inmediato Rápido:

       Igual que antes, pero el valor es:

       Número entre 1 y 8 para suma y resta.

       Número entre -128 y 127 en instrucciones de movimiento de datos.

       Se añade el caracter Q al mnemónico y el # antes del número.

       Ej: ADDQ #6,A0

  • Direccionamiento Absoluto Largo:

     El argumento es la dirección efectiva a la que se accede.

   Ej: MULS $25022,D2

  • Direccionamiento Absoluto Corto:

     El argumento es una dirección de tamaño palabra (Word, 2 bytes)

     Si el valor está entre $0000-$7FFF accedemos a los 32k mas bajos de memoria.

     Si el valor está entre $8000-$FFFF accedemos a los 32k mas altos de memoria.

     Ej: EORI.B #$FF,$8000

  • Direccionamiento directo a registro:

    El operando es un registro interno, D* o A*

    Ej: SUB  D1,A2

  •  Direccionamiento Indirecto:

    El operando es una dirección de memoria intermedia, donde está contenida la dirección efectiva.

    Esta dirección de memoria esta contenida en un registro de dirección.

    Ej: ASL.W (A3)

  • Direccionamiento Indirecto con Postincremento:

   Igual que el anterior, pero despues de obtener el argumento el registro de direcciones se incrementa en un valor, segun el tamaño:

   .B (Byte): Se incrementa en 1

   .W (Word): Se incrementa en 2

   .L (LongWord): Se incrementa en 4

   Se utiliza la representacion (A*)+

  Ej: CMPM (A0)+,(A4)+

  Esto es muy útil para recorrer arrays y para actualizar el puntero de pila al sacar datos (El 68000 no tiene instrucción para eso)

  • Direccionamiento Indirecto con Predecremento:

    Primero se decrementa el valor del registro de direcciones y luego se accede al dato.

    Ej: OR.B D3,-(A0)

    Se utiliza para introducir datos en pila.

  • Direccionamiento Indirecto con Desplazamiento:

   La dirección efectiva se obtiene sumando un valor al contenido del registro de direcciones.

   El desplazamiento es un numero con signo de 16 bits.

   Ej:  CHR $24(A4),D3

  • Direccionamiento Indirecto con Indice y Desplazamiento:

    La dirección efectiva se halla sumando 3 valores:

    - El contenido de un registro de direcciones.

    - Un desplazamiento de 8 bits.

    - Un registro de datos.

    Formato:  desplazamiento(A*,D*.B|W|L)

   Ej: DIVU 8(A3,D7.L),D5

  • Direccionamiento Relativo con Desplazamiento:

    Igual que el de desplazamiento pero con el contador de programa.

    Ej: LEA $200(PC),A3

  • Direccionamiento Relativo con Indice y Desplazamiento

    Igual que el de indice y desplazamiento pero con el PC

    Ej: MOVE $B(PC,D1.L),D5

  Leer la entrada completa »