Ensamblador

Introducción

<body>.</body>

La finalidad de esta sección es tomar contacto con las herramientas de ensamblado y simulación del microprocesador Motorola 68000. Para ello se desarrollaran varios programas en ensamblador y se verificará su funcionamiento mediante la simulación.



El software utilizado para el desarrollo de los programas se llama EASy68K (sitio oficial); este permite editar, ensamblar y ejecutar programas del motorola 68000 en un PC con windows (desgraciadamente no existe instalable para Linux, pero podemos compilar el código fuente disponible para descargar más abajo) sin necesidad de hardware adicional. EASy68K es un proyecto open source distribuido bajo la licencia GNU GPL.

SetupEASy68K.exe Ejecutable con instalador (1.6 MB)
EASy68K.zip Fichero zip sin instalador (1.6 MB)
EASy68Ksource.zip Código fuente
vidalmb_admin – Jue, 22/06/2006 – 20:24

Práctica 1: Manejo de los periféricos

<body>.</body>

 

Objetivo

Diseñar un programa en ensamblador en el que al pulsar el switch situado más a la derecha se muestre en el display de 8 segmentos los números del 7 al 0. Al volver a pulsar el switch se iluminará, en todos y cada uno de los displays, el segmento central.

El resultado que se deberá observar en la ventana de hardware del simulador será el de las imagenes:

El funcionamiento del display de 7 segmentos es muy sencillo, los valores que se asignaran a cada display de la maqueta serán en función de lo que se quiera mostrar en el display y en las direcciones de memoria correspondientes (en la captura anterior se puede observar que comienzan en la E00000) mostradas en la tabla a continuación.

DISPLAY
DIRECCIÓN
1
E000000
2
E000002
3
E000004
4
E000006
5
E000008
6
E00000A
7
E00000C
8
E00000E

Para el desarrollo de la práctica es muy recomendable definir como variable de programa un vector denominado tabla que contenga la codificación de los dígitos del 0 al 9.

tabla dc.b $3F,$06,$5B,$4F,$66, $6D,$7D,$27,$7F,$67

Nota sobre la implementación: Para poder visualizar y gestionar la ventana hardware es necesario generar una excepción (trap) que lo permita. El código que permite hacer estas tareas es:

Trap para obtener la dirección hardware y visualización de la ventana hardware

move.b #32,d0
MOVE.B #0,D1
TRAP #15 


Almacena la dirección del display en D1

move.b #01,d1
trap #15 


Almacena la dirección de los leds en D1

move.b #02,d1
trap #15


Almacena la dirección de los switch en D1

move.b #03,d1
trap #15

El estado de los switch y de los leds, se almacena en la dirección de memoria que tienen asociada. Así, p.e., si el contenido de la dirección E00012 es %00100000 indicará que todos los interruptores a excepción del 5 están apagados.

 

Solución

El código de la solución será el siguiente:

*-----------------------------------------------------------
*
* Versión	: 1.0
* Escrito por	: Vidal Maté Barbero
* Fecha		: 27 - 4 - 2006
* Descripción	: Manejo de los periféricos
*
*-----------------------------------------------------------

START	ORG	$1000
	jmp inicio
*
* Constantes y variables
*
* Guardo la tabla con los valores (en hexadecimal), para mostrar más tarde en los displays
tabla	dc.b	$3F,$06,$5B,$4F,$66,$6D,$7D,$27,$7F,$67
*
* 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.l	#$E0000E, a1	Guardo la dirección del display en un registro para poder incrementarla sobre la marcha
	lea	tabla,a0	Pone el primer valor de la tabla en el registro de direcciones 0
	move.b	#0,d2		Muevo el contador de iteraciones del bucle al registro 2
	move.b	#8,d3		Muevo el número tope de iteraciones del bucle al registro 3

salto1	move.l	#$E00012,a3	Pongo la dirección de los switches en el registro de direcciones 3
	move.b	#1,d5		Pongo el estado 01 en el registro 5 para comparar
	cmp.b	(a3),d5		Comparación: determina si los switches están a 01
	beq	bucle1		Si la comparación es cierta pasamos a rellenar con 876543210
	jmp	salto1		Si no, ejecutamos de nuevo el bucle

salto2	move.l	#$E00012,a3	Pongo la dirección de los switches en el registro de direcciones 3
	move.b	#0,d5		Pongo el estado 00 en el registro 5 para comparar
	cmp.b	(a3),d5		Comparación: determina si los switches están a 00
	beq	prebuc2		Si la comparación es cierta pasamos a rellenar con --------
	jmp	salto2		Si no, ejecutamos de nuevo el bucle

bucle1	move.b	(a0),d4		Coloco en d4 al valor correspondiente de la tabla
	move.b	d4,(a1)		Coloco el valor adecuado en el contenido del registro a1
	sub.l	#2,a1		Paso al siguiente display disminuyendo la posición de mem a la que apunta a1
	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
	cmp.w	d2,d3		Comprobación de continuación del bucle
	bgt.b	bucle1		Bucle del programa, si se alcanza el valor límite, pasará a la siguiente instrucción
	jmp	salto2		Pasa a la espera de que se pulse de nuevo el switch

prebuc2	move.b	#0,d2		Muevo el contador de iteraciones del bucle al registro 2
	move.b	#8,d3		Muevo el número tope de iteraciones del bucle al registro 3
	move.l	#$E0000E, a1	Guardo la dirección del display en un registro para poder incrementarla sobre la marcha

bucle2	move.b	#$40,d4		Coloco en d4 al valor correspondiente (para poner un guión)
	move.b	d4,(a1)		Coloco el valor adecuado en el contenido del registro a1
	sub.l	#2,a1		Paso al siguiente display disminuyendo la posición de mem a la que apunta a1
	add	#1,d2		Añado una unidad al contador
	cmp.w	d2,d3		Comprobación de continuación del bucle
	bgt.b	bucle2		Bucle del programa, si se alcanza el valor límite, pasará a las instrucciones de parada

fin	MOVE.B	#9,d0
	TRAP	#15		Parada del simulador

	END	START


vidalmb_admin – Mié, 13/06/2007 – 11:37

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
vidalmb_admin – Mié, 25/07/2007 – 00:36

Práctica 3: Uso de interrupciones


Objetivo

Diseñar un programa que implemente un cronómetro visualizable a través del display de 7 segmentos cuya actualización se realice gracias a una interrupción de nivel 1 autoprogramada.


Implementación

Para poder usar el sistema de interrupciones en el simulador, lo primero que hay que hacer es capacitarlas. La capacitación de dichas interrupciones en el simulador se realiza de forma manual seleccionando la opción Enable Exception:

vidalmb_admin – Jue, 26/07/2007 – 01:57

Apéndice - Instrucciones importantes


Instrucciones de desplazamiento y rotación

En este tipo de operaciones, ya sean de tipo aritmético o lógico, el bit “perdido” se almacena en el bit C del registro de estado. Por tanto, tras realizar el desplazamiento, para saber si el bit perdido es un 0 ó un 1, bastará con evaluar dicho bit. Para ello se pueden usar las siguientes condiciones:

CC (Carry Clear) - Es cierta si el bit C del registro de estado es 0
CS (Carry Set) - Es cierta si el bit C del registro de estado es 1

vidalmb_admin – Vie, 27/07/2007 – 13:30