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