Unidad 4 – 5a Parte Programando En el Ensamblador del Z80

Anuncio
16/11/2011
1
Ejercicio
2


UNIDAD 5 – 3A PARTE
PROGRAMANDO EN EL
ENSAMBLADOR DEL Z80


Los puertos de entrada F1H y F2H estan conectados
a 7 switches cada uno. El bit mas significativo D 7 esta
conectado a un una señal de emergencia
El puerto de salida (F3H) esta conectado a 7 bandas
transportadoras y debe encenderse solo si el switch
correspondiente esta encendido en ambos puertos
Enciende o apaga los 7 bandas transportadoras de
acuerdo a las posiciones de on y off de los switches
en ambos puertos
Monitorea los switches continuamente
Microprocesadores
Otoño 2010
Solución
Ejercicio
3
4

START:

IN A,(F1H)

AND 7FH
Reset bits D0 y D1 del acumulador
Set bits D0 y D1 del acumulador
Complementa los bits D0 y D1 del acumulador
LD B,A
IN A,(F2H)
AND B
OUT (F3H),A
JP START
HALT
Solución
D7
D6
D5
D4
D3
D2
D1
D0
Acumulador
X
X
X
X
X
X
X
X
AND FCH
1
1
1
1
1
1
0
0
Resultado
X
X
X
X
X
X
0
0
Comparaciones
5
6
OPCODE OPERANDO BYTES
D7
D6
D5
D4
D3
D2
D1
D0
Acumulador
X
X
X
X
X
X
X
X
OR 03H
0
0
0
0
0
0
1
1
Resultado
X
X
X
X
X
X
1
1
D7
D6
D5
D4
D3
D2
D1
D0
Acumulador
X
X
X
X
X
X
X
X
XOR 03H
0
0
0
0
0
0
1
1
Resultado
X
X
X
X
X
X
D1
D0
DESCRIPCION
CP
r
1
Compara el contenido del acumulador con el
registro indicado
CP
8-bits
2
Compara el contenido del acumulador con el
número indicado
CP
(HL)
1
CP
(IX+d)
3
Condición
Compara el contenido del acumulador con la
locación de memoria indicada
Banderas
Carry
Cero
A < operando
1
0
A = operando
0
1
A > operando
0
0
1
16/11/2011
Ejemplo
Ejercicio
7
8



Las siguiente instrucciones comparan el contenido de
la locacion 1850H con 80H
Si el byte es igual salta a la locación check
Si el byte es mayor salta a overload



LD HL, 1850H
Un conjunto de 10 lecturas se encuentra
almacenado en memoria en la dirección inicial
INBUF
Escribe un programa que encuentre la lectura mas
grande en el conjunto
Almacena este dato en el buffer OUTBUF
LD A,80H
CP (HL)
JP Z,CHECK
JP C,OVRLOD
Solución
Rotaciones
9
10
START:
NEXT:
SKIP:
XOR A
; Empieza con una lectura mínima
LD B,0AH
; Inicializa el contador B a 10
LD HL,INBUF
; Apunta HL hacia INBUF
CP (HL)
; Compara la lectura de memoria con el apuntador
JP NC, SKIP
; Si la lectura es menor no cambies el valor de A
LD A, (HL)
; Actualiza el máximo
INC HL
; Apunta a la siguiente locación de memoria
DEC B
; Decrementa el contador
JP NZ,NEXT
; Obtén la siguiente lectura si el contador ≠ 0
LD (OUTBUF),A
; Guarda el resultado
8-bits
RLC
9-bits
RL
8-bits
RRC
9-bits
RR
Izquierda
Rotaciones
Derecha
HALT
Rotaciones
Shift y Rotación
11
12
OPCODE
OPERANDO
RLC
R
RL
RRC
(HL)
DESCRIPCION
Rotación de bits a la izquierda de un registro o
memoria
Rotación de bits a la izquierda a través del carry
de un registro o memoria
Rotación de bits a la derecha de un registro o
memoria
RR
Rotación de bits a la derecha a través del carry
de un registro o memoria
SLA
Shift de bits a la izquierda a través del carry de
un registro o memoria
(IX + d)
SRL
Shift de bits a la derecha a través del carry de un
registro o memoria
RLCA: Rota el acumulador a la
izquierda. El carry es
afectado por D7
C
D7
D6
D5
D4
D3
D2
D1
D0
RLA: Rota el acumulador a la
izquierda a través del
carry
C
D7
D6
D5
D4
D3
D2
D1
D0
RRCA: Rota el acumulador a la
derecha. El carry es
afectado por D0
C
D7
D6
D5
D4
D3
D2
D1
D0
RRA: Rota el acumulador a la
derecha a través del
carry
C
D7
D6
D5
D4
D3
D2
D1
D0
2
16/11/2011
Shift y Rotación
Rotaciones y Shift
13
14

SLA: Recorre los bits del
registro hacia la
izquierda a través del
carry. Introduce ceros en
el bit D0
SRL: Recorre los bits del
registro hacia la
derecha a través del
carry. Introduce ceros en
el bit D7
C
D7
D6
D5
D4
D3
D2
D1
0
D0

C
D7
D6
D5
D4
D3
D2
D1
D0

0
Ejemplo
En estas instrucciones, la dirección de memoria puede
ser especificada usando el registro HL o los registros
índice con un offset
Las banderas Z, S y P/V son modificadas de acuerdo a
las condiciones del resultado.
El valor del carry es determinado por D7 en la rotación
(shift) a la izquierda o por D0 en la rotación (shift) a la
derecha
Manipulación de bits
15
16
A 10  A  8  2
  A  8   A  2 


El operando B representa un bit del D7 al D0
SET/RES no afectan las banderas
OPCODE
LD HL,1850H
; HL apunta a la dirección 1850H
LD A,(HL)
; Lee el numero de la locación de memoria
SLA A
; Multiplica por 2
LD B,A
; Guarda el resultado en B
SLA A
; Multiplica por 4
SLA A
; Multiplica por 8
ADD A,B
; Para multiplicar por 10, suma la multiplicación por 2
LD (HL),A
; Guarda el resultado
OPERANDO
B,R
BIT
DESCRIPCION
Prueba el bit B en el registro o locación de memoria. Si
el bit es 0, la bandera del cero (Z) es encenderá, de
otra manera permanecerá apagada
B,(HL)
B, (IX+d)
B,R
SET
B,(HL)
Asigna un 1 al bit B del registro o locación de memoria
B, (IX+d)
B,R
RES
HALT
Asigna un 0 al bit B del registro o locación de memoria
B,(HL)
B, (IX+d)
Retardos y Formas de Onda
Retardo
17
18
INICIO
Carga el patrón de bits
Manipulación de bits
Copia la cuenta del
retardo en un registro
Decrementa el contador
Salida para generar el
pulso
Retardo
No


f  2MHz; Tc  1 f  0.5s
LT  14
N10  64H  100
TL  0.5 106 14 100  700s
Contador
=0?
Si
Regresa a cambiar el
pulso
TL  Tc  LT  N10
donde
TC es el periodo del reloj
LT son los T-states en el ciclo
N10 es la cuenta en decimal
LOOP:
Mnemónicos
T-States
LD B,64H
7
DEC B
4
JP NZ,LOOP
10
3
16/11/2011
Retardo
Ejemplo
19
20

El retardo total se obtiene de la siguiente manera
Ttotal  T0  TL
START:
LD C,01010101B ; Carga el patrón de bits
ROTATE:
LD A,C
; Coloca el patrón de bits en el acumulador
4
RLCA
; Cambia el patrón de bits para la siguiente salida
4
LD C,A
; Guarda el patrón de bits
4
AND 01H
; Enmascara los bits D7-D1
7
OUT (PORT1),A
; Cambia el nivel de voltaje
11
LD B,COUNT
; Carga el registro B con el contador del retardo
7
DEC B
; Inicia el retardo
4
 Tc L0  LT  N10   0.5s7  14 100
 3.5 μs  700s  703.5s

Para encontrar el numero de veces que el ciclo
debe ser ejecutado para obtener un cierto retardo
entonces
N10 
DELAY:
JN NZ,DELAY
JP ROTATE
Ttotal
L
 0
TC  LT LT
Calculando N10
10
; Regresa a cambiar el nivel del pulso
10
Incrementando el Retardo
21
22


El pulso debe tener un periodo de 500µs, lo cual
implica que debe mantenerse en alto por 250µs y
en bajo por 250µs.
El programa se toma los siguientes ciclos de reloj

Existen tres formas de incrementar el retardo,
Incluir instrucciones adicionales
dentro del lazo
• NOP toma 4 ciclos T en ejecutarse
 T-states

dentro del ciclo = 14
 T-states fuera del ciclo = 47
Usar un par de registros
La cuenta debe ser
• BC, DE, o HL
N10 
250 106
47

 32
6
0.5 10 14 14
Usar lazos anidados
Ejemplo
Instrucciones especiales del Z80
23
24
LD D,10
LD BC,7143
10
LOOP1:
DEC BC
6
NOP
4
LD A,C
4
OR B
4
JP NZ,LOOP1
10
DEC B
4
JN NZ,LOOP
10
DELAY:
LOOP:
LD BC,7143
10
DJNZ
100 ms
DELAY:
DEC B
4
JN NZ,LOOP
10
6
TL1  0.5 10  28  7143  100ms

OPCODE OPERANDO DESCRIPCION
LD D,10
LOOP:

label
Decremento B y Salto Relativo sobre NZ
Esta instrucción decrementa el registro B y si B ≠ 0,
salta a la dirección de memoria especificada por
el valor de offset label
LDI
Carga e Incrementa
Copia un byte a la dirección de memoria apuntada
por HL dentro de la locación de memoria apuntada
por DE. Los registro HL y DE son incrementados y
BC es decrementado
LDIR
Carga, Incrementa y Repite
Esto es similar a la instrucción LDI, excepto que es
repetida hasta que BC = 0
TL  10 0.5 106  24  TL1  1000ms  120s
4
16/11/2011
Instrucciones especiales del Z80
25
Ejercicio
26

OPCODE OPERANDO DESCRIPCION
Carga y decrementa
Copia un byte a la dirección de
memoria apuntada por HL dentro de
LDD
la locación de memoria apuntada por
DE. Los registro HL, DE y BC son
decrementados
Carga, Decrementa y Repite
Esto es similar a la instrucción LDD,
LDDR
excepto que es repetida hasta que
BC = 0



Escriba un programa que sume 10 bytes almacenados
en memoria empezando en la direccion INBUF
Cuente el numero de carries generado en la suma
Guerde guarde el valor de la suma en OUTBUF y
OUTBUF + 1
Suponga que
OUTBUF EQU 1850H
COUNT EQU 10
 INBUF: DEFB 0A2H, 37H,4FH,97H,22H,6BH,
DEFB 75H,8EH9AH,0C7H


Solución
Calculando el Offset
27
28
1800
XOR A
; Limpia A para acumular la suma
1801
LD C,A
; Limpia C para acumular los carries
1802
LD HL, INBUF
; HL apunta a INBUF
1805
LD B,COUNT
; Copia 10 al contador B
LD D,(HL)
; Carga el dato almacenado en INBUF
1808
ADD A,D
; Suma A y el dato obtenido de INBUF
1809
JP NC, SKIPCY
; Si no hay carry salta a incrementar HL
180C
INC C
; Si hay carry incrementa C
INC HL
; Incrementa HL
Program Counter
180E
DJNZ NXTBYT
; Decrementa B y salta si no es igual a cero
Dirección destino
1810
LD HL,OUTBUF
; Apunta HL a OUTBUF
1813
LD (HL),A
; Copia el resultado del acumulador
1814
INC HL
; Incrementa HL
1815
LD (HL),C
; Copia C a OUTBUF + 1
1807
180D
START:
NXTBYT:
SKIPCY:


Complemento a 2’s
Instrucciones especiales del Z80
29
El salto debe ser realizado hacia atrás a la
dirección 1807H
Debido a que es un salto hacia atrás, entonces el
offset es un numero negativo que debe ser
representado en complemento a 2’s
–
1
8
1
0
1
8
0
7
0
9
00001001
F
7
11110111
Características Generales
30
OPCODE
OPERANDO
DESCRIPCION
CPI
Compara e Incrementa
Compara el contenido de la locación de memoria
apuntada por HL con el contenido del acumulador.
Incrementa HL y decrementa BC
CPIR
Compara, Incrementa y Repite
Esta instrucción es igual a CPI pero se repite hasta que
BC = 0 o el contenido de HL es igual al acumulador
CPD
Compara y Decrementa
Compara el contenido de la locación de memoria
apuntada por HL con el contenido del acumulador.
Decrementa HL y BC
CPDR
Compara, Decrementa y Repite
Esta instrucción es igual a CPD pero se repite hasta que
BC = 0 o el contenido de HL es igual al acumulador





Estas son instrucciones de 2 bytes
La bandera del cero (Z) se enciende si los números
comparados son iguales. Esto es, si el valor del
acumulador y la locación de memoria son iguales
La bandera del signo (S) se enciende si el byte es
mas grande que el acumulador
La bandera P/V se apaga si BC es igual a cero
La bandera del carry no es afectada
5
16/11/2011
Ejemplo
Ejercicio
31
32

El buffer INBUF contiene 256 datos. Realiza una
búsqueda para encontrar el valor 24H en el buffer
de entrada. Si lo encuentra salta a START, de lo
contrario salta a ERROR
LD HL,INBUF
; HL debe apuntar a INBUF
LD BC,0100H
; BC es el contador = 256
LD A,24H
; El acumulador debe contener el byte buscado
CPIR
; busca 24H dentro del buffer
JP Z,START
; Si el byte fue encontrado, inicia el proceso
JP ERROR
; Despliega el mensaje de error
START:
LD HL,1850H
LD D,00H
Solución
LD C,02
33
CHECK:
Un conjunto de 3 lecturas han sido almacenadas en
memoria iniciando en la direccion1850H
 87
 56
 42

Ordena las lecturas en orden ascendente
; Apunta HL hacia los datos
; Usa D como una bandera de intercambio
; Cuenta de comparaciones
LD A,(HL)
; Obtén el dato
INC HL
; Incrementa el apuntador al siguiente dato
CP (HL)
; Compara los números
JP C,NEXTBYT
; Si A < segundo byte, no intercambies
LD B,(HL)
; Obtén el segundo byte para intercambio
LD (HL),A
; Almacena el byte anterior en la posición siguiente
DEC HL
; Apunto a la locación posterior
LD (HL),B
; Almacena el byte en la locación anterior
INC HL
; restaura HL a la posición de comparación
LD D,01
; D = 1 para recordar que se realizo un intercambio
NEXTBYT: DEC C

; Decrementa el contador de comparaciones
JP NZ, CHECK
; Si la cuenta es diferente de cero regresa a check
BIT 0,D
; Checa la bandera de intercambio
JP NZ,START
; Si la bandera es 1 realiza una nueva pasada
HALT
; fin del ordenamiento
6
Descargar