• No se han encontrado resultados

Pila. Pila. Pila. Pila. Pila 08/11/2011 UNIDAD 5 4 A PARTE PROGRAMANDO EN EL ENSAMBLADOR DEL Z80

N/A
N/A
Protected

Academic year: 2021

Share "Pila. Pila. Pila. Pila. Pila 08/11/2011 UNIDAD 5 4 A PARTE PROGRAMANDO EN EL ENSAMBLADOR DEL Z80"

Copied!
9
0
0

Texto completo

(1)

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

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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 100s

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

(9)

Interfaz

49

Referencias

Documento similar

• Una persona puede alzar pesos menores o iguales a 25 Kg para hombres y 12.5 Kg para mujeres, si la bolsa supera este peso, dividir la carga o manipularla entre dos

Necesidades de refrigeración del prototipo de pila de 20 celdas (1 kW) en función de la densidad de corriente

 Realización de archivo plano para pago de Planilla Seguridad Social (PILA)..  Informes a gerencias de áreas y gerencia general de la situación de la nómina de

1 Pulse la tecla programada con la función Pila o pulse prolongadamente la tecla programada con la función Selcall, Estado o Selcall + Estado para pasar al modo de pila.. •

1 Pulse la tecla programada con la función Pila, o pulse prolongadamente la tecla programada con la función Selcall, Estado o Selcall + Estado para pasar al modo de pila.. •

1 Pulse la tecla programada con la función Pila, o pulse prolongadamente la tecla programada con la función Selcall, Estado o Selcall + Estado para pasar al modo de pila.. •

Artículos de revista: autor: los dos apellidos [si es español] en MAYÚSCULAS, inicial(es) del nombre de pila en mayúsculas seguida de punto (.), año entre paréntesis,

Los eventos que no son interesantes para la detecci´ on de amenazas pueden seguir siendo de utilidad para otros consumidores, como por ejemplo, en un entorno empresarial que tenga