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.5s LT 14 N10 64H 100 TL 0.5 106 14 100 700s 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.5s7 14 100 3.5 μs 700s 703.5s 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 106 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 106 24 TL1 1000ms 120s 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