; VICTOR MANUEL INIESTRA ALVAREZ
TITLE PARSER ; VALIDA EL VERBO DE UNA FRASE, RECONOCE NUMEROS
ORG 1000 ; VAR
ABRE EQU FF0D
ESCR EQU FF1D
LEE EQU FF4B
CIERRA EQU FF15
BUZON EQU 6000
; RESULTADO DE LA VALIDACION:
VALIDA1 DEFB 0 ; (0:NUMERO,1:VERBO 1,2:VERBO 2,...5:VARIABLE)
PALA1 DEFM " " ; PALABRA 1
DEFB 0FF
HEX1 DEFS 2 ; HEX(PALABRA 1)
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)
VALIDA4 DEFB 0
PALA4 DEFM " " ; PALABRA 4
DEFB 0FF
HEX4 DEFS 2 ; HEX(PALABRA 4)
VALIDA5 DEFB 0
PALA5 DEFM " " ; PALABRA 5
DEFB 0FF
HEX5 DEFS 2 ; HEX(PALABRA 5)
VERB1 DEFM "SUMA " ; VERBO 1
VERB2 DEFM "RESTA " ; VERBO 2
VERB3 DEFM "IGUALA" ; VERBO 3
VERB4 DEFM "MULTIP" ; VERBO 4
SIG_LIN DEFB 0A,0D,0FF
MENSAJE DEFM "Proy. de Arq. y Prog. de Proc."
DEFB 0FF
MENS0 DEFM " es Numero"
DEFB 0FF
MENS1 DEFM " es el Verbo 1"
DEFB 0FF
MENS2 DEFM " es el Verbo 2"
DEFB 0FF
MENS3 DEFM " es el Verbo 3"
DEFB 0FF
MENS4 DEFM " es el Verbo 4"
DEFB 0FF
MENS5 DEFM " es Variable"
DEFB 0FF
PROMPT DEFM ">"
DEFB 0FF
CUENTA DEFB 0 ; CONTADOR MILUSOS
NUMVER DEFB 0 ; CONTADOR DEL VERBO
VALVER DEFB 0 ; RESULTADO DE LA VALIDACION DEL VERBO
ORACIO DEFS 1 ; FRASE A ANALIZAR SEGUIDA POR EL SEPARADOR
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
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
ILEGAL: LD #5
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
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
LD #6
LDX PALA4
CALL KLEAN
LD #6
LDX PALA5
CALL KLEAN
RET
ID: ADD #0
JZ OPC0
SUB #1
JZ OPC1
SUB #1
JZ OPC2
SUB #1
JZ OPC3
SUB #1
JZ OPC4
JNZ OPC5
OPC0: LDX MENS0
JZ ASD
JNZ ASD
OPC1: LDX MENS1
JZ ASD
JNZ ASD
OPC2: LDX MENS2
JZ ASD
JNZ ASD
OPC3: LDX MENS3
JZ ASD
JNZ ASD
OPC4: LDX MENS4
JZ ASD
JNZ ASD
OPC5: LDX MENS5
JZ ASD
JNZ ASD
ASD: CALL ESCR
RET
MACRO RECONOC PALAO, VALIDAO
LDX PALAO
CALL ESCR
LD VALIDAO
CALL ID
LDX SIG_LIN
CALL ESCR
ENDM
BEGIN:
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
SEPARA PALA4 ; ASIGNANDOLAS A LAS LOCALIDADES PALA1, PALA2,..
SEPARA PALA5 ; 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
VAL_NUM PALA4, HEX4, VALIDA4 ; Y PONE UN VALOR DE 0 A VALIDA1,2.
VAL_NUM PALA5, HEX5, VALIDA5 ; 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_VER PALA4, VALIDA4
VAL_VER PALA5, VALIDA5
RECONOC PALA1, VALIDA1
RECONOC PALA2, VALIDA2
RECONOC PALA3, VALIDA3
RECONOC PALA4, VALIDA4
RECONOC PALA5, VALIDA5
CALL LIMPIA
CALL LEE
CALL CIERRA
JNZ BEGIN
JZ BEGIN
ACABA:
HALT
END
               (
geocities.com/v.iniestra/apuntes)                   (
geocities.com/v.iniestra)