;************************************* Tablas_07.asm *************************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
;
; 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 **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	
	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.
	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
	
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
