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
	

vidalmb_admin – Mié, 25/07/2007 – 00:36