Práctica 2: Uso de subrutinas y simulación de operaciones de E/S
Objetivo
Diseñar un programa que, en función del estado de los dos interruptores situados más a la derecha, realice las siguientes operaciones:
S1 |
S0 |
Función |
0 |
0 |
Cuenta cíclica ascendente de 0 a 9 en intervalos de 1 seg |
0 |
1 |
Cuenta cíclica descendente en intervalos de 1 seg |
1 |
0 |
Rotación de un segmento del display en intervalos de 0,5 seg |
1 |
1 |
Fin de programa |
Por cada operación básica, a excepción de la que determina el fin de programa existirá una subrutina encargada de materializarla.
Para conseguir un correcto funcionamiento del programa, antes de la llamada a la primera subrutina, es necesario inicializar la pila a un valor adecuado ($7b0 por ejemplo). Para ello se usará la sentencia:
MOVE.L #$7B0,A7
Para conseguir el retardo se diseñará una subrutina en la que se haga uso del reloj del sistema. Para ello son imprescindibles las siguientes sentencias:
move.b #8,d0 Almacena en d1.L, las centésimas de segundo
trap #15 transcurridas desde la media noche
Puesto que el retardo en las operaciones es distinto (1 seg en el caso de los contadores y 0,5 seg. en el caso de la rotación del segmento), para la codificación de esta subrutina existen dos posibilidades:
- Diseñar una subrutina de retardo de carácter general y llamarla tantas veces como sea necesario
- Diseñar una rutina para cada intervalo.
Solución
*----------------------------------------------------------- * * Versión : 1.0 * Escrito por : Vidal Maté Barbero * Fecha : 30 - 4 - 2006 * Descripción : Uso de subrutinas y simulación de operaciones de E/S * *----------------------------------------------------------- START ORG $1000 jmp inicio * * Constantes y variables * * Guardo la tabla con los valores (en hexadecimal), para mostrar más tarde en los displays tablaa dc.b $3F,$06,$5B,$4F,$66,$6D,$7D,$27,$7F,$67 tablab dc.b $67,$7F,$27,$7D,$6D,$66,$4F,$5B,$06,$3F tablac dc.b $08,$10,$20,$01,$02,$04 * * Programa principal * inicio move.b #32,d0 Cojo la dirección del hardware move.b #0,d1 trap #15 Muestro la ventana de hardware * move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 * move.b #10,d3 Muevo el número tope de iteraciones del bucle al registro 3 lea tablaa,a0 Pone el primer valor de la tabla a (contador ascendente) en el registro de direcciones 0 lea tablab,a1 Pone el primer valor de la tabla b (contador descendente) en el registro de direcciones 1 lea tablac,a2 Pone el primer valor de la tabla c (rotación de segmento) en el registro de direcciones 2 main move.l #$E00012,a3 Pongo la dirección de los switches en el registro de direcciones 3 move.b #0,d5 Pongo el primer estado en el registro 5 para comparar cmp.b (a3),d5 Primera comparación: determina si los switches están a 00 bne s1 Evito el salto a la subrutina 1 si la comparación es falsa move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 move.b #10,d3 Muevo el número tope de iteraciones del bucle al registro 3 move.l #tablaa,a0 Vuelvo a cargar el vector de cuenta ascendente jsr sub1 Salto a la subrutina 1 si la comparación anterior es verdadera s1 move.b #1,d5 Muevo 1 a d5 para comparar con el siguiente estado de los switches cmp.b (a3),d5 Segunda comparación: determina si los switches están a 01 bne s2 Evito el salto a la subrutina 2 si la comparación es falsa move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 move.b #10,d3 Muevo el número tope de iteraciones del bucle al registro 3 move.l #tablab,a1 Vuelvo a cargar el vector de cuenta descendente jsr sub2 Salto a la subrutina 2 si la comparación anterior es verdadera s2 move.b #2,d5 Muevo 2 a d5 para comparar con el siguiente estado de los switches move.b #6,d3 Establezco el tope de iteraciones para el caso 3 ya que no 10 como antes cmp.b (a3),d5 Tercera comparación: determina si los switches están a 10 bne s3 Evito el salto a la subrutina 3 si la comparación es falsa move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 move.b #6,d3 Muevo el número tope de iteraciones del bucle al registro 3 move.l #tablac,a2 Vuelvo a cargar el vector de la línea que gira jsr sub3 Salto a la subrutina 3 si la comparación anterior es verdadera s3 move.b #3,d5 Muevo 3 a d5 para comparar con el siguiente estado de los switches cmp.b (a3),d5 Cuarta comparación: determina si los switches están a 11 bne s4 Evito el salto a la subrutina 4 si la comparación es falsa jsr sub4 Salto a la subrutina 4 si la sentencia anterior es verdadera s4 jmp main reloj move.b #8,d0 Almacena en d1.l las centésimas de segundo trap #15 transcurridas desde la media noche sub.l d6,d1 Resto 100 al contador de centésimas cmp.l d1,d7 Comparo el contador de centesimas (después de restar 100) con el valor inicial bne reloj Realizo el bucle de nuevo si los valores no son iguales rts sub1 move.b (a0),d4 Coloco en d4 al valor correspondiente de la tabla move.b d4,$E0000E Coloco el valor adecuado en la posición de memoria del primer display add #1,a0 Paso a la siguiente posición de memoria en a0 (siguiente valor de la tabla) add #1,d2 Añado una unidad al contador move.b #8,d0 Almacena en d1.l las centésimas de segundo trap #15 transcurridas desde la media noche move.l d1,d7 Almaceno las centésimas iniciales en el registro 7 move.b #100,d6 Almaceno en d6 el intervalo (en centésimas) que necesito jsr reloj Salto a la subrutina que produce un retardo de un segundo cmp.w d2,d3 Comprobación de continuación del bucle bgt.b sub1 Bucle del programa rts sub2 move.b (a1),d4 Coloco en d4 al valor correspondiente de la tabla move.b d4,$E0000E Coloco el valor adecuado en la posición de memoria del primer display add #1,a1 Paso a la siguiente posición de memoria en a1 (siguiente valor de la tabla) add #1,d2 Añado una unidad al contador move.b #8,d0 Almacena en d1.l las centésimas de segundo trap #15 transcurridas desde la media noche move.l d1,d7 Almaceno las centésimas iniciales en el registro 7 move.b #100,d6 Almaceno en d6 el intervalo (en centésimas) que necesito jsr reloj Salto a la subrutina que produce un retardo de un segundo cmp.w d2,d3 Comprobación de continuación del bucle bgt.b sub2 Bucle del programa rts sub3 move.b (a2),d4 Coloco en d4 al valor correspondiente de la tabla move.b d4,$E0000E Coloco el valor adecuado en la posición de memoria del primer display add #1,a2 Paso a la siguiente posición de memoria en a1 (siguiente valor de la tabla) add #1,d2 Añado una unidad al contador move.b #8,d0 Almacena en d1.l las centésimas de segundo trap #15 transcurridas desde la media noche move.l d1,d7 Almaceno las centésimas iniciales en el registro 7 move.b #50,d6 Almaceno en d6 el intervalo (en centésimas) que necesito jsr reloj Salto a la subrutina que produce un retardo de un segundo cmp.w d2,d3 Comprobación de continuación del bucle bgt.b sub3 Bucle del programa rts sub4 bra fin fin MOVE.B #9,d0 TRAP #15 Parada del simulador END START |