-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:
-
Transferencia de información
-
Operaciones aritméticas
-
Operaciones lógicas
-
Subrutinas
-
Entradas y salidas
-
Incrementar y decrementar bytes
-
Realizar saltos
-
Comprobar, poner en uno o en cero a los bits
-
Realizar ajustes a BCD
-
Ejecutar interrupciones
-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-
-
Es muy difícil para el programador entender o depurar los programas.
-
El proceso de cargar el programa en la computadora es muy lento ya que
se tiene que alimentar bit por bit.
-
El programa no describe la tarea que realiza de una forma fácil
de entender para el usuario.
-
Los programas largos son cansados en su elaboración.
-
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.
-
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:
-
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.
-
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:
-
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)
-
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)
-
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 ß registro destino
S ß registro fuente
"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:
-
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:
-
Rotar
-
Girar
-
Poner en uno
-
Poner en cero y
-
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:
-
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.
-
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.
-
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.
-
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
antes
después
1303 FF
1303 FF ß SP
1304 FF
1304 30 ß C
1305 FF
1305 6A ß B
1306 FF ß SP
1306 FF
1307 FF
1307 FF
- 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
antes
después
1507 FF
1507 FF
1508 33 ß SP
1508 33
1509 0C
1509 0C
150A FF
150A FF ß SP
150B FF
150B FF
(B) ß 6A
(B) ß 0C
(C) ß 30
(C) ß 33