PORTC	EQU	$03
DDRC	EQU	$07
DDRD	EQU	$09
BAUD	EQU	$2B
SCCR1	EQU	$2C
SCCR2	EQU	$2D
SCSR	EQU	$2E
SCDR	EQU	$2F
PORTB	EQU	$04

FIN	EQU	$B61C	; 28 caracteres del MENU + $B600
T1	EQU	$31	; Teclas para la OPCION
T2	EQU	$32
T3	EQU	$33
T4	EQU	$34

	ORG	$100
	JMP	INICIO
MEM	FCC	'00000000000000000000000000000000'
FLAG	FCB	$00

VM	LDY	#RISTRA	; CABECERA DEL MENU
L6	LDAA	$00,Y
	JSR	WRITE
	INY
	CPY	#$B663	; $B600 + MENU (1C) + RISTRA (72 Bytes)
	BNE	L6

	JSR	ENTER
	LDAA	#'-'	; BUCLE SUBRISTRA
	LDAB	#71
L7	JSR	WRITE
	DECB
	TSTB
	BNE	L7
	JSR	ENTER

	LDY	#DIR1	; Etiqueta de la primera fila de datos
L10	LDAA	$00,Y
	JSR	WRITE
	INY
	CPY	#$B669	; $B600 + MENU (1C) + RISTRA (72 Bytes) + DIR1 (6)
	BNE	L10

	LDY	#MEM	; Primera fila de datos (en hexadecimal)
L2	LDAA	$00,Y
	TAB		; Para poder usar la transf. de High y Low
	LSRA
	LSRA
	LSRA
	LSRA		; A <= High del dato
	ANDB	#$0F	; B <= Low del dato
	JSR	ENVIA
	TBA
	JSR	ENVIA
	JSR 	SPACE
	INY
	CPY	#$113	; $100 + 16Bytes + 3 del JMP INICIO
	BNE	L2
	PSHY

	JSR 	SPACE	

	LDY	#MEM	; Primera fila de datos (en ASCII)
L12	LDAA	$00,Y
	BSR	LETNUM	; Si no es caracter visible sustituimos por un punto '.'
	JSR	WRITE
	INY
	CPY	#$113	; $100 + 16Bytes + 3 del JMP INICIO
	BNE	L12
	JSR	ENTER
	PSHY

	
	LDY	#DIR2	; Etiqueta de la segunda fila de datos
L11	LDAA	$00,Y
	JSR	WRITE
	INY
	CPY	#$B66F	; $B600 + MENU (1C) + RISTRA (72 Bytes) + DIR1 (6) + DIR2 (6)
	BNE	L11

	PULY		; Segunda fila de datos (en hexadecimal)
L9	LDAA	$00,Y
	TAB		; Para poder usar la transf. de High y Low
	LSRA
	LSRA
	LSRA
	LSRA		; A <= High del dato
	ANDB	#$0F	; B <= Low del dato
	JSR	ENVIA
	TBA
	JSR	ENVIA
	JSR	SPACE
	INY
	CPY	#$123	; $100 + 32Bytes + 3 del JMP INICIO
	BNE	L9

	JSR 	SPACE

	PULY		; Segunda fila de datos (en ASCII)
L15	LDAA	$00,Y
	BSR	LETNUM	; Si no es caracter visible sustituimos por un punto '.'
	JSR	WRITE
	INY
	CPY	#$123	; $100 + 32Bytes + 3 del JMP INICIO
	BNE	L15

	JSR	ENTER
	JMP	START

			; Los caracteres visibles son desde 32 ($20) hasta 126 ($7E)
LETNUM	CMPA	#$20	; Verificamos si es mayor que 32
	BGE	MAY126
PUNTO	LDAA	#'.'
	RTS
MAY126	CMPA	#$7E	; Verificamos si es menor que 126
	BGT	PUNTO
	RTS


	ORG	$B600		;En la $0000 tenemos el MENU
MENU	FCB	$0D		;Enter
	FCB	$0A
	FCC	'1.LPE'		;Lectura del Puerto de Entrada
	FCB	$0D		;Enter
	FCB	$0A
	FCC	'2.EPS'		;Escritura del Puerto de Salida
	FCB	$0D		;Enter
	FCB	$0A
	FCC	'3.VM'		;Volcado de Memoria (32 bytes)
	FCB	$0D		;Enter
	FCB	$0A
	FCC	'4.EM'		;Escritura en Memoria (1 valor)
	FCB	$0D		;Enter
	FCB	$0A

RISTRA	FCC	'DIR   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F      ASCII       '
DIR1	FCC	'0000: '
DIR2	FCC	'0010: '

INICIO	LDX	#$1000
	LDS	#$1FF
	CLRA
	STAA	DDRC,X
	LDAA	#$30
	STAA	BAUD,X
	LDAA	#$02
	STAA	DDRD,X
	CLRA
	STAA	SCCR1,X
	LDAA	#$0C
	STAA	SCCR2,X
	JSR	READ
	
START	JSR	MOSTRAR		;Programa Principal
OPTION	JSR	READ
	CMPA	#T1
	BEQ	LPE
	CMPA	#T2
	BEQ	EPS
	CMPA	#T3
	BEQ	LVM
	CMPA	#T4
	BEQ	EM
	BRA	OPTION

LPE	LDAA	PORTC,X
	TAB			;Para poder usar la transf. de High y Low
	LSRA
	LSRA
	LSRA
	LSRA			;A <= High del dato
	ANDB	#$0F		;B <= Low del dato
	BSR	ENVIA
	TBA
	BSR	ENVIA
	BRA	START

ENVIA	CMPA	#$09
	BGT	CHAR
	ADDA	#$30
	JSR	WRITE
	RTS
CHAR	ADDA	#$37
	JSR	WRITE
	RTS

EPS	LDAA	#'?'
	JSR	WRITE
	JSR	READ
	JSR	NUMLET
	LSLA
	LSLA
	LSLA
	LSLA
	PSHA		
	JSR	READ
	JSR	NUMLET
	TAB
	ANDB	#$0F
	PULA
	ABA
	BSR	ESCRIBE	

ESCRIBE	STAA	PORTB,X
	BRA	START

LVM	JMP	VM

EM	LDAA	#'A'
	JSR	WRITE
	LDAA	#'?'
	JSR	WRITE
	JSR	READ
	JSR	NUMLET		;Comprobamos que sea un dato en Hex válido
	PSHA			;Salvamos el primer digito en Hex en la pila
	JSR	READ
	JSR	NUMLET
	TAB
	PULA			;Recuperamos el primer digito
	PSHB			;Salvamos el segundo digito
	LDAB	#$10		;
	MUL			;B <= Parte alta del dato
	PULA			;A <= Parte baja del dato
	ABA			;A <= Hex(DATO)
	TAB
	CLRA			;D <= Address
	ADDD	#$103
	XGDY			;Y <= Address
	CPY	#$0122
	BGT	LEXIT
	LDAA	#'D'
	JSR	WRITE
	LDAA	#'?'
	JSR	WRITE
	JSR	READ
	JSR	NUMLET		;Comprobamos que sea un dato en Hex válido
	PSHA			;Salvamos el primer digito en Hex en la pila
	JSR	READ
	JSR	NUMLET
	TAB
	PULA			;Recuperamos el primer digito
	PSHB			;Salvamos el segundo digito
	LDAB	#$10		;
	MUL			;B <= Parte alta del dato
	PULA			;A <= Parte baja del dato
	ABA			;A <= Hex(DATO)
	STAA	$00,Y		;Mem[Address] <= Data
LEXIT	JMP	START

MOSTRAR	LDY	#MENU
L1	LDAA	$00,Y
	BSR	WRITE
	INY
	CPY	#FIN
	BNE	L1
	RTS

NUMLET	SUBA	#$30
	CMPA	#$9		;Verificamos 0-9
	BGT	MAY9
	RTS
MAY9	SUBA	#$7		;Pasamos a decimal
	CMPA	#$9
	BGT	MEN16
	LDAB	#$01
	STAB	FLAG
	RTS
MEN16	CMPA	#$10		;Comparamos si es letra
	BLT	LETRA		;Si no es letra, no nos interesa
	LDAB	#$01
	STAB	FLAG
LETRA	RTS

SPACE	LDAA	#' '	; Dos espacios en blanco entre DATOS (hex) y DATOS (ASCII)
	BSR	WRITE
	RTS

ENTER	LDAA	#$0D	; CRLF
	BSR	WRITE
	LDAA	#$0A
	BSR	WRITE
	RTS

READ	BRCLR	SCSR,X	$20	*
	LDAA	SCDR,X
	RTS

WRITE	BRCLR	SCSR,X	$80	*
	STAA	SCDR,X
	RTS

	END