*PROYECTO TRADUCCION DE NUMERO ROMANO A DECIMAL Y VICEVERSA *PARADA PÉREZ JESÚS BRYAN *VAN DER WERFF VARGAS PIETER ALEXANDER *MAYA ORTEGA MARIA FERNANDA
*DECLARACION CONSTANTES
SCDR EQU $102F SCCR2 EQU $102D SCSR EQU $102E SCCR1 EQU $102C BAUD EQU $102B HPRIO EQU $103C SPCR EQU $1028 CSCTL EQU $105D OPT2 EQU $1038 DDRD EQU $1009
*DECLARACION DE VARIABLES PARA NUMEROS ROMANOS DIRECCION_RESULTADO EQU $0050 DIRECCION_INPUT EQU $0030 DIRECCION_TEXTUAL EQU $0070 BANDERA_TIPO_TRADUCCION EQU $0024
NUMCARAC EQU $0010 BANDERA_ERROR EQU $0011 * BANDERA DE ERROR PARA NUMEROS DECIMALES BANDERA_TRADUCCION EQU $0012 * BANDERA PARA IDENTIFICAR LA TRADUCCION CONTADOR EQU $0028 CONTADOR_EXT EQU $0010
ORDEN EQU $0000 BANDERAM EQU $0016 * BANDERA DE LETRAS M (MIL) BANDERAD EQU $0017 * BANDERA DE LETRAS D (QUININETOS) BANDERAC EQU $0018 * BANDERA DE LETRAS C (CIEN) BANDERAL EQU $0019 * BANDERA DE LETRAS L (CINCUENTA) BANDERAX EQU $0020 * BANDERA DE LETRAS X (DIEZ) BANDERAV EQU $0021 * BANDERA DE LETRAS V (CINCO) BANDERAI EQU $0022 * BANDERA DE LETRAS I (UNO) BANDERAOK EQU $0023 * BANDERA DEL OK BANDERAERROR EQU $0002 * BANDERA DE ERROR UNIDAD EQU $0053 * DIRECCION PARA ESCRIBIR UNIDADES DECENA EQU $0052 * DIRECCION PARA ESCRIBIR DECENAS CENTENA EQU $0051 * DIRECCION PARA ESCRIBIR CENTENAS MIL EQU $0050 * DIRECCION PARA ESCRIBIR UNIDADES DE MIL
ORG $3000 MENSAJE_E_ROMANO FCC "ERROR, NUMERO ROMANO INVALIDO." MENSAJE_E_DECIMAL FCC "ERROR, NUMERO DECIMAL INVALIDO." MENSAJE_E_RANGO FCC "ERROR, NUMERO FUERA DE RANGO."
-
NUMEROS DECIMALES
UNO_D FCC "uno " DOS_D FCC "dos " TRES_D FCC "tres " CUATRO_D FCC "cuatro " CINCO_D FCC "cinco " SEIS_D FCC "seis " SIETE_D FCC "siete " OCHO_D FCC "ocho " NUEVE_D FCC "nueve " DIECI_D FCC "dieci " DIEZ_D FCC "diez " ONCE_D FCC "once " DOCE_D FCC "doce " TRECE_D FCC "trece " CATORCE_D FCC "catorce " DIECISEIS_D FCC "diecisEis " QUINCE_D FCC "quince " VEINTE_D FCC "veinte " VEINTIUNO_D FCC "veintiuno " VEINTIDOS_D FCC "veintidOs " VEINTITRES_D FCC "veintitrEs " VEINTICUATRO_D FCC "veinticuatro " VEINTICINCO_D FCC "veinticinco " VEINTISEIS_D FCC "veintisEis " VEINTISIETE_D FCC "veintisiete " VEINTIOCHO_D FCC "veintiocho " VEINTINUEVE_D FCC "veintinueve " Y_D FCC "y " TREINTA_D FCC "treinta " CUARENTA_D FCC "cuarenta " CINCUENTA_D FCC "cincuenta " SESENTA_D FCC "sesenta " SETENTA_D FCC "setenta " OCHENTA_D FCC "ochenta " NOVENTA_D FCC "noventa " CIEN_D FCC "cien " CIENTO_D FCC "ciento " CIENTOS_D FCC "cientos " QUINIENTOS_D FCC "quinientos " SETECIENTOS_D FCC "setecientos " NOVECIENTOS_D FCC "novecientos " MIL_D FCC "mil "
-
NUMEROS ROMANOS
CIEN_R FCC "C " DOSCIENTOS_R FCC "CC " TRESCIENTOS_R FCC "CCC " CUATROCIENTOS_R FCC "CD " QUINIENTOS_R FCC "D " SEISCIENTOS_R FCC "DC " SETECIENTOS_R FCC "DCC " OCHOCIENTOS_R FCC "DCCC " NOVECIENTOS_R FCC "CM " DIEZ_R FCC "X " VEINTE_R FCC "XX " TREINTA_R FCC "XXX " CUARENTA_R FCC "XL " CINCUENTA_R FCC "L " SESENTA_R FCC "LX " SETENTA_R FCC "LXX " OCHENTA_R FCC "LXXX " NOVENTA_R FCC "XC " UNO_R FCC "I " DOS_R FCC "II " TRES_R FCC "III " CUATRO_R FCC "IV " CINCO_R FCC "V " SEIS_R FCC "VI " SIETE_R FCC "VII " OCHO_R FCC "VIII " NUEVE_R FCC "IX "
ORG $8000
INICIO LDS #$00FF * Configuracion del puerto serial JSR SERIAL * SUBRUTINA PARA CONFIG EL PUERTO SERIAL JSR LIMPIEZA JSR INICIALIZAR JMP CICLATE1
CICLATE LDAA #'? STAA ORDEN CUENTA LDAA ORDEN CMPA #'? BEQ CUENTA
ENTRADA_ROMANO LDAB NUMCARAC CMPB #0 BNE ERROR1 CMPA #'M BEQ CASOM CMPA #'D BEQ CASOD JMP SALTOINTERMEDIO1
ERROR1 JSR ERROR_ESCRITURA JMP FIN
CASOM LDAB BANDERAC * PARA EL CASO CM REVISA QUE LLEGUE C ANTES CMPB #0 BNE CASOCM
LDAB BANDERAM CMPB #8 * REVISA QUE NO SEAN MAS DE 9 M's BHI ERROR1
JSR D_ERROR
STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX LDAB BANDERAM INCB STAB BANDERAM LDAB MIL INCB STAB MIL JMP CICLATE
*CASO DONDE LLEGUE CM CASOCM CMPB #1 * REVISA SI HAY UNA SEGUNDA C BHI ERROR1 ADDB #5 STAB BANDERAC * CARGA 5 EN C LDAB #9 STAB CENTENA * CARGA 9 EN CENTENA STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX * AUMENTA EN 1 X JMP CICLATE
CASOD
JSR L_ERROR
LDAB BANDERAD
INCB
STAB BANDERAD
CMPB #2
BEQ ERROR1 * VALIDA QUE NO LLEGUE MAS DE UNA D
STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70
INX
LDAB BANDERAC
CMPB #0
BNE CASOCD
LDAB #5
STAB CENTENA
JMP CICLATE
CASOCD
* CASO CUATROCIENTOS (CD)
CMPB #1
BHI ERROR_1
ADDB #5
STAB BANDERAC * CARGA 5 EN C
LDAB #4
STAB CENTENA * CARGA 4 EN CENTENA
STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70
INX * AUMENTA EN 1 X
JMP CICLATE
SALTOINTERMEDIO1 CMPA #'C BEQ CASOC CMPA #'L BEQ CASOL JMP SALTOINTERMEDIO
CASOC * BANDERA A FUTURO PARA IDENTIFICAR LOS ERRORES LDAB BANDERAX * IDENTIFICA SI LLEGA UN NOVENTA (XC) CMPB #0 BNE CASOXC LDAB BANDERAC CMPB #4 BHI ERROR_1
JSR L_ERROR
LDAB BANDERAC INCB STAB BANDERAC CMPB #4 BEQ ERROR_1 * VALIDA QUE NO LLEGUEN MAS DE 4 C'S STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX LDAB CENTENA INCB STAB CENTENA JMP CICLATE
*CASO POR SI LLEGA UN XC CASOXC CMPB #1 BHI ERROR_1 * ERROR CUANDO HAY MÁS DE UNA C ADDB #5 * SE USA CON EL ERROR XCX STAB BANDERAX LDAB #9 STAB DECENA STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX JMP CICLATE
ERROR_1 JSR ERROR_ESCRITURA JMP FIN
CASOL LDAB BANDERAX CMPB #0 BNE CASOXL JSR V_ERROR LDAB BANDERAL INCB STAB BANDERAL CMPB #2 BEQ ERROR_1 * VERIFICA QUE NO LLEGUE MAS DE UNA L STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX LDAB #5 STAB DECENA
JMP CICLATE
*PARA CUANDO LLEGA XL CASOXL CMPB #1 BHI ERROR_1 * IDENTIFICA SI HAY MAS DE UNA X ADDB #5 STAB BANDERAX * SUMA 5 A X LDAB #4 STAB DECENA * CARGA 4 A LAS CENTENAS STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX JMP CICLATE
SALTOINTERMEDIO CMPA #'X BEQ CASOX CMPA #'V BEQ CASOV CMPA #'I BEQ CASOI
JMP SALTOINTERMEDIO2
CASOX JSR V_ERROR LDAB BANDERAI CMPB #0 * VALIDA EL CASO DE NUEVE (IX) BNE CASOIX LDAB BANDERAX INCB STAB BANDERAX CMPB #3 BHI ERROR_1 LDAB BANDERAV CMPB #0 * VALIDA QUE NO EXISTAN V’s ANTES DE X BNE ERROR_1
STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX LDAB DECENA INCB STAB DECENA JMP CICLATE
ERROR_2 JSR ERROR_ESCRITURA JMP FIN *CUANDO LLEGUE UN IX CASOIX CMPB #1 BHI ERROR_1 ADDB #6 STAB BANDERAI LDAB #9 STAB UNIDAD STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX JMP CICLATE
CASOV LDAB BANDERAI CMPB #0 BNE CASOIV LDAB BANDERAV INCB STAB BANDERAV CMPB #2 BEQ ERROR_2 * VERIFICA QUE NO HAYA MAS DE DE UNA V STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX LDAB #5 STAB UNIDAD JMP CICLATE
*CUANDO LLEGUE UN IV CASOIV CMPB #1 BHI ERROR_2 ADDB #6 STAB BANDERAI LDAB #4 STAB UNIDAD STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX JMP CICLATE
SALTOINTERMEDIO2 CMPA #'O * SI RECIBE UN OK BEQ CASOO CMPA #'K BEQ CASOOK CMPA #61 * IDENTIFICA EL FINAL DE LA CADENA UNA VEZ RECIBIDO EL = BEQ ESCRIBECHAR JMP SALTOINTERMEDIO1_ERROR
CASOI LDAB BANDERAI INCB STAB BANDERAI CMPB #3 BHI ERROR_2 STAA $00,X * LO QUE MANDA EL USUARIO SE ESCRIBE A PARTIR DE LA DIRECCION $70 INX LDAB UNIDAD INCB STAB UNIDAD JMP CICLATE
CASOO LDAB BANDERAOK INCB STAB BANDERAOK JMP FIN
CASOOK LDAB BANDERAOK CMPB #0 BNE LIMPIEZA_SALTO JMP CICLATE1 LIMPIEZA_SALTO JSR LIMPIEZA JSR INICIALIZAR JMP CICLATE1
SALTOINTERMEDIO1_ERROR JMP ERROR1
ESCRIBECHAR LDAB BANDERAERROR CMPB #1 BEQ SALTOINTERMEDIO1_ERROR LDAB #48 * CÓDIGO ASCII DE 0 LDAA MIL ABA STAA MIL LDAA CENTENA ABA STAA CENTENA LDAA DECENA ABA STAA DECENA LDAA UNIDAD ABA STAA UNIDAD JMP INSERTAR_TEXTO JMP FIN
FIN LDAA #'? STAA ORDEN CICLO1 LDAA ORDEN CMPA #'?
BEQ CICLO1 CMPA #'O BEQ CASOO CMPA #'K BEQ CASOOK JMP FIN
TRADUCCION DE NUMEROS ROMANOS A DECIMAL
CICLATE1 LDAA #'? STAA ORDEN CICLO LDAA ORDEN CMPA #'? BEQ CICLO
ENTRADA CMPA #61 * IDENTIFICA EL FINAL DE LA CADENA CON EL = BEQ TRADUCCION_A_ROMANO
CMPA #'O *CASO EN QUE RECIBA OK BEQ CASOO_DECIMAL CMPA #'K BEQ CASOOK_DECIMAL * RECIBE UNA K
JSR VALIDACION_DECIMAL * SI ES UN NUMERO DECIMAL REGRESA UN 1 CMPB #1 BNE ENTRADA_INTERMEDIO_ROMANO
LDAB NUMCARAC CMPB #3 BHI ERROR_CANTIDAD * HAY ERROR SI LLEGAN MAS DE 4 CARACTERES
INCB STAB NUMCARAC * SE INCREMENTA EL NUMERO DE CARACTERES
STAA $00,X INX
JMP CICLATE1
ENTRADA_INTERMEDIO_ROMANO LDAB #2 STAB BANDERA_TIPO_TRADUCCION JMP ENTRADA_ROMANO
CASOO_DECIMAL LDAB BANDERAOK INCB STAB BANDERAOK JMP CICLATE1
CASOOK_DECIMAL LDAB BANDERAOK CMPB #0 BEQ ERROR_CANTIDAD JSR INICIALIZAR JMP CICLATE1
TRADUCCION_A_ROMANO LDAB #1 STAB BANDERA_TIPO_TRADUCCION
LDAA BANDERA_ERROR CMPA #1 BEQ CICLATE1 LDY #DIRECCION_RESULTADO * DIRECCION EN MEMORIA PARA ESCRIBIR LDX #DIRECCION_INPUT * DIRECCION EN MEMORIA DE LOS NUMEROS LDAA NUMCARAC * COMPARACION DE NUMERO DE CARACTERES CMPA #1 BEQ CASO_UNIDAD CMPA #2 BEQ CASO_DECENA CMPA #3 BEQ CASO_CENTENA CMPA #4 BEQ CASO_MILLAR
JMP CICLATE1 * EN EL CASO DE QUE NO SE HAGA NIEN LA VALIDACION
CASO_MILLAR
LDAB $00,X * EL PRIMER CHAR SE PONE EN B CMPB #$31 BLO CASO_CENTENA * IDENTIFICA SI EL VALOR ES MAYOR A 0
CASO_ESCRIBE_MILLAR LDAA #'M * CARGA EN EL ACUMULADOR A UNA M STAA $00,Y * ESCRIBE EN LA DIR DE Y INY * INCREMENTAMOS Y PARA CONTINUAR ESCRIBIENDO DECB * SE DECREMENTAN B CMPB #$30 * ASCII DE 0 BNE CASO_ESCRIBE_MILLAR * EN CASO DE RECIBIR UN PUNTO(.) SE REPITE INX * SE PASA AL SIGUIENTE DIGITO
CASO_CENTENA JSR ESCRIBE_CENTENA INX CASO_DECENA * GUARDA EN A, EL VALOR DE X JSR ESCRIBE_DECENA INX CASO_UNIDAD JSR ESCRIBE_UNIDAD JMP INSERTAR_TEXTO JMP CICLATE1
ERROR_CANTIDAD LDX #DIRECCION_RESULTADO * DIRECCION EN MEMORIA DEL MENSAJE LDY #MENSAJE_E_RANGO * ORG FCC JSR ERROR JMP CICLATE1
INICIALIZAR LDX #DIRECCION_INPUT LDY #DIRECCION_RESULTADO * ES LA DIRECCION $50 CLR BANDERA_TIPO_TRADUCCION CLR BANDERAOK CLR UNO_R CLR NUMCARAC CLR BANDERA_ERROR LIM3 LDAB #00 STAB $00,Y INY CPY #$00C0 BNE LIM3 LDY #DIRECCION_INPUT * ES LA DIRECCION $30 LIM4 LDAB #00 STAB $00,Y INY CPY #$0040 BNE LIM4 RTS
VALIDACION_DECIMAL CMPA #$30 * VALOR EN ASCCI DE 0 BLO ERROR_DECIMAL CMPA #$3A * VALOR EN ASCII DE 9 BHI ERROR_DECIMAL LDAB #1 FIN_VALIDACION_DECIMAL RTS
ERROR_DECIMAL LDAB #4 JMP FIN_VALIDACION_DECIMAL
ERROR LDAB #1 STAB BANDERA_ERROR ERROR_CICLO1 LDAB $00,Y * CARACTER DEL FCC STAB $00,X * EN LA DIRECCION DE X ESCRIBE EL CHAR INX * INCREMENTA X INY * INCREMENTA Y CMPB #46 * VALOR EN ASCII DE PUNTO BNE ERROR_CICLO1 * SE CICLA HASTA ENCONTAR UN PUNTO(.) RTS ESCRIBE_CENTENA PSHX * COPIA EL VALOR DE X LDAA $00,X * GUARDA X EN A SUBA #$30 * RESTA 30 CMPA #1 BEQ NUM_1_CENTENA CMPA #2 BEQ NUM_2_CENTENA CMPA #3 BEQ NUM_3_CENTENA CMPA #4 BEQ NUM_4_CENTENA CMPA #5 BEQ NUM_5_CENTENA CMPA #6 BEQ NUM_6_CENTENA CMPA #7 BEQ NUM_7_CENTENA CMPA #8 BEQ NUM_8_CENTENA CMPA #9 BEQ NUM_9_CENTENA FIN_CENTENA PULX RTS NUM_1_CENTENA LDX #CIEN_R * DIRECCION DE CIEN JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_2_CENTENA LDX #DOSCIENTOS_R * DIRECCION DE DOSCIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_3_CENTENA LDX #TRESCIENTOS_R * DIRECCION DE TRESCIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_4_CENTENA LDX #CUATROCIENTOS_R * DIRECCION DE CUATROCIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_5_CENTENA LDX #QUINIENTOS_R * DIRECCION DE QUINIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_6_CENTENA LDX #SEISCIENTOS_R * DIRECCION DE SEISCIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_7_CENTENA LDX #SETECIENTOS_R * DIRECCION DE SETECIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_8_CENTENA LDX #OCHOCIENTOS_R * DIRECCION DE OCHOCIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA NUM_9_CENTENA LDX #NOVECIENTOS_R * DIRECCION DE NOVSECIENTOS JSR CICLO_ESCRITURA JMP FIN_CENTENA
CICLO_ESCRITURA LDAB $00,X * TOMA CARACTER DEL FCC STAB $00,Y * ESCRIBE EN LA DIRECCION DE Y EL CHAR INX INY CMPB #$20 * VALOR EN ASCII DEL ESPACIO BNE CICLO_ESCRITURA * SE REPITE HASTA QUE NO SE ENCUENTRE UN PUNTO(.) DEY RTS
ESCRIBE_DECENA PSHX LDAA $00,X SUBA #$30 CMPA #1 BEQ NUM_1_DECENA CMPA #2 BEQ NUM_2_DECENA CMPA #3 BEQ NUM_3_DECENA CMPA #4 BEQ NUM_4_DECENA CMPA #5 BEQ NUM_5_DECENA CMPA #6 BEQ NUM_6_DECENA CMPA #7 BEQ NUM_7_DECENA CMPA #8 BEQ NUM_8_DECENA CMPA #9 BEQ NUM_9_DECENA FIN_DECENA PULX RTS
NUM_1_DECENA LDX #DIEZ_R * DIRECCION DE DIEZ JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_2_DECENA LDX #VEINTE_R * DIRECCION DE VEINTE JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_3_DECENA LDX #TREINTA_R * DIRECCION DE TREINTA JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_4_DECENA LDX #CUARENTA_R * DIRECCION DE CUARENTA JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_5_DECENA LDX #CINCUENTA_R * DIRECCION DE CINCUENTA JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_6_DECENA LDX #SESENTA_R * DIRECCION DE SESENTA JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_7_DECENA LDX #SETENTA_R * DIRECCION DE SETENTA JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_8_DECENA LDX #OCHENTA_R * DIRECCION DE OCHENTA JSR CICLO_ESCRITURA JMP FIN_DECENA NUM_9_DECENA LDX #NOVENTA_R * DIRECCION DE NOVENTA JSR CICLO_ESCRITURA JMP FIN_DECENA
ESCRIBE_UNIDAD PSHX LDAA $00,X SUBA #$30 CMPA #1 BEQ NUM_1_UNIDAD CMPA #2 BEQ NUM_2_UNIDAD CMPA #3 BEQ NUM_3_UNIDAD CMPA #4 BEQ NUM_4_UNIDAD CMPA #5 BEQ NUM_5_UNIDAD CMPA #6 BEQ NUM_6_UNIDAD CMPA #7 BEQ NUM_7_UNIDAD CMPA #8 BEQ NUM_8_UNIDAD CMPA #9 BEQ NUM_9_UNIDAD FIN_UNIDAD PULX RTS
NUM_1_UNIDAD LDX #UNO_R * DIRECCION DE UNO
JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_2_UNIDAD LDX #DOS_R * DIRECCION DE DOS JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_3_UNIDAD LDX #TRES_R * DIRECCION DE TRES JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_4_UNIDAD LDX #CUATRO_R * DIRECCION DE CUATRO JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_5_UNIDAD LDX #CINCO_R * DIRECCION DE CINCO JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_6_UNIDAD LDX #SEIS_R * DIRECCION DE SEIS JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_7_UNIDAD LDX #SIETE_R * DIRECCION DE SIETE JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_8_UNIDAD LDX #OCHO_R * DIRECCION DE OCHO JSR CICLO_ESCRITURA JMP FIN_UNIDAD NUM_9_UNIDAD LDX #NUEVE_R * DIRECCION DE NUEVE JSR CICLO_ESCRITURA JMP FIN_UNIDAD
*Configuracion del puerto serial SERIAL LDD #$302C * CONFIGURA PUERTO SERIAL STAA BAUD * BAUD 9600 para cristal de 8MHz STAB SCCR2 * HABILITA RX Y TX PERO INTERRUPCN SOLO RX LDAA #$00 STAA SCCR1 * 8 BITS
LDAA #$FE * CONFIG PUERTO D COMO SALIDAS (EXCEPTO PD0) STAA DDRD * SEA ENABLE DEL DISPLAY PD4 Y RS PD3
LDAA #$04 STAA HPRIO
LDAA #$00 TAP RTS
ERROR_ESCRITURA LDAB BANDERAERROR INCB STAB BANDERAERROR LDX #DIRECCION_RESULTADO * DIRECCION MENSAJE LDY #$3000 * ORG FCC ERROR_CICLO LDAB $00,Y STAB $00,X INX INY CMPB #46 * VALOR DE ASCII DEL PUNTO BNE ERROR_CICLO RTS
ERROR_SALTO JSR ERROR_ESCRITURA JMP FIN_ERROR
D_ERROR LDAB BANDERAD CMPB #0 * VALIDA QUE ANTES DE LA M NO HAYA D’s BNE ERROR_SALTO
CMPA #'M BEQ L_ERROR * IDENTIFICA SI M TIENE UNA C ANTES C_ERROR LDAB BANDERAC CMPB #0 * VALIDA QUE ANTES DE LA M NO HAYA D's BNE ERROR_SALTO L_ERROR LDAB BANDERAL CMPB #0 * VALIDA QUE ANTES DE LA M NO HAYA L's BNE ERROR_SALTO CMPA #'C BEQ V_ERROR * VALIDAR QUE C SI PUEDE TENER UNA X ANTES X_ERROR LDAB BANDERAX CMPB #0 * VALIDA QUE ANTES DE LA M NO HAYA X's BNE ERROR_SALTO V_ERROR LDAB BANDERAV CMPB #0 * VALIDA QUE ANTES DE LA M NO HAYA V's BNE ERROR_SALTO CMPA #'X BEQ FIN_ERROR * VALIDAR QUE X SI PUEDE TENER UNA I ANTES I_ERROR LDAB BANDERAI CMPB #0 * VALIDA QUE ANTES DE LA M NO HAYA I's BNE ERROR_SALTO FIN_ERROR RTS
LIMPIEZA CLR BANDERAM CLR BANDERAD CLR BANDERAC CLR BANDERAL CLR BANDERAX CLR BANDERAV CLR BANDERAI CLR NUMCARAC CLR BANDERA_TIPO_TRADUCCION CLR BANDERAERROR CLR UNIDAD CLR DECENA CLR CENTENA CLR MIL CLR BANDERA_TRADUCCION LDX #DIRECCION_RESULTADO LDY #DIRECCION_INPUT LIM LDAB #00 STAB $00,Y * EMPIEZA EN LA $50 INY CPY #$00C0 * TERMINA EN LA $70 BNE LIM LDY #DIRECCION_INPUT * EMPIEZA EN LA $30 LIM2 LDAB #00 STAB $00,Y INY CPY #$0040 * TERMINA EN LA $40 BNE LIM2 RTS
ORIGEN_DECIMAL * JSR DESPLAZA_DECIMALS LDY #DIRECCION_INPUT JMP ESCRIBE_INSERTAR_TEXTO ORIGEN_ROMANO LDY #DIRECCION_RESULTADO * LA TRADUCCION LDAA $00,Y JMP ENTRADA_MILES
ENTRADA_INTERMEDIA_UNIDADES JMP ENTRADA_UNIDADES ENTRADA_INTERMEDIA_DECENAS JMP ENTRADA_DECENAS ENTRADA_INTERMEDIA_CENTENAS JMP ENTRADA_CENTENAS
**SUBRUTINA PARA ESCRIBIR LOS NUMEROS TEXTUALES INSERTAR_TEXTO LDAB BANDERA_TIPO_TRADUCCION CMPB #1 BEQ ORIGEN_DECIMAL CMPB #2 BEQ ORIGEN_ROMANO ESCRIBE_INSERTAR_TEXTO LDX #DIRECCION_TEXTUAL LDAB NUMCARAC STAB $00A0 CMPB #1 BEQ ENTRADA_INTERMEDIA_UNIDADES CMPB #2 BEQ ENTRADA_INTERMEDIA_DECENAS CMPB #3 BEQ ENTRADA_INTERMEDIA_CENTENAS ENTRADA_MILES LDX #DIRECCION_TEXTUAL LDAB $00,Y PSHY CMPB #'0 BEQ ESCRIBE_MIL_FIN CMPB #'1 BEQ ESCRIBE_MIL CMPB #'2 BEQ ESCRIBE_DOS_MIL CMPB #'3 BEQ ESCRIBE_TRES_MIL CMPB #'4 BEQ ESCRIBE_CUATRO_MIL CMPB #'5 BEQ ESCRIBE_CINCO_MIL CMPB #'6 BEQ ESCRIBE_SEIS_MIL CMPB #'7 BEQ ESCRIBE_SIETE_MIL CMPB #'8 BEQ ESCRIBE_OCHO_MIL CMPB #'9 BEQ ESCRIBE_NUEVE_MIL
ESCRIBE_MIL_FIN PULY INY JMP ENTRADA_CENTENAS
ESCRIBE_MIL LDY #MIL_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL_FIN
ESCRIBE_DOS_MIL LDY #DOS_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ESCRIBE_TRES_MIL LDY #TRES_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ESCRIBE_CUATRO_MIL LDY #CUATRO_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ESCRIBE_CINCO_MIL LDY #CINCO_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ESCRIBE_SEIS_MIL LDY #SEIS_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ESCRIBE_SIETE_MIL LDY #SIETE_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ESCRIBE_OCHO_MIL LDY #OCHO_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ESCRIBE_NUEVE_MIL LDY #NUEVE_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_MIL
ENTRADA_CENTENAS LDAB $00,Y PSHY CMPB #'0 BEQ ESCRIBE_CIENTOS_FIN CMPB #'1 BEQ ESCRIBE_CIEN CMPB #'2 BEQ ESCRIBE_DOS_CIENTOS CMPB #'3 BEQ ESCRIBE_TRES_CIENTOS CMPB #'4 BEQ ESCRIBE_CUATRO_CIENTOS CMPB #'5 BEQ ESCRIBE_CINCO_CIENTOS JMP OTRAS_CENTENAS ESCRIBE_CIENTOS LDY #CIENTOS_D JSR CICLO_INSERTAR_TEXTO ESCRIBE_CIENTOS_FIN PULY INY JMP ENTRADA_DECENAS
ESCRIBE_CIEN *CHECAMOS DECENAS PULY INY LDAB $00,Y CMPB #'0 BNE ESCRIBE_CIENTO_DEC DEY PSHY * CHECAMOS UNIDADES PULY INY INY LDAB $00,Y CMPB #'0 BNE ESCRIBE_CIENTO_UNI DEY DEY PSHY LDY #CIEN_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_CIENTOS_FIN ESCRIBE_CIENTO_DEC DEY PSHY JMP ESCRIBE_CIENTO ESCRIBE_CIENTO_UNI DEY DEY PSHY JMP ESCRIBE_CIENTO
ESCRIBE_CIENTO LDY #CIENTO_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_CIENTOS_FIN
ESCRIBE_DOS_CIENTOS LDY #DOS_D JSR CICLO_INSERTAR_TEXTO DEX JMP ESCRIBE_CIENTOS
ESCRIBE_TRES_CIENTOS LDY #TRES_D JSR CICLO_INSERTAR_TEXTO DEX JMP ESCRIBE_CIENTOS
ESCRIBE_CUATRO_CIENTOS LDY #CUATRO_D JSR CICLO_INSERTAR_TEXTO DEX JMP ESCRIBE_CIENTOS
ESCRIBE_CINCO_CIENTOS LDY #QUINIENTOS_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_CIENTOS_FIN
OTRAS_CENTENAS CMPB #'6 BEQ ESCRIBE_SEIS_CIENTOS CMPB #'7 BEQ ESCRIBE_SIETE_CIENTOS CMPB #'8 BEQ ESCRIBE_OCHO_CIENTOS CMPB #'9 BEQ ESCRIBE_NUEVE_CIENTOS JMP ESCRIBE_CIENTOS
ESCRIBE_SEIS_CIENTOS LDY #SEIS_D JSR CICLO_INSERTAR_TEXTO DEX JMP ESCRIBE_CIENTOS
ESCRIBE_SIETE_CIENTOS LDY #SETECIENTOS_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_CIENTOS_FIN
ESCRIBE_OCHO_CIENTOS LDY #OCHO_D JSR CICLO_INSERTAR_TEXTO DEX JMP ESCRIBE_CIENTOS
ESCRIBE_NUEVE_CIENTOS LDY #NOVECIENTOS_D JSR CICLO_INSERTAR_TEXTO JMP ESCRIBE_CIENTOS_FIN
ENTRADA_DECENAS LDAB $00,Y PSHY CMPB #'0 BEQ FIN_ENTRADA_DECENAS CMPB #'1 BEQ ESCRIBE_DIECI CMPB #'2 BEQ S_ESCRIBE_VEINTI JMP COMPARA_TANTOS FIN_ENTRADA_DECENAS PULY INY JMP ENTRADA_UNIDADES
S_ESCRIBE_VEINTI JMP ESCRIBE_VEINTI
ESCRIBE_DIECI PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ ESCRIBE_DIEZ CMPB #'1 BEQ ESCRIBE_ONCE CMPB #'2 BEQ ESCRIBE_DOCE CMPB #'3 BEQ ESCRIBE_TRECE CMPB #'4 BEQ ESCRIBE_CATORCE CMPB #'5 BEQ ESCRIBE_QUINCE CMPB #'6 BEQ ESCRIBE_DIECISEIS JMP ESCRIBE_DIECI_L JMP FIN_INSERTAR_TEXTO
ESCRIBE_DIEZ LDY #DIEZ_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_ONCE LDY #ONCE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_DOCE LDY #DOCE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_TRECE LDY #TRECE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_CATORCE LDY #CATORCE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_QUINCE LDY #QUINCE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_DIECI_L LDY #DIECI_D JSR CICLO_INSERTAR_TEXTO DEX JMP FIN_ENTRADA_DECENAS ESCRIBE_DIECISEIS LDY #DIECISEIS_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_VEINTI PULY INY LDAB $00,Y PSHY CMPB #'0 BEQ ESCRIBE_VEINTE CMPB #'1 BEQ ESCRIBE_VEINTIUNO CMPB #'2 BEQ ESCRIBE_VEINTIDOS CMPB #'3 BEQ ESCRIBE_VEINTITRES CMPB #'4 BEQ ESCRIBE_VEINTICUATRO CMPB #'5 BEQ ESCRIBE_VEINTICINCO CMPB #'6 BEQ ESCRIBE_VEINTISEIS CMPB #'7 BEQ ESCRIBE_VEINTISIETE CMPB #'8 BEQ ESCRIBE_VEINTIOCHO CMPB #'9 BEQ ESCRIBE_VEINTINUEVE JMP FIN_INSERTAR_TEXTO * SE VA AL FIN
*VEINTES
ESCRIBE_VEINTE LDY #VEINTE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTIUNO LDY #VEINTIUNO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTIDOS LDY #VEINTIDOS_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTITRES LDY #VEINTITRES_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTICUATRO LDY #VEINTICUATRO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTICINCO LDY #VEINTICINCO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTISEIS LDY #VEINTISEIS_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTISIETE LDY #VEINTISIETE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTIOCHO LDY #VEINTIOCHO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO ESCRIBE_VEINTINUEVE LDY #VEINTINUEVE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
COMPARA_TANTOS CMPB #'3 BEQ ESCRIBE_TREINTA CMPB #'4 BEQ ESCRIBE_CUARENTA CMPB #'5 BEQ ESCRIBE_CINCUENTA CMPB #'6 BEQ ESCRIBE_SESENTA JMP COMPARA_OTROS_TANTOS
***TREINTAS
ESCRIBE_TREINTA LDY #TREINTA_D JSR CICLO_INSERTAR_TEXTO
PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ FIN_ESCRIBE_TREINTA
LDY #Y_D JSR CICLO_INSERTAR_TEXTO FIN_ESCRIBE_TREINTA JMP FIN_ENTRADA_DECENAS
**CUARENTAS ESCRIBE_CUARENTA LDY #CUARENTA_D JSR CICLO_INSERTAR_TEXTO
PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ FIN_ESCRIBE_CUARENTA
LDY #Y_D JSR CICLO_INSERTAR_TEXTO FIN_ESCRIBE_CUARENTA JMP FIN_ENTRADA_DECENAS
**CINCUENTAS ESCRIBE_CINCUENTA LDY #CINCUENTA_D JSR CICLO_INSERTAR_TEXTO
PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ FIN_ESCRIBE_CINCUENTA
LDY #Y_D JSR CICLO_INSERTAR_TEXTO FIN_ESCRIBE_CINCUENTA JMP FIN_ENTRADA_DECENAS
**SESENTAS ESCRIBE_SESENTA LDY #SESENTA_D JSR CICLO_INSERTAR_TEXTO
PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ FIN_ESCRIBE_SESENTA
LDY #Y_D JSR CICLO_INSERTAR_TEXTO FIN_ESCRIBE_SESENTA JMP FIN_ENTRADA_DECENAS
COMPARA_OTROS_TANTOS CMPB #'7 BEQ ESCRIBE_SETENTA CMPB #'8 BEQ ESCRIBE_OCHENTA CMPB #'9 BEQ ESCRIBE_NOVENTA JMP FIN_ENTRADA_DECENAS
*SETENTAS ESCRIBE_SETENTA LDY #SETENTA_D JSR CICLO_INSERTAR_TEXTO
PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ FIN_ESCRIBE_SETENTA
LDY #Y_D JSR CICLO_INSERTAR_TEXTO FIN_ESCRIBE_SETENTA JMP FIN_ENTRADA_DECENAS
*OCHENTAS ESCRIBE_OCHENTA LDY #OCHENTA_D JSR CICLO_INSERTAR_TEXTO
PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ FIN_ESCRIBE_OCHENTA
LDY #Y_D JSR CICLO_INSERTAR_TEXTO FIN_ESCRIBE_OCHENTA JMP FIN_ENTRADA_DECENAS
*NOVENTAS ESCRIBE_NOVENTA LDY #NOVENTA_D JSR CICLO_INSERTAR_TEXTO
PULY INY LDAB $00,Y DEY PSHY CMPB #'0 BEQ FIN_ESCRIBE_NOVENTA
LDY #Y_D JSR CICLO_INSERTAR_TEXTO FIN_ESCRIBE_NOVENTA JMP FIN_ENTRADA_DECENAS
ENTRADA_UNIDADES LDAB $00,Y PSHY CMPB #'1 BEQ ESCRIBE_UNO CMPB #'2 BEQ ESCRIBE_DOS CMPB #'3 BEQ ESCRIBE_TRES CMPB #'4 BEQ ESCRIBE_CUATRO CMPB #'5 BEQ ESCRIBE_CINCO CMPB #'6 BEQ ESCRIBE_SEIS CMPB #'7 BEQ ESCRIBE_SIETE CMPB #'8 BEQ ESCRIBE_OCHO CMPB #'9 BEQ ESCRIBE_NUEVE
JMP FIN_INSERTAR_TEXTO ESCRIBE_UNO LDY #UNO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_DOS LDY #DOS_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_TRES LDY #TRES_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_CUATRO LDY #CUATRO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_CINCO LDY #CINCO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_SEIS LDY #SEIS_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_SIETE LDY #SIETE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_OCHO LDY #OCHO_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
ESCRIBE_NUEVE LDY #NUEVE_D JSR CICLO_INSERTAR_TEXTO JMP FIN_INSERTAR_TEXTO
FIN_INSERTAR_TEXTO JMP FIN
CICLO_INSERTAR_TEXTO LDAB $00,Y * TOMA CARACTER DEL FCC STAB $00,X * ESCRIBE EN X EL CHAR INX * INCREMENTA X INY * INCREMENTA Y CMPB #$20 * VALOR EN ASCII DE ESPACIO BNE CICLO_INSERTAR_TEXTO * SE REPITE MIENTRAS NO SE ENCUENTR UN PUNTO(.) DEY RTS
-
ATENCION A INTERRUPCION SERIAL
ORG $F100 LDAA SCSR LDAA SCDR STAA ORDEN RTI
-
VECTOR INTERRUPCION SERIAL
ORG $FFD6 FCB $F1,$00
*RESET
ORG $FFFE RESET FCB $80,$00
END $8000