;                 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
 
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	
[5~
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?
[5~	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
 
 
 
	JZ	NPI
	JNZ	NPI
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

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

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