LABORATORIO DE ARQUITECTURA DE COMPUTADORES

Anuncio
LABORATORIO DE ARQUITECTURA DE COMPUTADORES
Práctica 1
1. Realizar un programa que almacene en memoria RAM a partir de la dirección $1000 los
30 primeros números múltiplos de tres.
2. Paso de parámetros en la pila. Seguir la ejecución del programa siguiente. Modificar los
parámetros para que sean de tipo LONG y BYTE.
DATOS
INICIO
BORRAR
BUCLE
ORG
DC.L
DC.L
$0
$8000
INICIO
ORG
DCB
$1000
8,$AAAA
ORG
MOVE.W
MOVE.W
MOVE.W
MOVE.W
BSR
ADD
BREAK
$2000
#DATOS,A2
A2,-(SP)
#$00,D2
D2,-(SP)
BORRAR
#$4,SP
MOVE.W
MOVE.W
MOVE.W
ADDQ
CMP
BNE
RTS
END
4(SP),D0
6(SP),A0
D0,(A0)
#2,A0
#$1010,A0
BUCLE
; Pasamos el 1er parametro en la pila
; Pasamos el 2do parametro
; Desapilamos los parametros
; Recuperamos los parametros
3. Realizar una subrutina que tenga dos parámetros de entrada, base y exponente, que
calcule la función baseexponente.
a. Estructurar el programa para pasar los parámetros vía los registros de datos.
b. Estructurar el programa para pasar los parámetros vía la pila del sistema.
4. Realizar la función factorial por medio de una subrutina que acepte un parámetro de
entrada a través de la pila. Resolver recursivamente.
LABORATORIO DE ARQUITECTURA DE COMPUTADORES
Práctica 2
La práctica consta de varios apartados. En el primero habrá que implementar una serie de
subrutinas para manejar las UART mediante la técnica de entrada/salida programada o polling. En
los apartados siguientes se implementarán una serie de programas que harán diversos usos de las
subrutinas desarrolladas en el primer apartado.
Todos los apartados de la práctica se realizarán en el modo supervisor de funcionamiento del
microprocesador Motorota 68000.
PRIMER APARTADO
Se pide desarrollar las subrutinas siguientes para manejar las UART mediante entrada/salida
programada:
INI_UART (uart: WORD)
Permite inicializar una UART. El parámetro ‘uart’ es de tipo WORD, es decir, ocupa dos octetos y
sus únicos valores posibles son: 0, 1 ó 2 para referirse a cada una de las tres UARTS que se van
a utilizar en el desarrollo de la práctica.
Esta subrutina programa la UART pasada como parámetro, para comunicarse a 8 bits por
carácter, sin paridad, un bit de stop y una velocidad de transmisión de 9600 bits por segundo.
Además, habilitará la recepción y la transmisión de caracteres.
Es posible que una misma UART pueda inicializarse varias veces durante la ejecución de un
programa, por lo que conviene tener en cuenta la singularidad del funcionamiento de los registros
MR1 y MR2.
ENV_CAR (uart: WORD; car: BYTE)
Envía un carácter por una UART. El parámetro ‘uart’ es de tipo WORD y sólo admite los valores
0, 1 y 2 para referirse a cada una de las UARTS utilizadas en esta práctica. El parámetro ‘car’ es
de tipo BYTE. Está rutina enviará el carácter (escribir en el registro TB) cuando la UART esté
lista, y no devolverá el control hasta que el último bit del carácter haya salido por la línea de
comunicaciones.
REC_CAR (uart: WORD; VAR car: BYTE)
Recibe un carácter de una UART. El parámetro ‘uart’ es de tipo WORD y admite los mismos
valores que en la subrutina ENV_CAR. El parámetro ‘car’, además de ser de tipo BYTE, es de
salida (parámetro por referencia).
Esta subrutina no devolverá el control hasta que se reciba un carácter por la UART indicada.
SEGUNDO APARTADO
Se pide escribir el programa ECO, que deberá enviar por un puerto UART todos los caracteres recibidos
por su otro puerto, finalizando su ejecución cuando reciba el carácter asterisco (‘*’).
En este apartado se utilizará únicamente la UART 0, que tiene por nombre “Port A (0)” en el entorno de
prácticas.
Téngase en cuenta que antes de poder enviar o recibir por una uart es necesario inicializarla.
TERCER APARTADO
Escribir un programa que escriba todo lo que lea de la UART 0 (Port A) por las uarts 1 (Port B) y 2 (Port
C). Al igual que en segundo apartado el programa finalizará su ejecución cuando reciba un asterisco (“*”)
CUARTO APARTADO
Escribir un programa con la recepción de caracteres configurable. Al arrancar el programa la información
se recibirá por la UART 0 (Port A), enviándose a continuación toda la información recibida a las UARTs 1
(Port B) y 2 (Port C). Si en un momento dado recibe por la entrada seleccionada (Port A) la secuencia “*1”
o “*2”, se conmutará la entrada, respectivamente, a la UART 1 ó 2. A partir de ese momento se enviará la
información a las otras dos UARTs (0 y 1 ó 0 y 2) según corresponda. El programa no detiene nunca su
ejecución.
En resumen, el comportamiento del programa se ajustará al diagrama de estados siguiente:
*2
*0
*2
Entrada
Seleccionada
0 (Port A)
*1
Entrada
Seleccionada 2 (Port
C)
*0
Entrada
*2
*1
*1
*0
Entrada
Seleccionada
1 (Port B)
*0
NOTA: No olvidar que por las UARTs se reciben caracteres. Cuando se recibe un ‘2’ es un
carácter y no el número 2 en decimal. Se recomienda, en la realización de la práctica, trabajar
con el código ASCII de los caracteres o utilizar el carácter entre comillas simples (por ejemplo:
move.b #’A’,D0)
* Fichero: P2.ASM
* --- Ejemplo de E/S por polling.
* Arranque del 68000
ORG $0
DC.L $10000
DC.L RESET
; Comienzo Tabla Vectores de Interrupcion
; Valor Inicial SSP
; PC Inicial
*
* CONST
*
USART
MR1A
MR2A
SRA
CSRA
CRA
TBA
RBA
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
$EFFA01
$0
$0
$2
$2
$4
$6
$6
*
* VAR
ORG $400
MENSAJE DC.B
* $A caracter
* $D caracter
* $0 caracter
'Arquitectura de Computadores',$A,$D,$0
Line Feed (LF)
Carriage Return (CR)
NULL, indica el Final del String
*
* BEGIN
ORG
$500
RESET:
BSR
MOVE.L
INI_68681
#MENSAJE,A1
; Call INI_68681
; A1 := ADDRESS (MENSAJE)
BUCLE:
CMPI.B
BEQ
#0,(A1)
SALIR
; While (A1) <> 0 do
POLL:
BTST.B
BEQ
#2,USART+SRA
POLL
; While USART.SRA[2] = 0 do
; End While
MOVE.B
(A1)+,USART+TBA
; Enviar_Car
JMP
BUCLE
SALIR:
BREAK
*
* PROC INI_68681 ()
*
INI_68681
MOVE.L A0,-(SP)
MOVE.L #USART,A0
MOVE.B #%00010000,CRA(A0)
MOVE.B #%00100011,MR1A(A0)
MOVE.B #%00000111,MR2A(A0)
MOVE.B #%10111011,CSRA(A0)
MOVE.B #%00110100,CRA(A0)
MOVE.L (SP)+,A0
RTS
END
; End While
; End Program
;
;
;
;
;
;
;
;
Push A0
A0 := USART
USART.CRA = Habilitar MR1A
USART.MR1A = 8 bits por car.
USART.MR2A = no RTS, no CTS, 1 bit Stop
USART.CSTA = 9600 bps
USART.CRA = Habilitar Transmisor
Pop A0
LABORATORIO DE ARQUITECTURA DE COMPUTADORES
Práctica 3 (E/S por Interrupciones)
Ejercicios:
1. Realizar un programa capaz de mostrar por un puerto de la UART los diez primeros valores
exponenciales de base dos (20, 21…29 ). Tener en cuenta que para visualizar un valor por la
ventana de la UART, hay que enviar los caracteres ASCII que representan el valor, y no el
valor en sí. Es decir, si queremos enviar el valor 32, tendremos que convertir este número a
los caracteres ‘3’ y ‘2’ para proceder a su envío. La conversión puede realizarse utilizando la
división entera y el módulo, además de tener en cuenta que el valor ASCII del carácter ‘0’ es
el $30 y que el resto tiene valores consecutivos.
La transmisión debe realizarse mediante interrupciones y la llamada para la inicialización de
la UART se llevará a cabo mediante un Trap.
Una interrupción software o Trap es similar a una interrupción hardware, pero se produce por
la ejecución de una instrucción TRAP. El 68000 dispone de 16 traps distintos, donde cada
uno tiene asociado un número de vector de interrupción, teniendo al trap #0 le corresponde
el vector $20 (32 decimal), y al trap #15, el $2F (47 decimal).
2. Modificar el programa “ECO” propuesto en la práctica 2 para que la recepción de caracteres
se realice mediante interrupciones. Para realizar este apartado puede tomarse como base el
ejemplo que aparece al final de este documento, sustituyendo el TIMER por la UART.
3. Hacer un programa que simule el comportamiento de un dado. Cada vez que se pulse una
tecla se visualizará un número aleatorio entre 1 y 6.
Para obtener el número aleatorio podemos utilizar los bits menos significativos del contador
del TIMER, habiéndolo puesto previamente a funcionar. Si dicho contador se decrementa
muy rápido (por ejemplo cada centésima), y lo leemos cada vez que se pulsa una tecla,
podemos considerar este valor como aleatorio. Después bastará con transformar el valor
leído al rango entre 1 y 6 (módulo 6)
Tabla de Vectores de Excepción del MC68000
BERR
Excepciones
Interrupciones
Autovectorizadas
Interrupciones
Software (Traps)
Interrupciones
Vectorizadas
(Hardware)
Dirección
Número
Vector Dec Hex E.D.
0
0
0
SC
4
4
SC
2
8
8
SD
3
12
C SD
4
16 10 SD
5
20 14 SD
6
24 18 SD
7
28 1C SD
8
32 20 SD
9
36 24 SD
10
40 28 SD
11
44 2C SD
12-14
48 30 SD
15
60 3C SD
16-23
64 40 SD
24
96 60 SD
25
100 64 SD
26
104 68 SD
27
108 6C SD
28
112 70 SD
29
116 74 SD
30
120 78 SD
31
124 7C SD
32-47
128 80 SD
48-63
192 C0 SD
64-255 256 100 SD
Excepción
Reset: SSP Inicial
Reset: PC Inicial
Error de Bus
Error de Dirección
Instrucción Ilegal
División por 0
Instrucción CHK
Instrucción TRAPV
Violación de Privilegio
Traza
Emulador Instrucción 1010
Emulador Instrucción 1111
Reservado
Vector Int. No Inicializado
Reservado
Interrupción Espúrea
Autovector Nivel 1
Autovector Nivel 2
Autovector Nivel 3
Autovector Nivel 4
Autovector Nivel 5
Autovector Nivel 6
Autovector Nivel 7
Instrucciones TRAP
Reservado
Vectores de Interrupción
Dirección = Nº Vector * 4
Las pastillas de E/S contienen
el número del vector de interrupción (8 bits) en
el registro del vector de interrupción
1er Kbyte
de
memoria
256
Vectores
Programa ejemplo:
* FICHERO: P3.ASM
* ============== Saca "*" por la UART 0 cada segundo mediante interrupciones
* ================= Definición de constantes ==========================
* ---------------------- UART 68681 ---------------------------------UART
EQU
$EFFA01
MR1
MR2
USR
CSR
CR
TB
RB
ISR
IMR
IVR
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
$0
$0
$2 ;SR de la UART
$2
$4
$6
$6
$A
$A
$18
* -------------------- TIMER 68230------------------------------------TIMER
EQU
$10021
TCR
TIVR
CPRH
CPRM
CPRL
CNTRH
CNTRM
CNTRL
TSR
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
$0
$2
$6
$8
$A
$E
$10
$12
$14
NVI_TIMER
EQU
$70
TCR_PROG
* ===
* ===
* ===
* ===
* ===
EQU
101:
0:
X:
00:
1:
%10100001
IRQ Vectorizada,
ZD activo (Recarga),
No Usado,
Control de Reloj Modo 00 (Clock Sistema con preescala(32)),
Activado
* ==================== Vectores de interrupción =======================
ORG
$0
DC.L
$10000
; Valor Inicial del SSP
DC.L
INICIO
ORG
DC.L
NVI_TIMER*4
RTI_TIMER
; Dir. RTI del TIMER
* -------------- Programa Principal ----------------------------------
INICIO
ESPERA
ORG
BSR
BSR
$400
INI_68681
INI_68230
; Inicializa la USART
; Inicializa el TIMER
ANDI.W
#$F0FF,SR
; Permite interrupciones;
MOVE.B
MOVE.B
#TCR_PROG,TIMER+TCR ; Para activar el TIMER
#'*',UART+TB
BRA
ESPERA
; Espera activa, no hace nada
* -------------- SUBRUTINAS ------------------------------------------* =================
INI_68681 MOVE.L
MOVE.L
MOVE.B
MOVE.B
MOVE.B
MOVE.B
MOVE.B
MOVE.L
RTS
Inicializar la UART: 68681
A0,-(SP)
; Guarda registro
#UART,A0
; Direccion base
#%00010000,CR(A0)
; Habilita MR1, inhibe TX y RX
#%00100011,MR1(A0)
; 8 bits por car, sin paridad
#%00000111,MR2(A0)
; 1 bit de stop
#%10111011,CSR(A0)
; 9600 bps
#%00110100,CR(A0)
; Habilita TX
(SP)+,A0
; Recupera registro
* =================
INI_68230 MOVE.L
MOVE.L
MOVE.B
MOVE.B
MOVE.B
MOVE.B
*
Inicializar Timer: 68230
A0,-(SP)
; Guarda registro
#TIMER,A0
; Dirección base
#$1,CPRH(A0)
; 4.000.000/32 = $1E848
#$E8,CPRM(A0)
#$48,CPRL(A0)
#NVI_TIMER,TIVR(A0)
; Vector de interrupción
; Falta programar el TCR
MOVE.L
RTS
(SP)+,A0
; Recupera registro
*==================== Tratamiento de interrupción del TIMER
RTI_TIMER
POLL
BTST.B
#2,UART+USR
BEQ
POLL
MOVE.B
#'*',UART+TB
MOVE.B
RTE
END
#TCR_PROG,TIMER+TCR
; Para activar el TIMER
LABORATORIO DE ARQUITECTURA DE COMPUTADORES
Práctica 4
1. Ejercicio de DMA
Desarrollar un programa que, utilizando el dispositivo DMA, realice una copia de un
bloque de información de una zona de memoria a otra.
Antes de realizar la copia, la zona origen se rellenará con los 2048 primeros números
(0-2047), utilizando una palabra (2 octetos) para almacenar cada número.
El programa principal, una vez haya inicializado y arrancado el DMA, se quedará en
bucle mostrando por la UART A el carácter ‘.’ (punto) hasta que no finalice la
transferencia. La finalización de la transferencia se detectará mediante la
correspondiente interrupción y se indicará mostrando un carácter ‘*’ (asterisco) por la
UART A.
El DMA se programará con una velocidad de transferencia de 1 octeto cada 32 ciclos
de reloj.
La transmisión por la UART A se realizará mediante la técnica de sondeo (polling).
2. Trabajo Final
Este ejercicio pretende ser una especie de “trabajo final” en el que se utilicen conceptos ya
introducidos en prácticas anteriores. Por lo tanto, carece de explicaciones teóricas y deja al
alumno la iniciativa sobre cómo enfocar el problema.
Se plantea la realización de lo que denominaremos un “medidor de reflejos”. Se trata
de implementar un bucle sin fin que visualice un estímulo visual al que el usuario
deberá responder pulsando una tecla cualquiera en el menor tiempo posible. A
continuación se visualizará el tiempo de reacción (el transcurrido entre la visualización
del estímulo y la pulsación de la tecla). El programa utilizará el puerto A de la UART 0
como medio de entrada/salida.
Comenzará visualizando un mensaje para prevenir al usuario, por ejemplo:
Pulse cuando esté preparado...
Cuando el usuario lo desee, pulsara una tecla cualquiera. A partir de ese instante
transcurrirá un tiempo aleatorio (8 0 10 segundos como máximo) al final del cual se
visualizará el estímulo, por ejemplo:
..... YA!
A partir de este momento, el usuario pulsará una tecla cualquiera lo antes que pueda y
ello dará lugar a la visualización del tiempo de reacción. Este tiempo se medirá en
centésimas de segundo que es una escala razonable para este tipo de mediciones. El
resultado podría ser algo así:
Tiempo de reacción (centésimas): 68
A continuación volveríamos a repetir el ciclo visualizando nuevamente el mensaje
inicial. Nuestro programa no tiene fin.
Se muestra un ejemplo de lo que podría ser la salida de ejecución a través del puerto
A:
Pulse cuando esté preparado...
..... YA!
Tiempo de reacción (centésimas): 59
Pulse cuando esté preparado...
..... YA!
Tiempo de reacción (centésimas): 87
Pulse cuando esté preparado...
Descargar