SOLUCIÓN

Anuncio
Estructura de computadores. Control 2. Grupos 1 y 2.
Curso 2009/2010
Problema 1.- SOLUCIÓN
Se presentan dos soluciones. La primera (v1.0) supone que la separación entre palabras es de
exactamente un espacio en blanco. Además, no se prevee que haya espacios al principio de la
cadena o después de la última palabra. Con esas premisas, se construye un bucle que recorre la
cadena desde el principio y cuenta el número de caracteres de la cadena (en D0) y el número de
espacios que se van encontrando (en D1). El número medio de letras de las palabras de la frase
es (D0-D1)/(D1+1)
;-----------------------------------------------------------------------; strmwlen
v1.0
;
; Devuelve el número medio de caracteres de las palabras de una cadena.
; En caso de error (no hay palabras, la cadena está vacía) devuelve 0.
; Entradas: A0: puntero a la cadena de caracteres.
; Salidas: D0.W: número medio de caracteres de las palabras.
; Se converva: Todo
; Detalles de implementación: sólo se considera el espacio como separador;
; supone que no puede haber espacios al principio/final de la cadena, y que
; la separación entre palabras es de un único espacio.
; Cualquier otro carácter (incluso signos de puntuación) se considera
; que forman parte de las palabras.
;-----------------------------------------------------------------------strmwlen
movem.l
d1/a0, -(sp)
clr.l
d0
;d0: Contador de caracteres
clr.l
d1
;d1: Contador de espacios
strmwBuc
strmwFin
;Recorrer
tst.b
beq
add.l
cmp.b
bne
add.l
bra
cadena contando letras y espacios
(a0)
;Fin de cadena?
strmwFin
;...sí. Calcular media
#1, d0
;...no. Contablizar carácter
#’ ‘, (a0)+
;Es un espacio?
strmwBuc
;...no. Procesar sig. carácter
#1, d1
;...sí. Contabilizar espacio
strmwBuc
;Procesar sig. carácter
;Calcular
sub.l
add.l
divu
movem.l
rts
media
d1, d0
#1, d1
d1, d0
(sp)+, d1/a0
;d0 = número de letras
;d1 = número de palabras
;d0 = número medio de letras
La siguiente solución (v2.0) rebaja las exigencias de la primera y permite la ocurrencia de
espacios en cualquier número y lugar. El bucle recorre ahora la cadena contabilizando el número
de letras en D1 y el de palabras en D0.
;-----------------------------------------------------------------------; strmwlen
v2.0
;
; Devuelve el número medio de caracteres de las palabras de una cadena.
; En caso de error (no hay palabras, la cadena está vacía) devuelve 0.
; Entradas: A0: puntero a la cadena de caracteres.
; Salidas: D0.W: número medio de caracteres de las palabras.
; Se converva: Todo
; Detalles de implementación: sólo se considera el espacio como separador.
; Cualquier otro carácter (incluso signos de puntuación) se considera
; que forman parte de las palabras.
;-----------------------------------------------------------------------strmwlen
movem.l d1/a0,-(sp)
clr.w
d0
;D0=num. palabras (también resultado)
clr.l
d1
;D1=num total letras
buscinipal tst.b
beq
cmpi.b
beq
buscfinpal addq.l
tst.b
beq
cmpi.b
bne
cuentapal addq.w
bra
(a0)
nomaspal
#' ',(a0)+
buscinipal
#1,d1
(a0)
cuentapal
#' ',(a0)+
buscfinpal
#1, d0
buscinipal
nomaspal
la cadena. Calcular resultado
d0
;Hay palabras?
strmwErr
;...no, salir con error
d0, d1
;D1 = Sum(longitudes)/NumPalabras
d1, d0
;D0 = Cociente
(sp)+, d1-d2/a0
strmwErr
;Se acabó
tst.w
beq
divu
move.w
movem.l
rts
;Fin de cadena?
;...sí. Salir
;...no. Es esapcio?
;...sí. Seguir buscando inicio palabra
;...no. Contabilizar una letra más
;Es la última de la cadena?
;...sí, entonces contabilizar palabra
;...no. Le sigue un espacio?
;...no. Seguir procesando palabra
;...sí. Contabilizar palabra
;Seguir proceso de cadena
Problema 2.- SOLUCIÓN
$005000
move.l
(a0), d0
Secuencia
Tipo ciclo (B/E)
A23..0
D15..0
R/W#
UDS#
LDS#
1
B
$005000
$2010
1
0
0
2
E
$003004
$1177
1
0
0
3
E
$003006
$0508
1
0
0
$005002
move.b
-(a0), $123456
Secuencia
Tipo ciclo (B/E)
A23..0
D15..0
R/W#
UDS#
LDS#
4
B
$005002
$13E0
1
0
0
5
B
$005004
$0012
1
0
0
6
B
$005006
$3456
1
0
0
7
E
$003003
$xx99
1
1
0
8
E
$123456
$99xx
0
0
1
005008
add.w
d1, d0
Secuencia
Tipo ciclo (B/E)
A23..0
D15..0
R/W#
UDS#
LDS#
9
B
$005008
$D041
1
0
0
Problema 3.- SOLUCIÓN
a) Teniendo en cuenta que en el 68000 las direcciones pares se encuentran ubicadas en un chip
físico diferente al de las direcciones impares, será necesario utilizar al menos dos chips de
memoria por bloque. Al hacer esto, saldrían chips de tamaño 6Kb lo que es imposible al no ser
potencia de 2. De esta forma, tendremos que partir cada bloque de 12Kb en otros menores. La
solución que contempla menos bloques a implementar es dividir el bloque de 12 Kb en uno de
4 Kb y otro de 8 Kb. La tabla de direcciones para cada bloque correspondiente a la división
propuesta será:
A23 A22 A21 A20 A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
1
0
0
0
Bloque
ROM1 1Kb
ROM2 4Kb
ROM3 8Kb
RAM1 8Kb
RAM2 4Kb
Las expresiones de selección de los chips serán:
23
CS ROM1 # = AS# +
∑
Ai
23
i = 10
23
CS ROM2 # = AS# +
∑
CS RAM1 # = AS# +
CS ROM3 # = AS# +
∑
A i + A 14 + A 13
i = 15
23
A i + A 12
i = 13
23
∑
CS RAM2 # = AS# +
∑
A i + A 14 + A 13 + A 12
i = 15
A i + A 13
i = 14
DTACK# = CS ROM1 # ⋅ CS ROM2 # ⋅ CS ROM3 # ⋅ CS RAM1 # ⋅ CS RAM2 #
BERR# = AS# + DTACK#
Si se van a usar chips de memoria con filosofía Motorola, las ecuaciones serían:
CS ROM1p # = CS ROM1 # + R/W# + UDS#
CS ROM1i # = CS ROM1 # + R/W# + LDS#
CS ROM2p # = CS ROM2 # + R/W# + UDS#
CS ROM2i # = CS ROM2 # + R/W# + LDS#
CS ROM3p # = CS ROM3 # + R/W# + UDS#
CS ROM3i # = CS ROM3 # + R/W# + LDS#
CS RAM1p # = CS RAM1 # + UDS#
CS RAM1i # = CS RAM1 # + LDS#
CS RAM2p # = CS RAM2 # + UDS#
CS RAM1i # = CS RAM2 # + LDS#
b) Ahora tenemos que generar la lógica de selección que implemente los CS# definidos. En el
enunciado nos dicen que el sistema no va a ser ampliado por lo que será aceptable realizar una
decodificación incompleta (aunque aparezcan espejos de memoria). Seguiremos la forma de
adaptación de señales del M68000 al funcionamiento de las memorias tipo Intel generando las
señales xRD# y xWR# mediante la siguiente expresión generada por la lógica representada en
la figura (esto no es necesario si se usan memorias tipo Motorola).
LDS#
LRD#
LRD# = LDS# + R/W#
URD#
LWR#
UWR#
R/W#
UDS#
URD# = UDS# + R/W#
LWR# = LDS# + R/W#
UWR# = UDS# + R/W#
Para la implementación física, partimos de la observación de la tabla detallada para la selección
de cada chip viendo que las líneas A14, A13, y A12 determinan bloques de 4Kb que es el tamaño
mínimo que necesitamos.
DEC
A14
A13
A12
AS#
s2
s1
s0
E
d0
d1
d2
d3
d4
d5
d6
d7
CSROM1#
CSROM2#
CSROM3#
CSRAM1#
CSRAM2#
DTACK#
c) El código del enunciado hace un acceso de tamaño palabra larga para lo cual el
microprocesador efectuará dos accesos consecutivos de tamaño palabra. Al utilizar el modo de
direccionamiento indirecto con predecremento, primero se le restará el tamaño del operando a
la dirección contenida en el registro A0 ($4002 - 4 = $3FFE) por lo que uno de los accesos se
hará a la palabra $3FFE y el siguiente a la palabra $4000.
En el mapa de memoria se observa que la primera palabra accedida corresponde a la última del
bloque de ROM y la siguiente a la primera del bloque de RAM.
Físicamente se encuentran en la dirección $FFF del chip de ROM de 4Kb de los bytes pares del
bloque denominado ROM3 y del chip de ROM de los impares del mismo bloque; y en la
dirección $000 del chip de RAM de 4Kb de los bytes pares del bloque denominado RAM1 y del
chip de RAM de los impares del mismo bloque.
Descargar