;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;
;	              TESTING PIC16C63 	   
;   		
;	 	      IR TESTCODE !!!!!
;  
; PROGRAMMEUR 	: GLENN GOOVAERTS    	   
; KLAS		: 4 ICT2
; JAAR		: 1998-1999
; FILENAAM	: IRTEST.ASM
; PROJECTNAME	: IRTEST.PJT
;
; INTERNE PROMOTOR :	MR VINGERHOEDT
; EXTERNE PROMOTOR :	MR DEVENYNS
;
;    	               WDOG ON 20MHZ XTAL		   
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

                  LIST    P=16C63,F=INHX8M

;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 
;
;               DECLARATIE RS232 - VARIABELEN
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§                         

INADD           EQU     00      ;INDIRECT POINTER
PCL		EQU	02	;LOWER BYTE VAN DE (PC) !!
RTCC            EQU     01      ;RTCC REG --> TMR0 REGISTER !!!
				;HIERMEE KUNNEN WE DE WDT RATE
				;SETTEN !!!!!!!!!!!!!!!!!!!!!!
OPT             EQU     81      ;OPTION REG
STATUS          EQU     03      ;STATUS REG


;STATUS REG FLAGS

C		EQU	00	;CARRY FLAG
Z		EQU	02	;ZERO FLAG
TO              EQU     04      ;TIME OUT FLAG
RP0             EQU     05      ;REG PAGE SELECT

FSR             EQU     04      ;FILE SELECT REG
INDF		EQU	00	;INDIRECT FILE REGISTER
				;NOT PHYSICALLY IMPLEMENTED !!

PORTC           EQU     07      ;PORT C (F7)
TRISC           EQU     87H
PORTA           EQU     05      ;PORT A (F5)
TRISA           EQU     85H

PCLATH  EQU     0AH

INTCON  EQU     0BH
;BIT DEFS
GIE             EQU     07H	;GLOBAL INTERRUPT ENABLE BIT 
PEIE            EQU     06H	;PHERIPHERAL INTERRUPT ENABLE BIT
T0IF            EQU     02H	;TMR0 OVERFLOW INTERRUPT FLAG BIT

PIR1            EQU     0CH
;BIT DEFS
RCIF            EQU     05	;USART RECEIVE INTERRUPT FLAG BIT
				;IS 1 WANNEER RECEIVE BUFFER FULL
				;CLR DOOR VAN RCREG TE LEZEN 

;DEVOLGENDE BIT WORDT NERGENS NIET GEBRUIKT !!!!!!!!!!!!!!!!!!!

TXIF            EQU     04	;USART TRANSMIT INTERRUPT FLAG BIT
				;IS 1 WANNEER TRANSMIT BUFFER EMPTY
				;CLR DOOR NAAR TXREG TE SCHRIJVEN
;SNAP NIET WAT DIT HIER DOET --> VERZENDEN GING TOCH ZONDER INTERR
;DEZE FLAG WORDT GESET ONAFHANKELIJK VAN HET FEIT DAT DE TXIE DIS-
;ABLED IS IN DE SOFTWARE. 
				

PIE1            EQU     0CH
;BIT DEFS
RCIE		EQU	05	;USART RECEIVE INTERRUPT ENABLE BIT

RCSTA           EQU     018H
TXSTA           EQU     098H	;TRANSMIT STATUS AND CONTROL 
				;REGISTER --> TRMT=1 WIL ZEGGEN
				;TRANSMIT SHIFT REGISTER EMPTY!
TXREG           EQU     019H
SPBRG           EQU     099H
RCREG           EQU     01AH

			 
;GENERAL EQUATES
;THESE ARE GENERAL PURPOSE RAM LOCATIONS
 
W_STORE 	EQU     20H     ;IN BOTH PAGES
STAT_STORE      EQU     21H     ;PAGE 0 ONLY
COUNT           EQU     22H     ;
COUNT1  	EQU     23H     ;
FLAGS           EQU     24H     ;GENERAL PURPOSE FLAG REG
                                ;BITS USED 0,
RX_BUFF 	EQU     25H     ;RECEIVED DATA BYTE FROM RS232


;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 
;
;                DECLARATIE I2C - VARIABELEN
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


; BIT 3,4 VAN POORT C NOEMEN WE RESPECTIEVELIJK : SCL,SDA

#DEFINE		SCL		PORTC,3		;SCL PIN
#DEFINE		SCL_DIR		TRISC,3
#DEFINE 	SDA		PORTC,4		;SDA PIN
#DEFINE 	SDA_DIR		TRISC,4

#DEFINE		INVERT_CS	PORTA,1		

CHIP_SELECT	EQU	26H		

SLAVE_ADDRESS	EQU	27H
DATA_VALUE_OUT	EQU	28H
DATA_VALUE_IN	EQU	29H

TELLER		EQU	30H
OUT_BITCOUNT	EQU	31H
IN_BITCOUNT	EQU	32H

DATABYTE_OUT	EQU	33H

BYTE1		EQU	34H
BYTE2		EQU	35H
RESULT_BYTE	EQU	36H
OFFSET		EQU	37H
TABLE_POINTER	EQU	38H

LEFT_MASK	EQU	3AH

ACK_USER	EQU	39H	;AFHANKELIJK VAN DEZE WAARDE 0
				;OF 1 BEPAALT DE GEBRUIKER OF
				;DAT NACK OF ACK MOET GEGENE-
				;REERD WORDEN (LAATSTE BYTE OF
				;NIET !!!!!)


;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 
;
;               DECLARATIE INFRARED - VARIABELEN
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

FRAME_NUMBER		EQU	3AH
CATEGORY_WIDTH		EQU	3BH
CATEGORY_HIGHBYTE	EQU	3CH
CATEGORY_LOWBYTE	EQU	3DH
IR_DATA			EQU	3EH

IR_TELLER1		EQU	3FH
IR_TELLER2		EQU	40H
IR_TELLER3		EQU	41H

TIME			EQU	42H
IR_DATABITCOUNT		EQU	43H
IR_CATBITCOUNT		EQU	44H
CATEGORY_FLAG		EQU	45H
NOT_SEND		EQU	48H
SEND			EQU	49H
NOT_SEND_HIGH		EQU	4AH
SEND_HIGH		EQU	4BH

;********

SHIFTREGISTER		EQU	4CH	;TESTREGISTERS !!

;********


#DEFINE		IR_LED	PORTA,2	;AAN DEZE PIN HANGT DE IR-LED !

;**************************************************************
;
;			AANTAL MACRO'S :

BANK1		MACRO
		BSF	STATUS,RP0
		ENDM

BANK0 		MACRO
		BCF	STATUS,RP0
		ENDM


;	     ENKEL OM LEESBAARHEID TE VERBETEREN !!!!
;
;**************************************************************

;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;    	          BEGIN VAN DE PROGRAMMA CODE
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
		

        ORG     000             ;RESET VECTOR
        GOTO    CLDSTT          ;COLDSTART VECTOR



        ORG     04H             ;RESET VECTOR



;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;		     BEGIN RS232 ROUTINES
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


;**************************************************************
;
;		      INTERRUPT ROUTINE
;
;**************************************************************

;THE RECEIVE BUFFER FULL IS THE ONLY INTERRUPT THAT IS ENABLED 
;IN THIS SOFTWARE SO WE WILL ONLY GET HERE WHEN WE HAVE A 
;CHARACTER IN RCREG READY FOR US TO USE.
;STORE W AND STATUS

INT_ROUTINE
        MOVWF   W_STORE
        MOVFW   STATUS
        BANK0			;MOVE TO REGISTER BANK 0
        MOVWF   STAT_STORE

;SEE WHICH INTERRUPT FLAG IS SET

        BTFSC   PIR1,RCIF       ;TEST FOR RECEIVE INTERR FLAG
        GOTO    RS232_RECEIVE

        CLRF    PIR1            ;MUST BE A MISTAKE

;RESTORE W AND STATUS AND RETURN FROM INTERRUPT
;OM HET TERUGKEER ADRES TERUG TE KRIJGEN VAN DE STACK !!!

INT_RET
        MOVFW   STAT_STORE
        MOVWF   STATUS
        SWAPF   W_STORE,F	;NORMAAL MOET DESTINATION NOG
				;GESPECIFIEERD WORDEN. DEFAULT
				;DESTINATION IS F. DUS HIER 
				;WORDT HET RESULTAAT IN F GE-
				;STOPT! GEEFT WEL EEN MESSAGE
				;BIJ HET COMPILEREN !!!
        SWAPF   W_STORE,W               
        RETFIE                  ;THIS INSTRUCTION ALSO SETS THE
				;GIE.

;BIT TO REENABLE THE INTERRUPTS

;**************************************************************





;**************************************************************
;
;		     RS232-RECEIVE ROUTINE
;
;**************************************************************

;IF WE GET HERE THEN WE HAVE A CHAR IN THE RECEIVE BUFFER

RS232_RECEIVE
        MOVFW   RCREG
        MOVWF   RX_BUFF 	;THIS IS A GENERAL PURPOSE RAM
				;LOCATION.	
        BSF     FLAGS,0 	;SET OUR SOFTWARE FLAG.
        BCF     PIR1,RCIF       ;CLEAR THE FLAG TO REMOVE THE
				;INTERRUPT

;WE WANT TO ECHO THE CHARACTER BACK SO IT APPEARS ON THE SCREEN
;OF THE TERMINAL PROGRAM.

        MOVFW   RX_BUFF
        BANK0
        MOVWF   TXREG

;TX LOOP - WE WAIT IN THIS LOOP UNTIL WE ARE CLEAR TO SEND
;THE NEXT CHARACTER.

	BANK1
INT_TXC1
        CLRWDT
        BTFSS   TXSTA,1 	;TRMT BIT
        GOTO    INT_TXC1
        BANK0

        GOTO	INT_RET 	;LOOP BACK TO RETURN

;**************************************************************





;**************************************************************
;
;		     RS232-TRANSMIT ROUTINE
;
;**************************************************************

; IN TEGENSTELLING MET DE ONTVANGST ROUTINE, DIE INTERRUPT 
; GESTUURD IS, MOETEN WE DEZE ROUTINE AANROEPEN WILLEN WE EEN
; CHARACTER VERSTUREN. ROEP DEZE ROUTINE AAN MET DE TE VERZEN-
; DEN BYTE IN HET W-REGISTER !!!
;
;
;SEND CHAR IN W TO UART

TX_CHARACTER
       BANK0      		;ENSURE WE ARE IN THE LOWER RAM
				;PAGE.
       MOVWF   TXREG            ;THIS IS THE DATA REGISTER.


; WANNEER IETS IN HET DATA REGISTER TXREG WORDT GEPLAATST DAN
; WORDT AUTOMATISCH HET VERZENDINGSPROCES OPGESTART !!!!!!!!!
; IN HETVOLGENDE STUK ROUTINE : TX_LOOP WACHTEN WE TOT DE 
; LAATSTE BIT VAN HET CHARACTER UIT TXREG VERZONDEN IS !!!!!!!
; VANAF HET MOMENT DAT TXREG LEEG IS WORDT DE TRMT BIT GESET
; WAARDOOR WE UIT DE LOOP TXC1 GAAN WAARDOOR WE DE VOLGENDE 
; BYTE KUNNEN GAAN VERZENDEN INDIEN GEWENST !!!!!!!!!!!!!!!!!!

        BANK1      		;MOVE TO RAM PAGE 1
TXC1
        CLRWDT
        BTFSS   TXSTA,1 	;TRMT BIT
				;TRANSMIT SHIFT REGISTER STATUS
        GOTO    TXC1

;IF WE GET HERE THEN THE BUFFER IS EMPTY
;SO SEND ANOTHER CHARACTER OR JUST RETURN

        BANK0      		;LEAVE POINTING AT RAM PAGE 0
        RETURN

;**************************************************************




;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;           TABEL --> OMVORMING ASCII NAAR HEX !!!
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;WE PLAATSTEN DEZE TABEL HIER OPDAT WE NIET IN DE PROBLEMEN
;ZOUDEN KOMEN DOOR TE SPRINGEN VOORBIJ DE PROGRAMMA GRENZEN
;DOOR HET AANPASSEN VAN DE PC !!!!!

CONVERSION_TABLE_ASCIIHEX	; KOMEN HIER MET TABLE_POINTER!
	MOVFW	TABLE_POINTER	; TABLE_POINTER BEVAT JUISTE
				; INDEX --> TERUG MET JUISTE W
	ADDWF	PCL,F		; PC = PC + 0 !
	RETLW	.0		; 0-WAARDE --> BEGIN TABEL !!! 
	RETLW	.1		; 1-WAARDE --> PC + 2 !!!
	RETLW	.2		; 2-WAARDE --> 
	RETLW	.3		; 3-WAARDE --> 
	RETLW	.4		; 4-WAARDE --> 
	RETLW	.5		; 5-WAARDE --> 
	RETLW	.6		; 6-WAARDE --> 
	RETLW	.7		; 7-WAARDE --> 
	RETLW	.8		; 8-WAARDE --> 
	RETLW	.9		; 9-WAARDE --> PC + 10 !!
	RETLW   .0		; :-WAARDE --> PC + 11 !!
	RETLW	.0		; ;-WAARDE --> 
	RETLW	.0		; <-WAARDE --> 
	RETLW	.0		; =-WAARDE --> 
	RETLW	.0		; >-WAARDE --> 
	RETLW	.0		; ?-WAARDE --> 
	RETLW	.0		; @-WAARDE --> 
	RETLW   .10		; A-WAARDE --> PC + 18 !!
	RETLW	.11		; B-WAARDE --> 
	RETLW	.12		; C-WAARDE --> 
	RETLW	.13		; D-WAARDE --> 
	RETLW	.14		; E-WAARDE --> 
	RETLW	.15		; F-WAARDE --> PC + 23 !!
	

;KOMEN HIER MET WAARDES IN BYTE1 EN IN BYTE2. HIER MAKEN
;WE ER 1 BYTE VAN !! WERKWIJZE --> EERST SWAPPEN WE DE
;UPPER EN LOWER NIBBLES VAN BYTE1, GEVOLGD DOOR HET OPTELLEN
;VAN DE GESWAPTE BYTE1 EN BYTE2 !! DEZE SOM PLAATSEN WE IN
;DE VARIABELE RESULT_BYTE !!!!!!!

CONV_SINGLE_BYTE		
	SWAPF	BYTE1,W		
	ADDWF	BYTE2,W				
	MOVWF	RESULT_BYTE	;SOM IN RESULT_BYTE, TERUGKEREN
	RETURN


;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;          TABEL --> OMVORMING HEX NAAR ASCII !!!
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

CONVERSION_TABLE_HEXASCII
	ADDWF	PCL,F
	RETLW	.48		;KARAKTER 0 IN W
	RETLW	.49
	RETLW	.50
	RETLW	.51
	RETLW	.52	
	RETLW	.53
	RETLW	.54
	RETLW	.55
	RETLW	.56
	RETLW	.57
	RETLW	.65		;KARAKTER A IN W
	RETLW	.66
	RETLW	.67
	RETLW	.68
	RETLW	.69
	RETLW	.70


;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;		 BEGIN ASCII LETTER ROUTINES      
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


SEND_WELCOME 			;WHAT DO YOU DESIRE O GREAT ONE
	CALL	LET_W		; LETTER = W WORDT VERZONDEN !!
	CALL	LET_H		; LETTER = H WORDT VERZONDEN !!
	CALL	LET_A		; LETTER = A WORDT VERZONDEN !!
	CALL	LET_T		; LETTER = T WORDT VERZONDEN !!
	CALL	SPATIE		; SPATIE     WORDT VERZONDEN !!
	CALL	LET_D		; LETTER = D WORDT VERZONDEN !!
	CALL	LET_O		; LETTER = O WORDT VERZONDEN !!
	CALL	SPATIE		; SPATIE     WORDT VERZONDEN !!
	CALL	LET_Y		; LETTER = Y WORDT VERZONDEN !!
	CALL	LET_O		; LETTER = O WORDT VERZONDEN !!
	CALL	LET_U		; LETTER = U WORDT VERZONDEN !!
	CALL	SPATIE		; SPATIE     WORDT VERZONDEN !!
	CALL	LET_D		; LETTER = D WORDT VERZONDEN !!
	CALL	LET_E		; LETTER = E WORDT VERZONDEN !!
	CALL	LET_S		; LETTER = S WORDT VERZONDEN !!
	CALL	LET_I		; LETTER = I WORDT VERZONDEN !!
	CALL	LET_R		; LETTER = R WORDT VERZONDEN !!
	CALL	LET_E		; LETTER = E WORDT VERZONDEN !!
	CALL	SPATIE		; SPATIE     WORDT VERZONDEN !!
	CALL	LET_O		; LETTER = O WORDT VERZONDEN !!
	CALL	SPATIE		; SPATIE     WORDT VERZONDEN !!
	CALL	LET_G		; LETTER = G WORDT VERZONDEN !!
	CALL	LET_R		; LETTER = R WORDT VERZONDEN !!
	CALL	LET_E		; LETTER = E WORDT VERZONDEN !!
	CALL	LET_A		; LETTER = A WORDT VERZONDEN !!
	CALL	LET_T		; LETTER = T WORDT VERZONDEN !!
	CALL	SPATIE		; SPATIE     WORDT VERZONDEN !!
	CALL	LET_O		; LETTER = O WORDT VERZONDEN !!
	CALL	LET_N		; LETTER = N WORDT VERZONDEN !!
	CALL	LET_E		; LETTER = E WORDT VERZONDEN !!

	CALL	SEND_LEGEND	; MOGELIJKE COMMANDO'S TONEN !!
 
	RETURN	


SEND_END			;BYE BYE BYE MASTER GLENN
	CALL	SEND_CR
	CALL	SEND_CR
	CALL	GROET
	CALL	SPATIE	
	CALL	GROET
	CALL	SPATIE
	CALL	GROET
	CALL	SEND_CR
	CALL	LET_M
	CALL	LET_A
	CALL	LET_S
	CALL	LET_T
	CALL	LET_E
	CALL	LET_R
	CALL	SPATIE
	CALL	LET_G
	CALL	LET_L
	CALL	LET_E
	CALL	LET_N
	CALL	LET_N
	CALL	SEND_CR
	RETURN


SEND_LEGEND			;HIERMEE TONEN WE EEN LIJST OP
				;HET SCHERM MET ALLE MOGELIJKE
				;COMMANDO'S DAT DIT PROGRAMMA
				;KAN VERWERKEN !!!!!

				;POSSIBLE COMMANDS :
	CALL	SEND_CR
	CALL	SEND_CR
	CALL	LET_P
	CALL	LET_O
	CALL	LET_S
	CALL	LET_S
	CALL	LET_I
	CALL	LET_B
	CALL	LET_L
	CALL	LET_E
	CALL	SPATIE
	CALL	LET_C
	CALL	LET_O
	CALL	LET_M
	CALL	LET_M
	CALL	LET_A
	CALL	LET_N
	CALL	LET_D
	CALL 	LET_S
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	
	CALL	SEND_CR
	CALL	SEND_CR
	
	CALL	LET_L		;L : SHOW POSSIBLE COMMANDS
	CALL	SPATIE
	CALL	SPATIE
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_S
	CALL	LET_H
	CALL	LET_O
	CALL	LET_W
	CALL	SPATIE
	CALL	LET_P
	CALL	LET_O
	CALL	LET_S
	CALL	LET_S
	CALL	LET_I
	CALL	LET_B
	CALL	LET_L
	CALL	LET_E
	CALL	SPATIE
	CALL	LET_C
	CALL	LET_O
	CALL	LET_M
	CALL	LET_M
	CALL	LET_A
	CALL	LET_N
	CALL	LET_D
	CALL 	LET_S

	CALL	SEND_CR

	CALL	LET_P		;P : STOPCONDITION
	CALL	SPATIE
	CALL	SPATIE
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_S
	CALL	LET_T
	CALL	LET_O
	CALL	LET_P
	CALL	LET_C
	CALL	LET_O
	CALL	LET_N
	CALL	LET_D
	CALL	LET_I
	CALL	LET_T
	CALL	LET_I
	CALL	LET_O
	CALL	LET_N

	CALL	SEND_CR

	CALL	LET_A		;A() : SEND ADDRESS (...)
	CALL	SYM_HAAKLINKS
	CALL	SYM_HAAKRECHTS
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_S
	CALL	LET_E
	CALL	LET_N
	CALL	LET_D
	CALL	SPATIE
	CALL	LET_A
	CALL	LET_D
	CALL	LET_D
	CALL	LET_R
	CALL	LET_E
	CALL	LET_S
	CALL	LET_S
	CALL	SPATIE
	CALL	SYM_HAAKLINKS
	CALL	SYM_PUNT
	CALL	SYM_PUNT
	CALL	SYM_PUNT
	CALL	SYM_HAAKRECHTS

	CALL	SEND_CR

	CALL	LET_Y		;Y() : CHIP SELECT (0,1)
	CALL	SYM_HAAKLINKS
	CALL	SYM_HAAKRECHTS
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_C
	CALL	LET_H
	CALL	LET_I
	CALL	LET_P
	CALL	SPATIE
	CALL	LET_S
	CALL	LET_E
	CALL	LET_L
	CALL	LET_E
	CALL	LET_C
	CALL	LET_T
	CALL	SPATIE
	CALL	SYM_HAAKLINKS
	CALL	SYM_0
	CALL	SYM_KOMMA
	CALL	SYM_1
	CALL	SYM_HAAKRECHTS

	CALL	SEND_CR

	CALL	LET_W		;W() : WRITE BYTE (...)
	CALL	SYM_HAAKLINKS
	CALL	SYM_HAAKRECHTS
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_W
	CALL	LET_R
	CALL	LET_I
	CALL	LET_T
	CALL	LET_E
	CALL	SPATIE
	CALL	LET_B
	CALL	LET_Y
	CALL	LET_T
	CALL	LET_E
	CALL	SYM_HAAKLINKS
	CALL	SYM_PUNT
	CALL	SYM_PUNT
	CALL	SYM_PUNT	
	CALL	SYM_HAAKRECHTS

	CALL	SEND_CR

	CALL	LET_R		;R() : READ BYTE (0,1)
	CALL	SYM_HAAKLINKS
	CALL	SYM_HAAKRECHTS
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_R
	CALL	LET_E
	CALL	LET_A
	CALL	LET_D
	CALL	SPATIE	
	CALL	LET_B
	CALL	LET_Y
	CALL	LET_T
	CALL	LET_E
	CALL	SPATIE
	CALL	SYM_HAAKLINKS
	CALL	SYM_0
	CALL	SYM_KOMMA
	CALL	SYM_1
	CALL	SYM_HAAKRECHTS

	CALL	SEND_CR
	
	CALL	LET_I		;I() : INFRARED (5 PAR)
	CALL	SYM_HAAKLINKS
	CALL	SYM_HAAKRECHTS
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_I
	CALL	LET_N
	CALL	LET_F
	CALL	LET_R
	CALL	LET_A
	CALL	LET_R
	CALL	LET_E
	CALL	LET_D
	CALL	SPATIE
	CALL	SYM_HAAKLINKS
	CALL	SYM_5
	CALL	SPATIE
	CALL	LET_P
	CALL	LET_A
	CALL	LET_R
	CALL	LET_A
	CALL	LET_M
	CALL	SYM_HAAKRECHTS

	CALL	SEND_CR
	CALL	SEND_CR

	CALL	LET_E		;ESC : END PROGRAM
	CALL	LET_S
	CALL	LET_C
	CALL	SYM_SPATIE_DUBBELPUNT_SPATIE
	CALL	LET_E
	CALL	LET_N
	CALL	LET_D
	CALL	SPATIE
	CALL	LET_P
	CALL	LET_R
	CALL	LET_O
	CALL	LET_G
	CALL	LET_R
	CALL	LET_A
	CALL	LET_M

	CALL	SEND_CR
	CALL	SEND_CR

	CALL	LET_W		
	CALL	LET_A		
	CALL	LET_I		
	CALL	LET_T		
	CALL	LET_I		
	CALL	LET_N		
	CALL	LET_G		
	CALL	SPATIE	
	CALL	LET_F		
	CALL	LET_O		
	CALL	LET_R		
	CALL	SPATIE		
	CALL	LET_C		
	CALL	LET_O		
	CALL	LET_M		
	CALL	LET_M		
	CALL	LET_A		
	CALL	LET_N		
	CALL	LET_D		
	CALL	LET_S		
	
	CALL	SEND_CR		; VOLGENDE REGEL !	
	CALL	SEND_CR		
	CALL	SEND_PROMPT	; TEKEN '>' KOMT OP VRIJE REGEL
				; TE STAAN. VANAF NU KUNNEN WE
				; MET BEHULP VAN HET TERMINAL
				; PROGRAMMA COMMANDO'S INGEVEN
	RETURN

;**************************************************************
;**************************************************************
;
;	               ASCII SUBROUTINES
;
;**************************************************************

LET_W
	MOVLW	B'01010111'		; LETTER = W
	CALL    TX_CHARACTER 		; VERZONDEN !
	RETURN
LET_A
	MOVLW	B'01000001'		; LETTER = A 
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_T
	MOVLW	B'01010100'		; LETTER = T
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
SPATIE
	MOVLW	B'00100000'		; SPATIE
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_D
	MOVLW	B'01000100'		; LETTER = D
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_O
	MOVLW	B'01001111'		; LETTER = O
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_E
	MOVLW	B'01000101'		; LETTER = E
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN				
LET_S
	MOVLW	B'01010011'		; LETTER = S
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_R
	MOVLW	B'01010010'		; LETTER = R
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_N
	MOVLW	B'01001110'		; LETTER = N
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_M
	MOVLW	B'01001101'		; LETTER = M
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_G
	MOVLW	B'01000111'		; LETTER = G		
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_L
	MOVLW	B'01001100'		; LETTER = L
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_I
	MOVLW	B'01001001'		; LETTER = I
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_K
	MOVLW	B'01001011'		; LETTER = K
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_B	
	MOVLW	B'01000010'		; LETTER = B
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_Y
	MOVLW	B'01011001'		; LETTER = Y
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_F	
	MOVLW	B'01000110'		; LETTER = F
	CALL    TX_CHARACTER		; VERZONDEN !
	RETURN
LET_H	
	MOVLW	B'01001000'
	CALL    TX_CHARACTER
	RETURN
LET_U
	MOVLW	B'01010101'	
	CALL    TX_CHARACTER
	RETURN
LET_C
	MOVLW	B'01000011'	
	CALL    TX_CHARACTER
	RETURN
LET_J
	MOVLW	B'01001010'	
	CALL    TX_CHARACTER
	RETURN
LET_P
	MOVLW	B'01010000'	
	CALL    TX_CHARACTER
	RETURN
LET_V
	MOVLW	B'01010110'	
	CALL    TX_CHARACTER
	RETURN
LET_Q
	MOVLW	B'01010001'
	CALL	TX_CHARACTER
	RETURN
LET_X
	MOVLW	B'01011000'
	CALL	TX_CHARACTER
	RETURN
LET_Z
	MOVLW	B'01011010'
	CALL	TX_CHARACTER
	RETURN

SYM_HAAKRECHTS
	MOVLW	B'00101001'
	CALL	TX_CHARACTER
	RETURN

SYM_HAAKLINKS
	MOVLW	B'00101000'
	CALL	TX_CHARACTER
	RETURN

SYM_KOMMA
	MOVLW	B'00101100'
	CALL	TX_CHARACTER
	RETURN

SYM_0
	MOVLW	B'00110000'
	CALL	TX_CHARACTER
	RETURN

SYM_1
	MOVLW	B'00110001'
	CALL	TX_CHARACTER
	RETURN

SYM_5
	MOVLW	B'00110101'	;KARAKTER '5' OP SCHERM !!
	CALL	TX_CHARACTER
	RETURN

SYM_PUNT
	MOVLW	B'00101110'
	CALL	TX_CHARACTER
	RETURN

SYM_SPATIE_DUBBELPUNT_SPATIE
	MOVLW	B'00100000'
	CALL	TX_CHARACTER
	MOVLW	B'00111010'
	CALL	TX_CHARACTER
	MOVLW	B'00100000'
	CALL	TX_CHARACTER
	RETURN

SYM_SPATIE_GELIJK_SPATIE
	MOVLW	B'00100000'
	CALL	TX_CHARACTER
	MOVLW	B'00111101'	;ASCII VOOR KARAKTER '=' !!
	CALL	TX_CHARACTER
	MOVLW	B'00100000'
	CALL	TX_CHARACTER
	RETURN

SEND_CR 
	MOVLW   B'00001101'
	CALL    TX_CHARACTER
	RETURN

SEND_PROMPT 
	MOVLW   B'00111110'
	CALL    TX_CHARACTER
	RETURN

GROET
	CALL	LET_B
	CALL	LET_Y
	CALL	LET_E
	RETURN



;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;  	          BEGIN I2C HOOFDROUTINES      
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

I2C_INIT
	CLRF	TELLER
	CLRF	IN_BITCOUNT
	CLRF	OUT_BITCOUNT
	CLRF	OFFSET
	CLRF	DATA_VALUE_IN
	CLRF	DATA_VALUE_OUT
	CLRF	SLAVE_ADDRESS
	BCF	INVERT_CS
	MOVLW	.48		;VASTE WAARDE 48 DECIMAAL IN 
	MOVWF	OFFSET		;;VARIABELE OFFSET PLAATSEN !!
	CALL	RELEASEBUS	
	RETURN

SENDSTART
	CALL	HIGH_SCL
	CALL	LOW_SDA
	CALL	LOW_SCL
	RETURN
	
SENDSTOP
	CALL	LOW_SDA
	CALL	HIGH_SCL
	CALL	HIGH_SDA
	RETURN

SENDADRES
	CALL	SENDSTART	;GEEN APARTE INSTRUCTIE. IMMERS
	MOVFW	SLAVE_ADDRESS	;WE GAAN NOOIT EEN STARTCOND.
	MOVWF	DATA_VALUE_OUT	;ALLEEN DOEN. WE ZULLEN STEEDS
	GOTO	BYTE_OUT	;EEN START DOEN GEVOLGD DOOR DE
				;VERZENDING VAN HET SLAVE ADRES

WRITEBYTE
	CLRF	DATA_VALUE_OUT
	MOVFW	DATABYTE_OUT
	MOVWF	DATA_VALUE_OUT
	GOTO	BYTE_OUT

READBYTE
	CLRF	DATA_VALUE_IN
	GOTO	BYTE_IN

SYS
	MOVFW	CHIP_SELECT
	XORLW	.49		; ASCII VOOR CHARACTER 1
	BTFSS	STATUS,Z
	GOTO 	LOW_CS
	GOTO	HIGH_CS
			

;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;	    BEGIN I2C SUB- EN LOWLEVEL ROUTINES      
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


; WE HOUDEN WEL IN GEDACHTEN DAT :
;
;	SDA_DIR   --> TRISC,4
;	SDA       --> PORTC,4
;	SCL_DIR   --> TRISC,3
;	SCL       --> PORTC,3
;	INVERT_CS --> PORTA,1
;
; ZIJN ALLEN DEFINED BIJ DE VARIABELEN DECLARATIE


; 2. I2C-VERZEND SUBROUTINES + AFHANDELING VAN DE SLAVE ACK :
;
; KOMEN DEZE ROUTINE BINNEN MET DE TE VERZENDEN BYTE IN DE
; VARIABELE DATA_VALUE_OUT !!!


BYTE_OUT
	MOVLW	.8
	MOVWF	OUT_BITCOUNT

BIT_OUT
	BCF	STATUS,C
	RLF	DATA_VALUE_OUT,F
	BTFSS	STATUS,C
	GOTO	ZERO_OUT
	GOTO	ONE_OUT

ZERO_OUT
	CALL	LOW_SDA
	CALL	KLOKIMPULS
	GOTO	PROCEED_OUT

ONE_OUT
	CALL	HIGH_SDA
	CALL	KLOKIMPULS
	GOTO	PROCEED_OUT

PROCEED_OUT
	DECFSZ	OUT_BITCOUNT,F
	GOTO	BIT_OUT

ACK_RECEIVE
	CALL	HIGH_SDA
	CALL	HIGH_SCL_EXTRA
	CALL	DELAY2U
	BTFSC	SDA
	GOTO 	SDA_NIET_LAAG
	GOTO	SDA_LAAG

SDA_NIET_LAAG
	CALL	DELAY2U
	CALL	LOW_SCL
	GOTO	ACK_ERROR

SDA_LAAG
	CALL	DELAY2U
	CALL	LOW_SCL
	GOTO	ACK_OK

	
; **********************************

; 3. I2C-ONTVANGST-SUBROUTINES + AFHANDELING USER ACK/NACK :
;    KOMEN HIER BINNEN MET WAARDE 0 OF 1 IN VAR ACK_USER :
;
;    ACK_USER = 0 --> ONTVANG LAATSTE BYTE EN VERSTUUR NACK !!!
;    ACK_USER = 1 --> ONTVANG VOLGENDE BYTE EN VERSTUUR ACK !!!
;

BYTE_IN
	CLRF	DATA_VALUE_IN
	MOVLW	.8
	MOVWF	IN_BITCOUNT
	CALL	HIGH_SDA
	
BIT_IN
	CALL	HIGH_SCL_EXTRA
	CALL	DELAY2U
	BTFSC	SDA
	GOTO 	ONE_IN
	GOTO	ZERO_IN
	
ZERO_IN
	CALL	DELAY2U
	BCF	STATUS,C
	RLF	DATA_VALUE_IN,F
	GOTO	PROCEED_IN

ONE_IN
	CALL	DELAY2U
	BSF	STATUS,C
	RLF	DATA_VALUE_IN,F
	GOTO	PROCEED_IN

PROCEED_IN
	CALL	LOW_SCL
	DECFSZ	IN_BITCOUNT,F
	GOTO	BIT_IN		;LAATSTE BIT IS INGELEZEN !!!!
	CALL	HEX_PART1
	GOTO	USER_ACK_TEST	;TESTEN OF ACK/NACK 
	


; 4. LOWLEVEL ROUTINES :

RELEASEBUS
	CALL	HIGH_SCL
	CALL	HIGH_SDA
	RETURN

KLOKIMPULS
	CALL	HIGH_SCL
	CALL	LOW_SCL
	RETURN

HIGH_SDA
	BANK1
	BSF	SDA_DIR
	BANK0
	CALL	DELAY
	RETURN

LOW_SDA
	BCF	SDA
	BANK1
	BCF	SDA_DIR
	BANK0
	CALL	DELAY
	RETURN

HIGH_SCL
	BANK1
	BSF	SCL_DIR
	BANK0
	CALL	DELAY
	RETURN

LOW_SCL
	BCF	SCL
	BANK1
	BCF	SCL_DIR
	BANK0
	CALL	DELAY
	RETURN

HIGH_SCL_EXTRA			;SCL HOOG IMP. ZONDER DELAY !!!
	BANK1			;GEBRUIKT VOOR HET TESTEN VAN
	BSF	SCL_DIR		;DE ACK VAN DE SLAVE !!!!!!!!!!
	BANK0
	RETURN

; VOLGENDE 2 ROUTINES DIENEN OM DE TV VAN SONY TE LATEN WETEN
; DAT WIJ DE SOLE MASTER ZIJN VAN DE I2C BUS. DIT DOEN WE MET
; PIN CHIP SELECT CS --> 1 --> DAN ZIJN WIJ SOLE MASTER OF THE
; BUS. WE MOETEN HIER WEL OPLETTEN OMDAT DE TRANSISTOREN AAN-
; GEBRACHT OP DE TESTPRINT ZORGEN VOOR NEGATIEVE LOGICA !!!!!!

HIGH_CS
	BCF	INVERT_CS	;LET OP DE NEGATIEVE LOGICA !!!
	CALL	LET_C		;RESULTAAT 'CS 1' TERUGSTUREN !
	CALL	LET_S
	CALL	SPATIE
	CALL	SYM_1	
	CALL	SEND_CR
	CALL	SEND_PROMPT
	GOTO	TEST_NEW_DATA	;NIEUWE LETTER INLEZEN !!
	
LOW_CS
	BSF	INVERT_CS	;LET OP DE NEGATIEVE LOGICA !!!
	CALL	LET_C		;RESULTAAT 'CS 0' TERUGSTUREN !
	CALL	LET_S
	CALL	SPATIE
	CALL	SYM_0
	CALL	SEND_CR
	CALL	SEND_PROMPT
	GOTO	TEST_NEW_DATA	;NIEUWE LETTER INLEZEN !!

ACK_ERROR
	CALL	SENDSTOP	;VERZENDING BYTE MISGELOPEN !!!
				;STOPCONDITIE GENEREREN !!
	CALL	SEND_CR
	CALL	SPATIE
	CALL	SPATIE
	CALL	LET_A
	CALL	LET_C
	CALL	LET_K
	CALL	SPATIE
	CALL	LET_E
	CALL	LET_R
	CALL	LET_R
	CALL	LET_O
	CALL	LET_R
	CALL	SEND_CR
	CALL	SEND_PROMPT
	GOTO	TEST_NEW_DATA


ACK_OK
	CALL	SEND_CR		;VERZENDING BYTE IN ORDE !!!
	CALL	SPATIE
	CALL	SPATIE
	CALL	LET_A
	CALL	LET_C
	CALL	LET_K
	CALL	SPATIE
	CALL	LET_O
	CALL	LET_K
	CALL	SEND_CR
	CALL	SEND_PROMPT
	GOTO	TEST_NEW_DATA


USER_ACK_TEST			;AAN DE HAND VAN DE ACK_USER 
	MOVFW	ACK_USER	;SEND ACK/NACK !!!
	XORLW	.49		;ASCII VOOR CHARACTER 1 !!
	BTFSS	STATUS,Z
	GOTO 	SEND_NACK
SEND_ACK			;TERUGSTUREN VAN EEN ACK. DUS
	CALL	LOW_SDA		;TREKKEN WE SDA LAAG EN KLOKKEN
	CALL	KLOKIMPULS	;DIT UIT ! DUS VOLGENDE BYTE
	GOTO	TEST_NEW_DATA	;MOET ONTVANGEN WORDEN !!
SEND_NACK			;NACK = GEEN ACK TERUGSTUREN !!
	CALL	HIGH_SDA	;NACK WORDT UITGEKLOKT ! DUS 
	CALL	KLOKIMPULS	;WORDEN ER GEEN VERDERE BYTES
	GOTO	TEST_NEW_DATA	;MEER ONTVANGEN !!!!
				

;IN BEIDE GEVALLEN : DUS ZOWEL BIJ NACK ALS BIJ ACK MOETEN WE 
;OPNIEUW EEN LETTER GAAN INLEZEN (VOLGENDE INSTRUCTIE) INSTRUC-
;TIE SEQUENTIE WORDT UITEINDELIJK GEREGELD DOOR HET PROGRAMMA 
;DAT DRAAIT OP DE USER PC !!!!


;HEXBYTE WORDT IN TWEE STUKKEN GEBROKEN EN VERSTUURD ALS ASCII
;KARAKTERS (NAAR HET TERMINAL VENSTER !!)

HEX_PART1
	SWAPF	DATA_VALUE_IN,W
	ANDLW	B'00001111'	; 4 MSB GEMASKEERD (00001111)
	CALL	CONVERSION_TABLE_HEXASCII
	CALL	TX_CHARACTER	;EERSTE DEEL HEXBYTE OP SCHERM
HEX_PART2
	MOVFW	DATA_VALUE_IN
	ANDLW	B'00001111'	; 4 MSB GEMASKEERD (00001111)
	CALL	CONVERSION_TABLE_HEXASCII
	CALL	TX_CHARACTER	;TWEEDE DEEL HEXBYTE OP SCHERM
	CALL	SEND_CR		
	CALL	SEND_PROMPT
	RETURN			

	
; HETVOLGENDE IS EEN DELAY VAN +/- 5 US --> MOET NIET EXACT
; 5 US ZIJN OMDAT DE I2C-BUS VAN SONY TOCH NIET TIJDKRITISCH IS

DELAY				;5US VERTRAGING !!
	MOVLW	.5
	MOVWF	TELLER
DELAY1
	DECFSZ	TELLER,F
	GOTO	DELAY2
	RETURN
DELAY2
	NOP
	GOTO	DELAY1

; OM ANDERE DELAY'S TE BEKOMEN MOET MEN VOLGENDE FORMULE 
; GEBRUIKEN : DELAY = (X-1)*4 + 8 = 4X + 4 WAARBIJ X HET 
; GETAL IS DAT IN DE MAIN LOOP IN TELLER WORDT GEPLAATST !! 
; ALLE GETALLEN UIT DEZE FORMULE STELLEN INSTRUCTIE CYCLI !!!!
; VOOR !!!!!!! DUS, WIL MEN EEN BEPAALDE DELAY MAKEN --> EERST
; KIJKEN HOEVEEL DEZE DELAY IS IN INSTRUCTIE CYCLI !!!!!!!!!!!

; HETVOLGENDE IS EEN DELAY VAN 2US --> WORDT ENKEL GEBRUIKT IN 
; DE ROUTINES OM DE ACKNOWLEDGE VAN EEN SLAVE TE KUNNEN TESTEN
; HERINNEREN ONS WEL DAT 1 INSTRUCTIE 200 NS OF 400 NS DUURT 
; WANNEER WE EEN KRISTAL VAN 20MHZ GEBRUIKEN. DEZE DELAY ZORGT
; DUS VOOR EEN DELAY VAN 10 X 200 NS --> 2 US
; DEZE DELAY IS DUS NODIG OM TE KUNNEN TESTEN OF SDA HOOG OF
; LAAG IS JUIST IN HET MIDDEN VAN DE NEGENDE KLOKPULS (OOK WEL
; DE ACK KLOKPULS GENOEMD !)
;
; WORDT OOK GEBRUIKT IN ROUTINE READBYTE --> OM BIT TE KUNNEN
; LEZEN MOETEN WE JUIST IN HET MIDDEN VAN DE KLOKPULS SDA GAAN
; TESTEN. HIERVOOR DELAY2U NODIG !!!!!!!!!!

DELAY2U				;2US VERTRAGING !!
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	RETURN



;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;  	            BEGIN IR-HOOFDROUTINES      
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

;AFDRUKKEN VAN HET IR-COMMANDO IN DE LEGENDE !!


INFRARED_ASCII			;ROUTINE DRUKT 5 PAR AF !!!!
				;PARAMETERS ZELFDE WAARDE ALS
				;INGEVOERD -> ROUTINE HEX1
	CALL	SEND_CR		;VOLGENDE REGEL VOOR AFDRUK PAR
	CALL	SEND_CR

	CALL	SPATIE		;NUMBER FRAMES = PAR1
	CALL	SPATIE
	CALL	LET_N
	CALL	LET_U
	CALL	LET_M
	CALL	LET_B
	CALL	LET_E
	CALL	LET_R
	CALL	SPATIE
	CALL	LET_O
	CALL	LET_F
	CALL	SPATIE
	CALL	LET_F
	CALL	LET_R
	CALL	LET_A
	CALL	LET_M
	CALL	LET_E
	CALL	LET_S
	CALL	SYM_SPATIE_GELIJK_SPATIE
	MOVFW	FRAME_NUMBER
	MOVWF	DATA_VALUE_IN
	CALL	HEX1		;PARAMETER 1 VERSTUURD !!
				;ZOALS INGEGEVEN !!!!!!!!
	CALL	SEND_CR		;VOLGENDE REGEL !!

	CALL	SPATIE		;CATEGORY WIDTH = PAR2
	CALL	SPATIE
	CALL	LET_C
	CALL	LET_A
	CALL	LET_T
	CALL	LET_E
	CALL	LET_G
	CALL	LET_O
	CALL	LET_R
	CALL	LET_Y
	CALL	SPATIE
	CALL	LET_W
	CALL	LET_I
	CALL	LET_D
	CALL	LET_T
	CALL	LET_H
	CALL	SYM_SPATIE_GELIJK_SPATIE
	MOVFW	CATEGORY_WIDTH	
	MOVWF	DATA_VALUE_IN
	CALL	HEX1		;PARAMETER 2 VERSTUURD !!
				;ZOALS INGEGEVEN !!!!!!!!	
	CALL	SEND_CR

	CALL	SPATIE		;CATEGORY HIGH BYTE = PAR3
	CALL	SPATIE
	CALL	LET_C
	CALL	LET_A
	CALL	LET_T
	CALL	LET_E
	CALL	LET_G
	CALL	LET_O
	CALL	LET_R
	CALL	LET_Y
	CALL	SPATIE
	CALL	LET_H
	CALL	LET_I
	CALL	LET_G
	CALL	LET_H
	CALL	SPATIE
	CALL	LET_B
	CALL	LET_Y
	CALL	LET_T
	CALL	LET_E
	CALL	SYM_SPATIE_GELIJK_SPATIE
	MOVFW	CATEGORY_HIGHBYTE
	MOVWF	DATA_VALUE_IN
	CALL	HEX1		;PARAMETER 1 VERSTUURD !!
				;ZOALS INGEGEVEN !!!!!!!!
	CALL	SEND_CR

	CALL	SPATIE		;CATEGORY LOW BYTE = PAR4
	CALL	SPATIE
	CALL	LET_C
	CALL	LET_A
	CALL	LET_T
	CALL	LET_E
	CALL	LET_G
	CALL	LET_O
	CALL	LET_R
	CALL	LET_Y
	CALL	SPATIE
	CALL	LET_L
	CALL	LET_O
	CALL	LET_W
	CALL	SPATIE
	CALL	LET_B
	CALL	LET_Y
	CALL	LET_T
	CALL	LET_E
	CALL	SYM_SPATIE_GELIJK_SPATIE
	MOVFW	CATEGORY_LOWBYTE
	MOVWF	DATA_VALUE_IN
	CALL	HEX1		;PARAMETER 1 VERSTUURD !!
				;ZOALS INGEGEVEN !!!!!!!!
	CALL	SEND_CR

	CALL	SPATIE		;IR DATA = PAR5
	CALL	SPATIE
	CALL	LET_I
	CALL	LET_R
	CALL	SPATIE
	CALL	LET_D
	CALL	LET_A
	CALL	LET_T
	CALL	LET_A
	CALL	SYM_SPATIE_GELIJK_SPATIE
	MOVFW	IR_DATA
	MOVWF	DATA_VALUE_IN
	CALL	HEX1		;PARAMETER 1 VERSTUURD !!
				;ZOALS INGEGEVEN !!!!!!!!
	CALL	SEND_CR
	CALL	SEND_CR
	CALL	SEND_PROMPT
	RETURN


;**************************************************************
;**************************************************************

IR_INIT
	CLRF	FRAME_NUMBER
	CLRF	CATEGORY_WIDTH
	CLRF	CATEGORY_HIGHBYTE
	CLRF	CATEGORY_LOWBYTE
	CLRF	IR_DATA
	CLRF	IR_TELLER1	;TELLERS VOOR DELAYS
	CLRF	IR_TELLER2
	CLRF	IR_TELLER3
	CLRF	TIME
	CLRF	SHIFTREGISTER	;WAARDE GEROTEERD+VERZONDEN !!
	CLRF	NOT_SEND
	CLRF	SEND
	CLRF	NOT_SEND_HIGH
	CLRF	SEND_HIGH
	RETURN


;**************************************************************
;**************************************************************

TEST_CAT_WIDTH
	MOVLW	.5
	XORWF	CATEGORY_WIDTH,W
	BTFSC	STATUS,Z
	GOTO	CAT_CODE5

	MOVLW	.6
	XORWF	CATEGORY_WIDTH,W
	BTFSC	STATUS,Z
	GOTO	CAT_CODE6
	
	MOVLW	.7
	XORWF	CATEGORY_WIDTH,W
	BTFSC	STATUS,Z
	GOTO	CAT_CODE7

	MOVLW	.8
	XORWF	CATEGORY_WIDTH,W
	BTFSC	STATUS,Z
	GOTO	CAT_CODE8

	MOVLW	.13
	XORWF	CATEGORY_WIDTH,W
	BTFSC	STATUS,Z
	GOTO	CAT_CODE13

	GOTO	TEST_NEW_DATA	

;***********************************

CAT_CODE5
	BSF	CATEGORY_FLAG,0 ;GEEN HIGHBYTE TE VERSTUREN !!			
	MOVLW	.5		
	MOVWF	NOT_SEND	;3 ROTATIE NIETS VERZENDEN
	MOVLW	.3		;5 ROTATIES + VERZENDING !!
	MOVWF	SEND
	RETURN

CAT_CODE6			
	BSF	CATEGORY_FLAG,0 ;GEEN HIGHBYTE TE VERSTUREN !!			
	MOVLW	.6		
	MOVWF	NOT_SEND	;2 ROTATIE NIETS VERZENDEN
	MOVLW	.2		;6 ROTATIES + VERZENDING !!
	MOVWF	SEND
	RETURN

CAT_CODE7
	BSF	CATEGORY_FLAG,0 ;GEEN HIGHBYTE TE VERSTUREN !!						
	MOVLW	.7		
	MOVWF	NOT_SEND	;1 ROTATIE NIETS VERZENDEN
	MOVLW	.1		;7 ROTATIES + VERZENDING !!
	MOVWF	SEND
	RETURN

CAT_CODE8			
	BSF	CATEGORY_FLAG,0 ;GEEN HIGHBYTE TE VERSTUREN !!			
	MOVLW	.8		
	MOVWF	NOT_SEND	;0 ROTATIE NIETS VERZENDEN
	MOVLW	.0		;8 ROTATIES + VERZENDING !!
	MOVWF	SEND
	RETURN

; VANAF NU ZULLEN WE OOK EEN HIGHBYTE VOOR CATEGORY MOETEN
; VERSTUREN !!

CAT_CODE13
	BCF	CATEGORY_FLAG,0	;DUS HIGHBYTE TE VERZENDEN !!!
	MOVLW	.8
	MOVWF	NOT_SEND
	MOVLW	.0
	MOVWF	SEND		;ALLE GEGEVENS VOOR LOWBYTE OK
	
	MOVLW	.5
	MOVWF	NOT_SEND_HIGH
	MOVLW	.3
	MOVWF	SEND_HIGH	;ALLE GEGEVENS VOOR HIGHBYTE OK

	RETURN


;**************************************************************
;**************************************************************

;BEPAALT HOEVEEL KEER WE HET FRAME (ZONDER GUIDEPULS EN EERSTE
;DATA_OFF_TIME !!) MOETEN VERSTUREN !!!

TEST_FRAME_NUM
	CALL	GUIDEPULS
	CALL	DATA_OFF_TIME
	CALL	SEND_DATA_CODE	
	CALL	SEND_CAT_CODE 
TEST_NUMBER
	DECFSZ	FRAME_NUMBER,F
	GOTO	AGAIN_IR
	RETURN
AGAIN_IR
	CALL	SEND_DATA_CODE
	CALL	SEND_CAT_CODE  
	GOTO	TEST_NUMBER


;**************************************************************
;**************************************************************
;
; HIER WORDEN 7 BITS (!!!!!) VERZONDEN !!!
;

SEND_DATA_CODE	
	MOVLW	.7
	MOVWF	NOT_SEND
	MOVLW	.1
	MOVWF	SEND
	MOVFW	IR_DATA
	MOVWF	SHIFTREGISTER
	CALL	SEND_IR
	RETURN


;**************************************************************
;**************************************************************

;TEST_CAT_WIDTH !!!

;DIENT ENKEL OM DE WAARDES VOOR DE VARIABELEN SEND EN NOT_SEND 
;IN TE VULLEN. DEZE WAARDES WORDEN DAN GEBRUIKT VOOR HET AL DAN 
;NIET ROTEREN EN/OF WEGZENDEN !!! ZOWEL GEGEVENS VOOR HET VER-
;ZENDEN VAN LOWBYTE ALS VOOR HIGHBYTE WORDEN INGEVULD IN DE 
;ROUTINE TEST_CAT_WIDTH !!!!

SEND_CAT_CODE
	CALL	TEST_CAT_WIDTH  ;SEND, NOT_SEND JUISTE WAARDES!	
	MOVFW	CATEGORY_LOWBYTE
	MOVWF	SHIFTREGISTER
	CALL	SEND_IR	
	RETURN


;**************************************************************
;**************************************************************
;
;	     !!!!!!!! HOOFD-ZENDROUTINE !!!!!!!!

SEND_IR

;VOLGENDE VIER ROUTINES ZORGEN ERVOOR DAT DE BITS DIE ER TEVEEL
;AAN ZIJN WORDEN GEROTEERD MAAR NIET WORDEN UITGEZONDEN !!!!!!!

BIT_ROT_NO_SEND		       ;ENKEL ROTEREN, NIET VERZENDEN!
	MOVFW	NOT_SEND       ;HIER TESTEN OP NOT_SEND=8 !! 
	XORLW	.8	       ;IF JA, INEENS > BIT_ROT_DO_SEND
	BTFSC	STATUS,Z
	GOTO	BIT_ROT_DO_SEND
	RLF	SHIFTREGISTER,F
	GOTO	AGAIN_ROT_NO_SEND
	GOTO	BIT_ROT_DO_SEND
AGAIN_ROT_NO_SEND		;NOG EEN KEER ENKEL ROTEREN !!!	
	INCF	NOT_SEND,F
	BTFSS	NOT_SEND,3
	GOTO	BIT_ROT_NO_SEND

BIT_ROT_DO_SEND			;ROTEREN DOOR C + VERZENDEN !!!
	BCF	STATUS,C
	RLF	SHIFTREGISTER,F		
	BTFSS	STATUS,C	
	GOTO	IR_OUT_ZERO
IR_OUT_ONE
	CALL	DATA_ON_TIME_ONE
	GOTO	BIT_SPACE
IR_OUT_ZERO
	CALL	DATA_ON_TIME_ZERO

BIT_SPACE
	CALL	DATA_OFF_TIME
	INCF	SEND,F		
	BTFSS	SEND,3	
	GOTO	BIT_ROT_DO_SEND	
	BTFSC	CATEGORY_FLAG,0	;INDIEN 1 --> GEEN HIGHBYTE !!!	
	RETURN			

;INDIEN CATEGORY_FLAG,0 GECLEARED IS --> VERSTUUR HIGHBYTE !!!!

SEND_HIGHBYTE			
	MOVFW	NOT_SEND_HIGH
	MOVWF	NOT_SEND
	MOVFW	SEND_HIGH	
	MOVWF	SEND
	BSF	CATEGORY_FLAG,0 
	MOVFW	CATEGORY_HIGHBYTE
	MOVWF	SHIFTREGISTER
	GOTO	BIT_ROT_NO_SEND	  ;VERSTUREN NU DE HIGHBYTE !!!


;**************************************************************
;**************************************************************

;VOLGENDE ROUTINE GUIDEPULS MOET GEDURENDE 2.4 MS OF 2400 US
;DE ROUTINE CARRIER AANROEPEN !! DIT IS HET STARTSIGNAAL VOOR
;DE IR-DATATRANSMISSIE !!! DE WAARDE DIE WE AAN TIME GEVEN ZAL
;VERMENIGVULDIGD WORDEN MET 25 US -> 96 X 25 = EXACT 2400 US !!
;DOOR 1 OF ANDERE REDEN HEBBEN WE EEN LICHTE AFWIJKING. IN 
;PLAATS VAN 96 KIEZEN WE 98 WAARDOOR GUIDEPULS DE BLOKGOLF 
;GEDURENDE 2.39 MS ZAL AANROEPEN. WE ZITTEN DUS MET EEN FOUT 
;VAN 0.01 MS. DEZE FOUT LIGT BINNEN HET TOLERANTIE GEBIED EN
;DUS IS DE WAARDE 98 OK !!!


GUIDEPULS
	MOVLW	.98
	MOVWF	TIME
	CALL	CARRIER		;DUURT 25US
	RETURN


;**************************************************************
;**************************************************************

;VOLGENDE ROUTINE DATA_OFF_TIME MOET GEDURENDE 0.6 MS HET 
;SIGNAAL LAAG MAKEN !! KOMT IN PRINCIPE NEER OP EEN DELAY 
;VAN 0.6 MS OFWEL 600 US. WE GEBRUIKEN HIER EEN APARTE DELAY 
;VOOR !!! LET WEL OP --> 600 US MOET NOG WEL VERMINDERT WORDEN
;MET 4 INSTRUCTIE CYCLI = 0.8 US OPDAT WE GEEN REKENING ZOUDEN
;MOETEN HOUDEN MET DE AANROEP EN HET TERUGKEREN VAN DEZE ROUT-
;INE !!!! HEBBEN EEN FOUT VAN 0.0012. ZITTEN DUS VEILIG BINNEN
;HET TOLERANTIE GEBIED (+/- 0.015 MS) !!!!!


DATA_OFF_TIME
	BCF	IR_LED		;IR LED UIT !!!!!!!
	MOVLW	.150
	MOVWF	IR_TELLER3
DATA_OFF_LOOP
	GOTO	$+1		;GEBRUIKT 2 INSTR.CYCLI !!
	GOTO	$+1
	GOTO	$+1
	GOTO	$+1
	GOTO	$+1
	GOTO	$+1
	GOTO	$+1
	GOTO	$+1
	NOP			;GEBRUIKT 1 INSTR. CYCLI !!
	DECFSZ	IR_TELLER3,F
	GOTO	DATA_OFF_LOOP
	RETURN


;**************************************************************
;**************************************************************

;DE VOLGENDE ROUTINES STELLEN DE BREEDTES VAN DE DATABITS 0
;EN 1 VOOR. WE NOEMEN DIT DE ON-TIME VAN DE DATABITS. DE 
;OFF-TIME HEBBEN WE HIER BOVEN REEDS BEREKEND. HIER MOETEN WE
;DE BLOKGOLF AANROEPEN EN HERHALEN TOTDAT DE VOORGESCHREVEN
;TIJDEN BEREIKT ZIJN. TIJDEN ZIJ :
;
;	ON-TIME '1' -->  1.2 MS = 1200 US  
;	ON-TIME '0' -->  0.6 MS = 600 US
;
;  AFWIJKINGEN GEVONDEN WAARDOOR WAARDE 48 (48 X 25 = 1200)
;  MOEST VERVANGEN WORDEN -> 49 --> HIERDOOR EXACT 1200 MS !!!

DATA_ON_TIME_ONE
	MOVLW	.49		; 49 X 25 -> 1200 US
	MOVWF	TIME		
	CALL	CARRIER
	RETURN


; AFWIJKINGEN GEVONDEN WAARDOOR WAARDE 24 (24 X 25 = 600)
; MOEST VERVANGEN WORDEN -> 25 --> HIERDOOR FOUT VAN 0.0118 MS
; DEZE FOUT LIGT VEILIG BINNEN HET TOLERANTIEGEBIED VAN 
; +/- 0.015 MS !!!!

DATA_ON_TIME_ZERO
	MOVLW	.25		; 24 X 25 = 600 US
	MOVWF	TIME		
	CALL	CARRIER
	RETURN

;		!!!!!!!!OPMERKING!!!!!!!!
;
; HET ENIGE DAT NU NOG MOET GEDAAN WORDEN IS HET CHECKEN VAN DE
; BREEDTE VAN EEN VOLLEDIGE DATABIT --> = OFF- EN DE ON-TIME !!
; DEZE WAARDES ZIJN :
;
;	DATABIT '1' --> BREEDTE = 1.8 MS = 1800 US
;			GESIMULEERDE BREEDTE = EXACT 1.8 MS !!!
;
;	DATABIT '0' --> BREEDTE = 1.2 MS = 1200 US
;			GESIMULEERDE BREEDTE = 1.21
;			DUS FOUT= 0.01 MS -> BINNEN TOL.GEBIED! 
;
;	TOLERANTIEGEBIED = +/- 0.03 MS = +/- 30 US
;
;	EN DIT VOOR BEIDE GEVALLEN !!
;
; HET CHECKEN GEBEURDE DOOR HET SIMULEREN VAN DE JUISTE 
; ROUTINES EN DOOR MIDDEL VAN EEN DIGITALE SCOOP !!!!!!


;**************************************************************
;**************************************************************

;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;  	            BEGIN IR-SUBROUTINES      
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


;EERSTE SUBROUTINE DIENT OM DE BLOKGOLF MET FREQUENTIE 40 KHZ TE
;GENEREREN !! 40 KHZ = EEN PERIODE VAN 25 US --> 125 INSTRUCTIE
;CYCLI !! DE AANROEP, RETURN EN CARRIER ZELF DUURT EXACT (!!!!)
;25 US !!!!!!!!!!!!!


CARRIER
	BSF	IR_LED
	CALL	IR_DELAY1
	BCF	IR_LED
	CALL	IR_DELAY2
	DECFSZ	TIME,F	
	GOTO	CARRIER
	RETURN


IR_DELAY1
	NOP
	MOVLW	.18
	MOVWF	IR_TELLER1
IR_LOOP1
	DECFSZ	IR_TELLER1,F
	GOTO	IR_LOOP1
	RETURN


IR_DELAY2
	NOP
	MOVLW	.17
	MOVWF	IR_TELLER2
IR_LOOP2
	DECFSZ	IR_TELLER2,F
	GOTO	IR_LOOP2
	RETURN


;HEXBYTE WORDT IN TWEE STUKKEN GEBROKEN EN VERSTUURD ALS ASCII
;KARAKTERS (NAAR HET TERMINAL VENSTER !!) ZELFDE ALS DE ROUTINE
;HEX_PART1 MAAR HIER HEBBEN WE DE PROMPT EN CR OP HET LAATSTE 
;WEGGELATEN !!!! BIJ BEEINDIGING VAN HET EINDWERK MOET DEZE 
;ROUTINE VERDWIJNEN EN SAMENVLOEIEN MET ROUTINE HEX_PART1 !!!!!

HEX1
	SWAPF	DATA_VALUE_IN,W
	ANDLW	B'00001111'	; 4 MSB GEMASKEERD (00001111)
	CALL	CONVERSION_TABLE_HEXASCII
	CALL	TX_CHARACTER	;EERSTE DEEL HEXBYTE OP SCHERM
HEX2
	MOVFW	DATA_VALUE_IN
	ANDLW	B'00001111'	; 4 MSB GEMASKEERD (00001111)
	CALL	CONVERSION_TABLE_HEXASCII
	CALL	TX_CHARACTER	;TWEEDE DEEL HEXBYTE OP SCHERM
	RETURN	


;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;
;		      BEGIN MAIN CODE      
;
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
;§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

;LETS CONFIGURE OUR I/O PINS AS WE WANT THEM FOR
;THIS APPLICATION. USE THIS ROUTINE TO SETUP I/O
;( ALWAYS A GOOD IDEA TO PRESET THE OUTPUT LATCHES
;BEFORE MAKING THEM OUTPUTS SO THAT WE DO NOT HAVE 
;ANY UNEXPECTED VALUES ON THE PINS WHEN WE CONFIGURE THEM )

CLDSTT
CONFIG_IO
				; INSTELLEN VAN DE GEBRUIKTE
	BANK0			; POORTEN !!!
	CLRF	PORTA
        CLRF    PORTC
	BANK1
        MOVLW   B'10000000'     ;CONFIGURE I/O (BITS 6 AND 7)
				;FOR RS232.
        MOVWF   TRISC		;BIT3 (SCL) EN 4 (SDA) OUTPUTS
				;BIT 6 RS232 OUTPUT
				;BIT 7 RS232 INPUT
        MOVLW   B'00000000'     ;ALL OUTPUTS, ZEKER CS-PIN !!
        MOVWF   TRISA           
        BANK0      		;SELECT PAGE 0 OF RAM

;**************************************************************
;
; BEREKENING BAUDRATE :
;
; OORSPRONKELIJK CONFIGURE BAUD RATE ASSUMING 2.4576MHZ XTAL
;
; VOOR GEWENSTE BAUDRATE VAN 9600 MET EEN KRISTAL VAN 20 MHZ
; MOETEN WE DE DECIMALE WAARDE 32 IN REGISTER SPBRG STOPPEN !!
;
; BEREKENING VAN WAARDE 32 : ZIE NOTITIES !!
;
;
; INSTELLING VAN DE USART VAN DE PIC VOOR ZENDEN EN ONTVANGEN :
;
;
;     I. STAPPEN TE VOLGEN VOOR HET STARTEN VAN EEN TRANSMISSIE:
;
;	1. INITIALISEER HET SPBRG REGISTER VOOR DE GEWENSTE 
;	   BAUD RATE !!
;	   HET IS AANBEVOLEN OM VERVOLGENS BRGH NUL TE MAKEN
;
;	2. ENABLE ASYNC SERIAL PORT DOOR : SYNC=0 EN SPEN=1
;
;	3. INTERRUPTS GEWENST -> TXIE SETTEN
;
;	4. ENABLE TRANSMISSION --> TXEN SETTEN
;
;	5. LOADEN VAN DATA IN TXREG START DE TRANSMISSIE !!
;
;
;
;   II. STAPPEN TE VOLGEN VOOR HET STARTEN VAN EEN RECEPTIE
;
;	1. INITIALISEER SPBRG REGISTER VOOR GEWENSTE BAUDRATE
;
;	2. CLEAR SYNC, SET SPEN
;
;	3. SET RCIE WANT WE WENSEN INTERRUPTS
;
;	4. SET CREN --> ENABLE RECEPTION 
;
;	5. LEES DE 8 BITS DOOR HET RCREG REGISTER UIT TE LEZEN  
;
;
;**************************************************************



CONFIG_RS232
	BANK1
        MOVLW   .32		;DECIMALE WAARDE 32 IN W 
        MOVWF   SPBRG           ;BAUD RATE REGISTER

;CONFIGURE TX

        MOVLW   B'00100010'
        MOVWF   TXSTA           ;ASYNC,8BITS,BRGH=0

;CONFIGURE RX

        BANK0
        MOVLW   B'10011000'     ;ASYNC,8BITS 
        MOVWF   RCSTA

	;BIT DRIE IS UNIMPLEMENTED ZEGT DATASHEETS ???????????? 
	;DOOR BIT 4 TE SETTEN --> ENABLE RECEPTION !!!!

;CLEAR PENDING INTERRUPTS - PERIPHERAL INTERRUPTS

        CLRF    PIR1            ;CLEAR ALL INTERRUPT FLAGS
   

;CONFIGURE INTERRUPTS

        BANK1
        BSF     PIE1,RCIE       ;ENABLE RECEIVE INTERRUPT
        BANK0

;CONFIGURE I2C

	CALL	I2C_INIT

;CONFIGURE IR

	CALL	IR_INIT

; SCHRIJVEN WELKOMSTBERICHT OP HET TERMINAL VENSTER, GEVOLGD 
; DOOR EEN CARRIAGE <CR>, GEVOLGD DOOR EEN PROMPT !!!!!!! 
; DEZE TWEE LAATSTE ZITTEN MEE IN DE ROUTINE DIE DE DE TEKST
; OP HET SCHERM SCHRIJFT !!!!	

	CALL	SEND_WELCOME

;ENABLE GLOBAL INTERRUPT AND PERIPHERAL INTERRUPTS

        MOVLW   B'11000000'
        MOVWF   INTCON

;**************************************************************
;
;     	     WAITLOOP CHARACTERS SEND, RECEIVE
;
;**************************************************************
;
; IN DIT TESTPROGRAMMA GAAN WE TESTEN OP DRIE VERSCHILLENDE 
; LETTERTOETSEN TESTEN NAMELIJK :
;
;	P   --> ASCII : 01010000 --> SENDSTOP
;	Y   --> ASCII : 01011001 --> SYS
;	L   --> ASCII : 01001100 --> SEND_LEGEND
;
;	A   --> ASCII : 01000001 --> SENDADRES
;
;	W   --> ASCII :	01010111 --> WRITEBYTE
;	R   --> ASCII :          --> READBYTE
;
;	I   --> ASCII : 	 --> INFRARED
;
;	ESC --> ASCII : 00011011 --> THE_END
	

TEST_NEW_DATA 	

	CLRWDT
        BTFSS   FLAGS,0         ;TEST FOR NEW DATA
        GOTO    TEST_NEW_DATA

	BCF	FLAGS,0		;KOMEN WE HIER DAN IS ER NIEUWE
				;DATA IN RX_BUFF REGISTER !!!!

LETTER_L_TEST
	MOVLW	B'01111111'
	ANDWF	RX_BUFF,W
	XORLW	B'01001100'	;ASCII VOOR LETTER L
	BTFSC	STATUS,Z
	CALL	SEND_LEGEND

LETTER_P_TEST
	MOVLW	B'01111111'
	ANDWF	RX_BUFF,W
	XORLW	B'01010000'	;ASCII VOOR LETTER P
	BTFSC	STATUS,Z
	GOTO	STOPAANROEP	;LETTER = P !!
	GOTO	LETTER_A_TEST	
 STOPAANROEP			
	CALL	SEND_CR
	CALL	SEND_PROMPT
	CALL	SENDSTOP

LETTER_A_TEST			;DEZE ROUTINE GEBRUIKEN WE OM
	MOVLW	B'01111111'	;HET SLAVE ADRES TE VERZENDEN
	ANDWF	RX_BUFF,W
	XORLW	B'01000001'	;ASCII VOOR LETTER A
	BTFSS	STATUS,Z
	GOTO	LETTER_W_TEST
A_MATCH
	CLRWDT			
	BTFSS	FLAGS,0		
	GOTO	A_MATCH		
	BCF	FLAGS,0
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!

	CALL	CONVERSION_TABLE_ASCIIHEX

				;WAARDE OPHALEN UIT TABEL MET
				;INDEX = TABLE_POINTER !!!!!!!
	MOVWF	BYTE1
A_MATCH2
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	A_MATCH2
	BCF	FLAGS,0		;TWEEDE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	; W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!

	CALL	CONVERSION_TABLE_ASCIIHEX

				;WAARDE OPHALEN UIT TABEL MET
				;INDEX = TABLE_POINTER !!!!!!!
	MOVWF	BYTE2		;TERUGKEER MET JUISTE W-WAARDE 	

	CALL	CONV_SINGLE_BYTE  ;BYTES --> 1 BYTE VAN MAKEN !
	MOVFW	RESULT_BYTE	  ;SAMENGESTELDE BYTE !!
	MOVWF	SLAVE_ADDRESS
	GOTO	SENDADRES	;SLAVE_ADDRESS WORDT VERSTUURD!


LETTER_W_TEST			;BYTE WORDT GESCHREVEN NAAR BUS
	MOVLW	B'01111111'
	ANDWF	RX_BUFF,W
	XORLW	B'01010111'	;ASCII VOOR LETTER W
	BTFSS	STATUS,Z
	GOTO	LETTER_Y_TEST
W_MATCH				;OPHALEN VAN BYTE1
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	W_MATCH
	BCF	FLAGS,0		;EERSTE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!

	CALL	CONVERSION_TABLE_ASCIIHEX

				;WAARDE OPHALEN UIT TABEL MET
				;INDEX = TABLE_POINTER !!!!!!!
	MOVWF	BYTE1		;TERUGKEER MET JUISTE W-WAARDE 	
W_MATCH2	
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	W_MATCH2
	BCF	FLAGS,0		;TWEEDE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	; W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!

	CALL	CONVERSION_TABLE_ASCIIHEX

				;WAARDE OPHALEN UIT TABEL MET
				;INDEX = TABLE_POINTER !!!!!!!
	MOVWF	BYTE2		;TERUGKEER MET JUISTE W-WAARDE 	

	CALL	CONV_SINGLE_BYTE  ;BYTES --> 1 BYTE VAN MAKEN !
	MOVFW	RESULT_BYTE	  ;SAMENGESTELDE BYTE !!
	MOVWF	DATABYTE_OUT
	GOTO	WRITEBYTE	
	

LETTER_Y_TEST
	MOVLW	B'01111111'
	ANDWF	RX_BUFF,W
	XORLW	B'01011001'	;ASCII VOOR LETTER Y
	BTFSS	STATUS,Z
	GOTO	LETTER_R_TEST
Y_MATCH
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	Y_MATCH
	BCF	FLAGS,0
	MOVFW	RX_BUFF
	MOVWF	CHIP_SELECT
	CALL	SEND_CR		;NA EERSTE LETTER EN PAR.
	GOTO	SYS		; --> ENTER !!
	
LETTER_R_TEST
	MOVLW	B'01111111'
	ANDWF	RX_BUFF,W
	XORLW	B'01010010'	;ASCII VOOR LETTER R
	BTFSS	STATUS,Z
	GOTO	LETTER_I_TEST
R_MATCH
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	R_MATCH
	BCF	FLAGS,0
	MOVFW	RX_BUFF
	MOVWF	ACK_USER
	CALL	SEND_CR		;NA EERSTE LETTER R EN PAR. 
	GOTO	READBYTE	; --> ENTER !!


LETTER_I_TEST			;IR(INFRARED ROUTINE) 5 PARAM !
	MOVLW	B'01111111'
	ANDWF	RX_BUFF,W
	XORLW	B'01001001'	;ASCII VOOR LETTER I
	BTFSS	STATUS,Z
	GOTO	NO_MATCH

;********

I_MATCH1A				;OPHALEN VAN BYTE1
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH1A	;IN LUS TOT PAR ONTVANGEN IS !!
	BCF	FLAGS,0		;EERSTE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE1		
I_MATCH1B
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH1B
	BCF	FLAGS,0
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE2		
	CALL	CONV_SINGLE_BYTE  
	MOVFW	RESULT_BYTE
	MOVWF	FRAME_NUMBER
	

;********

I_MATCH2A	
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH2A
	BCF	FLAGS,0		;TWEEDE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE1		
I_MATCH2B
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH2B
	BCF	FLAGS,0
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE2		
	CALL	CONV_SINGLE_BYTE  
	MOVFW	RESULT_BYTE
	MOVWF	CATEGORY_WIDTH

;********

I_MATCH3A
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH3A
	BCF	FLAGS,0		;DERDE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE1		
I_MATCH3B
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH3B
	BCF	FLAGS,0
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE2		
	CALL	CONV_SINGLE_BYTE  
	MOVFW	RESULT_BYTE
	MOVWF	CATEGORY_HIGHBYTE

;********

I_MATCH4A
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH4A
	BCF	FLAGS,0		;VIERDE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE1		
I_MATCH4B
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH4B
	BCF	FLAGS,0
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE2		
	CALL	CONV_SINGLE_BYTE  
	MOVFW	RESULT_BYTE
	MOVWF	CATEGORY_LOWBYTE

;********

I_MATCH5A
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH5A
	BCF	FLAGS,0		;VIJFDE BYTE ZIT TE WACHTEN !!
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE1		
I_MATCH5B
	CLRWDT
	BTFSS	FLAGS,0
	GOTO	I_MATCH5B
	BCF	FLAGS,0
	MOVFW	OFFSET		;48 DECIMAAL
	SUBWF	RX_BUFF,W	;W = F(RX_BUFF)-W(OFFSET) !!!
	MOVWF	TABLE_POINTER	;TABLEPOINTER = W !!!!!!!!!!!!
	CALL	CONVERSION_TABLE_ASCIIHEX
	MOVWF	BYTE2		
	CALL	CONV_SINGLE_BYTE  
	MOVFW	RESULT_BYTE
	MOVWF	IR_DATA

	CALL	INFRARED_ASCII	;HEX WAARDEN OP SCHERM !!
	
;***************

	CALL	TEST_FRAME_NUM	;HOEVEEL FRAMES VERSTUREN ??

;***************
         			;GENOEG FRAMES VERSTUURT! TERUG
				;WACHTEN OP NIEUWE COMMANDO'S !
NO_MATCH		
	MOVLW	B'01111111'	;VISEREN VAN 7 LSB'S
	ANDWF	RX_BUFF,W	
	XORLW	B'00011011'	;ASCII CODE VOOR ESC-TOETS !
	BTFSC	STATUS,Z	;AFSCHEIDSTEKST OP SCHERM !!
	GOTO	THE_END	        
	GOTO	TEST_NEW_DATA	;NIEUWE LETTER INLEZEN !!!
				

THE_END	
	CALL	RELEASEBUS			
	BCF	INVERT_CS
	CALL	SEND_END	
	GOTO	TEST_NEW_DATA
	END

