Story Transcript
Ciclos de máquina • Otro ejemplo: decremento de un registro par (donde rp = HL, DE, BC, SP) DCX rp
Acceso a periféricos: función del pin IO/M • Este μP cuenta con dos instrucciones específicas para I/O, llamadas IN y OUT. • Cuando se ejecuta un IN en lugar de un LDA, la línea IO/M se pone en alto (lo mismo ocurre con OUT frente a STA). • Además, en estos casos, solo se utilizan direcciones de 8 bits:
IN dir_puerto Lenguaje de máquina:
En assembler:
11011011 00110011
= DBh = 33h
(opcode) (dir. puerto entrada, de 8 bits)
A Å (puerto 33h)
IN 33h
OUT dir_puerto Lenguaje de máquina:
En assembler:
11010011 01000101
OUT 45h
= D3h = 45h
(opcode) (dir. puerto salida, de 8 bits)
(puerto 45h) Å A
Ciclos de máquina: instrucción OUT
Ciclos de máquina: instrucción STA
Terminales del μP 8085 (vistos hasta ahora)
Buses de direcciones y datos Bus de control Alimentación, clock, reset
Acceso a memorias lentas: función del pin READY • Diferencias en ciclos de lectura con y sin estados de espera (TW):
Cálculo de tiempos de ejecución Ejemplo: parpadeo de un bit en el puerto 33h (puerto 33h) Å 00000000b B Å 100 B Å B-1
delay
activó Z? delay (puerto 33h) Å 00000001b B Å 100 B Å B-1
activó Z?
2000h: 2002h: 2004h: 2006h: 2007h: 200Ah: 200Ch: 200Eh: 2010h: 2011h: 2014h: 2015h:
MVI OUT MVI DCR JNZ MVI OUT MVI DCR JNZ JMP
A,00000000b 33h B,100 B 2006h A,00000001b 33h B,100 B 2010h 2000h
Cálculo de tiempos de ejecución Solución usando una subrutina:
programa principal
subrutina
zona de RAM dedicada al stack
1000h: . . . 2000h: 2002h: 2004h: 2007h: 2009h: 200Bh: 200Eh: 2011h: . . . 3000h: 3002h: 3003h: 3006h: . . . 4000h: . . . 4100h:
LXI
SP,4100h
MVI OUT CALL MVI OUT CALL JMP
A,00000000b 33h 3000h A,00000001b 33h 3000h 2000h
MVI B,100 DCR B JNZ 3002h RET
Ejercicio 1: decodificación y acceso a puertos Dado el siguiente circuito, escribir un programa en assembler y hexadecimal para el 8085 a partir de la dirección que se ejecuta después de un reset, de modo que: a) Encienda los leds de salida que correspondan a los contactos que permanezcan cerrados. b) Encienda los leds de salida que correspondan a los contactos que permanezcan abiertos.
Ejercicio: decodificación y acceso a puertos A15 .
Dirección
. .
A8
A7 A6 A5 A4 A3 A2 A1 A0
Puerto entrada
. . .
0
0
1
X
1
1
1
1
(2F)
Puerto salida
. . .
1
0
0
X
1
1
1
1
(8F)
Parte a): COM ASSEMBLER:
Leer puerto de entrada
Enviar valor a puerto de salida
DIR:
HEXA:
2000 2001
DB 8F
2002 2003
D3 2F
OUT
h’2F
2004 2005 2006
C3 00 20
JMP
h’2000
2000h: IN
h’8F
Ejercicio: decodificación y acceso a puertos Parte b): COM ASSEMBLER: DIR: Leer puerto de entrada
Invertir
Enviar valor a puerto de salida
HEXA:
2100 2101
DB 2F
2100h: IN
h’2F
2102
2F
CMA
2103 2104
D3 8F
OUT
h’8F
2105 2106 2107
C3 00 21
JMP
h’2100
¿Se podría leer o escribir esos puertos con instrucciones LDA o STA? ¿Que le cambiaría al circuito para lograrlo?
Lenguaje Assembler • Es más fácil de manejar que el lenguaje de máquina. • Consiste esencialmente de las mismas instrucciones que el μP (los mnemónicos). • Se agregan otras instrucciones propias del lenguaje, llamadas pseudo-instrucciones o directivas del ensamblador (empiezan con un punto). • Se hace uso de las llamadas etiquetas (o labels) para efectuar saltos o señalar una dirección.
Algunas pseudo-instrucciones son: .ORG dir (Indica que el código que sigue a continuación ha de ubicarse a partir de la dirección dir) .END (Indica el fin del programa) label .EQU data (le asigna a la etiqueta label el valor data)
Cálculo de tiempos de ejecución (puerto 33h) Å 00000000b B Å 100 B Å B-1
programa principal
activó Z?
(puerto 33h) Å 00000001b subrutina B Å 100 B Å B-1
activó Z?
zona de RAM dedicada al stack
1000h: . . . 2000h: 2002h: 2004h: 2007h: 2009h: 200Bh: 200Eh: 2011h: . . . 3000h: 3002h: 3003h: 3006h: . . . 4000h: . . . 4100h:
LXI
SP,4100h
MVI OUT CALL MVI OUT CALL JMP
A,00000000b 33h 3000h A,00000001b 33h 3000h 2000h
MVI B,100 DCR B JNZ 3002h RET
Mismo ejemplo pero en lenguaje assembler: pilaini: tiempo: puerto:
.EQU .EQU .EQU
4100h 100 33h
;------------------------------------; Programa principal
parpadear:
.ORG
1000h
LXI
SP,pilaini
MVI OUT CALL MVI OUT CALL JMP
A,00000000b puerto demora A,00000001b puerto demora parpadear
; inicializo el stack ; para poder usar CALL ; apaga el LED
; enciende el LED
;-------------------------------------; Subrutina de delay, T=tiempo*14*Tclock (aprox.) demora: repetir:
MVI DCR JNZ RET .END
B,tiempo B repetir
Ejercicio 2: decodificación y algo mas… Dado el siguiente circuito, escribir un programa en assembler y hexadecimal para el 8085 a partir de la dirección que se ejecuta después de un reset que: a) Reproduzca en los 8 leds superiores el contenido del registro B del μP y en los 8 inferiores el contenido del registro C. b) Indicar el valor de la suma del contenido de los registros A, B y C ( A+B+C ) y colocarlo en binario en los 16 bits formados por los dos puertos (superior mas significativo).
Ejercicio 2: decodificación y algo mas… Dirección
A15 .
Salida de arriba
X
Salida de abajo
X
COM
Leer registro B Invertir Escribir puerto de arriba Leer registro C Invertir Escribir puerto de abajo
. .
A8
A7 A6 A5 A4 A3 A2 A1 A0
. . .
X
1
1
1
1
0
1
0
1
(F5)
. . .
X
1
1
1
1
0
1
0
0
(F4)
ASSEMBLER:
Parte a): DIR: 0000 0001 0002 . . . 0100 0101 0102 0103 0104 0105 0106 0107 0108 0109 010A
HEXA: C3 00 01 . . . 78 2F D3 F5 79 2F D3 F4 C3 00 01
.ORG JMP . . .
h’0000 START
.ORG START: MOV CMA OUT
h’0100 A,B h’F5
MOV CMA OUT
A,C
JMP
START
h’F4
Ejercicio 2: decodificación y algo mas… ASSEMBLER:
Parte b):
COM
Inicializar variables Sumar A+B+C Escribir puerto de arriba Escribir puerto de abajo
DIR: 0000 0001 0002 . . . 1F00 1F01 1F02 1F03 1F04 1F05 1F06 1F07 1F08 1F09 1F0A 1F0B 1F0C 1F0D 1F0E 1F0F 1F10 1F11 1F12 1F13
HEXA: C3 00 1F . . . 26 00 80 D2 07 1F 24 81 D2 0C 1F 24 D3 F4 7C D3 F5 C3 00 1F
START:
SALTO:
.ORG JMP . . .
h’0000 START
.ORG MVI
h’1F00 H,0
ADD JNC
B SALTO
INR ADD JNC
H C SALTO1
INR SALTO1: OUT
H h’F4
MOV OUT
A,H h’F5
JMP
START