-PROGRAMACIÓN- 
Una operación es una acción específica que realiza el microprocesador siempre que ejecuta una instrucción. Existen diferentes operaciones que realiza el microprocesador, las operaciones asociadas con el Z80 son:  

-LENGUAJE MÁQUINA-
Se dice que un programa se forma con un grupo de patrones binarios, por ejemplo sumar las localidades 1500H y 3020H y almacenar el resultado en la localidad 3000H el programa a ejecutar es el siguiente: 

0011
1010
0000
0000
0001
0101
0100
0111
0011
1010
0010
0000
0011
0000
1000
0000
0011
0010
0000
0000
0011
0000
 
A estos patrones binarios se les conoce como "LENGUAJE MÁQUINA" ya que este es el único lenguaje que entienden las computadoras. 
 
-PROBLEMAS CON LOS PATRONES BINARIOS-
  1. Es muy difícil para el programador entender o depurar los programas.
  2. El proceso de cargar el programa en la computadora es muy lento ya que se tiene que alimentar bit por bit.
  3. El programa no describe la tarea que realiza de una forma fácil de entender para el usuario.
  4. Los programas largos son cansados en su elaboración.
  5. Existe una gran posibilidad de que el programador se equivoque en la redacción del programa, produciendo de esta forma, una gran dificultado para encontrar los errores.
  6. Si en el programa binario existiera un bit erróneo sería laborioso el detectarlo y corregirlo.

 -MNEMÓNICOS-
Un método de mejorar el manejo de las instrucciones para el programador consiste en asignar un nombre a cada instrucción, por ejemplo a la instrucción de decrementar se le nombra como "DEC" y a la de cargar un dato se nombra como "LD", a los nombres de las instrucciones se les conoce como "MNEMÓNICOS", se escogen de tal manera que orienten en forma fácil al programador.

Es más fácil recordar que INC A es el mnemónico de la instrucción para incrementar en uno el contenido del registro acumulador que recordar que 3Ch es el código operacional correspondiente a la misma instrucción, cada fabricante de microprocesadores proporciona una serie de mnemónicos para el conjunto de instrucciones de cada microprocesador, el programa anterior queda en la forma siguiente al usar los mnemónicos del Z80:

                                         PROGRAMA OBJETO              PROGRAMA FUENTE
 

1000
3A
0015
LD
A, (1500)
1003
47
   
LD
B,A
1004
3
20030
 
LD
A, (3000)
1007
80
   
ADD
B
1008
32
0030
 
LD
(3000),A
 
Esta representación del programa es más comprensible que la que usa patrones binarios, en este caso ya que se identifican qué partes son instrucciones y qué partes son direcciones o datos, a la representación de las instrucciones de un programa usando mnemónicos se le conoce como "programa fuente".


-MODOS DE DIRECCIONAMIENTO-
Una parte importante en la programación es el de entender las formas de direccionamiento para las localidades de memoria que contienen los datos que se procesan como instrucciones, la CPU Z80 tiene 10 modos diferentes para direccionar los datos almacenados en la memoria y en los registros:

Implícito o inherente
Inmediato
Inmediato extendido
Registro
Registro indirecto
Extendido
Página cero modificada
Relativo
Indexado
Bit


-DIRECCIONAMIENTO IMPLÍCITO O INHERENTE-
Este modo de direccionamiento se refiere a operaciones en donde el código operacional implica automáticamente a uno o más registros de la CPU, el código operacional es fijo y no tiene campos variables de tal forma que la instrucción siempre ejecuta la misma operación.

Ejemplos de este modo de direccionamiento son las instrucciones CPL y RRA.

El código operacional de CPL es 2Fh, ésta instrucción toma el contenido del acumulador, lo complementa a uno, cambia los ceros por unos y los unos por ceros, y deposita el resultado en el acumulador, las bandeas de condiciones no se afectan, la fuente y el destino siempre son fijos;
 



-DIRECCIONAMIENTO INMEDIATO-
Este modo no constituye un direccionamiento propiamente dicho, pues aquí la instrucción no contiene ninguna dirección, en su lugar figura un operando sobre el cual se realiza la operación que indica la instrucción, no hay necesidad del ciclo de memoria (ejecute) de ejecución, una denominación más precisa es la de operando inmediato.

Una instrucción con direccionamiento inmediato es la que contiene en el byte 2 o en el byte 3 de la propia instrucción en el dato de la transferencia, es decir, el dato es parte integral de los bytes que constituyen la instrucción.
 

OP-CODE <----- uno o más bytes
OPERANDO  

Este tipo de direccionamiento es útil al cargar o efectuar una operación aritmética o lógica con un dato constante.

Ejemplo:  Para cargar 07h en el acumulador se utiliza la instrucción LD A,N
 

x 3E LD A,N
x + 1 N A ß 07h
 
El código operacional de la instrucción es 3Eh y el segundo byte es el dato que se va a cargar en el acumulador, en este caso N = 07h, los movimientos que realiza el CPU Z80 son los siguientes:
  1. El contenido de la localidad op-code que apunta el contador del programa (PC) se carga en el registro de instrucciones IR y se incrementa el PC en uno.

  2.  
  3. La unidad de control ordena, después de decodificar la instrucción que el contenido de la localidad (dato inmediato u operando) que apunta el PC se cargue en el registro "r" indicado por el código de la instrucción, el PC se incrementa en uno y apunta a la próxima instrucción a ejecutarse.
En general este tipo de direccionamiento lo utilizan las instrucciones aritméticas y lógicas de 8 bits, ejemplo de estas son: ADD N, XOR N, AND N, etc.


 -DIRECCIONAMIENTO INMEDIATO EXTENDIDO-
Este modo de direccionamiento como su nombre lo indica es una extensión del Direccionamiento Inmediato, este tipo de direccionamiento permite cargar con un dato de 16 bits a un registro par y obtiene la dirección donde continua el procesamiento en forma inmediata.
 
x
OP-CODE
x + 1
BYTE BAJO
x + 2
BYTE ALTO
 
Este modo de direccionamiento lo utilizan las instrucciones del grupo "cargar 16 bits" y del grupo de instrucciones "saltos, llamadas y regresos", (JP, CALL y RET).

El primero de los dos bytes del dato o de la dirección contiene los bits menos significativos (LSB) y el segundo byte contiene los bits más significativos (MSB).

Ejemplo:

X
01
 
x + 1
68
NN = 7968
x + 2
79
 

Los movimientos de esta instrucción son los siguientes:

  1. El contenido de la localidad "x" apuntada por el contador de programa (PC) se carga en el registro de instrucciones IR y se incrementa el contador de programa, (PC ß PC + 1)

  2.  
  3. La unidad de control después de decodificar la instrucción ordena que el contenido de la localidad "x + 1" apuntada por el PC se cargue en el registro B, y se incrementa el contador de programa ( PC ß PC + 1)

  4.  
  5. La unidad de control ordena que el contenido apuntado por el PC se cargue en el registro C, se incrementa el contador de programa, (PC ß PC + 1) y el PC apunta a la siguiente instrucción a ejecutarse.
 
-DIRECCIONAMIENTO DE REGISTRO-
Muchas instrucciones utilizan los registros del Z80 para recibir o proporcionar un dato, el código de la instrucción tiene un campo que se usa para especificar el ó los registros que se utilizan en la ejecución de la instrucción.

Ejemplo: LD r,s

Esta instrucción ordena que el contenido del registro "s" se deposite en el registro "r".

"r" y "s" pueden ser cualquiera de los registros activos o primarios de 8 bits de la CPU Z80, el movimiento de la información de esta instrucción es:
  1. El contenido de la localidad apuntada por el PC se deposita en el registro de instrucciones IR, la unidad de control ordena copiar en el registro r el contenido del registro s, PC ß PC + 1, y el contador de programa apunta a la siguiente instrucción a ejecutarse.
Los grupos de instrucciones que utilizan este tipo de direccionamiento de registro, son los de aritmética y lógica de 8 bits y de 16 bits como son:
  1. Rotar
  2. Girar
  3. Poner en uno
  4. Poner en cero y
  5. Probar bits

 -DIRECCIONAMIENTO DE REGISTRO INDIRECTO-
Este tipo de direccionamiento utiliza el contenido de un registro par, como la dirección de una localidad de memoria, los registros pares son BC, DE y HL, en donde los registros B, D y H contienen los bits menos significativos, el código operacional de la instrucción puede ser de uno o de dos bytes:

Ejemplo: LD r, (HL)

Los movimientos de esta instrucción son:

El contenido de la localidad que contiene el código operacional, al cual apunta el contador de programa PC, se deposita en el registro de instrucciones IR y se incrementa el contador de programa. PC ß PC + 1.

La unidad de control envía los 16 bits del registro par HL por el bus de direcciones, lee el contenido de la localidad con esta dirección y deposita su contenido sobre el registro r.

Este tipo de direccionamiento permite apuntar a cualquier localidad de memoria, antes de usar instrucciones que utilicen este tipo de direccionamiento se debe cargar el registro par con el valor de la dirección requerida.


-DIRECCIONAMIENTO EXTENDIDO-
En este tipo de direccionamiento la dirección de la palabra de instrucción contiene la dirección eficaz de la memoria, este es, las instrucciones que utilizan direccionamiento extendido proporcionan los 16 bits de la dirección eficaz de la memoria, el campo de la dirección eficaz contiene un operando, con este modo de direccionamiento se pueden accesar directamente todas las localidades de memoria desde 0000h hasta FFFFh, el primer byte contiene los 8 bits menos significativos (LSB) de la dirección eficaz y el segundo byte contiene los 8 bits más significativos (MSB) de la dirección eficaz.

Ejemplo: LD A,(1580h)
 

OP - CODE ß 3A
LSB ß 80
MSB ß 15
 
Los movimientos que se producen son los siguientes:
  1. La localidad apuntada por el contador de programa PC contiene el código operacional, este se deposita en el registro de instrucciones IR, el contador de programa se incrementa. PC ß PC+ 1.

  2.  
  3. La unidad de control ordena que el contenido de la localidad (dirección LSB) se deposite en un registro temporal, y se incrementa el contador de programa PCß PC + 1.

  4.  
  5. La unidad de control ordena que el contenido de la localidad (dirección MSB) se deposite en otro registro temporal, y se incrementa el contador de programa PC ß PC + 1.

  6.  
  7. La unidad de control envía por el bus de direcciones la dirección recién leída de 16 bits, lee el contenido de la localidad de memoria de esa dirección y deposita el operando en el acumulador.
 Con este tipo de direccionamiento se pueden hacer transferencias de datos de 16 bits, LD (1580h), HL


-DIRECCIONAMIENTO DE PAGINA ZERO MODIFICADA-
Este tipo de direccionamiento se usa únicamente con la instrucción RESTAR (RST), esta instrucción causa que el procedimiento del programa continúe en una de ocho localidades posibles y bien especificadas de la pagina zero.

La pagina zero se define como área de menor memoria que se puede accesar con 8 bits del bus de direcciones, esto es las 256 localidades obtenidas con ocho combinaciones posibles, desde la 00h hasta la FFh, todas estas direcciones constituyen la pagina zero.

El código operacional de "RST" m" se encuentra como sigue:
 

11xxx111
RST m
Localidad
m
0000
0
0008
1
0010
2
0018
3
0020
4
0028
5
0030
6
0038
7
 
Las direcciones especificas de la pagina zero se obtienen al multiplicar por 8 el valor binario de la variable m, por ejemplo si m = 2 la dirección es 10h.
 
RST m
OP-CODE
RST 0
C7
RST 8
CF
RST 10
D7
RST 18
DF
RST 20
E7
RST 28
EF
RST 30
F7
RST 38
FF
 

-DIRECCIONAMIENTO RELATIVO-
En el direccionamiento relativo a la dirección proporcionada por el registro de instrucciones se le añade una dirección de referencia, normalmente esta dirección de referencia es el contador de programa PC, es posible obtener dos modos diferentes de direccionamiento relativo :

1).- Relativo hacia adelante
2).- Relativo hacia atrás
 

En las direcciones de salto, este tipo de direccionamientos permite reducir el numero de bytes para especificar la dirección y reducir así el largo del programa, se usa el byte que sigue al código operacional relativo para especificar un desplazamiento a partir del valor actual del contador de "programa más dos", el resultado de la operación es una dirección a la cual el programa salta para continuar el procesamiento en esta nueva dirección.

El direccionamiento relativo permite el acceso a 256 localidades alrededor de la dirección de la siguiente instrucción, el valor del operando es un valor con signo entre +128 y -127, tomando como punto de partida del desplazamiento a la localidad de memoria donde esta la siguiente instrucción:
 

El direccionamiento relativo se usa en la CPU Z80 únicamente con el grupo de instrucciones de salto, permitiendo saltos condicionales o incondicionales que se obtienen de la resta o la suma respectivamente, del contador de programa actual más el operando.


-DIRECCIONAMIENTO DE BIT-
La CPU Z80 tiene instrucciones que permiten probar, poner en cero y poner en uno a los bits de un operando:
1. BIT b, r
2. RES b, r
3. SET b, r

Estas instrucciones efectúan operaciones a nivel de bits sobre los contenidos de las localidades de memoria o los registros de la CPU Z80 seleccionados por medio de uno de tres tipos de direccionamiento, de registro, de registro indirecto e indexado, con tres bits del código operacional se especifica cual de los 8 bits del operando es el involucrado.

Ejemplo:  SET b, r

En donde "b" puede ser cualquier numero del 0h al 7h y "r" es cualquier registro primario, acumulador, registro par HL o registro de índice IX o IY.
 

CAMPO b
 
BIT =1
000
xxxx xxx1
001
 
xxxx xx1x
010
 
xxxx x1xx 
011
 
xxxx 1xxx
100
 
xxx1 xxxx
101
 
xx1x xxxx
110
 
x1xx xxxx
111
 
1xxx xxxx

Ejemplo:   SET 5, B

El bit "5" del registro B toma el valor de "1" los otros siete bits no sufren alteración alguna, en este caso se esta usando direccionamiento de registro.

1000 1000 antes (B) ß 88
1010 1000 después (B) ß A8


-DIRECCIONAMIENTO INDEXADO-
Con este modo se obtiene la dirección efectiva haciendo la suma de:

1. El contenido de un registro especial del Z80 denominado "registro de índice".

2. El registro de índice se suma con el operando que proporciona la instrucción.

La indexación permite tratar bucles durante un programa, si se dispone de varios registros de índice se pueden añadir varios bucles, normalmente el registro de índice se incrementa por software después de cada operación.

Las instrucciones que utilizan direccionamientos indexado usan byte que sigue al código operacional para especificar el desplazamiento que suma a uno de los dos registros de índice del Z80, para formar la dirección efectiva de la memoria, el contenido del registro de índice no se altera.

Ejemplo:
 

REGISTRO DE INDICE + OPERANDO = DIRECCION EFICAZ

1200h + 08h = 1208h

Los movimientos son:

1. El contenido de la localidad 1000h apuntada por el PC se deposita en el registro I R , PC ß PC + 1, la unidad de control reconoce que debe cargar otra vez el contenido de la localidad 1001h sobre el I R, PC ß PC + 1.

2. El código operacional en IR le ordena a la unidad de control leer en un registro temporal el contenido de la localidad apuntada por el PC, PC ß PC + 1.

3. La unidad de control envía por el bus de direcciones la dirección que resulta al sumar el registro de índice x con el contenido del registro temporal, lee el contenido de esa localidad y lo carga en el acumulador.


-DIRECCIONAMIENTO CON EL APUNTADOR DE PILA- (STACK POINTER)
El contenido de un registro por (BC, DE o HL), o el contenido del contador de programa (PC), puede transferirse a una área de memoria llamada "stack pointer" y se puede realizar la función inversa, las localidades de memoria que reciben el dato se direccionan por medio de un registro de 16 bits denominado "apuntador de pila o stack pointer", existen únicamente dos operaciones que se realizan con el apuntador de pila, cargar un dato de 16 bits en la pila de la memoria por medio de la instrucción denominada PUSH y la operación de leer un dato de 16 bits por medio de la instrucción llamada POP, es importante aclarar que las direcciones a las que se esta seleccionando con el apuntador de pila (SP) debe ser memorias de leer y escribir, esto es, memorias tipo RAM.


-OPERACION PUSH -
Un dato de 16 bits se transfiere al área de la pila de la memoria desde un registro par o desde el PC durante una operación PUSH, las direcciones del área de memoria que son accesadas durante la operación PUSH se determinan de la siguiente manera:

1.Los 8 bits mas significativos del dato se almacenan en la localidad de memoria con dirección igual al contenido actual del apuntador de pila de la memoria (SP) menos uno.

2.Los 8 bits menos significativos del dato se almacenan en la localidad de memoria con dirección igual al contenido actual del apuntador de pila de la memoria menos dos.

3. El contenido actual del apuntador de pila de la memoria se decrementa automáticamente por dos.

Por ejemplo sea:  PUSH BC

(SP) ß 13A6h, (B) ß 6A, (C) ß 30


- OPERACION POP-
Un dato de 16 bits se transfiere desde la pila de la memoria a un registro par o al contador del programa durante una operación POP.

Las direcciones del área de memoria que son accesadas durante la operación POP se determinan de la siguiente manera:

1.El segundo registro del par o los 8 bits menos significativos del contador de programa se cargan con el contenido de la localidad direccionada por el apuntador de la pila.

2.El primer registro del par o los 8 bits mas significativos del contador de programa se cargan con el contenido de la localidad direccionada por el apuntador de la pila mas uno.

3.El contenido actual de la pila se incrementa automáticamente por dos.

Ejemplo:   POP BC