Problema 1.- Supuesto un sistema basado en el MC68000, con una memoria ROM de 8Kwords y una memoria RAM para datos de 4Kwords contigua a la memoria ROM. Señala como quedarían afectadas las posiciones de memoria y el registro A1, después de ejecutarse las siguientes instrucciones:
MOVE.L #$FFA012,D0 MOVE.W D0,1(A1)
Suponer un valor de A1, antes de la ejecución de la instrucción, que sirva de puntero dentro de la zona de memoria de datos indicada en la figura, y que no de lugar a que se produzca error en el proceso de ejecución.
Solución propuesta:
En las posiciones más bajas del espacio de direccionamineto se sitúa 8K palabras de ROM o, equivalentemente, 16Kbytes de ROM. Para direccionar 16Kbytes, se requieren 14 bits de direcciones, A13-A0, por consiguiente, el rango de direcciones para ROM en MC68000 va desde $000000 a $003FFF. La primera dirección de la RAM, situada a continuación de la ROM en el espacio de direccinamiento, tiene la dirección $004000. Para la RAM existen 4K words = 8K bytes, para los que se requieren 13 bits. Por tanto el rango de la RAM es: $004000-$005FFF. Si se escoge el contenido del registro A1 = $004001, el modo de direccionamiento 1(A1) selecciona la dirección de memoria $004002, o dirección par, para la escritura del dato de tamaño palabra.
20 FA A0 12 0F 1A
20
E4
32
3A
0F
1A
E4
02
F0
FF
2N 2N+1
2N 2N+1
Antes de la ejecución
Después de la ejecución
Primera posición de la RAM
20
E4
32
3A
0F
1A
2N 2N+1
2N 2N+1
Problema 2.- Señala como quedarían afectadas las posiciones de memoria, después de ejecutarse las siguientes instrucciones, suponiendo que la primera dirección de memoria es $FF8000.
MOVE.L #$FF,D2 MOVE.L #4,D0 MOVEA.L #$8000,A1 DIVU 4(A1,D0.W),D2 MOVE.L D2,(A1)+ Solución propuesta: a) MOVE.L #$FF,D2 b) MOVE.L #4,D0 c) MOVEA.L #$8000,A1 d) DIVU 4(A1,D0.W),D2 e) MOVE.L D2,(A1)+
La instrucción (a) almacena un dato tamaño palabra larga en el registro D2 = $0000 00FF. La instrucción (b) carga D0=$00000004; la instrucción (c), carga en A1 = $0000 8000; la (d) calcula el resultado de la división sin signo de $0000 00FF entre el dato tamaño palabra situado en la dirección 4 (A1,D0.W) = 4 + $FF8000 + 0004 = $FF8008, o sea, $007F.
1111 1111 | 111 1111 01 10
El resultado de la división genera D2 = $0001 002. La última instrucción, (e) modifica la memoria según se muestra a continuación y el registro A1= FFFF 8004
00 01 00 02 0F 1A 00 00 00 7F
20
E4
32
3A
0F
1A
00
00
00
7F
2N 2N+1
2N 2N+1
Antes de la ejecución
Después de la ejecución
20
E4
32
3A
0F
1A
00
00
00
7F
2N 2N+1
2N 2N+1
Problema 3.- Señala sobre la figura, el contenido de la memoria de programa y cómo quedarían afectadas las posiciones de memoria de datos, después de ejecutarse las siguientes instrucciones de un programa, donde se muestra parte del fichero .LST:
3: 0000 1000: 7009 : (1) MOVEQ #9,D0 4: 0000 1002: 207C 0001 0000 : (2) MOVEA #$10000,A0 5: 0000 1008: 42A8 0000 : (3) CLR.L 0(A0) 6: 0000 100C: 42A8 0008 : (4) CLR.L 8(A0) 7: 0000 1010: 42A8 000C : (5) CLR.L 12(A0) 8: 0000 1014: 0618 0001 : (6)LAZO:ADDI.B #1,(A0)+ 9: 0000 1018: 51C8 FFFA : (7) DBF D0,LAZO A: 0000 101C: 2088 : (8) MOVE.L A0,(A0) Solución propuesta: 70 09 $010000 01 01 20 7C $010002 01 01 00 01 $010004 a+1 b+1 00 00 $010006 c+1 d+1 42 A8 $010008 01 01 00 00 $01000A 00 00 42 A8 $01000C 00 01 00 08 00 0C 42 A8 00 0C ...
(1) D0 = $0000 0009 (2) A0 = $0001 0000 (3) Borra el dato tamaño palabra de la dirección A0 (4)Boora el dato tamaño palabra de la dirección $01 0008 (5) Hace lo propio con el situado en la
dirección $01000C; (6) Incrementa el dato de tamaño byte almacenado en la dirección $010000 y A0=$0001 0001. (7) Decrementa el registro D0, si no es -1, salta a lazo. Al final del bucle A0=$01000A. (8) Se escribe en la dirección apuntada por A0 el contenido del propio registro.
Nota: a, b, c y d son los contenidos de la memoria de datos antes de la ejecución del programa.
2N 2N+1
MEM. DATOS
MEM. PROG.
2N 2N+1
$1000
Problema 4.- Se disponen de chips RAM y ROM de 8 bits para implementar un mapa de memoria entorno al MC68000 teniendo en cuenta, que, para acceder a ROM, se han reservado las direcciones ($000000-$00FFFF) y, para RAM, ($020000-$023FFF). Diseñe el sistema de decodificación.
Solución propuesta:
Los chips de ROM disponen de entrada de #CS y se requieren, al menos, dos. Los chips de RAM disponen de entradas de #CS y se requieren, también, dos.
Desde la dirección $00 0000 a la $00 FFFF, se cubren 64Kbytes, o 32K words, para lo que se necesitan dos ROMs de 32K bytes cada una, con bus de direcciones de 15 líneas, AB14-0.
CS_ROM_par = A23 +A22+A21+A20 + A19 + A18 + A17 + A16+ #AS + #UDS + FC2 FC1 FC0 +R/#W'
AB_ROM_par = A15-A1 DB_ROM_par= D15-D8
CS_ROM_impar = A23 +A22+A21+A20 + A19 + A18 + A17 + A16+ #AS + #LDS + FC2 FC1 FC0 +R/#W'
AB_ROM_impar = A15-A1 DB_ROM_impar= D7-D0
Desde la dirección $020000 hasta la $023FFF, se cubren 16Kbytes u 8 Kwords, para lo que se necesitan dos RAMS de 8K bytes cada una, con bus de direcciones de 13 líneas, AB12-0.
CS_RAM_par = A23 + A22 + A21 + A20 + A19 + A18 + /A17 + A16 + A15 + A14 + #UDS + #AS + FC2 FC1 FC0
AB_RAM_par = A13-A1 DB_RAM_par = D15-D8 R/#W_RAM_par = R/#W
CS_RAM_impar = A23 + A22 + A21 + A20 + A19 + A18 + /A17 + A16 + A15 + A14 + #LDS + #AS + FC2 FC1 FC0
AB_RAM_impar = A13-A1 DB_RAM_impar = D7-D1 R/#W_RAM_impar = R/#W
Problema 5.- Escribe una rutina de excepción software para que, llamada a través de la instrucción trap #2, retorne, en D0, el valor de la máscara de interrupción en el momento de ser llamada. El vector asociado a la excepción trap#0 es el 32D. La rutina ha de comenzar en la dirección $005000.
Solución propuesta:
ORG 136
DC.L RUTINA ;Instalación de la rutina en el vector que ocupa la dirección de memoria(32 + 2)*4=136
ORG $005000
RUTINA: MOVE SR,D0 ;Copia el registro SR, que contiene la máscara de interrupciones, en el registro D0
AND.W #$700,D0 ; Se enmascaran todos los bits salvo los tres que ocupan las posiciones menos signiticativas del System byte
LSR.W #8,D0 ;Coloca el número en el byte menos significativo. RTE
Problema 6.- Escribe una rutina de excepción que sea llamada a través de una excepción software (trap #2) para poner la máscara de interrupción de la CPU al nivel deseado. Este nivel se pasará a través de la PILA como parámetro en tamaño word, antes de ejecutar la instrucción trap. Supóngase que la CPU está en modo Supervisor. Asimismo inicializa el vector, suponiendo que la rutina se situará en la dirección de memoria $005000 y que, el número de vector asignado a la excepción trap #0, es el 32d. Indíquese que cambios habría que realizar si la rutina, en el momento de ejecutarse, desconoce si el sistema estaba en modo supervisor o usuario.
Solución propuesta:
En todas las excepciones el microprocesador pasa a modo supervisor antes de guardar la información del contador de programa y del registro de estado. El puntero de pila siempre está apuntando a la última palabra almacenada, se decrementa cuando se introducen datos en ella y se incrementa cuando se sacan.
Si MC68000 está en modo usuario, el nivel que se desea que tenga la máscara de interrupciones se encuentra apuntado por el USP. Si se está en modo Supervisor, esta información se encuentra en la PILA de Supervisor en la posición SSP+6. A su vez, el registro de estado anterior a la excepción, que informa sobre si el MC68000 estaba en modo supervisor, se encuentra apuntado por el SSP, en concreto, el bit 13 de dicha posición de memoria.
ORG 136
DC.L RUTINA ;Instalación de la rutina en el vector que ocupa la dirección de memoria(32 + 2)*4=136
ORG $005000
RUTINA: MOVE (A7),D0 ;(SSP)->D0
AND.W #$2000,D0 ;Enmascara todos los bits salvo el S BEQ usuario ;Si S=0 se cumple el salto
Supervisor: MOVE.W 6(A7),D1 BRA fin
Usuario: MOVE USP,A6 ;Copia el puntero de usuario al registro A6 MOVE.W (A6),D1
Fin: LSL.W #8,D1 ;Desplaza 8 posiciones a la izquierda el contenido de D1. Esto sitúa los bits deseados de máscara en la posición del system byte.
MOVE.W (A7),D0 ;(SSP)->D0
AND.W #$F8FF,D0 ;Borra los bits de máscara de interrupción OR.W D1,D0
MOVE.W D0,(A7) ;Coloca el SR modificado en su posición en la SP RTE
Problema 7.- El circuito de la figura representa parte de la lógica de selección de memoria de un sistema basado en el 68000.
1. Completa la conexión de los buses de datos y direcciones de los chips de memoria con la CPU. 2. Indica el rango o margen de direcciones de la memoria ROM y RAM así como su capacidad.
3. Indica sobre cada chip de memoria, el margen de direcciones que ocupa y el banco al que pertenece (PAR o IMPAR).
4. Indica qué modificación introducirías para evitar conflicto en los buses, si se efectúan accesos indeseados en operaciones de escritura sobre la memoria ROM.
Solución propuesta:
De izquierda a derecha y de arriba a abajo, se numeran los chips desde 1 hasta 6.
1. Los bits A0-A14 de las memorias se conectan a las líneas A1-A15 del bus del microprocesador. Para los chips de RAM, 3 y 6, que tienen el terminal R/#W, este se conecta al del mismo nombre del microprocesador. La entrada #OE de los chips 1 y 4 habilita el bus de datos de los mismos cuando #UDS lo indica por lo que se deben conectar a las líneas D15-D8 del bus de datos, para los chips 2 y 5, controlados por #LDS, sus buses de datos deben conectarse al D7-D0 y para las RAM, el chip 3 se conecta al D7-D0 y el 6 al D15-D8.
2. Por lo que se aprecia en la figura, existen cuatro chips de memoria ROM y dos de memoria RAM (los de la derecha). Todos los chips de memoria son de 32Kbytes, puesto que disponen de 15 líneas en sus buses de direcciones. Esto hace que, el sistema de la figura, disponga de 64K words de ROM y 32K words de RAM. Los rangos que ocupan estos en el espacio de direccionamiento depende de la decodificación y/o activación de los chips. Los chips 4 y 5 se seleccionan si S0, los chips 1 y 2 si S1 y los de RAM, si S2.
S0 = A17 + A16 + #AS => chips 4 y 5 => rango dir. $x0 0000 - $x0 FFFF S1 = A17 + /A16 + #AS => chips 1 y 2 => rango dir. $x1 0000 - $x1 FFFF S2 = /A17 + A16 + #AS => chips 3 y 6 => rango dir. $x2 0000 - $x2 FFFF 3. Se deduce de los apartados anteriores
4. Introduciendo una puerta OR con S0 + /R/#W. En accesos a escritura, no se activaría el CS.
Problema 8.- Escribe una rutina que permita generar una tabla de datos con los elementos de la serie de Fibonacci. Los parámetros de entrada, antes de llamar a la rutina, se pasarán a través de la PILA, siendo estos: primero la dirección de comienzo de la tabla y segundo, el número de elementos, N>1. Considerar que el elemento más grande de la serie se puede almacenar en 16 bits.
1,1,2,3,5,8,13,21,34,....
Solución propuesta:
Se debe tener en cuenta que la rutina debe recibir sus argumentos (tamaño y dirección inicial) de la pila. Por consiguiente, ésta, una vez que el programa principal haya, por el orden adecuado, introducido la dirección de inicio, el número de elementos y haya invocado a la subrutina, quedaría como muestra la siguiente ilustración. <--- Tamaño W ----> A7-> PCH PCL N Dirección de inicio H Dirección de inicio L
rutina_fibonnacci: MOVE.W 4(A7),D0 ;Almacenamos en D0 el número de elementos de la tabla MOVEA.L 6(A7),A0 ;Extraemos la dirección de comienzo que se copia en A0 MOVE.W #2,D1 ;D1=2 D1 es el índice i
MOVE.W #1, (A0) ;tabla[0]=1 MOVE.W #1, 2(A0) ;tabla[1]=1 Bucle: CMP.W D0,D1
BEQ final
MOVE.W D1,D2 ;D2=i SUB.W #1,D2 ;D2=i-1 LSL.W #1,D2 ;D2=2*(i-1) MOVE.W 0(A0,D2.W),D3 ;D3 = tabla[i-1] MOVE.W D1,D2 ;D2=i
SUB.W #2,D2 ;D2=i-2 LSL.W #1,D2 ;D2=2*(i-2)
ADD.W 0(A0,D2.W),D3 ;D3 = tabla[i-1]+tabla[i-2] MOVE.W D1,D2 ;D2=i
LSL.W #1,D2 ;D2=2*i MOVE.W D3,0(A0,D2.W) ; tabla[i]=D3 ADD.W #1,D1 ;I++
BRA bucle Fin: RTS
Problema 9.- Se desea programar una rutina que convierta un número de 32 bits, almacenado en la dirección NUMERO, en su cadena de caracteres ASCII equivalente, y lo almacene a partir de la dirección CADENA_RESULTANTE.
Ejemplo: NUMERO: DC.L $010B0A09
CADENA_RESULTANTE: DS.B 8 >> $3031306630653039
Solución propuesta:
RUTINA: MOVE.W #0,D2 ;I=0 MOVEA.L #CADENA+8,A0 MOVE.L NUMERO,D0 ; BUCLE: MOVE.L D0,D1 ANDI.L #$F,D1 LSR.L #4,D0 CMPI.L #9,D1
Problema 10.- Supóngase que se desea transmitir un mensaje vía serie, el cual se encuentra almacenado en la dirección MENSAJE. Para su correcta transmisión, es necesario añadirle un byte que contiene la paridad impar del resto de los caracteres que se van a transmitir. Se pide realizar el programa que genera dicho byte.
Solución propuesta:
Suponemos que la longitud del mensaje es fija e igual a N
RUTINA: MOVE.W #0,D0 ;I=0 MOVEA.L #MENSAJE,A0
MOVE.B #0,D1 ;RES=D1=0 BUCLE: MOVE.B (A0)+,D2
EOR.B D2,D1 ADD.W #1,D0 ;I++ CMPI.W #N,D0 BNE BUCLE NOT.B D1 MOVE.B D1,(A0) RTS
Problema 11.- En la dirección de memoria $26008 se encuentra almacenada una lista de números codificados en binario con signo, mediante 16 bits. La longitud de la lista se encuentra almacenada en la dirección $26000, siendo ésta como máximo igual a 65535. Se desea saber cuántos elementos de esa lista son positivos, negativos o cero, para ello se debe programar una rutina que realice esta función, la cual almacenará el número de elementos de cada tipo en las direcciones $26002, $26004 y $26006 respectivamente. Solución propuesta: TABLA: EQU $26008 ORG $26002 POSITIVOS: DC.W 0 NEGATIVOS: DC.W 0 CEROS: DC.W 0
RUTINA: MOVE.W #0,D0 ;I=0 MOVEA.L #TABLA,A0
LAZO: CMPI.W #0,(A0) BGT INCPOS BEQ INCCEROS INCNEG: ADDI.W #1,NEGATIVOS
BRA SIGUE INCCEROS: ADDI.W #1,CEROS
BRA SIGUE
INCPOS: ADDI.W #1,POSITIVOS SIGUE: ADD.W #1,D0
CMP.W $26000,D0 BNE LAZO
RTS
Problema 12.- Se encuentra almacenada en memoria una cadena de caracteres, a partir de la dirección CADENA. La longitud de esta es indeterminada, pero se sabe que el carácter ascii con código 13 es indicativo de fin de cadena. De dicha cadena se desean eliminar todos aquellos caracteres que no pertenezcan al alfabeto (los que no estén comprendidos entre a..z y A..Z), siendo sustituidos por el ascii 32 (espacio).
Solución propuesta:
Las letras 'a' .. 'z' tienen códigos comprendidos entre $61 y $7A, mientras que las letras 'A' .. 'Z' tienen códigos entre $41 y $5A.
RUTINA: MOVEA.L #CADENA,A0 MOVE.B (A0),D0 BUCLE: CMP.B #13,D0
BEQ FIN
ORI.B #$20,D0 ;Pasa a minúsculas CMP.B #$61,D0
BCS SI CMP.B #$7A,D0 BHI SI SIGUE: ADDA.L #1,A0
BRA BUCLE SI: MOVE.B #32,(A0)
BRA SIGUE FIN: RTS
Problema 13.- Programe una rutina para convertir un número BCD de cuatro dígitos a binario, el cual está almacenado a partir de la dirección NUM_BCD. El número convertido en binario se almacenará en la dirección NUM_BIN.
Solución propuesta:
RUTINA: MOVE.B #0,D0 ;I=0 MOVE.L #0,D1 ;RES=0 MOVE.L NUM_BCD,D2 ;N=NUM MOVE.L #1,D4 ;N2=1 BUCLE: MOVE.L D2,D3 N1=N
ANDI.L #$F,D3 ;N1&=0XF MULU D4,D3 ;D3=N2XN1
Problema 14.- Se dispone de dos tablas de datos de 32 palabras, cuyas direcciones iniciales son: $25200 y $25500 respectivamente. Confeccionar un programa que sitúe el resultado de sumar las dos tablas anteriores a partir de la dirección $25600, a partir de la posición $25700 el resultado de restarlas y a partir de la $25800 la tabla suma obtenida anteriormente, ordenada de mayor a menor.
S olución propuesta:
Para ordenar las listas de mayor a menor, se supondrán que los números son sin signo.
RUTINA: MOVE.B #32,D0 ;Número de iteraciones MOVEA.L #$25200,A0
MOVEA.L #$25500,A1 MOVEA.L #$25600,A2 MOVEA.L #$25700,A3 BUCLE1: MOVE.W (A0)+,D1
ADD.W (A1)+,D1 MOVE.W D1,(A2)+ MOVE.W D1,(A3)+ SUBI.B #1,D0 BNE BUCLE1
MOVE.B #32,D0 ;Número de iteraciones MOVEA.L #$25200,A0
MOVEA.L #$25500,A1 MOVEA.L #$25700,A3 BUCLE2: MOVE.W (A0)+,D1
SUB.W (A1)+,D1 MOVE.W D1,(A3)+ SUBI.B #1,D0 BNE BUCLE2 ORDENAR: MOVEA.L #$25700,A3
MOVE.W #0,D0 ;I=0 BUCLE3: MOVE.W D0,D1 ;J=I MOVE.W D0,D2 D2=I LSL.W #1,D2 D2=2*I BUCLE4: MOVE.W 0(A3,D2.W),D7 D7=TABLA[I]
MOVE.W D1,D3 D3=J LSL.W #1,D3 D3=2*J CMP.W D7,0(A3,D3.W)
BLS SALTO SI TABLA[J]<=TABLA[I] SALTA MOVE.W 0(A3,D3.W),0(A3,D2.W) TABLA[I]=TABLA[J]
MOVE.W D7,0(A3,D3.W) TABLA[J]=COPIA TABLA[I] SALTO: ADD.W #1,D1 CMP.W #32,D1 BNE BUCLE4 ADD.W #1,D0 CMP.W #32,D1 BNE BUCLE3 RTS
Problema 15.- Diseñar un programa que realice la siguiente función:
Mediante esta función se realiza un filtrado digital de tipo FIR y de orden N, donde los AK, son los pesos del filtro y los, xt-K, son los datos digitales de la señal. Los valores de AK son datos de tipo byte con signo en complemento a 2 y están en la memoria a partir de la dirección $30000. Los valores xt-K son datos de tipo byte con signo en complemento a 2 y se leen de la dirección de memoria $60001. El valor calculado yt se asume que será de tipo byte y se debe escribir en la dirección de memoria $6000.
Solución propuesta:
RUTINA: MOVE.B #0,D0 ; INDICE I QUE VA DESDE 0 HASTA 126 MOVE.L #$30000,A0
MOVE.L $60001,A1
MOVE.L #0,D3 ;D3 CONTIENE EL ACUMULADO AK*XT-K BUCLE: MOVE.B (A0)+,D1 ;D1 = BYTE Ak
MOVE.B (A1)+,D2 ;D2= BYTE Xt-k EXT.W D1
EXT.W D2 ;EXTENSIÓN DE SIGNO DE LOS DATOS A MULTIPLICAR MULS D1,D2 ADD.L D2,D3 ;D3=D3+Ak*Xt-k ADD.B #1.D0 CMPI.B #127,D0 BNE BUCLE MOVE.W #127,D0 DIVS D0,D3 D3=D3/127 MOVE.B D3,$60000 RTS yt=