;************************************* Tablas_07.asm *************************************
;
; Repetir el ejercicio Tablas_03.asm, pero situando la tabla en una posición tal que desborde
; la página de las primeras 256 posiciones de memoria de programa ROM.
;
; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
GuardaOffset
ENDC
; ZONA DE CÓDIGOS ********************************************************************
	ORG 	0 		; El programa comienza en la dirección 0.
Inicio
	bsf 	STATUS,RP0 	; Acceso al Banco 1.
	clrf 	TRISB 		; Las líneas del Puerto B se configuran como salida.
	movlw 	b'00011111' 	; Las 5 líneas del Puerto A se configuran como entrada.
	movwf 	TRISA
	bcf 	STATUS,RP0 	; Acceso al Banco 0.
Principal
	movf 	PORTA,W 	; Lee el valor de las variables de entrada.
; a parti desde aqui se considera el manejo de la tabla..... >>>>>>>>>>
	andlw 	b'00000111' 	; Se queda con los tres bits bajos de entrada.
	movwf 	GuardaOffset 	; Guarda el offset del salto.
	movlw 	LOW (TablaVerdad+1) ; Obtiene los 8 bits bajos de la dirección de memoria
				; de programa donde está situada la tabla real.
	addwf 	GuardaOffset,F ; Y halla el valor del salto absoluto dentro de la tabla.
	movlw 	HIGH (TablaVerdad+1) ; Cinco bits alto de la dirección de memoria de
				; programa donde está situada la tabla real.
	btfsc 	STATUS,C 	; ¿Ha desbordado la página de 256 bytes?
	addlw 	1 		; Sí, entonces añade una unidad al PCH.
	movwf 	PCLATH 		; Prepara el PCLATH.
	movf 	GuardaOffset,W 	; El offset se cargará en el PCL.
	call 	TablaVerdad 	; Obtiene la configuración de salida.
	movwf 	PORTB 		; Se visualiza por el puerto de salida.
goto Principal
; Subrutina "TablaVerdad" ---------------------------------------------------------------
;
; La tabla de la verdad se sitúa desbordando los primeros 256 bytes de memoria de programa.
	ORG .254 		; Cerca del borde de la primera página de 256 bytes.
TablaVerdad 			; Posición 0x00FE de memoria de programa (PCH-PCL).
	movwf 	PCL 		; El salto dentro de la tabla: PCH=PCLATH, PCL=W.
				; (Ver figura 9-8).
	retlw b'00001010' 	; (Configuración 0). Posición 0x00FF.
	retlw b'00001001' 	; (Configuración 1). Posición 0x0100.
	retlw b'00100011' 	; (Configuración 2). Posición 0x0101.
	retlw b'00001111' 	; (Configuración 3). Posición 0x0102.
	retlw b'00100000' 	; (Configuración 4). Posición 0x0103.
	retlw b'00000111' 	; (Configuración 5). Posición 0x0104.
	retlw b'00010111' 	; (Configuración 6). Posición 0x0105.
	retlw b'00111111' 	; (Configuración 7). Posición 0x0106.
	END