; UNIVERSIDAD IBEROAMERICANA
; PROYECTO DE ARQUITECTURA Y PROGRAMACION DE MICROPROCESADORES
; JUAN CARLOS CASTRO ARENAL OTOQO 1994
; VICTOR INIESTRA
TITLE INTERPRETE ; MAURICIO ORDOQEZ
ORG 1000 ; VARIABLES DEFINIDAS A PARTIR DE 1000
ABRE EQU FF0D
ESCR EQU FF1D
LEE EQU FF4B ; DIRECCIONES USADAS POR EL DRIVER INTERACTIVO
CIERRA EQU FF15
BUZON EQU 6000
; RESULTADO DE LA VALIDACION: 0=NUMERO 1=LET 2=ADD 3=SUBS 4=PRINT
; 5=TRANSFER 6=ALL 7=VARIABLE DESCONOCIDA
; 8=VAR-1 9=VAR-2 A=VAR-3 B=VAR-4 C=VAR-5 D=VAR-6
VALIDA1 DEFB 0
PALA1 DEFM " " ; PALABRA 1
DEFB 0FF ; CON ESTO PUEDO ESCRIBIR LA PALABRA CON LA REF. PALA1
HEX1 DEFS 2 ; HEX(PALABRA 1) SI LO TIENE :+)
VALIDA2 DEFB 0
PALA2 DEFM " " ; PALABRA 2
DEFB 0FF
HEX2 DEFS 2 ; HEX(PALABRA 2)
VALIDA3 DEFB 0
PALA3 DEFM " " ; PALABRA 3
DEFB 0FF
HEX3 DEFS 2 ; HEX(PALABRA 3)
VARIA1 DEFM "VAR-1 " ; VARIABLE 1. EL NOMBRE PODRA SER CAMBIADO
DEFB 0FF
HEXVA1 DEFS 2 ; HEX(VARIABLE 1) SI LO TIENE :+)
VARIA2 DEFM "VAR-2 " ; VARIABLE 2
DEFB 0FF
HEXVA2 DEFS 2 ; HEX(VARIABLE 2)
VARIA3 DEFM "VAR-3 " ; VARIABLE 3
DEFB 0FF
HEXVA3 DEFS 2 ; HEX(VARIABLE 3)
VARIA4 DEFM "VAR-4 " ; VARIABLE 4
DEFB 0FF
HEXVA4 DEFS 2 ; HEX(VARIABLE 4)
VARIA5 DEFM "VAR-5 " ; VARIABLE 5
DEFB 0FF
HEXVA5 DEFS 2 ; HEX(VARIABLE 5)
VARIA6 DEFM "VAR-6 " ; VARIABLE 6
DEFB 0FF
HEXVA6 DEFS 2 ; HEX(VARIABLE 6)
VERB1 DEFM "LET " ; VERBO 1
VERB2 DEFM "ADD " ; VERBO 2
VERB3 DEFM "SUBS " ; VERBO 3
VERB4 DEFM "PRINT " ; VERBO 4
VERB5 DEFM "TRANSF" ; VERBO 5
VERB6 DEFM "ALL " ; OPCION DEL VERBO PRINT
; POR LO QUE NO PUEDE SER VARIABLE
SIG_LIN DEFB 0A,0D,0FF ; CUANDO QUIERO AVANZAR UNA LINEA, ESCRIBO SIG_LIN
MENSAJE DEFM "Proy. de Arq. y Prog. de Proc."
DEFB 0FF
MENS0 DEFM "Sintaxis- Verbo o Comando Ilegal"
DEFB 0FF
MENS1 DEFM "Leteando"
DEFB 0FF
MENS2 DEFM "Addeando"
DEFB 0FF
MENS3 DEFM "Subeando"
DEFB 0FF
MENS4 DEFM "Printeando"
DEFB 0FF
MENS5 DEFM "Transfereando"
DEFB 0FF
MENSVA DEFM "OPERACION REALIZADA"
DEFB 0FF
MENSI DEFM "Num. max. de var. alcanzado"
DEFB 0FF
MENSO DEFM "Error de parametros"
DEFB 0FF
OVFLOW DEFM "Overflow"
DEFB 0FF
PROMPT DEFM ">"
DEFB 0FF
NUM DEFB 0FF
DEFB 0FF
PAR1 DEFB 0
PAR2 DEFB 0
PAR3 DEFB 0
PAR4 DEFB 0
PAR5 DEFB 0
SAL5 DEFB 0
SAL4 DEFB 0
SAL3 DEFB 0
SAL2 DEFB 0
SAL1 DEFB 0
DEFB 0FF
CUENTA DEFB 0 ; CONTADOR MILUSOS
NUMVER DEFB 0 ; CONTADOR DEL VERBO
NUMVAR DEFB 0 ; CONTADOR DE VARIABLE
VALVER DEFB 0 ; RESULTADO DE LA VALIDACION DEL VERBO
VALVAR DEFB 0 ; RESULTADO DE LA VALIDACION DE LA VARIABLE
VARIAS DEFB 6 ; NUMERO DE VARIABLES ASIGNABLES
ACARRE DEFB 0 ; ACARREO USADO EN LA RESTA
ORACIO DEFS 1 ; FRASE A ANALIZAR
ORG 0 ; PROGRAMA
LDSP #5000
JZ BEGIN ;VE AL PROGRAMA PRINCIPAL
JNZ BEGIN
REGRE: LD X
SUB #20
INX
JNZ REGRE
RET ; REGRESA EL CONTROL AL MACRO SEPARA
LEE1: LD #7
STO CUENTA
LEE2: LD CUENTA
SUB #1
JZ REGRE
STO CUENTA
LD X ; A=LETRA(FRASE)
SUB #20 ; A=LETRA(FRASE)-" "
JZ REGRE ; LETRA(FRASE)=" "? SI: YA ACABE.
ADD #20 ; VUELVE A AGREGAR LO QUE LE QUITE ANTES
STO Y ; ALMACENA ESTA LETRA EN LA LOCALIDAD CORRESPONDIENTE
INY ; AVANZA UNA LETRA EN LA FRASE
INX ; AVANZA UNA LETRA EN LA PALABRA
JZ LEE2 ; CONTINUALE HASTA QUE ACABES CON ESTA
JNZ LEE2 ; PALABRA DE LA FRASE
VALID:
LD #1 ; CHECA SI LA PALABRA QUE QUIERO VALIDAR
STO NUMVER ; ES IGUAL AL PRIMER VERBO
LDY VERB1
CALL VAL
LD #2 ; ES EL SEGUNDO VERBO?
STO NUMVER
LDY VERB2
CALL VAL
LD #3 ; EL TERCERO?
STO NUMVER
LDY VERB3
CALL VAL
LD #4 ; EL CUARTO?
STO NUMVER
LDY VERB4
CALL VAL
LD #5 ; EL QUINTO?
STO NUMVER
LDY VERB5
CALL VAL
LD #6 ; EL SEXTO?
STO NUMVER
LDY VERB6
CALL VAL
RET ; YA ACABE DE VALIDAR, REGRESA AL PRINCIPAL
VAL: PUSH X ; SALVAGUARDA LA DIRECCION DE LA PALABRA QUE
LD #1 ; ESTOY VALIDANDO
STO CUENTA ; ASEGURATE DE COMPARAR SOLO 6 LETRAS
VALI: LD #1
ADD #0FF ; ACARREO=1 (PARA LA RESTA)
LD X
SBC Y
JNZ RETOR ; @X=@Y? SI NO ES ASI, NO ES EL MISMO VERBO
LD CUENTA
SUB #6 ; YA COMPARE SEIS LETRAS?
JZ SI_ES ; SI YA LO HICE, SI ES EL VERBO
INX
INY ; MUEVETE A LA SIGUIENTE LETRA
LD CUENTA
ADD #1 ; YA LLEVO OTRA
STO CUENTA
JZ VALI ; COMPARA OTRA VEZ
JNZ VALI
SI_ES: LD NUMVER ; CARGA EL NUMERO DE VERBO QUE ESTOY COMPARANDO
STO VALVER ; ALMACENALO EN VALIDA
RETOR: POP X ; RECUPERA LA DIRECCION DE LA PALABRA VALIDABLE
RET ; REGRESA A VALID
VALIDV:
LD #8 ; CHECA SI LA PALABRA QUE QUIERO VALIDAR
STO NUMVAR ; ES IGUAL A LA PRIMERA VARIABLE
LDY VARIA1
CALL VALV
LD #9 ; ES EL SEGUNDO VERBO?
STO NUMVAR
LDY VARIA2
CALL VALV
LD #0A ; EL TERCERO?
STO NUMVAR
LDY VARIA3
CALL VALV
LD #0B ; EL CUARTO?
STO NUMVAR
LDY VARIA4
CALL VALV
LD #0C ; EL QUINTO?
STO NUMVAR
LDY VARIA5
CALL VALV
LD #0D ; EL SEXTO?
STO NUMVAR
LDY VARIA6
CALL VALV
RET ; YA ACABE DE VALIDAR, REGRESA AL PRINCIPAL
VALV: PUSH X ; SALVAGUARDA LA DIRECCION DE LA PALABRA QUE
LD #1 ; ESTOY VALIDANDO
STO CUENTA ; ASEGURATE DE COMPARAR SOLO 6 LETRAS
VALIV: LD #1
ADD #0FF ; ACARREO=1 (PARA LA RESTA)
LD X
SBC Y
JNZ RETORV ; @X=@Y? SI NO ES ASI, NO ES EL MISMO VERBO
LD CUENTA
SUB #6 ; YA COMPARE SEIS LETRAS?
JZ SI_ESV ; SI YA LO HICE, SI ES EL VERBO
INX
INY ; MUEVETE A LA SIGUIENTE LETRA
LD CUENTA
ADD #1 ; YA LLEVO OTRA
STO CUENTA
JZ VALIV ; COMPARA OTRA VEZ
JNZ VALIV
SI_ESV: LD NUMVAR ; CARGA EL NUMERO DE VERBO QUE ESTOY COMPARANDO
STO VALVAR ; ALMACENALO EN VALIDA
RETORV: POP X ; RECUPERA LA DIRECCION DE LA PALABRA VALIDABLE
RET ; REGRESA A VALID
HEXV: LD HEX3
STO X
INX
LD HEX3+1
STO X
RET
NOMV:
LD PALA2
STO X
INX
LD PALA2+1
STO X
INX
LD PALA2+2
STO X
INX
LD PALA2+3
STO X
INX
LD PALA2+4
STO X
INX
LD PALA2+5
STO X
RET
LETEA:
LD VARIAS
SUB #1
JZ VR6
SUB #1
JZ VR5
SUB #1
JZ VR4
SUB #1
JZ VR3
SUB #1
JZ VR2
JNZ VR1
VR1: LDX HEXVA1
CALL HEXV
LDX VARIA1
CALL NOMV
JZ PNI
JNZ PNI
VR2: LDX HEXVA2
CALL HEXV
LDX VARIA2
CALL NOMV
JZ PNI
JNZ PNI
VR3: LDX HEXVA3
CALL HEXV
LDX VARIA3
CALL NOMV
JZ PNI
JNZ PNI
VR4: LDX HEXVA4
CALL HEXV
LDX VARIA4
CALL NOMV
JZ PNI
JNZ PNI
VR5: LDX HEXVA5
CALL HEXV
LDX VARIA5
CALL NOMV
JZ PNI
JNZ PNI
VR6: LDX HEXVA6
CALL HEXV
LDX VARIA6
CALL NOMV
PNI: LDX MENSVA
CALL ESCR
RET
ILEGAL: LD #7
STO CUENTA
JZ SALIDA
JNZ SALIDA
DEC09: LD X ; A=@X
AND #0F ; A=BAJO(@X)
PUSH A
SUB #0A
LD #0
ADC #0
POP A
JZ ILEGAL
SL ; A=BAJO(@X)*10
SL
SL
SL
STO Y ; Y=BAJO(@X)*10
JZ UNIDAD
JNZ UNIDAD ; VE A LEER LA UNIDAD
DECAF: LD X
AND #0F
PUSH A
SUB #7
LD #0
ADC #0
POP A
JZ ILEGAL
ADD #9 ; A=BAJO(@X)+9
SL
SL
SL
SL
STO Y
JZ UNIDAD
JNZ UNIDAD
UNI09: LD X ; A=@X
AND #0F ; A=BAJO(@X)
PUSH A
SUB #0A
LD #0
ADC #0
JZ ILEGAL
LD #0 ; CARRY=0
ADD #0
POP A
ADC Y ; A=Y+BAJO(@X)
STO Y ; Y=Y+BAJO(@X)
JZ SALIDA
JNZ SALIDA
UNIAF: LD X ; A=@X
AND #0F ; A=BAJO(@X)
PUSH A
SUB #7
LD #0
ADC #0
JZ ILEGAL
POP A
ADD #9
ADC Y ; A=Y+BAJO(@X)
STO Y ; Y=Y+BAJO(@X)
JZ SALIDA
JNZ SALIDA
ASCHEX:
LD X ; A=@X
AND #0F0 ; A=ALTO(@X)
SUB #30 ; ALTO(@X)=30? (30,31,32,...,39)
JZ DEC09 ; X ESTA ENTRE 0 Y 9
SUB #10 ; ALTO(@X)=40? (41,42,..46)
JZ DECAF ; X ESTA ENTRE A Y F
JNZ ILEGAL
UNIDAD: INX ; AHORA LEE LA UNIDAD
LD X
AND #0F0
SUB #30
JZ UNI09
SUB #10
JZ UNIAF
JNZ ILEGAL
SALIDA: INX ; PREPARA LA SIGUIENTE CIFRA
INY
RET ; REGRESA A RECNUM
RECNUM:
CALL ASCHEX ; PRIMERA CIFRA
CALL ASCHEX ; SEGUNDA CIFRA
RET ; REGRESA AL PRINCIPAL
ASIGNA: LDY ORACIO
NO: LD X
SUB #0FF
JZ SALTE
ADD #0FF
STO Y
INX
INY
JZ NO
JNZ NO
SALTE: LD #6
PUSH Y
POP X
CALL KLEAN
RET
MACRO SEPARA NUM_PAL
LDY NUM_PAL ; Y=NUMERO PALABRA
CALL LEE1 ; @Y=NUMERO PALABRA(X)
ENDM
MACRO VAL_NUM NUM_PAL, NUM_HEX, NUM_VALIDA
LD #0
STO CUENTA
LDX NUM_PAL ; X=NUMERO PALABRA
LDY NUM_HEX ; Y=NUMERO HEX
CALL RECNUM ; RECONOCE EL NUMERO QUE ES LA PALABRA NUMERO
LD CUENTA
STO NUM_VALIDA
ENDM
MACRO VAL_VER NUM_PAL, NUM_VALIDA
LD NUM_VALIDA
STO VALVER
LDX NUM_PAL ; X=LA PALABRA QUE QUIERO VALIDAR
CALL VALID ; VE A VALIDAR VERBOS
LD VALVER
STO NUM_VALIDA
ENDM
MACRO VAL_VAR NUM_PL, NUM_VALID
LD NUM_VALID
STO VALVAR
LDX NUM_PL ; X=LA PALABRA QUE QUIERO VALIDAR
CALL VALIDV ; VE A VALIDAR VARIABLES
LD VALVAR
STO NUM_VALID
ENDM
ARGERR: LDX MENSO
CALL ESCR
RET
IDVAR1: LDX SIG_LIN
CALL ESCR
LD VALIDA3
SUB #8
JZ OPC218
SUB #1
JZ OPC219
SUB #1
JZ OPC21A
SUB #1
JZ OPC21B
SUB #1
JZ OPC21C
SUB #1
JZ OPC21D
CALL ARGERR
LD #1
RET
OPC218: LDX HEXVA1
JZ PL
JNZ PL
OPC219: LDX HEXVA2
JZ PL
JNZ PL
OPC21A: LDX HEXVA3
JZ PL
JNZ PL
OPC21B: LDX HEXVA4
JZ PL
JNZ PL
OPC21C: LDX HEXVA5
JZ PL
JNZ PL
OPC21D: LDX HEXVA6
PL: LD #0
RET
IDVAR2: LD VALIDA2
SUB #8
JZ OPC228
SUB #1
JZ OPC229
SUB #1
JZ OPC22A
SUB #1
JZ OPC22B
SUB #1
JZ OPC22C
SUB #1
JZ OPC22D
CALL ARGERR
LD #1
RET
OPC228: LDY HEXVA1
JZ PO
JNZ PO
OPC229: LDY HEXVA2
JZ PO
JNZ PO
OPC22A: LDY HEXVA3
JZ PO
JNZ PO
OPC22B: LDY HEXVA4
JZ PO
JNZ PO
OPC22C: LDY HEXVA5
JZ PO
JNZ PO
OPC22D: LDY HEXVA6
PO: LD #0
RET
KLEAN: PUSH A
LD #20
STO X
INX
POP A
SUB #1
JNZ KLEAN
RET
LIMPIA:
LD #6
LDX PALA1
CALL KLEAN
LD #6
LDX PALA2
CALL KLEAN
LD #6
LDX PALA3
CALL KLEAN
RET
ID: LD VALIDA1
SUB #1
JZ OPC1
SUB #1
JZ OPC2
SUB #1
JZ OPC3
SUB #1
JZ OPC4
SUB #1
JZ OPC5
JNZ OPC6
OPC1: LDX MENS1 ; PRIMERA PALABRA=LET
CALL ESCR
LD VALIDA2
SUB #7
JZ OPC11
CALL ARGERR
JZ NPI
JNZ NPI
OPC11: LD VALIDA3
ADD #0
JZ OPC12
CALL ARGERR
JZ NPI
JNZ NPI
OPC12: LD VARIAS
ADD #0
JZ INSMEM
CALL LETEA
LD VARIAS
SUB #1
STO VARIAS
JZ NPI
JNZ NPI
INSMEM: LDX MENSI
CALL ESCR
JZ NPI
JNZ NPI
OPC2: LDX MENS2 ; PRIMERA PALABRA=ADD
CALL ESCR
CALL IDVAR1
SUB #1
JZ NPI
CALL IDVAR2
SUB #1
JZ NPI
LD #0
ADD #0
INX
INY
LD X
ADC Y
STO Y
DEX
DEY
LD X
ADC Y
STO Y
LD #0
ADC #0
JZ NPI
LDX OVFLOW
CALL ESCR
JZ NPI
JNZ NPI
OPC3: LDX MENS3 ; PRIMERA PALABRA=SUBS
CALL ESCR
CALL IDVAR1
SUB #1
JZ NPI
CALL IDVAR2
SUB #1
JZ NPI
LD #1
ADD #0FF
INX
INY
LD X
SBC Y
STO Y
LD #0
ADC #0
JZ CNT1
DEY
LD Y
ADD #1
STO Y
INY
CNT1: LD #1
ADD #0FF
DEX
DEY
LD X
SBC Y
STO Y
LD #0
ADC #0
JZ NPI
LDX OVFLOW
CALL ESCR
JZ NPI
JNZ NPI
OPC4: LDX MENS4 ; PRIMERA PALABRA=PRINT
CALL ESCR
LD VALIDA2
SUB #6
JNZ OPC41
LDX SIG_LIN
CALL ESCR
LDX VARIA1
CALL ESCR
LD HEXVA1
STO NUM
LD HEXVA1+1
STO NUM+1
CALL IMPRI
LDX SIG_LIN
CALL ESCR
LDX VARIA2
CALL ESCR
LD HEXVA2
STO NUM
LD HEXVA2+1
STO NUM+1
CALL IMPRI
LDX SIG_LIN
CALL ESCR
LDX VARIA3
CALL ESCR
LD HEXVA3
STO NUM
LD HEXVA3+1
STO NUM+1
CALL IMPRI
LDX SIG_LIN
CALL ESCR
LDX VARIA4
CALL ESCR
LD HEXVA4
STO NUM
LD HEXVA4+1
STO NUM+1
CALL IMPRI
LDX SIG_LIN
CALL ESCR
LDX VARIA5
CALL ESCR
LD HEXVA5
STO NUM
LD HEXVA5+1
STO NUM+1
CALL IMPRI
LDX SIG_LIN
CALL ESCR
LDX VARIA6
CALL ESCR
LD HEXVA6
STO NUM
LD HEXVA6+1
STO NUM+1
CALL IMPRI
JZ NPI
JNZ NPI
OPC41 CALL IDVAR1
SUB #1
JZ NPI
LD X
STO NUM
INX
LD X
STO NUM+1
CALL IMPRI
JZ NPI
JNZ NPI
SUMDEC: PUSH A
LD #0
ADD #0
POP A
ADC X
ADC Y
STO Y
LD #1
ADD #0FF
LD #9
SBC Y
LD #0
ADC #0
JZ REGRET
LD Y
ADD #6
SUB #10
STO Y
LD #1
REGRET: RET
A_1: SUB #0
JZ REGRET
PUSH A
LD #0
LDX PAR1
LDY SAL1
CALL SUMDEC
LDX PAR2
LDY SAL2
CALL SUMDEC
LDX PAR3
LDY SAL3
CALL SUMDEC
LDX PAR4
LDY SAL4
CALL SUMDEC
LDX PAR5
LDY SAL5
CALL SUMDEC
POP A
SUB #1
JZ A_1
JNZ A_1
IMPRI: LD #0
STO SAL1
STO SAL2
STO SAL3
STO SAL4
STO SAL5
STO PAR5
LD #4
STO PAR4
LD #0
STO PAR3
LD #9
STO PAR2
LD #6
STO PAR1
LD NUM
AND #0F0
SR
SR
SR
SR
CALL A_1
SIG2: LD #0
STO PAR4
LD #2
STO PAR3
LD #5
STO PAR2
LD #6
STO PAR1
LD NUM
AND #0F
CALL A_1
SIG3: LD #0
STO PAR3
LD #1
STO PAR2
LD #6
STO PAR1
LD NUM+1
AND #0F0
SR
SR
SR
SR
CALL A_1
SIG4: LD #0
STO PAR2
LD #1
STO PAR1
LD NUM+1
AND #0F
CALL A_1
SIG5:
LD SAL1
ADD #30
STO SAL1
LD SAL2
ADD #30
STO SAL2
LD SAL3
ADD #30
STO SAL3
LD SAL4
ADD #30
STO SAL4
LD SAL5
ADD #30
STO SAL5
LDX SAL5
CALL ESCR
RET
OPC5: LDX MENS5 ; PRIMERA PALABRA=TRANSFER
CALL ESCR
CALL IDVAR1
SUB #1
JZ NPI
CALL IDVAR2
SUB #1
JZ NPI
LD X
STO Y
INX
INY
LD X
STO Y
JZ NPI
JNZ NPI
OPC6: LDX MENS0 ; PRIMERA PALABRA = NO VERBO
CALL ESCR
NPI: RET
BEGIN:
CALL LIMPIA
CALL ABRE
LDX MENSAJE
CALL ESCR
LDX SIG_LIN
CALL ESCR
LDX PROMPT
CALL ESCR
CALL LEE
CALL ASIGNA
LDX ORACIO ; X=ORACION A SEPARAR
SEPARA PALA1
SEPARA PALA2
SEPARA PALA3 ; SEPARA LA ORACION EN SUS CINCO PRIMERAS PALABRAS
; ASIGNANDOLAS A LAS LOCALIDADES PALA1, PALA2,..
; CADA PALABRA PODRA TENER A LO MAS 6 LETRAS.
VAL_NUM PALA1, HEX1, VALIDA1 ; VALIDA CADA UNA DE LAS PALABRAS
VAL_NUM PALA2, HEX2, VALIDA2 ; PARA VER SI SON NUMEROS VALIDOS.
VAL_NUM PALA3, HEX3, VALIDA3 ; SI LO SON LOS ASIGNA A HEX1, HEX2
; Y PONE UN VALOR DE 0 A VALIDA1,2.
; SI NO LO SON PONE UN 5 A VALIDA1,2
; Y ALGO DE BASURA A HEX1, HEX2.
; SOLO RECONOCERA LAS PRIMERAS 4 LETRAS DE LA PALABRA.
VAL_VER PALA1, VALIDA1 ; VALIDA CADA UNA DE LAS PALABRAS PARA VER SI SON
VAL_VER PALA2, VALIDA2 ; VERBOS VALIDOS. SI LO SON LES ASIGNA EL NUMERO
VAL_VER PALA3, VALIDA3 ; DE VERBO (1,4) A VALIDA1 O A VALIDA2 O A...
VAL_VAR PALA1, VALIDA1
VAL_VAR PALA2, VALIDA3
VAL_VAR PALA3, VALIDA2
CALL ID
CALL LEE
CALL CIERRA
JNZ BEGIN
JZ BEGIN
END
               (
geocities.com/v.iniestra/apuntes)                   (
geocities.com/v.iniestra)