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.
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.
|