UNIDAD 5 – 4 A PARTE PROGRAMANDO EN EL ENSAMBLADOR DEL Z80
Microprocesadores
1
Otoño 2011
Pila
La pila es un grupo de locaciones de memoria definidas por medio de carga una dirección al apuntador a la pila (SP)
La pila es usada para almacenar información temporal durante la ejecución del programa
En teoría, el tamaño de la pila esta restringido al tamaño de la RAM disponible
La definición de la pila se inicia cargando la dirección de inicio de la pila LD SP,16-bits
2
Pila
La pila se localiza en la memoria RAM del sistema y se utiliza como almacenamiento temporal durante la ejecucion del programa
El contenido de un par de registros se almacena en la locacion (SP-1)
La pila crece hacia arriba en la memoria, es decir en orden decreciente de las direcciones de memoria
3
Pila
La pila puede ser inicializada en cualquier lugar de la memoria de usuario.
Un buen habito es inicializar la pila a la dirección de memoria mas alta para evitar que interfiera con la memoria de datos del programa
Pagina 0 Rutinas de Inicio
Programa
Pila FFFFH 0000H
0100H
Memoria
Crecimiento de la Pila 4
Pila
La instruccion PUSH almacena el contenido de un par de registros en la pila
POP recupera la informacion de la pila
El apuntador a la pila (SP) siempre apunta al tope de la pila
El apuntador SP es decrementado o incrementado segun se almacene o recupere informacion.
5
Pila
El almacenamiento y recuperación de los bytes en la pila se realiza siguiendo un formato LIFO (Last Input First Output)
La información en la locaciones de la pila no son destruidas hasta que nueva información es almacenada
Dato 4 Dato 3 Dato 2 Dato 1 6
Instrucciones de la Pila
OPCODE OPERANDO DESCRIPCION
LD SP,16-bits Carga una dirección de 16 bits en el registro apuntador a la pila. Define la dirección de inicio de la pila
PUSH RP
Copia el contenido del par de registros o de los registros índice en la pila.
Esta instrucción primero decrementa el apuntador a la pila y copia la parte alta del registro en la locación SP-1. Después decrementa nuevamente el apuntador y almacena la parte baja del apuntador en SP-2
PUSH IX
POP RP
Copia el contenido de las dos locaciones de memoria de la parte alta de la pila hacia par de registros especificados o hacia los registros índice .
Esta instrucción copia el contenido de la pila especificado por SP dentro del registro de la parte baja (en BC, seria C) incrementa el apuntador SP + 1. Copia el contenido de SP+1 en la parte alta del registro e incrementa SP (SP + 2)
POP IX
7
Datapath del Z80
8
PUSH
21 H B
10 H C
22 H H
A2 H L A F PUSH BC
PUSH HL
PUSH AF
Memoria
21 H 10 H 22 H A2 H (A) Banderas
2400 SP
23FF 23FE 23FD 23FC 23FB
23FA SP
9
POP
21 H B
10 H C
22 H H
A2 H L A F
POP BC POP HL POP AF
Memoria
21 H 10 H 22 H A2 H (A) Banderas
2400 SP
23FF 23FE 23FD 23FC 23FB 23FA
SP 10
Manipulando Banderas
El conjunto de instrucciones del Z80 no contiene ninguna instrucción que nos permita cambiar directamente el contenido de las banderas.
Sin embargo podemos examinar y modificar las banderas por medio de la pila
Podemos obtener el contenido del registro de banderas por medio de almacenarlo en la pila y posteriormente recuperarlo en un registro de propósito general
11
Manipulando banderas
START: LD SP, STACK ; Inicializa la pila
LD DE, 0000H ; Carga 0 para limpiar el registro de banderas PUSH DE ; Almacena 0 en la pila
POP AF ; Limpia el acumulador y el registro de banderas LD A,FFH ; Carga el máximo numero en A
INC A ; Incrementa A mas allá de FFH PUSH AF ; Almacena las banderas en la pila POP DE ; Recupera las banderas LD A,E ; Copia las banderas al acumulador AND 11000001B ; Enmascara todo el registro menos S, Z y CY OUT (PORT1),A ; Despliega las banderas
HALT ; Fin del programa
12
Manipulando Banderas
La instrucción INC incrementa el contenido del acumulador de FFH a 00H sin afectar la bandera del CY
Por lo tanto el valor de las banderas será el siguiente
S Z H P/V N CY
Acumulador 0 1 0 0 0 1 0 0
AND C1H 1 1 0 0 0 0 0 1
Resultado 0 1 0 0 0 0 0 0 40H
13
Intercambio
INSTRUCCION DESCRIPCION
EXX
Intercambio el contenido de los registros de propósito general (BC,DE, HL) con el contenido de los registros alternativos correspondientes
EX AF,AF’
Intercambia el contenido del acumulador y el registro de banderas con el contenido de los registros alternativos correspondientes
EX (SP),IX EX (SP),IY EX (SP),HL
Intercambio el contenido de un registro índice o el registro HL con el contenido del tope de la pila
EX DE,HL Intercambio el contenido del registro DE con el contenido del registro HL
Intercambio
80 H
H FF H L
SP 2097 H
32H 2097 H
A2H 2098 H 2099 H Contenido de los registros Contenido de la Pila
EX (SP),HL
A2 H
H 32 H L
SP 2097 H
FF H 2097 H
80 H 2098 H 2099 H Contenido de los registros Contenido de la Pila
Subrutinas
La subrutina consiste en un grupo de instrucciones escritas fuera del programa principal para desempeñar una función especifica
Las funciones que se realizan repetidamente en el en el programa principal son candidatas para subrutinas
Retardos. Los retardos pueden ser requeridos en diferentes partes del programa
Máximo, encontrar el numero máximo dentro de una secuencia
Subrutina
Cuando una subrutina es llamada, el contenido del program counter es guardado en el stack y la ejecuciones transferida a la subrutina
LD B, C CALL DELAY
CP (HL)
XOR A 2050H 2051H 2054H
2070H PC PC PC
20 H 54 H SP
PC
RET
Subrutina DELAY
Subrutina
Cuando la instrucción de regreso de la subrutina es ejecutada, la dirección previamente guardada en el stack es recuperada.
Continua con la ejecución del programa principal
LD B, C CALL DELAY
CP (HL)
XOR A 2050H 2051H 2054H
2070H
20 H 54 H SP
RET 2080H PC PC PC
Subrutina DELAY
Subrutina
OPCODE OPERANDO BYTES DESCRIPCION
CALL 16-bits 3
Llama a la subrutina localizada en la dirección de memoria especificada por el operando de 16-bits.
Esta instrucción almacena la dirección de la siguiente instrucción en la pila y transfiere la ejecución del programa a la dirección de la subrutina
RET 1
Regresa de la subrutina.
Esta instrucción obtiene la dirección de regreso del tope de la pila y transfiere la ejecución del programa de regreso al programa que realizo el llamado
19
Subrutina
OPCODE OPERANDO DESCRIPCION
CALL Z,16-bits Llama a la subrutina si Z =1 CALL NZ,16-bits Llama a la subrutina si Z =0 CALL C,16-bits Llama a la subrutina si CY =1 CALL NC,16-bits Llama a la subrutina si CY =0 CALL M,16-bits Llama a la subrutina si S =1 (Negativo) CALL P,16-bits Llama a la subrutina si S =0 (Positivo) CALL PE,16-bits Llama a la subrutina si P/V =1 (Par) CALL PO,16-bits Llama a la subrutina si P/V =0 (Impar)
20
Subrutina
OPCODE OPERANDO DESCRIPCION
RET Z Regresa de la subrutina si Z =1 RET NZ Regresa de la subrutina si Z =0 RET C Regresa de la subrutina si CY =1 RET NC Regresa de la subrutina si CY =0 RET M Regresa de la subrutina si S =1
(Negativo)
RET P Regresa de la subrutina si S =0 (Positivo)
RET PE Regresa de la subrutina si P/V =1 (Par) RET PO Regresa de la subrutina si P/V =0
(Impar)
21
Subrutina
Mnemónico HEX CODE
Dirección de Memoria
LD SP,1895H 31 1800
95 1801
18 1802
CALL 1850H CD 1825
50 1826
18 1827
Siguiente Instr. 1828
HALT 76 1840
22
1893 28
1894 18
1895 XX
1850 Subrutina
1865 RET
SP
Reinicio
Esta instrucción transfiere la ejecución del programa a una locación especifica en la pagina 00.
El operando especifica la parta baja de la dirección
Este tipo de direccionamiento es conocido como Modo de Direccionamiento Modificado de la Pagina Cero.
Ninguna Bandera es afectada
23
Reinicio
OPCODE OPERANDO DESCRIPCION
RST 00H • Esta instrucción transfiere la ejecución del programa a una locación especifica en la pagina 00H.
• El operando especifica la parta baja de la dirección
• Este tipo de direccionamiento es conocido como Modo de Direccionamiento Modificado de la Pagina Cero.
• Ninguna Bandera es afectada
RST 08H
RST 10H
RST 18H
RST 20H
RST 28H
RST 30H
RST 38H
24
Ejemplo
El siguiente programa realiza el control de un semáforo y dos señales para peatones
El flujo del trafico y de los peatones es en la misma dirección.
Por lo tanto, los peatones pueden cruzar solo si la luz verde esta encendida
Las señales son encendidas y apagadas por los siguientes bits
25
Señales Bits Tiempo
Verde D0 15 segundos
Amarilla D2 5 segundos
Roja D4 20 segundos
Caminar D6 15 segundos
No Caminar D7 25 segundos
Ejemplo
Secuencia de tiempo en
segundos No Caminar Caminar jooR Amarillo Verde Hex Code
D7 D6 D5 D4 D3 D2 D1 D0
0
(15) 0 1 0 0 0 0 0 1 41H
15
(5) 1 0 0 0 0 1 0 0 84H
20
(20) 1 0 0 1 0 0 0 0 90H
40 26
Subrutina Retardo
DELAY: ; Esta subrutina realiza un retardo de 0.5 seg. El retardo es repetido el
; numero de veces indicado en B.
; Entrada: Numero de veces a repetir el retardo especificado en B
; Salida: Ninguna
; Registros Modificados: B
PUSH DE ; guarda el contenido de DE y AF PUSH AF
WAIT: LD DE, COUNT ; Carga DE para realizar el retardo 0.5 seg LOOP: DEC DE
LD A,D ; Coloca D en A para checar banderas OR E ; Prende bandera del cero si D=E=0 JP NZ,LOOP ; Repite hasta si DE >0
DEC B ; Decrementa B
JR NZ,WAIT ; Si el retardo es suficiente termina POP AF ; Restablece el valor de DE y AF POP DE
RET 27
Ejemplo
28
LD SP,STACK ; Inicializa el Stack Pointer
START: LD A,01000001B ; Carga el patron de bits para encender el verde OUT (PORT1), A ; Enciende las senales apropiadas LD B,30 ; Realiza el retardo de 15 seg por medio CALL DELAY ; de la subrutina DELAY
LD A,10000100B ; Carga el patron correspondiente a la luz amarilla OUT (PORT1), A ; Enciende las luces
LD B,10 ; Realiza el retardo de 5 segundos
CALL DELAY ;
LD A,10010000B ; Carga el patron correspondiente a la luz roja OUT (PORT1), A ; enciende las senales correspondientes LD B,40 ; realiza el retardo de 20 segundos CALL DELAY
JP START ; Inicia el proceso nuevamente
Multiples llamado a subrutina
29
Dirección Programa Principal XX00
01
09 CALL DELAY 0C
12 CALL DELAY 15
1B CALL DELAY 1E
Dirección Subrutina XX50 PUSH DE PUSH AF
DELAY
POP AF POP DE
61 RET
Subrutinas Anidadas
30
Dirección Programa Principal 2000
2050 CALL
2051 90
2052 20
Dirección Subrutina 1 2090
209A CALL 209B C2 209C 20 209D
RET
Dirección Subrutina 2 20C2
209A 209B 209C 209D
RET
Ejemplo
Este programa implementa un contador de BCD
La cuenta es desplegada en un LED de 7 segmentos
El programa realiza las siguientes acciones
Ajusta el numero binario a un numero decimal por medio de la instrucción DAA
Busca dentro de una tabla el código asociado a los siete segmentos
Utiliza diversas subrutinas
31
BCD a 7 segmentos
32
1 0 1 1
1 1 1 w 0 a
1 b
0 1 1 1
1 0 1 1 0 1 0
0 w 1
0 1 1 0
0 w 2
0 0 0 0
1 w 3
0 0 0 0
0
c
1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1
1 0 0 1
1 1 1 1
0 1 1 0
1 1 1 1
1 1 1
0 1 1 1 d
0 1 0
0 1 0 e
1 0 1 1
1 0 1
0 0 1
0 0 0 1 f
1 0 0
1 1 1 g
1 0 1 1
1 1 1
1 0 1
Look-up Table c
e a
g b f
d
7-segment display
DAA
(DAA) Decimal Adjust Accumulator
Después de una operación aritmética, esta instrucción ajusta un numero de 8 bits en el acumulador en un numero empaquetado BCD
Esta instrucción usa las banderas H (Half Carry) y CY (Carry) internamente para ajustar el resultado a dos dígitos BCD
Ajusta el resultado de un suma o resta BCD
No convierte un numero binario a BCD
33
Contador BCD
34
UPDATE: ; Esta subrutina actualiza la cuenta BCD y ajusta el numero BCD. Cuando el
; contador llegue a 60, reinicia el contador
; Entrada: Cuenta en B
; Salida: Cuenta actualizada y ajustada a BCD en B
; Registros Modificados: B y el acumulador LD A,B ; obtiene la ultima cuenta ADD A,01H ; Actualiza la cuenta
DAA ; Ajusta el numero a BCD
LD B,A ; Guarda la cuenta en B
CP 60 ; Es la cuenta = 60
RET NZ ; Si no lo es regresa al programa principal LD B,00H ; Reinicia el contador
RET
Retardo
DELAY: ; Esta subrutina realiza un retardo de 1 seg.
; Entrada/Salida: Ninguna
; Registros Modificados: Ninguno
PUSH DE ; guarda el contenido de DE, BC y AF PUSH AF
PUSH BC LD B,10
WAIT: LD DE, COUNT ; Carga DE para realizar el retardo 100 µs LOOP: DEC DE
LD A,D ; Coloca D en A para checar banderas OR E ; Prende bandera del cero si D=E=0 JP NZ,LOOP ; Repite hasta si DE >0
DEC B ; Decrementa B
JR NZ,WAIT ; Si el retardo es suficiente termina POP BC
POP DE ; Restablece el valor de DE y AF POP AF
35
Despliega digtos BCD en 7 segmentos
2000 7E H 0
2001 30 H 1
2002 6D H 2
2003 79 H 3
2004 33 H 4
2005 5B H 5
2006 5F H 6
2007 70 H 7
2008 7F H 8
2009 7B H 9
36
Código 1 5
Codigo BCD Empaquetado
1 5
Obtener la parte baja 0001 0101 0000 1111 AND
0 5
Obtener la parte alta
1 5
SRL A
0001 0101 0000 1010 0000 0101 0000 0010 0000 0001 SRL A
SRL A SRL A
Despliega digtos BCD en 7 segmentos
2000 7E H 2001 30 H 2002 6D H 2003 79 H 2004 33 H 2005 5B H 2006 5F H 2007 70 H 2008 7F H 2009 7B H 37
Codigo 1 5
Código BCD Empaquetado
01 05
BCD desempaquetado
HL HL +1
HL + 5 HL 2000
H 20 00 L
L 00 01 L 01
L 00 05 L 05
HL 2001 HL 2005
Desempaqueta
UNPACK: ; Esta subrutina desempaqueta el numero BCD almacenado en el acumulador
; y los almacena en direcciones continuas empezando en BUFF
; Entrada: Numero BCD empaquetado en B
; Salida: BCD1 y BCD2 en el buffer BUFF
; Registros Modificados: Acumulador, HL
LD HL, BUFF1 ; apunta HL al buffer BUFF LD A, B ; Obtiene el numero en BCD empaquetado AND 0FH ; Enmascara la parte alta LD (HL),A ; Almacena el digito menos significativo INC HL ; Incrementa el apuntador LD A,B ; Obtiene el numero BCD empaquetado SRL A ; Shift el digito mas significativo a la parte SRL A ; baja del acumulador
SRL A SRL A
LD (HL), A ; Almacena el digito mas significativo RET
38
Búsqueda
LOOKUP: ; Esta subrutina toma un digito BCD desempaquetado, actualiza el
; apuntador y obtiene el código correspondiente
; Entrada: Digito BCD Desempaquetado en el acumulador
; Salida: Código de 7-segmentos en el acumulador
; Registros Modificados: Acumulador
PUSH HL ; guarda el contenido de HL LD HL,CODE ; apunto a la tabla del código 7-segmentos ADD A,L ; Suma al apuntador el digito a ser desplegado LD L,A ; Actualiza el apuntador
LD A, (HL) ; Obtén el código
POP HL ; Restablece HL
RET
CODE: DEFB 7EH, 30H, 6DH, 79H ; Código para 0, 1, 2, 3 DEFB 33H, 5BH, 5FH, 70H ; 4, 5, 6, 7 DEFB 7FH, 7BH ; 8, 9 39
Despliega
DISPLAY: ; Esta obtiene digitos BCD del buffer de salida, llama a la subrutina
; LOOKUP y despliega el digito al puerto de salida apropiado
; Entrada: Apuntador al buffer en HL
; Salida: Ninguna
; Registros Modificados: HL
; Subrutinas llamadas: LOOKUP
LD A,(HL) ; Obtiene el segundo digito CALL LOOKUP ; Obtiene el código 7-segmentos OUT (PORT2), A ; Despliega el código DEC HL ; Decrementa el apuntador LD A, (HL) ; Obtiene el segundo digito CALL LOOKUP ; Obtiene el código 7-segmentos OUT (PORT1), A ; Despliega el código RET
40
Programa Principal
STACK: EQU 1900H BUFF: EQU 1901H ORG 1800H
MAIN: LD SP, STACK ; Inicializa el stack LD B, 00H ; Inicializa el contador a 00H
NEXT: CALL UNPACK ; Desempaqueta el numero BCD y almacena en BUFF CALL DISPLAY ; Despliega los dígitos BCD en el puerto apropiado CALL DELAY ; Espera por 1 segundo
CALL UPDATE ; Actualiza la cuenta JP NEXT ; continua 41
Ejercicio
Escriba un programa que realice la conversión de un número en BCD a binario
Use la subrutina unpack para desempaquetar el número
Escriba una subrutina que realice la conversión de BCD a binario.
Escriba el programa principal
42
1 2 0000 1100
0001 0010 00000001 00000010
00001010 00000010 10
00001100
BCD a Binario
BCDBIN: ; Esta subrutina convierte un numero desempaquetado BCD en binario
; El digito menos significativo esta en BUFF y el mas significativo en BUFF+1
; Entrada: Numero BCD desempaquetado en BUFF y BUFF+1
; Salida: Numero binario en el acumulador A
; Registros Modificados: HL, A PUSH DE
LD HL,BUFF INC HL LD D,(HL) LD E,10 XOR A SUM: ADD A,D
DEC E JR NZ,SUM DEC HL ADD A,(HL) POP DE RET 43
Hitachi HD44780
Pantalla de Cristal Liquido LCDII con controlador incluido HDD44780
Esta pantalla tiene una variedad de
configuraciones como son 8X1 (8 caracteres por 1 renglón), 16X2, 20X2,20X4
44
Configuración de Terminales
1.
Ground
2.
VCC (+3.3 to +5V)
3.
Contrast adjustment (VO)
4.
Register Select (RS). RS=0:
Command, RS=1: Data
5.
Read/Write (R/W).
R/W=0: Write, R/W=1:
Read
6.
Clock (Enable). Falling edge triggered
7.
Bit 0
(Not used in 4-bit operation) 8.Bit 1
(Not used in 4-bit operation) 9.Bit 2
(Not used in 4-bit operation) 10.Bit 3
(Not used in 4-bit operation) 11.Bit 4
12.
Bit 5
13.
Bit 6
14.
Bit 7
15.
Backlight Anode (+)
16.
Backlight Cathode (-)
45
Rutina de Inicialización
Encender LCD
Esperar 1.5 ms después de que Vdd llega a 4.5V
Enviar código de
INICIO
00011XXXX BF no puede
probarse en este punto
Repetir código de
INICIO
Esperar por mas de 4.1 ms
Repetir código de
INICIO
El código de inicio indica que la
interfaz se establece a 8 bits
Esperar 100s
Inicializar
LCD Apagar y prender
el display Limpiar pantalla Establecer modo de Escritura 46
Comunicándose con LCD
LCD tiene un bus de datos de 8 bits (pin 7- 14) por el cual se transfiere el código ASCII a escribirse
Se utilizan 3 señales de control:
Selección de Registro (RS)
Escritura/Lectura (R/W)
Habilitación de Reloj
Selección
de Registro RS = 0, setup RS = 1, dato
Escritura RW = 1
Habilita intercambio CE = 1
Envió de datos
Envió de código ASCII Deshabilita Intercambio CE = 0 47
1. RS=0: Instrucción, RS=1: Dato 2. R/W=0: Escritura, R/W=1: Lectura 3. CE = 1 habilita, CE = 0, deshabilitado
Instrucciones
R/S R/W D7 D6 D5 D4 D3 D2 D1 D0 INSTRUCTION 4 5 14 13 12 11 10 9 8 7 PINS 0 0 0 0 0 0 0 0 0 1 Limpia pantalla 0 0 0 0 0 0 0 0 1 * Regresa el cursor al inicio de la
pantalla
0 0 0 0 0 0 0 1 ID S Indica la dirección de movimiento del cursor
0 0 0 0 0 0 1 D C B Habilita el display/cursor 0 0 0 0 0 1 SC RL * * Mueve el cursor/ Corre el display 0 0 0 0 1 DL N F * * Establece la longitud del display 1 0 D D D D D D D D Escribe un caracter en la posición actual
del cursor
1 1 D D D D D D D D Lee el caracter en la posición actual del cursor
48
Interfaz
49