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.