You are on page 1of 29

MICROPROCESADORES

Y
MICROCONTROLADORES

PRACTICA III

Ingeniera Tcnica Industrial Electrnica

Juan Carlos Irigoyen Calvo

DNI:

C.A. Pamplona

1
ENUNCIADO PRCTICA

Primera parte

Realizar un programa en el ensamblador del MC68000 que nos diga el da de la semana que fue
(de Lunes a Domingo) un da concreto facilitado por teclado.
En concreto, el programa preguntar, de forma independiente:

Primeramente, el ao.

En segundo lugar, nos preguntar el nmero de mes (de 1 a 12).

En tercer lugar, el da.

Calcularemos y mostraremos el da de la semana de la fecha introducida sabiendo que el 1 de Enero


del 2007 fue lunes. Las fechas introducidas tienen que ser anteriores a este valor.

Segunda parte

Mejorar el programa anterior para que, en vez de preguntarnos el nmero de mes, nos pregunte
el nombre del mes (de Enero a Diciembre). Para ello deberemos escribir una subrutina que compare dos
cadenas de texto, cuyas direcciones sern proporcionadas en A1 y A2. La subrutina devolver 1 en D1
si son iguales, y 0 en D1 si son diferentes.

Tercera parte

Mejorar el apartado b para comprobar que los tres datos introducidos por teclado son vlidos.

Para el ao, estar comprendido en el rango [1, 2006].

El nombre del mes tiene que ser uno de los doce posibles, todo en minsculas.

El da del mes tendr que ser vlido para el mes que hemos introducido (por ejemplo, si el mes
introducido es "febrero", el da del mes estar en el rango [1,28]).

Cuando se introduzca un dato no vlido, el programa volver a pedir justo ese dato continuamente
hasta que se introduzca bien.
Ejemplo: Nos han pedido el ao y lo hemos metido bien. Pero ahora metemos un mes errneo. El
programa nos volver a pedir el mes hasta que lo metamos bien. Es entonces cuando nos pedir el da de
mes.

ENTREGA PRCTICA

La entrega de la prctica se realizar a travs de la plataforma WebCT enviando un correo electrnico


al Administrador del Curso. Indicando en el asunto el nombre de la prctica que se est entregando.
Se debe adjuntar una memoria descriptiva de la prctica, explicando los elementos ms importantes del
cdigo. As como los ficheros fuentes con el cdigo ensamblador correspondiente totalmente libres de
errores.
La fecha lmite para la entrega de la prctica es el 2 de Mayo de 2008.

NOTA: Con el objetivo de simplificar la prctica, en todos los apartados no se tendrn en cuenta
los aos bisiestos, es decir, se supondr que todos los aos tienen 365 das.

2
MEMORIA DE LA PRCTICA
APARTADO A
El programa est estructurado de tal manera que hay una rutina principal, desde la que se llama a
todas las subrutinas. En la figura siguiente se muestra el diagrama de flujo de la rutina principal, en la
que se comentan los parmetros de entrada a cada subrutina, as como los valores que devuelven.

INICIO

Subrutina pregunta Ao. Devueve ao


YEAR? en D4

Subrutina pregunta Mes. Devuelve mes


MONTH? en D5

Subrutina pregunta Da. Devuelve da


DAY? en D6

Calcula das transcurridos desde 1-1-1 hasta 1-1-2007.


CALC Resultado en D7

Recibe fecha (DD-MM-AA) en D6,D5,D4. Devuelve los dias


CALCU transcurridos desde 1-1-1 hasta esta fecha en D1

Recibe entrada en D7 y D1. Devuelve da semana en D1 (0 lunes,


DISEM 1 domingo, 2 sabado,..,, 6 martes)

Recibe dia semana en D1 y saca por pantalla el nombre del da de la


DIRDIA semana

FIN

3
En el programa se ha reservado una zona de memoria, en la que se han introducido los
nombres de los das de la semana, as como los mensajes que aparecern en pantalla
solicitando la introduccin de los datos.
La zona de memoria etiquetada como DTRA almacena los valores que se usarn para
calcular posteriormente el da de la semana. Son doce valores que reflejan los das
acumulados dentro de cada ao hasta el mes anterior al introducido. En enero sern 0 das,
en febrero los 31 das de enero, en marzo los 59 acumulados hasta entonces y as
sucesivamente. La finalidad de esto se explicar con ms detalle al explicar la subrutina
correspondiente.

*----------------------------------------------------------
*
* ZONA DE DATOS
*
*----------------------------------------------------------

*-----------------------------------------------------------
* Introduccion en memoria de dias de la semana
*-----------------------------------------------------------

DATOS ORG $2000 LUNES


DC.B 'Lunes',0

ORG $2010 DOMINGO


DC.B 'Domingo',0

ORG $2020 SABADO


DC.B 'Sabado',0

ORG $2030 VIERNES


DC.B 'Viernes',0

ORG $2040 JUEVES


DC.B 'Jueves',0

ORG $2050 MIERCOLES


DC.B 'Miercoles',0

ORG $2060 MARTES


DC.B 'Martes',0

*----------------------------------------------------------
* N de das transcurridos a lo largo de los meses del ao
* (Dias transcurridos hasta enero, febrero,...diciembre)
*----------------------------------------------------------
DTRA ORG $2080
DC.W 0,31,59,90,120,151,181,212,243,273,304,334
DC.B 0

*---------------------------------------------------------
* Mensajes por pantalla
*---------------------------------------------------------

INTA ORG $21C0


DC.B 'Year (1-2006)?',0

INTMES ORG $21D0


DC.B 'Month (1-12)?',0

INTDIA ORG $21E0


DC.B 'Day?',0

4
En las tres figuras siguientes, se muestran los diagramas de flujo de las subrutinas que
se encargan de sacar un mensaje por pantalla solicitando la entrada del ao, mes y da, y
guardar la respuesta en los registros D4, D5 y D6. Los mensajes se preguntan en ingls
porque resultaba algo embarazoso al preguntar por el ao sin contar con la letra en este
simulador. En este primer apartado, el programa no supervisa ni corrige los posibles errores
derivados de introducir datos fuera de los intervalos solicitados que son:
Ao: 1-2006
Mes: 1-12
Da: En funcin del mes, en ningn caso se tendrn en cuenta los bisiestos.

YEAR

D0 13 N de funcion del Trap en D0

A1 #INTA Direccion de mensaje Year? En A1

TRAP 15 Imprime en pantalla mensaje Year

D0 4 N de funcion del Trap en D0

TRAP 15 Captura N por teclado y lo almacena en D1

D4 D1 Ao en D4

RTS

5
Subrutina de solicitud del mes (1-12):

MONT

D0 13 N de funcion del Trap en D0

A1 #INTMES Direccion de mensaje Month? En A1

TRAP 15 Imprime en pantalla mensaje Month

D0 4 N de funcion del Trap en D0

TRAP 15 Captura N por teclado y lo almacena en D1

D5 D1 Mes en D5

RTS

6
Subrutina de solicitud del da:

DAY

D0 13 N de funcion del Trap en D0

A1 #INTdia Direccion de mensaje DAY? En A1

TRAP 15 Imprime en pantalla mensaje DAY?

D0 4 N de funcion del Trap en D0

TRAP 15 Captura N por teclado y lo almacena en D1

D6 D1 Dia en D6

RTS

7
Subrutina CALC:
En los datos de partida conocemos que el da uno de enero de 2007 es lunes y el
programa debe funcionar para fechas desde el uno de enero del ao uno hasta el uno de enero
de 2007.
Esta subrutina se encarga de calcular los das transcurridos desde el 1-1-1 hasta el 1-1-
2007. Este clculo se podra haber hecho en tiempo de diseo y haber guardado el dato en
memoria para haberlo usado ms tarde pero he optado por esta opcin que refleja ms claro en
el programa el objetivo. El clculo se devolver en D7.
En la figura siguiente se encuentra el diagrama de flujo de esta subrutina.

CALC

D7 365

D1 2006

D7 D1 x D7

D7 D7 + 1 N de das transcurridos desde 1-1-1 hasta 1-1-2007 en D7

RTS

Subrutina CALCU:
Esta subrutina se encarga de calcular los das transcurridos desde el 1-1-1 hasta la fecha
introducida. Para ello calcula los das debidos a los aos. Si se introduce el ao 1901, se
multiplica 365 por 1900 (1900 -1). A esto se suman los das transcurridos por concepto de los
meses. Si se ha introducido marzo, se sumarn los 59 das de enero y marzo; para ello se
recurre a la direccin de memoria etiquetada como DTRA. Finalmente se suman los das
debidos al da introducido por pantalla, Por ejemplo, introducimos 3 de marzo de 2001

Aos: 2000 * 365 das


Meses: 59 das
Da: 3
Total: 730.062 das desde 1-1-1 hasta 3-3-2001

Este dato se almacena en D1 y se devuelve a rutina principal.

En la siguiente figura se encuentra el diagrama de flujo con comentarios.

8
CALCU

D1 D4 AO EN D1

D2 D5 MES EN D2

D2 D6 DIA EN D3

D1 D1 - 1 AO = AO -1

Dias transcurridos desde el 1-1-1 hasta el 31 de diciembre


D1 D1 x 365 del ao anterior al introducido

D2 D2 - 1 MES = MES -1

MES = MES * 2 SERA INDICE PARA BUSCAR EN MEMORIA DATOS


D2 D2 x 2 DE DIAS TRASCURRIDOS DESDE 1 DE ENERO HASTA EL ULTIMO
DIA DEL MES ANTERIOR AL INTRODUCIDO

EN A0 LA DIRECCION DE LOS DATOS DE DIAS


A0 #DTRA TRANSCURRIDOS POR MESES EN EL AO

EN A0 APUNTA DIRECCION DIAS TRANSCURRIDOS


A0 A0 + D2 HASTA EL MES ANTERIOR

EN D2 LOS DIAS TRANSCURRIDOS POR


D2 (A0) CONCEPTO DEL MES

EN D1 DIAS TRANSCURRIDOS DESDE 1-1-1


D1 D1 + D2 POR CONCEPTOS DE AO Y MES

EN D1 LOS DIAS TRANSCURRIDOS DESDE 1-


D1 D1 + D3 1-1 HASTA LA FECHA INTRODUCIDA

RTS

9
Subrutina DISEM:

Recibe los datos de D7 (das transcurridos desde 1-1-1 hasta 1-1-2007) y de D1 (das
transcurridos desde 1-1-1 hasta la fecha introducida).

El algoritmo de clculo consiste en:

1- Restar estas cantidades para hallar los das que hay entre la fecha introducida y el 1-1-2007. Este
dato se guarda en D0.
2- Dividir esta cantidad entre 7 (das de la semana). El resto de esta divisin nos revelar el da de la
semana que es la fecha introducida (0 lunes, 1 domingo, 2 sbado,, 6 martes).
3- Se comprueba si ha habido desbordamiento en la divisin. Hay que tener en cuenta que el
resultado da el cociente en la palabra de menos peso y el resto en la de ms peso. Por lo tanto, si
el resultado de la divisin es superior a 65.535 habr desbordamiento. Si hay desbordamiento,
no se produce la divisin, se resta 7 al dividendo y se vuelve a repetir hasta que no haya
desbordamiento.
4- Este dato (0 a 6) se guarda en D1 y se devuelve el control a la rutina principal.

En la siguiente figura se muestra el diagrama de flujo comentado:

DISEM

D0 D7 Dias trascurridos desde 1-1-1 a 1-1-2007 en D0

D7 D0

D7 D7 D1 Dias desde fecha introducida hasta 1-1-2007

D0 D0 - 7 D7 D7 / 7 Division entre 7

DESBORDAMIENTO Se produce desbordamiento si el cociente es un


SI
DIVISION numero de tamao superior a 2 bytes.

NO

RESTA 7 Y REPITE RESTO EN PALABRA DE


BUCLE HASTA EVITAR SWAP D7 MENOS PESO DE D7 SERA
DESBORDAMIENTO EL DIA DE LA SEMANA

D1 0

BYTE DE MENOS PESO DE D7 EN D1. ESTE


D1 D7 SER EL DIA DE LA SEMANA CALCULADO (0-
LUNES A 6-DOMINGO)

RTS

10
Subrutina DIRDIA:

Esta subrutina se encarga de mostrar en pantalla el nombre del da de la semana


correspondiente a la fecha introducida. Para ello recibe en D1 la cifra calculada en subrutina
anterior. Posteriormente busca en memoria a partir de la direccin etiquetada como DATOS el
nombre de ese da. Los das de la semana se encuentran en memoria a partir de la direccin
hexadecimal $2000. Los das se han almacenado cada $10 bytes ordenados de tal manera
que se corresponden con el resultado calculado en CALCU. Si multiplicamos esa cifra por $10
y la sumamos a $2000, se apuntar justamente a la direccin de memoria donde se
encuentra el nombre del da y es este dato el que sacamos por pantalla aprovechando la
funcin n 13 del Trap 15.

En la siguiente figura se encuentra el diagrama de flujo comentado

DIRDIA

A1 #DATOS A1 apunta a direccion de nombres dias de la semana

Dia de la semana hara de indice en la busqueda.


Multiplicamos por 10hex porque los nombres estn en
D1 D1 x $10 direcciones de memoria cada 16 bytes desde la posicion
#DATOS

A1 D1 + A1 A1 apunta al nombre del dia para la fecha introducida

Funcion para el TRAP salida por pantalla de cadena


D0 13 situada en A1

TRAP 15

RTS

11
ENSAMBLADO Y SIMULACION
El programa se encuentra en la carpeta con el nombre p3-apartado 1.x68

Aqu se encuentra la rutina principal y subrutinas. La zona de datos se ha expuesto


anteriormente.

*----------------------------------------------------------------
* Program : Practica 3
* Written by : Juan Carlos Irigoyen Calvo
* Date : 28 de febrero de 2008
* Description: Determina dia de la semana para una fecha
* desde 1 de enero de ao 1 hasta 1 de enero de 2007
* (No tiene en cuenta los bisiestos)
* No detecta datos fuera de estos margenes.
*----------------------------------------------------------------
START ORG $1000
BSR YEAR PREGUNTA AO
BSR MONTH PREGUNTA MES
BSR DAY PREGUNTA DIA
BSR CALC DIAS DESDE 1-1-1 HASTA 1-1-2007 EN D7
BSR CALCU DIAS DESDE 1-1-1 HASTA FECHA EN D1
BSR DISEM DIA DE LA SEMANA EN D1
BSR DIRDIA IMPRIME NOMBRE DEL DIA

MOVE.B #9,D0
TRAP #15 halt simulator
*-----------------------------------------------------------
* PETICION DE DATOS
*-----------------------------------------------------------

YEAR ORG $1500


MOVEQ #13,D0 IMPRIME TEXTO YEAR?
MOVE.L #INTA,A1
TRAP #15
MOVEQ #4,D0 LEE AO
TRAP #15 AO en D1
MOVE.L D1,D4 AO EN D4
RTS

MONTH ORG $1600


MOVEQ #13,D0 IMPRIME TEXTO MONTH?
MOVE.L #INTMES,A1
TRAP #15
MOVEQ #4,D0 LEE MES
TRAP #15
MOVE.L D1,D5 MES EN D5
RTS

DAY ORG $1700


MOVEQ #13,D0 IMPRIME TEXTO DAY?
MOVE.L #INTDIA,A1
TRAP #15
MOVEQ #4,D0 LEE DIA
TRAP #15 DIA EN D1
MOVE.B D1,D6 DIA EN D6
RTS

12
*--------------------------------------------------------------
* SUBRUTINAS
*--------------------------------------------------------------

DIRDIA ORG $1400


MOVE.L #DATOS,A1 Apunta a nombres dias de la semana
MULS #$10,D1 Indice dia semana x 10
ADDA D1,A1 A1 con la direccion del dia de la semana
calculado
MOVEQ #13,D0 Imprime en pantalla el dia de la semana
calculado (A1)
TRAP #15
RTS

CALC ORG $1800 N DE DIAS TRANSCURRIDOS DESDE


MOVE.L #365,D7 EL 1 DE ENERO DEL AO 1 HASTA
MOVE.L #2006,D1 EL 1 DE ENERO DE 2007
MULS D1,D7 AMBOS INCLUIDOS
ADDQ #1,D7 ESTA CIFRA EN D7
RTS

CALCU ORG $1900


MOVE.L D4,D1 AO EN D1
MOVE.L D5,D2 MES EN D2
MOVE.L D6,D3 DIA EN D3
SUBQ #1,D1
MULS #365,D1 DIAS TRANSCURRIDOS X AO EN D1

SUBQ #1,D2 RETORNO DE DIAS TRANSCURRIDOS POR EL MES


MULS #2,D2
MOVE.L #DTRA,A0
ADDA D2,A0
MOVE.W (A0),D2 DIAS X MES EN D2

ADD.L D2,D1
ADD.L D3,D1 DIAS TRANSCURRIDOS DESDE 1 DE ENERO DE AO 1
RTS

DISEM ORG $1950


MOVE.L D7,D0
COND MOVE.L D0,D7
SUB.L D1,D7 DIAS DESDE FECHA HASTA 1-1-2007 EN D0
DIVS #7,D7
BVC SIGUE ESTE BUCLE EVITA EL DESBORDAMIENTO EN LA
DIVISION
SUB.L #7,D0
BVC COND
SIGUE SWAP D7 RESTO EN BYTE MENOS SIGNIFICATIVO DE D0
MOVE.L #0,D1
MOVE.B D7,D1 DIA SEMANA EN D1
RTS

13
ENSAMBLADO Y SIMULACION:
Se procede al ensamblado del cdigo fuente generndose los
archivos del mismo nombre pero con extensiones .L68 y .S68
El ensamblado muestra que no hay errores como se puede apreciar
en la siguiente captura:

En las 2 siguientes capturas de pantalla se muestran las simulaciones para los das 1
de enero del ao 1 que da Jueves, y da 31 de diciembre de 2006, que da domingo.

14
15
APARTADO B
Se solicita en este apartado una modificacin del programa anterior para que los meses
se introduzcan por sus nombres as como la creacin de una subrutina de comparacin de
dos cadenas de texto, para el mes introducido y los meses del ao almacenados en memoria.

Para cumplir con este objetivo solo es necesario sustituir la subrutina MONTH por la
MONTH2 y aadir la subrutina COMCAD que comparar las dos cadenas de texto y que ser
llamada por MONTH2.

La siguiente figura muestra el diagrama de flujo de la rutina principal.

INICIO

YEAR? Subrutina pregunta Ao. Devueve ao en D4

Subrutina pregunta Mes como cadena de texto . Devuelve indice


MONTH2? mes en D5 y cadena en direccion de memoria DATMES

DAY? Subrutina pregunta Da. Devuelve da en D6

CALC Calcula das transcurridos desde 1-1-1 hasta 1-1-2007. Resultado en D7

Recibe fecha (DD-MM-AA) en D6,D5,D4. Devuelve los dias


CALCU transcurridos desde 1-1-1 hasta esta fecha en D1

Recibe entrada en D7 y D1. Devuelve da semana en D1 (0 lunes,


DISEM 1 martes,, 6 domingo)

DIRDIA Recibe dia semana en D1 y saca por pantalla el nombre del da de la semana

FIN

16
La zona de datos cuenta adems con dos apartados ms:

1-Nombres de los meses del ao situados a partir de la direccin $2100 y espaciados $10
bytes, que como veremos facilitar su acceso iterativo para compararlos con el texto
introducido por teclado.

*----------------------------------------------------------
* Nombres de los meses del ao
*----------------------------------------------------------
NBR_ME ORG $2100
DC.B 'enero',0

ORG $2110
DC.B 'febrero',0

ORG $2120
DC.B 'marzo',0

ORG $2130
DC.B 'abril',0

ORG $2140
DC.B 'mayo',0

ORG $2150
DC.B 'junio',0

ORG $2160
DC.B 'julio',0

ORG $2170
DC.B 'agosto',0

ORG $2180
DC.B 'septiembre',0

ORG $2190
DC.B 'octubre',0

ORG $21A0
DC.B 'noviembre',0

ORG $21B0
DC.B 'diciembre',0

2- Una reserva de 16 bytes de memoria para almacenar posteriormente la


cadena de texto con el mes introducido por teclado.

*----------------------------------------------------------
* Espacio de memoria para mes introducido
*----------------------------------------------------------
DATMES ORG $2200
DS.B 16

17
Subrutina MONTH2:
Esta subrutina se encarga de solicitar el mes por pantalla y de recibirlo guardando el texto en la
posicin de memoria reservada con la etiqueta DATMES. A su vez se guarda en D5 el n del mes
calculado con este algoritmo, por lo que el funcionamiento a partir de aqu ser idntico que en el
apartado anterior.

Una vez esta el mes en DATMES, comienza el algoritmo:

1- Se inicializa D5 a cero. Servir para ir contando los meses que se comparan con la cadena
introducida de tal manera que tras cada comparacin se incrementa su valor en uno.
2- Se introduce el valor de la direccin donde estn los meses del ao en A1 y la direccin de la
cadena introducida en A1
3- Se copia el valor de D5 en D7 para operar con el sin perder el valor original que seguir en D5
4- Se calcula el salto hexadecimal desde la direccin de inicio de los meses del ao en memoria
(NBR_MES) hasta el inicio del siguiente mes a comparar. Por ejemplo, si el mes es mayo, se
habrn recorrido sucesivos bucles comparando cadenas hasta llegar a D7=D5= 4 (0 es enero).
Multiplica D7 por $10 y el resultado se lo suma a NBR_MES dando la direccin $2140 que es
donde se encuentra la cadena Mayo.
5- Se invoca la subrutina COMCAD que devolver un 1 si son iguales y un 0 si son diferentes en el
registro de datos D1.
6- Si tras comparar con los doce meses no hay resultado positivo, se vuelve al principio y se vuelve
a preguntar el mes, aunque esto se pide en el apartado 3.

El diagrama de flujo se encuentra en la siguiente pgina, as como el cdigo.

Subrutina COMCAD:

Esta subrutina recibe 2 cadenas apuntadas por las direcciones A1 y A2, las compara y el resultado
lo devuelve en D1, 1 si son iguales y 0 si son diferentes.

El algoritmo consiste en recorrer los bytes de las dos cadenas desde el principio comparndolos
uno a uno, valindose para ello de una carga desde memoria a los registros D0 y D2 para las respectivas
cadenas. Se comparan los 2 bytes sucesivamente hasta que ocurran una de las dos siguientes cosas:

1- En un momento los dos bytes son distintos. Entonces se pone el registro D1 a cero y se retorna a
MONTH2.
2- Se llega al final de las cadenas (un cero). Esto quiere decir que las dos cadenas son iguales. Se
devuelve un uno en D1 a MONTH2.

En las siguientes pginas se muestran el diagrama de flujo, as como el cdigo.

18
MONT2

D0 13 N de funcion del Trap en D0

A1 #INTMES Direccion de mensaje Month? En A1

TRAP 15 Imprime en pantalla mensaje Month

A1 apunta a direccion de memoria para almacenamiento


A1 #DATMES cadena mes introducida

D0 2 N de funcion del Trap en D0

TRAP 15 Captura texto del mes y almacena en direccion A1

D5 0 Inicializa D5. Guaradar el n del mes para


calculos posteriores

SI A1 #DATMES Bucle BU

A2 #NBR_MES A2 apunta a nombres de meses almacenados en memoria

D7 D5 Indice del mes en D7

D7 apuntar a posicion de memoria a partir de


D7 D7 x 10 #DATMES

A2 A2 + D7 A2 apunta a nombre de mes a comparar con el introducido

SUBRUTINA COMCAD: Compara dos cadenas de texto situadas


COMCAD en A1 y A2. Devuelve resultado en D1 (1 iguales, 0 distintas)

D1 = 1 ? SI

NO
D5 D5 + 1
D5 = 11 ?

NO
Aumenta indice mes y
vuelve bucle BU para
D5 D5 + 1 comparar con mes
siguiente

RTS

19
MONTH2
*----------------------------------
* Peticin de mes
* enero a diciembre
* (En minsculas)
*----------------------------------
MONTH2 ORG $1200
MOVEQ #13,D0 IMPRIME TEXTO MONTH?
MOVE.L #INTMES,A1
TRAP #15
MOVE.L #DATMES,A1 A1 apunta reserva memoria entrada de mes
MOVEQ #2,D0 Funcin entrada texto
TRAP #15 Mes introducido en memoria (#DATMES)
MOVE.L #0,D5 Registro D5 a cero (ndice de meses 1-12)

*------------------------------------------------------------------------
* Este bucle comienza a recorrer todas las posiciones de memoria donde
* estn los nombres de los meses usando D7 como ndice que aumenta en cada
* bucle. Con el calculo de esta posicin de memoria en A2 y el mes
* introducido en memoria (A1), se enva a comparar a subrutina COMCAD
* hasta encontrar el mes que coincida con el introducido. En ese momento
* D7 tendr el valor numrico del mes (0-11), que devolveremos a D5 sumndole
* uno para tener el valor del mes (1-12) con el que operaremos ms tarde
*--------------------------------------------------------------------------

BU MOVE.L #DATMES,A1 Direccin guarda mes en A1


MOVE.L #NBR_ME,A2 Direccin nombres de meses en A2
MOVE.L D5,D7 Guarda ndice mes en D7 para operar con el
MULS #$10,D7 Multiplica ndice mes por 10
ADDA D7,A2 A2 apunta a nombre del mes para ese ndice
BSR COMCAD Llama subrutina comparacin 2 cadenas (A1 y A2)
CMP #1,D1
BEQ FINMON Encontrado nombre del mes. Manda etiqueta fin
CMP #11,D5
BEQ MONTH2 No es ninguno de los meses. Vuelve a pedir mes
ADDQ #1,D5 Aumenta ndice mes y vuelve bucle BU
BNE BU

FINMON ADDQ #1,D5 N DE MES EN D5


RTS

20
COMCAD
COMCAD

D1 1 N de funcion del Trap en D0

D0 0 Direccion de mensaje Month? En A1

D2 (A2) BYTE DE DIRECCION MEMORIA A2 A D2 Y


A2 A2 + 1 APUNTA SIGUIENTE CARACTER

SI
D0 (A1) BYTE DE DIRECCION MEMORIA A1 A D0 Y
A1 A1 + 1 APUNTA SIGUIENTE CARACTER

NO D0 = D2? COMPARA CARACTERES DE AMBAS


CADENAS

SI

COMPRUEBA FIN DE CADENA. Si ES FIN DE


CADENA DEVUELVE D1=1.
D1 0 D0 = 0 ? SI NO, SIGUE COMPARANDO CARACTERES DE
AMBAS CADENAS

SI

RTS

LAS CADENAS NO SON


IGUALES. RETORNO CON
D1=0
*-------------------------------------------------------------
* SUBRUTINA DE COMPARACION DE 2 CADENAS SITUADAS EN A1 Y A2
* DEVUELVE D1=0 SI SON DIFERENTES
* DEVUELVE D1=1 SI SON IGUALES
*-------------------------------------------------------------

COMCAD ORG $1300


MOVEQ #1,D1 CARGA D1=1 IGUALES
MOVEQ #0,D0

BUCAD MOVE.B (A2)+,D2 CARGA CARACTER DE A2 EN D2 Y APUNTA SIGUIENTE


MOVE.B (A1)+,D0 CARGA CARCTER DE A1 EN D1 Y APUNTA SIGUIENTE
CMP D0,D2 COMPARA CARACTERES
BNE NOIGUAL SI NO SON IGUALES APUNTA A NOIGUAL
CMP #0,D0 COMPRUEBA FIN DE CADENA
BEQ FINB SI ES FIN DE CADENA ENVIA A FINB (D1=1--- ES EL
MES)
BNE BUCAD SI NO FIN REPITE BUCLE

NOIGUAL MOVE.B #0,D1 D1=0 CADENA NO IGUAL


FINB RTS

21
ENSAMBLADO Y SIMULACION
El cdigo fuente se encuentra en el archivo p3-apartado 2.X68 y se produce el
ensamblado sin errores como se muestra en la siguiente captura de pantalla.

Se acepta la simulacin pulsando EXECUTE y se realizan 2 simulaciones:


1- Fecha 1 de enero de ao 1- Jueves
2- Fecha 31 de diciembre de ao 2006- Domingo

El resultado se muestra en las dos siguientes capturas.

22
23
APARTADO C
En este apartado se debe mejorar el apartado anterior programando cdigo para que no se
permitan la entrada de aos fuera del intervalo [1,2006], meses inexistentes (algo que ya se hizo en
apartado anterior, y que el da introducido est dentro del intervalo para ese mes, es decir enero 31 das,
febrero 28 das,

No se tienen en cuenta los bisiestos.

Dentro de la zona de datos se introducen a partir de la etiqueta DIAS la longitud en das de los
sucesivos meses del ao:

*----------------------------------------------------------
* N de das de meses enero a febrero
*----------------------------------------------------------
DIAS ORG $2070
DC.B 31,28,31,30,31,30,31,31,30,31,30,31

La rutina principal es la misma que la del apartado B.

Slo se ven modificadas las subrutinas YEAR y DAY, que quedan suficientemente claras en los
siguientes diagramas de flujo as como en el cdigo siguiente:
*---------------------------------
* Peticion de ao
*---------------------------------
YEAR ORG $1500
MOVEQ #13,D0 IMPRIME TEXTO YEAR?
MOVE.L #INTA,A1
TRAP #15
MOVEQ #4,D0 LEE AO
TRAP #15
CMP #2006,D1
BGT YEAR Si es mayor que 2006 vuelve a preguntar
CMP #1,D1
BLT YEAR Si es menor que 1 vuelve a preguntar
MOVE.L D1,D4 AO EN D4
RTS
*--------------------------------------------
* Peticin de da
*--------------------------------------------

DAY ORG $1700


MOVEQ #13,D0 IMPRIME TEXTO DAY?
MOVE.L #INTDIA,A1
TRAP #15
MOVEQ #4,D0 LEE DIA
TRAP #15
MOVE.L #1,D0 COMPRUEBA DIA MAYOR QUE 0
CMP D1,D0
BGT DAY SI ES MENOR QUE 1 REPITE
MOVE.L D5,D7 MES EN D7
SUBQ #1,D7 BUSCA N DE DIAS DE ESTE MES
ADD.L #DIAS,D7 Calculo direccion efectiva dias del mes
MOVEA D7,A2 Direccion en A2
MOVEQ #0,D7
MOVE.B (A2),D7 N DE DIAS DEL MES EN D7
CMP D7,D1 REPITE SI DIA INTRODUCIDO
BGT DAY MAYOR QUE DIAS DEL MES
MOVE.B D1,D6 DIA EN D6
RTS

24
YEAR

D0 13 N de funcion del Trap en D0

A1 #INTA Direccion de mensaje Year? En A1

TRAP 15 Imprime en pantalla mensaje Year

SI

SI
D0 4 N de funcion del Trap en D0

TRAP 15 Captura N por teclado y lo almacena en D1

D1 > 2006 ?

NO

D1 < 1 ?

NO

D4 D1 Ao en D4

RTS

25
DAY

D0 13 N de funcion del Trap en D0

A1 #INTDIA Direccion de mensaje DAY? En A1

TRAP 15 Imprime en pantalla mensaje DAY?

SI

D0 4 N de funcion del Trap en D0

TRAP 15 Captura N por teclado y lo almacena en D1

Si introducimos un valor para el dia menor que 1


D1 < 1
vuelve a preguntar

NO

SI D7 D5 Mes en D7. Sera indice

D7 D7 - 1

En D7 la direccion que contiene el n de dias del


D7 #DIAS + D7
mes solicitado

En A2 la direccion que contiene el n de dias del


A2 D7
mes solicitado

D7 0 Reset D7

D7 (A2) En D7 el n de dias que tiene el mes solicitado

Si el mes tiene menos dias que el DIA introducido


D1 > D7
vuelve a preguntar

NO

D6 D1 Dia en D6

RTS

26
ENSAMBLADO Y SIMULACION
El cdigo fuente para este apartado se encuentra en el archivo P3-apartado 3.X68.

Se procede a su ensamblado sin errores como se muestra a continuacin:

En las sucesivas capturas se aprecian simulaciones en que se han introducido a propsito datos
errneos para comprobar que se vuelve a preguntar hasta generar un resultado correcto.

27
28
29

You might also like