; 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

    Source: geocities.com/v.iniestra/apuntes/arq_proc

               ( geocities.com/v.iniestra/apuntes)                   ( geocities.com/v.iniestra)