Sunteți pe pagina 1din 9

08/11/2011

Pila
2

 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
UNIDAD 5 – 4A PARTE  En teoría, el tamaño de la pila esta restringido al
tamaño de la RAM disponible
PROGRAMANDO EN EL
 La definición de la pila se inicia cargando la
ENSAMBLADOR DEL Z80 dirección de inicio de la pila LD SP,16-bits
Otoño 2011 Microprocesadores

Pila Pila
3 4

Memoria
 La pila se localiza en la memoria RAM del sistema  La pila puede ser
0000H
y se utiliza como almacenamiento temporal durante inicializada en Pagina 0
Rutinas de Inicio
la ejecucion del programa cualquier lugar de la
0100H
memoria de usuario. Programa

 El contenido de un par de registros se almacena en  Un buen habito es


la locacion (SP-1) inicializar la pila a la
dirección de memoria Crecimiento
mas alta para evitar de la Pila
 La pila crece hacia arriba en la memoria, es decir que interfiera con la
en orden decreciente de las direcciones de memoria de datos del
Pila
FFFFH
memoria programa

Pila Pila
5 6

 La instruccion PUSH almacena el contenido de un par  El almacenamiento y


de registros en la pila recuperación de los
bytes en la pila se
realiza siguiendo un Dato 4
 POP recupera la informacion de la pila
formato LIFO (Last Input
Dato 3
First Output)
 El apuntador a la pila (SP) siempre apunta al tope de  La información en la Dato 2
la pila locaciones de la pila no Dato 1
son destruidas hasta que
 El apuntador SP es decrementado o incrementado nueva información es
segun se almacene o recupere informacion. almacenada

1
08/11/2011

Instrucciones de la Pila Datapath del Z80


7 8

OPCODE OPERANDO DESCRIPCION


Carga una dirección de 16 bits en el registro apuntador a
LD SP,16-bits
la pila. Define la dirección de inicio de la pila
Copia el contenido del par de registros o de los registros
PUSH RP í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
PUSH IX decrementa nuevamente el apuntador y almacena la parte
baja del apuntador en SP-2
Copia el contenido de las dos locaciones de memoria de la
POP RP 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)
POP IX incrementa el apuntador SP + 1. Copia el contenido de
SP+1 en la parte alta del registro e incrementa SP (SP + 2)

PUSH POP
9 10
Memoria Memoria
B 21 H A
PUSH BC POP AF
C 10 H F

H 22 H H 22 H
PUSH HL POP HL
L A2 H L A2 H

A B 21 H
PUSH AF POP BC
F C 10 H
Banderas 23FA SP Banderas 23FA SP
(A) 23FB (A) 23FB
A2 H 23FC A2 H 23FC
22 H 23FD 22 H 23FD
10 H 23FE 10 H 23FE
21 H 23FF 21 H 23FF
2400 SP 2400 SP

Manipulando Banderas Manipulando banderas


11 12

 El conjunto de instrucciones del Z80 no contiene START: LD SP, STACK ; Inicializa la pila
ninguna instrucción que nos permita cambiar LD DE, 0000H ; Carga 0 para limpiar el registro de banderas
directamente el contenido de las banderas. PUSH DE ; Almacena 0 en la pila
POP AF ; Limpia el acumulador y el registro de banderas
 Sin embargo podemos examinar y modificar las LD A,FFH ; Carga el máximo numero en A
banderas por medio de la pila INC A ; Incrementa A mas allá de FFH

 Podemos obtener el contenido del registro de PUSH AF ; Almacena las banderas en la pila
POP DE ; Recupera las banderas
banderas por medio de almacenarlo en la pila y
LD A,E ; Copia las banderas al acumulador
posteriormente recuperarlo en un registro de AND 11000001B ; Enmascara todo el registro menos S, Z y CY
propósito general OUT (PORT1),A ; Despliega las banderas
HALT ; Fin del programa

2
08/11/2011

Manipulando Banderas Intercambio


13

 La instrucción INC incrementa el contenido del INSTRUCCION DESCRIPCION


acumulador de FFH a 00H sin afectar la bandera Intercambio el contenido de los registros de propósito
EXX general (BC,DE, HL) con el contenido de los registros
del CY alternativos correspondientes
 Por lo tanto el valor de las banderas será el Intercambia el contenido del acumulador y el registro de
siguiente EX AF,AF’ banderas con el contenido de los registros alternativos
correspondientes
EX (SP),IX
S Z H P/V N CY Intercambio el contenido de un registro índice o el registro HL
EX (SP),IY
Acumulador 0 1 0 0 0 1 0 0 con el contenido del tope de la pila
EX (SP),HL
AND C1H 1 1 0 0 0 0 0 1 Intercambio el contenido del registro DE con el contenido del
EX DE,HL
registro HL
Resultado 0 1 0 0 0 0 0 0 40H

Intercambio Subrutinas

Contenido de los registros Contenido de la Pila


 La subrutina consiste en un grupo de instrucciones
escritas fuera del programa principal para
H 80 H FF H L 2097 H 32H
desempeñar una función especifica
SP 2097 H 2098 H A2H
2099 H  Las funciones que se realizan repetidamente en el
en el programa principal son candidatas para
subrutinas
EX (SP),HL  Retardos. Los retardos pueden ser requeridos en
diferentes partes del programa
Contenido de los registros Contenido de la Pila  Máximo, encontrar el numero máximo dentro de una
H A2 H 32 H L 2097 H FF H secuencia
2098 H 80 H
SP 2097 H
2099 H

Subrutina Subrutina
 Cuando una subrutina es llamada, el contenido del  Cuando la instrucción de regreso de la subrutina es ejecutada,
program counter es guardado en el stack y la la dirección previamente guardada en el stack es recuperada.
ejecuciones transferida a la subrutina  Continua con la ejecución del programa principal

2050H LD B, C SP 20 H
PC 2050H LD B, C
SP 20 H CALL DELAY
PC CALL DELAY
2051H 54 H
2051H 54 H
PC 2054H CP (HL)
PC 2054H CP (HL)

PC 2070H XOR A
PC 2070H XOR A Subrutina
Subrutina
DELAY
DELAY PC 2080H RET
RET

3
08/11/2011

Subrutina Subrutina
19 20

OPCODE OPERANDO BYTES DESCRIPCION OPCODE OPERANDO DESCRIPCION


Llama a la subrutina localizada en la
dirección de memoria especificada por el
CALL Z,16-bits Llama a la subrutina si Z =1
operando de 16-bits. CALL NZ,16-bits Llama a la subrutina si Z =0
CALL 16-bits 3 Esta instrucción almacena la dirección de la
siguiente instrucción en la pila y transfiere
CALL C,16-bits Llama a la subrutina si CY =1
la ejecución del programa a la dirección CALL NC,16-bits Llama a la subrutina si CY =0
de la subrutina
CALL M,16-bits Llama a la subrutina si S =1 (Negativo)
Regresa de la subrutina.
Esta instrucción obtiene la dirección de CALL P,16-bits Llama a la subrutina si S =0 (Positivo)
RET 1 regreso del tope de la pila y transfiere la CALL PE,16-bits Llama a la subrutina si P/V =1 (Par)
ejecución del programa de regreso al
programa que realizo el llamado CALL PO,16-bits Llama a la subrutina si P/V =0 (Impar)

Subrutina Subrutina
21 22

OPCODE OPERANDO DESCRIPCION HEX Dirección de


Mnemónico SP 1893 28
RET Z Regresa de la subrutina si Z =1 CODE Memoria
LD SP,1895H 31 1800 1894 18
RET NZ Regresa de la subrutina si Z =0 1895 XX
95 1801
RET C Regresa de la subrutina si CY =1 18 1802
RET NC Regresa de la subrutina si CY =0
Regresa de la subrutina si S =1 CALL 1850H CD 1825
RET M
(Negativo) 50 1826
18 1827 1850 Subrutina
Regresa de la subrutina si S =0
RET P Siguiente Instr. 1828
(Positivo)
1865 RET
RET PE Regresa de la subrutina si P/V =1 (Par) HALT 76 1840
Regresa de la subrutina si P/V =0
RET PO
(Impar)

Reinicio Reinicio
23 24

 Esta instrucción transfiere la ejecución del programa OPCODE OPERANDO DESCRIPCION


a una locación especifica en la pagina 00. RST 00H • Esta instrucción transfiere la ejecución del
 El operando especifica la parta baja de la RST 08H programa a una locación especifica en la
dirección pagina 00H.
RST 10H
• El operando especifica la parta baja de
 Este tipo de direccionamiento es conocido como RST 18H la dirección
Modo de Direccionamiento Modificado de la RST 20H • Este tipo de direccionamiento es conocido
Pagina Cero. RST 28H como Modo de Direccionamiento
Modificado de la Pagina Cero.
 Ninguna Bandera es afectada RST 30H
• Ninguna Bandera es afectada
RST 38H

4
08/11/2011

Ejemplo Ejemplo
25 26

 El siguiente programa realiza el control de un semáforo y dos


señales para peatones

Amarillo
Caminar

Caminar
Secuencia de

Verde
Hex

Rojo
No
tiempo en
 El flujo del trafico y de los peatones es en la misma dirección. segundos
Code
Por lo tanto, los peatones pueden cruzar solo si la luz verde
D7 D6 D5 D4 D3 D2 D1 D0
esta encendida
0
 Las señales son encendidas y apagadas por los siguientes bits (15) 0 1 0 0 0 0 0 1 41H
Señales Bits Tiempo 15
Verde D0 15 segundos (5) 1 0 0 0 0 1 0 0 84H
Amarilla D2 5 segundos 20
Roja D4 20 segundos (20) 1 0 0 1 0 0 0 0 90H
Caminar D6 15 segundos 40
No Caminar D7 25 segundos

Subrutina Retardo Ejemplo


DELAY: ; Esta subrutina realiza un retardo de 0.5 seg. El retardo es repetido el
27 ; numero de veces indicado en B. 28
; Entrada: Numero de veces a repetir el retardo especificado en B
; Salida: Ninguna LD SP,STACK ; Inicializa el Stack Pointer
; Registros Modificados: B START: LD A,01000001B ; Carga el patron de bits para encender el verde
PUSH DE ; guarda el contenido de DE y AF OUT (PORT1), A ; Enciende las senales apropiadas
PUSH AF LD B,30 ; Realiza el retardo de 15 seg por medio
WAIT: LD DE, COUNT ; Carga DE para realizar el retardo 0.5 seg CALL DELAY ; de la subrutina DELAY
LOOP: DEC DE LD A,10000100B ; Carga el patron correspondiente a la luz amarilla
LD A,D ; Coloca D en A para checar banderas OUT (PORT1), A ; Enciende las luces
OR E ; Prende bandera del cero si D=E=0 LD B,10 ; Realiza el retardo de 5 segundos
JP NZ,LOOP ; Repite hasta si DE >0 CALL DELAY ;
DEC B ; Decrementa B LD A,10010000B ; Carga el patron correspondiente a la luz roja
JR NZ,WAIT ; Si el retardo es suficiente termina OUT (PORT1), A ; enciende las senales correspondientes
POP AF ; Restablece el valor de DE y AF LD B,40 ; realiza el retardo de 20 segundos
POP DE CALL DELAY
RET JP START ; Inicia el proceso nuevamente

Multiples llamado a subrutina Subrutinas Anidadas


29 30

Programa Programa
Dirección Dirección
Principal Principal
XX00 2000 Dirección Subrutina 1 Dirección Subrutina 2
Dirección Subrutina
01 2090 20C2
XX50 PUSH DE
PUSH AF
09 CALL DELAY 2050 CALL 209A CALL 209A
0C 2051 90 209B C2 209B
2052 20 209C 20 209C
DELAY
12 CALL DELAY 209D 209D
15
RET RET
POP AF
1B CALL DELAY
POP DE
1E
61 RET

5
08/11/2011

Ejemplo BCD a 7 segmentos


31 32

 Este programa implementa un contador de BCD


 La cuenta es desplegada en un LED de 7 segmentos w3 w2 w1 w0 a b c d e f g

 El programa realiza las siguientes acciones a 0 0 0 0 1 1 1 1 1 1 0


0 0 0 1 0 1 1 0 0 0 0
 Ajusta el numero binario a un numero decimal por f b 0 0 1 0 1 1 0 1 1 0 1
medio de la instrucción DAA g 0 0 1 1 1 1 1 1 0 0 1
e c 0 1 0 0 0 1 1 0 0 1 1
 Busca dentro de una tabla el código asociado a los
0 1 0 1 1 0 1 1 0 1 1
siete segmentos d
0 1 1 0 1 0 1 1 1 1 1
 Utiliza diversas subrutinas 0 1 1 1 1 1 1 0 0 0 0
7-segment display 1 0 0 0 1 1 1 1 1 1 1
1 0 0 1 1 1 1 1 0 1 1

Look-up Table

DAA Contador BCD


33 34

 (DAA) Decimal Adjust Accumulator UPDATE: ; Esta subrutina actualiza la cuenta BCD y ajusta el numero BCD. Cuando el
; contador llegue a 60, reinicia el contador
 Después de una operación aritmética, esta ; Entrada: Cuenta en B
; Salida: Cuenta actualizada y ajustada a BCD en B
instrucción ajusta un numero de 8 bits en el ; Registros Modificados: B y el acumulador
acumulador en un numero empaquetado BCD LD A,B ; obtiene la ultima cuenta
ADD A,01H ; Actualiza la cuenta
 Esta instrucción usa las banderas H (Half Carry) y
DAA ; Ajusta el numero a BCD
CY (Carry) internamente para ajustar el resultado a LD B,A ; Guarda la cuenta en B
dos dígitos BCD CP 60 ; Es la cuenta = 60

 Ajusta el resultado de un suma o resta BCD RET NZ ; Si no lo es regresa al programa principal


LD B,00H ; Reinicia el contador
 No convierte un numero binario a BCD RET

Retardo Despliega digtos BCD en 7 segmentos


DELAY: ; Esta subrutina realiza un retardo de 1 seg.
35 ; Entrada/Salida: Ninguna 36
; Registros Modificados: Ninguno
PUSH DE ; guarda el contenido de DE, BC y AF
Codigo BCD
1 5
Empaquetado Código
PUSH AF
PUSH BC 2000 7E H 0
1 5
LD B,10 2001 30 H 1
WAIT: LD DE, COUNT ; Carga DE para realizar el retardo 100 µs 2002 6D H 2
Obtener la parte baja Obtener la parte alta
LOOP: DEC DE
2003 79 H 3
LD A,D ; Coloca D en A para checar banderas 0001 0101 1 5
AND 2004 33 H 4
OR E ; Prende bandera del cero si D=E=0 0000 1111 0001 0101
2005 5B H 5
JP NZ,LOOP ; Repite hasta si DE >0
0 5 SRL A 0000 1010 2006 5F H 6
DEC B ; Decrementa B
JR NZ,WAIT ; Si el retardo es suficiente termina SRL A 0000 0101 2007 70 H 7
POP BC 2008 7F H 8
SRL A 0000 0010
POP DE ; Restablece el valor de DE y AF 2009 7B H 9
SRL A 0000 0001
POP AF
RET 0 1

6
08/11/2011

Despliega digtos BCD en 7 segmentos Desempaqueta


37 38
UNPACK: ; Esta subrutina desempaqueta el numero BCD almacenado en el acumulador
; y los almacena en direcciones continuas empezando en BUFF
Código BCD
1 5 ; Entrada: Numero BCD empaquetado en B
Empaquetado Codigo ; Salida: BCD1 y BCD2 en el buffer BUFF
; Registros Modificados: Acumulador, HL
BCD HL 2000 7E H
01 05 LD HL, BUFF1 ; apunta HL al buffer BUFF
desempaquetado HL +1 2001 30 H
LD A, B ; Obtiene el numero en BCD empaquetado
2002 6D H AND 0FH ; Enmascara la parte alta
2003 79 H LD (HL),A ; Almacena el digito menos significativo
HL 2000
2004 33 H INC HL ; Incrementa el apuntador
H 20 00 L
HL + 5 2005 5B H LD A,B ; Obtiene el numero BCD empaquetado
2006 5F H SRL A ; Shift el digito mas significativo a la parte

L 00 01 L 01 HL 2001 2007 70 H SRL A ; baja del acumulador


2008 7F H SRL A
L 00 05 L 05 HL 2005 2009 7B H SRL A
LD (HL), A ; Almacena el digito mas significativo
RET

Búsqueda Despliega
39 40

LOOKUP: ; Esta subrutina toma un digito BCD desempaquetado, actualiza el


; apuntador y obtiene el código correspondiente DISPLAY: ; Esta obtiene digitos BCD del buffer de salida, llama a la subrutina
; Entrada: Digito BCD Desempaquetado en el acumulador ; LOOKUP y despliega el digito al puerto de salida apropiado
; Salida: Código de 7-segmentos en el acumulador ; Entrada: Apuntador al buffer en HL
; Registros Modificados: Acumulador ; Salida: Ninguna
PUSH HL ; guarda el contenido de HL ; Registros Modificados: HL
LD HL,CODE ; apunto a la tabla del código 7-segmentos ; Subrutinas llamadas: LOOKUP
ADD A,L ; Suma al apuntador el digito a ser desplegado LD A,(HL) ; Obtiene el segundo digito
LD L,A ; Actualiza el apuntador CALL LOOKUP ; Obtiene el código 7-segmentos
LD A, (HL) ; Obtén el código OUT (PORT2), A ; Despliega el código
POP HL ; Restablece HL DEC HL ; Decrementa el apuntador

RET LD A, (HL) ; Obtiene el segundo digito


CALL LOOKUP ; Obtiene el código 7-segmentos
CODE: DEFB 7EH, 30H, 6DH, 79H ; Código para 0, 1, 2, 3 OUT (PORT1), A ; Despliega el código
DEFB 33H, 5BH, 5FH, 70H ; 4, 5, 6, 7 RET
DEFB 7FH, 7BH ; 8, 9

Programa Principal Ejercicio


41 42

STACK: EQU 1900H


 Escriba un programa que realice la conversión de un número
BUFF: EQU 1901H
en BCD a binario
ORG 1800H  Use la subrutina unpack para desempaquetar el número
 Escriba una subrutina que realice la conversión de BCD a
MAIN: LD SP, STACK ; Inicializa el stack
binario.
LD B, 00H ; Inicializa el contador a 00H
NEXT: CALL UNPACK ; Desempaqueta el numero BCD y almacena en BUFF  Escriba el programa principal
CALL DISPLAY ; Despliega los dígitos BCD en el puerto apropiado
CALL DELAY ; Espera por 1 segundo 1 2 0000 1100
CALL UPDATE ; Actualiza la cuenta
0001 0010
JP NEXT ; continua
00000001 10 00001010
00001100
00000010 00000010

7
08/11/2011

BCD a Binario Hitachi HD44780


BCDBIN: ; Esta subrutina convierte un numero desempaquetado BCD en binario
43
; El digito menos significativo esta en BUFF y el mas significativo en BUFF+1 44
; Entrada: Numero BCD desempaquetado en BUFF y BUFF+1
; Salida: Numero binario en el acumulador A
; Registros Modificados: HL, A
 Pantalla de Cristal
PUSH DE Liquido LCDII con
LD HL,BUFF controlador incluido
INC HL
HDD44780
LD D,(HL)
LD E,10  Esta pantalla tiene una
XOR A
variedad de
SUM: ADD A,D
DEC E
configuraciones como
JR NZ,SUM son 8X1 (8 caracteres
DEC HL por 1 renglón), 16X2,
ADD A,(HL)
20X2,20X4
POP DE
RET

Configuración de Terminales Rutina de Inicialización


45 46

1. Ground 7. Bit 0 (Not used in 4-bit operation) Encender Esperar 1.5 ms


después de que

2. VCC (+3.3 to +5V) 8. Bit 1 (Not used in 4-bit operation) LCD Vdd llega a 4.5V

3. Contrast adjustment (VO) 9. Bit 2 (Not used in 4-bit operation) Enviar BF no puede
código de 00011XXXX probarse en este
4. Register Select (RS). RS=0: 10. Bit 3 (Not used in 4-bit operation) INICIO
punto

Command, RS=1: Data 11. Bit 4 Repetir


5. Read/Write (R/W). 12. Bit 5 código de Esperar por mas
de 4.1 ms

R/W=0: Write, R/W=1: INICIO


13. Bit 6
Read Repetir El código de inicio
14. Bit 7 código de indica que la
interfaz se Esperar 100s
6. Clock (Enable). Falling INICIO establece a 8 bits

edge triggered 15. Backlight Anode (+)


16. Backlight Cathode (-) Inicializar Apagar y prender Limpiar pantalla Establecer modo
LCD el display de Escritura

Comunicándose con LCD Instrucciones


47 48

 LCD tiene un bus de 1.


2.
RS=0: Instrucción, RS=1: Dato
R/W=0: Escritura, R/W=1: Lectura
R/S R/W D7 D6 D5 D4 D3 D2 D1 D0 INSTRUCTION

datos de 8 bits (pin 7- 3. CE = 1 habilita, CE = 0, deshabilitado


4 5 14 13 12 11 10 9 8 7 PINS
0 0 0 0 0 0 0 0 0 1 Limpia pantalla
14) por el cual se Regresa el cursor al inicio de la
Selección RS = 0, RS = 1, 0 0 0 0 0 0 0 0 1 *
transfiere el código de Registro setup dato pantalla
Indica la dirección de movimiento del
ASCII a escribirse 0 0 0 0 0 0 0 1 ID S
cursor
Escritura RW = 1
 Se utilizan 3 señales de 0 0 0 0 0 0 1 D C B Habilita el display/cursor
* Mueve el cursor/ Corre el display
control: Habilita
intercambio
CE = 1
0 0 0 0 0 1 SC RL *
0 0 0 0 1 DL N F * * Establece la longitud del display
 Selección de Registro Envió de Escribe un caracter en la posición actual
Envió de 1 0 D D D D D D D D
(RS) datos
código
ASCII del cursor
Lee el caracter en la posición actual del
 Escritura/Lectura (R/W) Deshabilita
1 1 D D D D D D D D
CE = 0 cursor
Intercambio
 Habilitación de Reloj
(CE)

8
08/11/2011

Interfaz
49

S-ar putea să vă placă și