ESCUELA TÉCNICA SUPERIOR DE INGENIEROS DE TELECOMUNICACIÓN Sistemas Electrónicos Digitales Convocatoria ESPECIAL. Diciembre 2006 DATOS PERSONALES Apellidos SOLUCIÓN Nombre Firma D.N.I. CALIFICACIONES Pregunta 1 1.5 Pregunta 5 1.5 Pregunta 2 1.5 Pregunta 6 Pregunta 3 2.5 Pregunta 7 Pregunta 4 1.0 Revisado 2.0 Calificación final Las Palmas de Gran Canaria a 16 de diciembre de 2006 Convocatoria Especial Sistemas Electrónicos Digitales Diciembre 2006 Pregunta 1 (1.5 Pto.) 1. 0.2 El salto se produce si los bits 7 y 0 están a “1” lógico. 2. 0.2 Se codifica con 4 bytes. Los bytes son: $5F $23 $81 $FC. 3. 0.2 La optimización se consigue con una única instrucción de comparación y salto. En nuestro caso sería: BRCLR DATO $40 *. 4. 0.2 El valor del registro sería $00. 5. 0.2 Se mantiene activo hasta que se vuelva a escribir sobre el PORTCL. 6. 0.2 El contenido del vector de reset sería $E000. 7. 0.2 El contenido del acumulador será $11. Al negar el contenido de A el resultado es $09 y al sumar 2 se queda en $0B. Como se ajusta decimalmente, el resultado final es $11. 8. 0.1 La sustitución quedaría de la siguiente manera: ADDB #1 ADCA #0 Pregunta 2 (1.5 Ptos.) Para la resolución suponemos que los índices m y n empiezan a numerarse por 0. El código de la rutina es: Etiqueta Nemónico , Operando Comentario ORG $100 BRA INICIO TABLA RMB LONG M EQU X N EQU Y INICIO LDS #$1FF LDX #$1000 * 0.3 Paso de parámetros LDY #TABLA PSHY LDAA #M PSHA LDAA #N PSHA BSR EXCT * 0.2 Eliminación de los parámetros introducidos en la pila PULA PULA PULY …… * 1.0 Código de la rutina EXCTST PSHA TPA PSHA PSHB PSHX PSHY TSY LDAB LDAA LDX LDY ASLA ASLB ABY TAB ABX LDD $09,Y $0A,Y $0C,Y $0C,Y ; Transferimos SP a Y ; Recuperamos N en B ; Recuperamos M sobre A ; Recuperamos dirección de comienzo de la TABLA en X ; Recuperamos dirección de comienzo de la TABLA en Y ; Al ser elementos de 16 bits calculamos la dirección x2 ; Y apuntando al elemento N $00,X ; X apuntando al elemento M ; D contiene elemento M 1 Solución Convocatoria Especial PSHA PSHB LDD STD PULB PULA STD PULY PULX PULB PULA TAP PULA RTS Sistemas Electrónicos Digitales Diciembre 2006 ; Lo guardamos temporalmente en la pila $00,Y $00,X ; D contiene elemento N ; Salvamos N en la tabla ; Recuperamos M $00,Y ; y lo salvamos en la tabla Pregunta 3 (2.5 Ptos.) 1. El programa quedaría de la siguiente manera: Etiqueta Nemónico , Operando Comentario ORG $FFFE ; Vector de Reset FDB $D000 ORG $FFF2 ; Vector de STRA FDB RSISTRA CONT ORG RMB $0000 2 ORG LDS LDX BSET BSR LDD STD LDAA STAA CLI BRA $D000 #$1FF #$1000 OPTION,X $80 DEL1MS #1000 CONT #$42 PIOC,X ; Zona de datos en memoria RAM ; Contador de interrupciones ; Activamos el conversor A/D ; Inicializamos a 1000 el contador de interrupciones ; Programamos STRA por interrupciones y flanco de subida * * Rutina de interrupción para STRA RSISTRA LDY CONT DEY BNE RSIOUT L1SEG LDY #1000 LDAA #$07 STAA ADCTL,X BRCLR ADCTL,X $80 * LDAA ADR1,X LDAB #8 MUL PSHX LDX #255 IDIV XGDX PULX CLR PORTB,X L1LOOP TSTB BEQ RSIOUT ASL PORTB,X BSET PORTB,X $01 DECB ; Decrementamos contador ; Inicializamos el contador ; Programamos el conversor A/D para convertir el pin 7 ; Esperamos fin de conversión ; Leemos el valor convertido ; Calculamos el número de leds a encender ; El número de leds a encender está en registro B ; Borramos leds en puerto B ; Comprobamos si número de leds es cero ; Si es cero salimos ; Desplazamos el contenido del puerto B ; y encendemos el bit menos significativo ; Decrementamos contador de leds 2 Solución Convocatoria Especial RSIOUT BRA STY LDAA LDAA RTI * Rutina de retardo de 1ms DEL1MS LDY L0 DEY BNE RTS Sistemas Electrónicos Digitales L1LOOP CONT PIOC,X PORTCL,X Diciembre 2006 ; y seguimos en el bucle ; Actualizamos valor del contador ; Iniciamos secuencia de borrado del flag 286 L0 Pregunta 4 (1.0 Pto.) 1. 0.2 Un posible código sería: PEA NEXT(PC) JMP L1 NEXT EQU * 2. 0.2 ORG $1000 DATO DC.B $2A LONG EQU 35 LEA DATO,A0 MOVE.W #DATO(PC),A0 MOVE.L #DATO(PC),A0 LEA LONG,A0 LEA #LONG,A0 MOVE.B DATO+LONG,A0 byte ; Guardamos dirección de retorno en la pila ; Actualizamos valor del contador ; Válida. El dato cargado en A0 es $1000 ; No válida. Dato no puede ser un valor inmediato. ; No válida. Dato no puede ser un valor inmediato. ; Válida. Carga el valor 35 en A0 ; No válida. La fuente no puede ser dato inmediato ; No válida. A un registro de direcciones no se puede mover un 3. 0.2 IFEQ \2-0. Esta directiva de ensamblado condicional, ensambla el código que le sigue siempre y cuando no haya segundo parámetro real en la llamada. 4. 0.2 El puntero de pila apunta a una posición ocupada/escrita ya que para salvar un dato en la pila, operación PUSH, se debe usar el modo indirecto con predecremento. 5. 0.2. La instrucción DBcc tiene el formato: DBcc Dn, etiqueta. Por tanto necesita una palabra de operación (OW) codificando el Dn (3 bits), y la condición (4 bits), siendo los restantes bits para el código de operación. Además incluye una palabra de extensión para codificar el desplazamiento en 16 bits. Pregunta 4 (1.5 Ptos.) 1. 1.2 El código de la macro es el que se adjunta. Para una mejor comprensión se adjunta a continuación el formato de la llamada a la macro: ARITHM TABLA, LONG, Dn Etiqueta Nemónico , Operando Comentario ARITHM MACRO BRA INIM\@ DATO\@ DS.B 1 INIM\@ MOVEM.L D0-D2/A0,-(A7) LEA \1,A0 ; Ponemos en A0 dirección de comienzo de la tabla MOVE \2,D0 ; Ponemos en D0 longitud de la tabla SUBQ #1,D0 ; Restamos una unidad para poder usar DBcc CLR D1 ; Matendremos la suma parcial en D1 LOOP\@ MOVE.B (A0)+,D2 ; Recuperamos elemento en D2 EXT.W D2 ; Lo pasamos a tamaño palabra ADD.W D2,D1 DBF D0,LOOP\@ ; Decrementamos longitud y continuamos MOVE \2,D0 ; Ponemos en D0 longitud de la tabla DIVS D0,D1 ; Dividimos la suma por la longitud de la tabla MOVE.B D1,DATO\@ ; Salvamos la media en memoria MOVEM.L (A7)+,D0-D2/A0 3 Solución Convocatoria Especial Sistemas Electrónicos Digitales Diciembre 2006 MOVE.B DATO\@,\3 ENDM 2. 0.3 Se denominan rutinas abiertas ya que no se retorna al punto de llamada. Se invocan incluyendo el código durante la fase de ensamblado y no durante la ejecución. Pregunta 5 (2.5 Ptos.) El código es el siguiente: Etiqueta Nemónico , Operando PSZONE EQU 20 PSPOS EQU 16 PSSTAT EQU 12 PSLONG EQU 8 VSNUM EQU -2 LOCPROG EQU -2 POS STAT ZONE LONG INICIO * Subrutina RX RX LOOP OUTRTS ORG JMP DS.B DS.B DS.B DS.W MOVE.L PEA PEA PEA PEA JSR ADD.L …….. $2000 INICIO 1 1 300 1 #$3000,A7 ZONE POS STAT LONG RX #16,A7 LINK MOVEM.L MOVE.L MOVE.L MOVE.L CLR TST.B BEQ CMP.B BEQ MOVE.B ADDQ BRA MOVE MOVEM.L UNLK RTS END A6,#LOCPROG A0-A3,-(A7) PSZONE(A6),A0 PSPOS(A6),A1 PSSTAT(A6),A2 VSNUM(A6) (A2) LOOP #$0D,(A1) OUTRTS (A1),(A0)+ VSNUM(A6) LOOP VSNUM(A6),(A3) (A7)+,A0-A2 A6 Comentario ; Direccionada por A0 ; Direccionada por A1 ; Direccionada por A2 ; Direccionada por A3 ; Inicializamos Stack Pointer ; Depositamos dirección de ZONE, POS y STAT en la pila ; Depositamos la longitud en la pila ; Eliminamos de la pila los parámetros ; Creamos marco de la rutina ; Guardamos el contexto ; Recuperamos dirección de ZONE en A0 ; Recuperamos dirección de POS en A1 ; Recuperamos dirección de STAT en A2 ; Borramos contador ; Comprobamos si hay dato ; Si no hay seguimos comprobando ; Comprobamos si el dato es ENTER ; Si es igual salimos ; En caso contrario depositamos el dato en ZONE ; e incrementamos el contador ; Seguimos en el bucle ; Actualizamos la longitud ; Recuperamos el contexto 4 Solución