Redeya.com

El procesador Z80

Autor: jugagoic@risc.umayor.cl


Indice

1 - Introducción al Z80
2 - Estructura interna
3 - Descripcion de Terminales
4 - Interrupciones
5 - Juego de instrucciones


1 - Introducción al Z80

El Z80 es un microprocesador de 8 bits ampliamente usado en computadores personales y en sistemas de control. Es fabricado por la empresa Zilog Inc. de California y constituye una versión mejorada del primer microprocesador de 8 bits, el I ntel 8080. Este se encuentra en los computadores personales Radio Schack TRS-80, Memotech MPF3, Amstrad CPC 464, Sinclair Spectrum, Timex Sinclair 1000, etc y en numerosos controladores. El microprocesador Z80 posee un amplio repertorio de instrucciones (158) lo cual lo hace muy eficiente. Este repertorio incluye las instrucciones del Intel 8080 (78).

2 - Estructura interna

  • La unidad aritmética y lógica ALU: Es la sección dentro de la CPU encargada de hacer todas las operaciones aritméticas y lógicas. Uno de los operandos se encuentra en el acumulador(registro A), y el otro proviene normalmente de la memoria, o de otro registro. El resultado se almacena en el acumulador, y el grupo de FLIP-FLOP denominados Flags cambia de estado según las características del resultado.

  • Registros

    • Registros de propósito general:
      El Z80 posee 14 registros de propósito general de 8 bits denominados A, B, C, D, H, L y A', B', C', D', H' , L'. Solamente un set de siete registros y el correspondiente registro de Flags F pueden estar activos al mismo tiempo. Una instrucción especial selecciona A y F o A' y F' mientras que otra instrucción selecciona B, C, D, E, H, L o C', D', E' ,H' L'.
      El programador puede cambiar rápidamente de un conjunto de registros de propósito general a otro. Esto proporciona una mayor capacidad de almacenamiento en registros. El acceso a datos presentes en registros de la CPU es mucho más rápido que el acceso a datos en memoria.
      Los registros pueden agruparse de a pares formando registros de 16 bits. Estos son los pares BC, DE y HL (sus equivalentes primas también pueden agruparse).

    • Flags:
      Aunque los Flags existen físicamente dentro de la CPU están agrupados lógicamente formando un registro. Los Flags del Z80 son los siguientes:
      • Flag de Cero(Z):
        toma el valor 1 si el resultado de una operación es cero. Es el bit seis.
      • Flag de signo(S):
        toma el valor 1 si el resultado de una operación es negativo. Es el bit siete.
      • Flag de Carry(C):
        este flag es afectado por las instrucciones de desplazamiento y es puesto en 1 ó 0 según el valor del bit desplazado. También es afectado por las operaciones aritméticas. Este flag es el bit cero.
      • Flag de Paridad y overflow(P/V):
        en el caso de paridad, se pone en 1 si el resultado de una operación posee un número par de unos. Cuando el flag P/V se usa para representar overflow, el flag se pone en 1 si ocurre un overflow después de una operación aritmética. Este flag es el bit 2.
      • Flag H y N:
        son dos Flip Flop que no pueden ser examinados por las instrucciones de salto condicional. El Z80 los usa para las operaciones BCD. H representa el rebalse que genera considerando los cuatro bits menos significativos del resultado y N es el flag de resta, el cual se activa para indicar si la última instrucción ejecutada fue suma o resta. En el caso general, una instrucción de resta coloca en 1 el flag N y una instrucción de suma lo coloca en 0. Los Flags H y N son los bits 4 y 1 respectivamente.


    • Registros de propósito especial
      • Program Counter:
        es un registro de 16 bits que indica la dirección de la próxima instrucción ejecutar. Las instrucciones del Z80 pueden contar de uno, dos, tres o cuatro bytes.
      • Stack-Pointer:
        es un registro de 16 bits que indica la dirección de una memoria RAM externa denominada Stack. El objetivo de esta área de memoria es proporcionar un medio de almacenamiento temporal de los registros del usuario, registro de Flags y del program Counter. La provisión de Stack es fundamental para operaciones tales como los llamados a sub-rutinas e interrupciones.
      • Registros índices IX e IY:
        estos registros son de 16 bits, diseñados para permitir un direccionamiento indexado en los programas del Z80. Cuando se ejecuta una instrucción en un modo de direccionamiento indexado, se usa uno de los dos registros índices para calcular la dirección del operando.
      • Registro de interrupciones I:
        es un registro de 8 bits que puede ser cargado para especificar el byte más significativo de una dirección de memoria. El byte menos significativo es proporcionado por el dispositivo que solicita la interrupción.
      • Registro de refresh de memoria R:
        es un registro especial diseñado para proporcionar un refresh automático de las memorias RAM dinámicas.


  • Registro de instrucciones:

    el registro de instrucciones tiene por misión almacenar el código de operación de la instrucción leída desde memoria. Este código es descodificado y con esta información se dirigen todos los micro-pasos.

  • La unidad de tiempo y control:

    su objetivo es mantener la secuencia adecuada y el control de todas las operaciones de la CPU. Atiende y responde a todas las señales externas.

3 - Descripcion de Terminales

El microprocesador Z80 está integrado en una pastilla de 40 pines.

CPU z80 pin

Estos terminales pueden agruparse funcionalmente como muestra la siguiente figura:

  • Bus de direcciones El bus de direcciones está formado por 16 líneas que van desde la línea A0 hasta la línea A15. Estas líneas poseen 3 estados, de modo que cuando el bus de direcciones está inactivo, ellos se encuentran en un estado de alta inpedancia.

    Cuando el procesador maneja dispositivos de I/O, las 8 líneas menos significativas de este bus contienen la dirección del dispositivo, la cual puede tener un valor entre 0 y 255 (d).

    Por otro lado, las líneas menos significativas de este bus contienen, durante un lapso en ejecución da cada instrucción, el valor presente en el registro de Refresh de memoria R.

  • Bus de data El bus de datos está formado por 8 líneas que van desde la línea D0 a la línea D7. Este bus es bidireccional permitiendo la transferencia de información desde la CPU hacía la memoria o dispositivos de I/O y viceversa. Es tambíen un bus de 3 estados.

  • Alimentación El microprocesador Z80 requiere solamente de 2 líneas de alimentación 0 y 5 V, con un margen de 5%, y consume una corriente máxima de 200 mA.

  • Señales de Reloj El Z80 requiere solamente una señal de reloj. La frecuencia de esta señal Ø para el Z80 es de 4[MHhz].

  • Señales de control
    • Control de los buses.
      La CPU posee dos señales asociadas con el control de los buses de dirección y datos. Estas señales son la señal de entrada BUSRQ y la señal de salida Busak

      La señal BUSRQ es generada por un dispositivo externo para obtener el control de los buses y realizar una operación de acceso directo a memoria.

      Cuando un dispositivo externo solicita el control de los buses colocando en 0 la línea BUSRQ, el procesador concluye la instrucción que estaba ejecutando y responde mediante la señal de reconocimiento BUSAK.

      Colocando la señal de salida Busak en 0, el procesador informa al dispositivo externo que el bus de dirección, el bus de datos y las señales de control de salida se encuentran en estado de alta impedancia y en consecuencia, se encuentran libres para ser controladas por dicho dispositivo.

    • Control de la memoria
      El Z80 posee 4 señales relacionadas con las operaciones de control de la memoria. Ellas son las señales MREQ, RD, WR y RFSH.

      La señal MREG es una señal de 3 estados que se activa en 0 indicando que el bus de direcciones contiene una dirección válida.

      La señales RD y WR indican a la memoria si la CPU efectuará una operación de lectura o escritura.

      La señal RFSH no está asociada con la operación normal de la memoria sino que se usa solamente con memoria dinámica. Las memorias dinámicas requieren que se refresque periódicamente la información almacenada antes que se degrade.


      Control de memoria
      MREG RFSH RD WR
      Leer memoria 0 0
      Escribir en memoria 0 0
      Ciclo de refresco (7 bits) 0 0


    • Control de I/O
      La CPU usa la señal IORQ' para informar a los dispositivos de I/O que los 8 bits menos significativos del bus de direcciones contienen una dirección de I/O válida.


      Control de I/O
      IORQ' RD WD
      Leer dispositivo I/O 0 0
      Escribe dispositivo I/O 0 0


    • Control de las Interrupciones
      El microprocesador Z80 posee dos líneas de entrada a través de las cuales un dispositivo externo puede solicitar la interrupción del programa que se está ejecutando y la ejecución de una rutina que maneje dicha interrupción. Estas líneas son la NM I y INT'.

  • Señales Misceláneas.

    En este grupo se encuentran las señales M1', RESET, WAIT y HALT.
    La señal RESET es una señal de entrada a la CPU y que se activa (se coloca en 0) para efectuar una operación de reset general. Esta señal es puesta en cero en los microcomputadores que usan este microprocesador, inmediatamente después que se aplica la energía y cada vez que se resetea el sistema.

    Cuando se activa la señal RESET, las interrupciones quedan en modo 0, los registros R e I quedan también en cero y el Program Counter carga la dirección 000H.

    La señal WAIT es una señal asociada con memorias o dispositivos de I/O lentos. Mientras, la señal Wait esté en cero, la CPU no hace nada esperando la respuesta de la memoria o del dispositivo de I/O lento.
    Finalmente, la señal HALT es una señal que se activa (se pone en cero) cuando se ejecuta una instrucción HALT.
    Cuando el microprocesador está en estado HALT realiza solamente instrucciones NOP (No operation) para asegurar el adecuado refresh de memoria. Se puede salir de este estado solo mediante interrupciones.

4 - Interrupciones

El microprocesador Z80 posee dos líneas de entrada de interrupciones, la línea NMI' (nonmaskable interrupt) y la línea INT'. La entrada NMI' permite una sola interrupción mientras que la entrada INT' permite hasta 128 interrupciones vectorizadas. La interrupción NMI' siempre es reconocida y aceptada por la CPU, en cambio, las interrupciones a través de la línea INT' son reconocidas y aceptadas sólo si han sido previamente habilitadas por software.

4.1 - Interrupción NMI'

Cuando se activa la línea de interrupción NMI' (0 lógico) el procesador concluye la instrucción que estaba ejecutando, almacena el contenido del contador del programa en el STACK y salta a la dirección 66H.

4.2 - Interrupción INT'

MODO 0

El modo 0 se activa a través de la instrucción IM 0
Este modo es idéntico a la interrupción INT' del microprocesador 8080.

El procedimiento que sigue la CPU, suponiendo que ha sido programada en modo 0 y que las interrupciones han sido habílitadas es el siguiente:

- El dispositivo externo solicita la interrupción colocando la línea INT' en 0.
- Al término de la ejecución de la instrucción presente, la CPU reconoce la interrupción.
- La CPU responde con las señales IORQ' y M1'.
- El dispositivo extreno reconoce las señales IORQ' y M1' y coloca en el bus de datos una instrucción RESTART.
- La CPU ejecuta la instrucción Restart saltando a una de 8 posiciones fijas de memoria (0,8,10,20,28,30 ó 38H).
- Se ejecuta la rutina que atiende la interrupción.
- Al final de la rutina, una instrucción RETI permite que el control retorne al punto donde se interrumpió el programa.

MODO 1

El modo 1 se programa mediante la instrucción IM 1. El proceso de interrupción en modo 1 es similar al proceso de la interrupción NMI'. El procesador concluye la instrcucción que estaba ejecutando, almacena el contenido del contador del programa en el STACK y salta a la dirección 38H.

MODO 2

El modo dos permite hasta 128 interrupciones vectorizadas desde dispositivos extrenos y se programa mediante la instrucción IM 2. Este modo utiliza una tabla vectorizada de interrpciones ubicada en cualquier zona de memoria y definida por el usuario.

La dirección de partida de esta tabla corresponde a IIIIIIII 00000000 base dos, donde I es el contenido del registro de interrupciones I.

Para cualquier interrupción, el registro I proporciona los 8 bits más significativos de la dirección de la tabla y el dispositivo externo proporciona los 8 bits menos significativos. La tabla tiene 128 entradas. Cada entrada es de 2 bytes. Estos bytes i ndican la dirección de la ruta de interrupción para un dispositivo dado.

El procedimiento que sigue la CPU, suponiendo que ha sido programada en modo 2, y que las interrupciones han sido habilitadas, es el siguiente:

- El dispositivo externo solicita la interrupción colocando la línea INT' en 0.
- Al término de la ejecución de la interrupción presente, la CPU reconoce la interrupción.
- La CPU responde con las señales IORQ' y M1'
- El dispositivo externo reconoce las señales IORQ' y M1' y coloca en el bus de datos un valor de 8 bits.
- La CPU forma con este valor y con el contenido del registro de interrupciones una dirección de acceso a la Tabla.
- La CPU almacena el contenido del contador del programa en el Stack.
- La CPU accede a la tabla de interrupción y carga el contenido de dicha posición de la tabla y de la posición siguiente en el contador del programa. De esta forma, el programa salta a la dirección donde se encuentra la rutina que atenderá la interrupción.
- Al final de la rutina, una instrucción RETI permite que el control retorne al punto donde se interrumpió el programa.

La figura muestra esquemáticamente el proceso de interrupción del microprocesador Z80 en modo 2.

5 - Juego de instrucciones

ADC   HL,ss       Add with carry register pair ss to HL.
ADC   A,s         Add with carry operand s to accumulator.
ADD   A,n         Add value n to accumulator.
ADD   A,r         Add register r to accumulator.
ADD   A,(HL)      Add location (HL) to acccumulator.
ADD   A,(IX+d)    Add location (IX+d) to accumulator.
ADD   A,(IY+d)    Add location (IY+d) to accumulator.
ADD   HL,ss       Add register pair ss to HL.
ADD   IX,pp       Add register pair pp to IX.
ADD   IY,rr       Add register pair rr to IY.
AND   s           Logical AND of operand s to accumulator.
BIT   b,(HL)      Test bit b of location (HL).
BIT   b,(IX+d)    Test bit b of location (IX+d).
BIT   b,(IY+d)    Test bit b of location (IY+d).
BIT   b,r         Test bit b of register r.
CALL  cc,nn       Call subroutine at location nn if condition CC is true.
CCF               Complement carry flag.
CP    s           Compare operand s with accumulator.
CPD               Comapre location (HL) and acc., decrement HL and BC,
CPDR              Perform a CPD and repeat until BC=0.
CPI               Compare location (HL) and acc., incr HL, decr BC.
CPIR              Perform a CPI and repeat until BC=0.
CPL               Complement accumulator (1's complement).
DAA               Decimal adjust accumulator.
DEC   m           Decrement operand m.
DEC   IX          Decrement IX.
DEC   IY          Decrement IY.
DEC   ss          Decrement register pair ss.
DI                Disable interrupts.
DJNZ  e           Decrement B and jump relative if B=0.
EI                Enable interrupts.
EX    (SP),HL     Exchange the location (SP) and HL.
EX    (SP),IX     Exchange the location (SP) and IX.
EX    (SP),IY     Exchange the location (SP) and IY.
EX    AF,AF'      Exchange the contents of AF and AF'.
EX    DE,HL       Exchange the contents of DE and HL.
EXX               Exchange the contents of BC,DE,HL with BC',DE',HL'.
HALT              Halt computer and wait for interrupt.
IM    0           Set interrupt mode 0.
IM    1           Set interrupt mode 1.
IM    2           Set interrupt mode 2.
IN    A,(n)       Load the accumulator with input from device n.
IN    r,(c)       Load the register r with input from device (C).
INC   (HL)        Increment location (HL).
INC   IX          Increment IX.
INC   (IX+d)      Increment location (IX+d).
INC   IY          Increment IY.
INC   (IY+d)      Increment location (IY+d).
INC   r           Increment register r.
INC   ss          Increment register pair ss.
IND               (HL)=Input from port (C). Decrement HL and B.
INDR              Perform an IND and repeat until B=0.
INI               (HL)=Input from port (C). HL=HL+1. B=B-1.
INIR              Perform an INI and repeat until B=0.
JP    (HL)        Unconditional jump to location (HL).
JP    (IX)        Unconditional jump to location (IX).
JP    (IY)        Unconditional jump to location (IY).
JP    cc,nn       Jump to location nn if condition cc is true.
JR    C,e         Jump relative to PC+e if carry=1.
JR    e           Unconditional jump relative to PC+e.
JR    NC,e        Jump relative to PC+e if carry=0.
JR    NZ,e        Jump relative to PC+e if non zero (Z=0).
JR    Z,e         Jump relative to PC+e if zero (Z=1).
LD    A,(BC)      Load accumulator with location (BC).
LD    A,(DE)      Load accumulator with location (DE).
LD    A,I         Load accumulator with I.
LD    A,(nn)      Load accumulator with location nn.
LD    A,R         Load accumulator with R.
LD    (BC),A      Load location (BC) with accumulator.
LD    (DE),A      Load location (DE) with accumulator.
LD    (HL),A      Load location (HL) with accumulator.
LD    dd,nn       Load register pair dd with nn.
LD    dd,(nn)     Load register pair dd with location (nn).
LD    HL,(nn)     Load HL with location (nn).
LD    (HL),r      Load location (HL) with register r.
LD    I,A         Load I with accumulator.
LD    IX,nn       Load IX with value nn.
LD    IX,(nn)     Load IX with location (nn).
LD    (IX+d),n    Load location (IX+d) with n.
LD    (IX+d),r    Load location (IX+d) with register r.
LD    IY,nn       Load IY with value nn.
LD    IY,(nn)     Load IY with location (nn).
LD    (IY+d),n    Load location (IY+d) with value n.
LD    (IY+d),r    Load location (IY+d) with register r.
LD    (nn),A      Load location (nn) with accumulator.
LD    (nn),dd     Load location (nn) with register pair dd.
LD    (nn),HL     Load location (nn) with HL.
LD    (nn),IX     Load location (nn) with IX.
LD    (nn),IY     Load location (nn) with IY.
LD    R,A         Load R with accumulator.
LD    r,(HL)      Load register r with location (HL).
LD    r,(IX+d)    Load register r with location (IX+d).
LD    r,(IY+d)    Load register r with location (IY+d).
LD    r,n         Load register r with value n.
LD    r,r'        Load register r with register r'.
LD    SP,HL       Load SP with HL.
LD    SP,IX       Load SP with IX.
LD    SP,IY       Load SP with IY.
LDD               Load location (DE) with location (HL), decrement DE,HL,BC.
LDDR              Perform an LDD and repeat until BC=0.
LDI               Load location (DE) with location (HL), incr DE,HL; decr BC.
LDIR              Perform an LDI and repeat until BC=0.
NEG               Negate accumulator (2's complement).
NOP               No operation.
OR    s           Logical OR of operand s and accumulator.
OTDR              Perform an OUTD and repeat until B=0.
OTIR              Perform an OTI and repeat until B=0.
OUT   (C),r       Load output port (C) with register r.
OUT   (n),A       Load output port (n) with accumulator.
OUTD              Load output port (C) with (HL), decrement HL and B.
OUTI              Load output port (C) with (HL), incr HL, decr B.
POP   IX          Load IX with top of stack.
POP   IY          Load IY with top of stack.
POP   qq          Load register pair qq with top of stack.
PUSH  IX          Load IX onto stack.
PUSH  IY          Load IY onto stack.
PUSH  qq          Load register pair qq onto stack.
RES   b,m         Reset bit b of operand m.
RET               Return from subroutine.
RET   cc          Return from subroutine if condition cc is true.
RETI              Return from interrupt.
RETN              Return from non-maskable interrupt.
RL    m           Rotate left through operand m.
RLA               Rotate left accumulator through carry.
RLC   (HL)        Rotate location (HL) left circular.
RLC   (IX+d)      Rotate location (IX+d) left circular.
RLC   (IY+d)      Rotate location (IY+d) left circular.
RLC   r           Rotate register r left circular.
RLCA              Rotate left circular accumulator.
RLD               Rotate digit left and right between accumulator and (HL).
RR    m           Rotate right through carry operand m.
RRA               Rotate right accumulator through carry.
RRC   m           Rotate operand m right circular.
RRCA              Rotate right circular accumulator.
RRD               Rotate digit right and left between accumulator and (HL).
RST   p           Restart to location p.
SBC   A,s         Subtract operand s from accumulator with carry.
SBC   HL,ss       Subtract register pair ss from HL with carry.
SCF               Set carry flag (C=1).
SET   b,(HL)      Set bit b of location (HL).
SET   b,(IX+d)    Set bit b of location (IX+d).
SET   b,(IY+d)    Set bit b of location (IY+d).
SET   b,R         Set bit b of register r.
SLA   m           Shift operand m left arithmetic.
SRA   m           Shift operand m right arithmetic.
SRL   m           Shift operand m right logical.
SUB   s           Subtract operand s from accumulator.
XOR   s           Exclusive OR operand s and accumulator.

Página original de Http://www.redeya.com, prohibida su reproducción sin consentimiento del autor