;=== FOXBOX == REV. 3.1a == Feb 10, 98 === Use Microchip MPASM assembler ====
;
;Written by Francois Tremblay VE2JX and Jacques Brodeur VE2EMM, Nov. 1997.
;Used for Montreal Fox Controller, "Homing In" for April 1998
;This software can be reproduce freely only to be used by Amateur Radio
;Operators and Amateur Radio Clubs, Any other use is prohibited.
;
;----------------------------------------------------------------------------
;
;	Use a 4.194304 XTAL
;
	list	P=16F84
	radix	HEX
	__CONFIG	_WDT_OFF&_XT_OSC&_CP_OFF&_PWRTE_ON
;
;----------------------------------------------------------------------------
;
;	List of memory addresses
;	
 	CBLOCK	0X0C
	NU_MESSAGE		;Registres utilises par la generation
	DEPLACEMENT		;de CW
	LETTRECW
	NBR_ESPACE
	NBR_DIT
	CTR_NBR
	CTR_DIT
	CTR_DIAPA
	PORTX
	DURE
;-----------------------------------
	TMPW		;MEMOIRE TEMPORAIRE DU W
	TMPS		;MEMOIRE TEMPORAIRE DE STATUS
	DIVISION		;REGISTRE AVEC LA VALEUR DE 16 A FAIRE DECOMPTER
	SECONDE		;REGISTRE DES SECONDES	
	TMP_1		;MEMOIRE A USAGE TEMPORAIRE
	DURE_TMP
	POINTEUR_TX		;POINTEUR TX
	CYCLE_MINUTE	;REGISTRE QUI A LA VALEUR DU CYCLE TOTAL EN MINUTE
	TIMER		;
	MESSAGE		;REGISTRE QUI A LE NOMBRE DE TX DANS LA CHASSE
	FLAG		;FLAG 0 =  , FLAG1 = , FLAG 7 = MEM_CALL
	BOUCLE
	TX_NUMBER
	TMPF1
	TMPF2
	TMPF3
	DIX_MIN
	ENDC
;
;-----------------------------------
;
TMR0	EQU	0X01	;PIC registers
PCL	EQU	0X02	;    "
STATUS	EQU	0X03	;    "
FSR	EQU	0X04	;    "
PORTA	EQU	0X05	;    "
PORTB	EQU	0X06	;    "
EEDATA	EQU	0X08	;    "
EEADR	EQU	0X09	;    "
PCLATH	EQU	0X0A	;    "
INTCON	EQU	0X0B	;    "
TRISA	EQU	0X85	;    "
TRISB	EQU	0X86	;    "
EECON1	EQU	0X88	;    "
EECON2	EQU	0X89	;    "
PCLATH	EQU	0X0A	;    "
;
;----------	List of symbolic values
;
RP0	EQU	0X05
W	EQU	0X00
F	EQU	0X01
Z	EQU	0X02
C	EQU	0X00
WREN	EQU	0X02
WR	EQU	0X01
RD	EQU	0X00
_CP_OFF	EQU	0X3FFF
_PWRTE_ON	EQU	0X3FF7	;16C84 = 0X3FFF   16F84 = 3FF7
_WDT_OFF	EQU	0X3FFB
_XT_OSC	EQU	0X3FFD
;
;============================================================================
;
	ORG	0X000	
	GOTO	DEBUT	;Vers le debut du programme
	ORG	0X004	;LORS D'UN OVERFLOW DE TMR0 LE PCL EST
	GOTO	INTERUPTION	;FORCE de VENIR ICI pour le timer
;
;--- MESSAGES ---------------------------------------------------------------
;
	ORG	0X006
MESSAGE0	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X00	;Espace mot
	RETLW	0XFF	;End of message

MESSAGE1	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X02	;"E"
	RETLW	0XFF	;End of message

MESSAGE2	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X04	;"I"
	RETLW	0XFF	;End of message

MESSAGE3	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X08	;"S"
	RETLW	0XFF	;End of message

MESSAGE4	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X10	;"H"
	RETLW	0XFF	;End of message

MESSAGE5	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X20	;"5"
	RETLW	0XFF	;End of message

MESSAGE6	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X05	;"N"
	RETLW	0XFF	;End of message

MESSAGE7	MOVF	DEPLACEMENT,W ;Wich caracter
	ADDWF	PCL,F	;
	RETLW	0X07	;"M"
	RETLW	0X0F	;"O"
	RETLW	0X09	;"D"
	RETLW	0XFF	;End of message

MESSAGE8			;EEDATA code, "Sender's CALL"
	MOVF	DEPLACEMENT,W ;Wich caracter
	MOVWF	EEADR	;load it
	BSF	STATUS,RP0	;Bank 1
	BSF	EECON1,RD	;Command a read
	BCF	STATUS,RP0	;Back to bank 0
	MOVF	EEDATA,W	;Load the read value in W
	RETURN

MESSAGE9	MOVF	DEPLACEMENT,W ;Wich caracter to load
	ADDWF	PCL,F	;Go to it
	RETLW	0X09	;"D"
	RETLW	0X02	;"E"
	RETLW	0X00	;Word space
	RETLW	0XFF	;End of message
;
;=== Memorize the sender's call =============================================
;
MEM_CALL	BTFSC	FLAG,7	;Procede if not done before
	GOTO	FLASH	;To Beep to put the jumper back on
	MOVLW	D'200'	;CW speed 5 WPM
	MOVWF	DURE
	MOVLW	D'9'	;Send "DE"
	CALL	CODER	;CW
	MOVLW	0X00	;EEDATA sarting adress 0X00
	MOVWF	DEPLACEMENT	;Memory location
NEXT_LETTER	BTFSC	PORTA,3	;Read enter button 
	GOTO	NEXT_LETTER	;wait for enter
	MOVF	DEPLACEMENT,W ;Load starting adress
	MOVWF	EEADR	;
	MOVF	PORTB,W	;Get a CW character from the switches
	MOVWF	EEDATA	;
	MOVWF	LETTRECW	;Save the CW to confirm the letter
	BSF	STATUS,RP0	;Go to bank 1
	BSF	EECON1,WREN	;Write enable
	MOVLW	0X55
	MOVWF	EECON2
	MOVLW	0XAA
	MOVWF	EECON2
	BSF	EECON1,WR	;Write command
	BCF	EECON1,WREN	;Disable the write enable
	BCF	STATUS,RP0	;Back to bank 1

LOOP	BTFSS	PORTA,3	;Wait for enter ************************
	GOTO	LOOP	;***************************************

	MOVF	PORTB,W
	XORLW	0XFF	;Test fo EOM character
	SKPNZ
	GOTO	CALL_COMPL
	CALL	UN_CAR	;Confirm the memorization
	INCF	DEPLACEMENT,F
	GOTO	NEXT_LETTER	;

CALL_COMPL	MOVLW	0X03	;Long "T" OR BEEP
	MOVWF	LETTRECW
	MOVWF	NBR_DIT
	MOVLW	D'255'	;1/4 secondes
	MOVWF	DURE
	CALL	UN_CAR
	BSF	FLAG,7	;Mark the flag done
MOIMEME	GOTO	MOIMEME	;Finish Wait for a RESET/SYNC pressing
;
;=== GENERATION OF CW/MCW ===================================================
;
;	RA0 = MCW
;	RA1 = Keyed CW/80 meters
;
;To send a message, enter the "CODER" routine with:
;	- The # of the message to transmitted in Reg "W"
;	- The speed of the CW in memory "DURE"; 5 WPM = 240, 20 WPM = 60
;
;To send a letter, enter the "UN_CAR" routine with:
;	- the letter to be transmitted in memory "LETTRECW"
;	- The speed of the CW in memory "DURE"; 5 WPM = 240, 20 WPM = 60
;
;To generate a beep, enter the "SON" routine with:
;	- 250 in "DURE" = 1/4 second beep
;	- # of 1/4 sec. in "NBR_DIT"
;
;--- CODE ROUTINE -- CW/MCW generation --------------------------------------
;	
CODER	MOVWF	NU_MESSAGE	;Enter the routine with the message #
	CLRF	DEPLACEMENT	;Reset of the displacement counter in
			;the message
CHERCH_LETR	CLRC		;Get a new letter
	RLF	NU_MESSAGE,W ;Multiply the message number by 2
	ADDWF	PCL,F	;Jump to the selected message

	CALL	MESSAGE0	;Location of message 0
	GOTO	FAIRCODER
	CALL	MESSAGE1	;Location of message 1
	GOTO	FAIRCODER
	CALL	MESSAGE2	;Location of message 2
	GOTO	FAIRCODER
	CALL	MESSAGE3	;Location of message 3
	GOTO	FAIRCODER
	CALL	MESSAGE4	;Location of message 4
	GOTO	FAIRCODER
	CALL	MESSAGE5	;Location of message 5
	GOTO	FAIRCODER
	CALL	MESSAGE6	;Location of message 6
	GOTO	FAIRCODER
	CALL	MESSAGE7	;Location of message 7
	GOTO	FAIRCODER
	CALL	MESSAGE8	;Location of message 8, EEDATA
	GOTO	FAIRCODER
	CALL	MESSAGE9	;Location of message 9, "DE"
	GOTO	FAIRCODER
;
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
FAIRCODER	MOVWF	LETTRECW
	MOVF	LETTRECW,F	;To set the zero bit in the STATUS Reg
	SKPNZ		;Test fo a space
	GOTO	FAIR_ESPMOT	;Do a word space **
	MOVLW	0XFF	;FF = end of message
	XORWF	LETTRECW,W	
	SKPNZ		;Test for the end of message
FINCODER	RETURN		;End of message * * * * * * * * * * * *

	CALL	UN_CAR	;Do a character
PROCH_LETR	INCF	DEPLACEMENT,F ;Next letter
	MOVLW	0X02	;Add 2 time period
	MOVWF	NBR_ESPACE	;Total 3 time period, SPACE between characters
	CALL	PAS_SON	;2 more periods
	GOTO	CHERCH_LETR	;Get another letter

FAIR_ESPMOT	MOVLW	0X04	;Add 4 more time periods between words
	MOVWF	NBR_ESPACE	;Total 7 time periods, SPACE between words
	CALL	PAS_SON	;Do 4 more periods
	GOTO	PROCH_LETR	;Get another letter
;
;--- ONE_CAR routine --------------------------------------------------------
;
;	DIT = 1 period
;	DAH = 3 periods
;	SPACE between character = 1 periods
;	SPace between letters = 3 periods
;	SPace between words = 7 periods
;
UN_CAR	CLRC		;Send a letter character by character
	RRF	LETTRECW,F	;Place a character in the carry flag
	MOVF	LETTRECW,F
	SKPNZ
	RETURN		;The character is finished**************

	SKPC		;Jump if DAH
	GOTO	FAIR_DIT	;Bit at 0
	GOTO	FAIR_DAH	;bit at 1

FAIR_DIT	MOVLW	0X01	;1 DIT
	MOVWF	NBR_DIT
	MOVWF	NBR_ESPACE	;1 space after the dit
	BSF	PORTA,1	;80 Meters CW, Key ON
	CALL	SON
	BCF	PORTA,1	;80 Meters CW, Key OFF
	CALL	PAS_SON
	GOTO	UN_CAR

FAIR_DAH	MOVLW	0X03	;1 DAH = 3 DIT
	MOVWF	NBR_DIT
	MOVLW	0X01	;
	MOVWF	NBR_ESPACE	;1 space after the DAH
	BSF	PORTA,1	;80 Meters CW, Key ON
	CALL	SON
	BCF	PORTA,1	;80 Meters CW, Key OFF
	CALL	PAS_SON
	GOTO	UN_CAR
;
;--- Sound routine ----------------------------------------------------------
;
;	This routine generates a dit multiplied by NBR_DIT
;
;	SPEED OF A CYCLE OU FREQUENCY, exemple, generate 1000 hz with a
;	XTAL of 4.194304 mhz. One instruction cycle = .95 usec.
;	Time of 1 audio cycle : 1/1000 = 0.001 second
;	Time of 1/2 audio cycle : 0.001/2 = 0.0005 second
;	The time of each downcounting of CTR_DIAPA is 3 instructions cycles
;	or 2.86 useconds
;	
;	The numbers pass to do for a half cycle audio at 1000 Hz is
;	0.0005/0.00000286 = 178
;
;	The lenght of a DIT for a MCW of 20 WPM is 0.060 secondes
;	The numbers of cycles to do is : 0.060/0.001 = 60 for a DIT
;	"DURE" =
;	MCW @ 20 WPM =  60
;	MCW @ 15 WPM =  90
;	MCW @ 10 WPM = 120
;	MCW @ 08 WPM = 150
;	MCW @ 05 WPM = 240
;
SON	MOVF	NBR_DIT,W	;The number of dits to do
	MOVWF	CTR_NBR
UNDIT	MOVF	DURE,W	;Length of a DIT period
	MOVWF	CTR_DIT	;

UNCYCLE	BSF	PORTA,0	;Place a 1 for the first half of the cycle
	MOVLW	D'178'	;The number of times through this half cycle
	MOVWF	CTR_DIAPA	;Determine the tone frequency
CYCLEHAUT	DECFSZ	CTR_DIAPA,F	;Downcount to 0
	GOTO	CYCLEHAUT

	BCF	PORTA,0	;Place the bit to 0 for the secon half of the cycle
	MOVLW	D'178'	;
	MOVWF	CTR_DIAPA
CYCLEBAS	DECFSZ	CTR_DIAPA,F	;Wait until 0 to finish
	GOTO	CYCLEBAS

	DECFSZ	CTR_DIT,F	;
	GOTO	UNCYCLE
	DECFSZ	CTR_NBR,F
	GOTO	UNDIT	;One more cycle
	RETURN		;Completed
;
;--- No sound routine -------------------------------------------------------
;
;	This routine generates space multiplied by NBR_ESPACE
;
;	This routine is the same as the SON routine, but whitout sound
;	It activate a virtual speaker, PORTX
;	The timing is kept the same

PAS_SON	MOVF	NBR_ESPACE,W ;The number of spaces to do
	MOVWF	CTR_NBR
UNDIT_PS	MOVF	DURE,W	;Length of a DIT period
	MOVWF	CTR_DIT	;

UNCYCLE_PS	BSF	PORTX,0	;Place a 1 for the first half of the cycle
	MOVLW	D'178'	;The number of times through this half cycle 
	MOVWF	CTR_DIAPA	;Determine the tone frequency
CYCLEHAUT_PS DECFSZ	CTR_DIAPA,F	;Downcount to 0
	GOTO	CYCLEHAUT_PS

	BCF	PORTX,0	;Place the bit to 0 for the secon half of the cycle
	MOVLW	D'178'	;
	MOVWF	CTR_DIAPA
CYCLEBAS_PS	DECFSZ	CTR_DIAPA,F	;Wait until 0 to finish
	GOTO	CYCLEBAS_PS

	DECFSZ	CTR_DIT,F	;
	GOTO	UNCYCLE_PS
	DECFSZ	CTR_NBR,F
	GOTO	UNDIT_PS	;One more cycle
	RETURN		;Completed
;
;=== TIMERS === ROUTINE D'INTERRUPTION ======================================
;
INTERUPTION	MOVWF	TMPW	;SAUVER W DANS TMPW ** PUSH **
	SWAPF	STATUS,W	;Charger le STATUS dans W
	MOVWF	TMPS	;Sauver le STATUS dans TMPS
;-----------------------------------
	DECFSZ	DIVISION,F	;Registre de 1 seconde-Divise par 16
	GOTO	POP	;Pas encore 1 seconde-Aller a POP
	MOVLW	D'16'	;METTRE 16 DANS W
	MOVWF	DIVISION	;Re-initialiser le generateur de secondes
;-----------------------------------
	DECFSZ	SECONDE,F	;Compteur de secondes
	GOTO	POP	;Pas encore 60 secondes-Aller a POP
	MOVLW	D'60'	;Re-initialiser le generateur de minutes
	MOVWF	SECONDE
	DECFSZ	DIX_MIN	;Compteur de 10 minutes
	GOTO	FAIR_MIN
	MOVLW	D'10'
	MOVWF	DIX_MIN
;-----------------------------------
	DECF	TIMER,F	;compte des 10 minutes-avant-pendant-apres
	SKPNZ
	BSF	FLAG,0	;Marque le passage a zero
FAIR_MIN	INCF	POINTEUR_TX,F ;Numero de la Minute actuelle du cycle
	BSF	FLAG,1	; de 1 @ 7 selon le cycle choisi
	MOVF	POINTEUR_TX,W ;
	SUBWF	CYCLE_MINUTE,W ;Temps maximum du cycle de transmission
	SKPZ		;Opere a la minute suivante du maximum
	GOTO 	POP
	MOVLW	D'1'
	MOVWF	POINTEUR_TX	;Re-init la minute actuelle a 1
;-----------------------------------
POP	BCF	INTCON,2	;Rappel du flag du zero de TMRO
	SWAPF	TMPS,W	;LES 6 PROCHAINE LIGNES SERVENT A REMETTRE W, STATUS
	MOVWF	STATUS	;A LEUR PLACE AVEC LES VALEUR QUE SES REGISTRES AVAIENT
	SWAPF	TMPW,F	;AVANT L'INTERUPTION, ET DE RESETER LE FLAG DE TMR0
	SWAPF	TMPW,W	;
	RETFIE		;Return to the program
;
;===========================================================================
;  **  START OF THE PROGRAM  **  PREMIERE INITIALISATION
;===========================================================================
;
DEBUT	MOVLW	B'00000111'
	OPTION
	CLRF	PORTA	;EFFACE LE PORTA
	CLRF	PORTB	;EFFACE LE PORTB
	MOVLW	B'00011000'	;1 = input pins, 0 = output pins
	TRIS	PORTA	;EDUCATION DU PORT
	MOVLW	B'11111111'	;
	TRIS	PORTB	;EDUCATION DU PORT EN ENTREE
;
;TEST LA PRESENCE DU CAVALIER TEST FOR THE JUMPER
;
	BTFSC	PORTA,3	;Voir si le cavalier est present
	GOTO	MEM_CALL	;NON charger les lettres d'appel
	MOVLW	D'1'
	MOVWF	PCLATH
	GOTO	PROG_PRINC	;OUI controller un TX (FOX)
;
;
;PROGRAMME DE CONTROLE DU TX (FOX)
;
	ORG	0X10A
PROG_PRINC	CLRF	TMR0	;
	CLRWDT		;
	CLRF	INTCON	;
	BSF	INTCON,7	;
	BSF	INTCON,5	;Demarre le timer
	MOVLW	D'16'	;
	MOVWF	DIVISION	;Genere les secondes
	MOVLW	D'60'	;
	MOVWF	SECONDE	;Genere les minutes
	MOVLW	D'10'	;COMPTEUR DE 10 MINUTES
	MOVWF	DIX_MIN
	CLRF	FLAG
;----------------------------------------------------------------------------
	CALL	LIRE_SW	;Lire les interrupteurs
	TSTF	TIMER	;Si TIMER est zero aller chasser
	SKPZ
	CALL	DELAYED_TIME ;Attente avant le debut de la chasse
	MOVLW	D'24'	;HUNTING TIME IN 10 MINUTES STEPS
			;4 HOURS = 24, 8 HOURS = 48
	MOVWF	TIMER	;Ne pas mettre 0 Temps de chasse maximum
	CALL	FAIRE_CYCLE	;Chasser
	BCF	INTCON,7	;Disable interrupts
SHUTDOWN	SLEEP		;Stop everyting low power consumption
	NOP
;
;============================================================================
;                   ***  SOUS-ROUTINES  ***
;============================================================================
;
;--- LIRE LES SW 3-2-1  POUR LE TEMPS EN ATTENTE ---
;
LIRE_SW	MOVF	PORTB,W	;
	ANDLW	B'00000111'	;Charger les SWs 3-2-1
	CALL	DEL_START
	MOVWF	TIMER
	GOTO	SW4	;Prochaines SWs
;
;--- Temps d'attente ---WAITING TIME BEFORE THE HUNT----
;
DEL_START	ADDWF	PCL,F	;ADDITIONNE W AVEC LE PROG. COMPTEUR RÉSULTAT DANS PCL
	RETLW	D'0'	; MAINTENANT  NOW    SW  off
	RETLW	D'3'	; 30 MIN D'ATTENTE   SW     1
	RETLW	D'6'	; 1H	//       SW   2
	RETLW	D'9'	; 1H30	//       SW   2 1
	RETLW	D'12'	; 2H	//       SW 4
	RETLW	D'15'	; 2H30	//       SW 4   1
	RETLW	D'18'	; 3H	//       SW 4 2
	RETLW	D'21'	; 3H30	//       SW 4 2 1
;
;--- LIRE LES SW 6-5-4 POUR LE CALLSIGN DU TX ET LE # DU TX ---
;
SW4	MOVF	PORTB,W
	ANDLW	B'00111000'	;Lire les SWs 6-5-4
	MOVWF	TMP_1
	CLRC		;Vider le CARRY
	RRF	TMP_1,F
	RRF	TMP_1,F
	RRF	TMP_1,F
	MOVF	TMP_1,W	;Charger W avec la valeur des SWs 6-5-4
	CALL	TXCALL_SIGN
	MOVWF	MESSAGE	;ID du FOX
	MOVF	TMP_1,W
	CALL	TIME_CYCLE
	MOVWF	TX_NUMBER	;Position du TX dans le cycle
	GOTO	SW7	;Prochaines SWs
;
;--- CALL SIGN DU TX ---
;
TXCALL_SIGN	ADDWF	PCL,F	;ADDITIONNE W AVEC LE PROG. COMPTEUR RÉSULTAT DANS PCL
	RETLW	D'0'	;MO
	RETLW	D'1'	;MOE
	RETLW	D'2'	;MOI
	RETLW	D'3'	;MOS
	RETLW	D'4'	;MOH
	RETLW	D'5'	;MO5
	RETLW	D'6'	;MON
	RETLW	D'7'	;MOD
;
;--- TX # ET TEMPS D'ATTENTE AVANT DE REFAIRE LA TRANSMISSION ---
;
TIME_CYCLE	ADDWF	PCL,F	;ADDITIONNE W AVEC LE PROG. COMPTEUR RÉSULTAT DANS PCL
	RETLW	D'1'	; CYCLE DE MINUTES/NUMÉRO DU TX 0
	RETLW	D'1'	; CYCLE DE MINUTES/NUMÉRO DU TX 1
	RETLW	D'2'	; CYCLE DE MINUTES/NUMÉRO DU TX 2
	RETLW	D'3'	; CYCLE DE MINUTES/NUMÉRO DU TX 3
	RETLW	D'4'	; CYCLE DE MINUTES/NUMÉRO DU TX 4
	RETLW	D'5'	; CYCLE DE MINUTES/NUMÉRO DU TX 5
	RETLW	D'6'	; CYCLE DE MINUTES/NUMÉRO DU TX 6
	RETLW	D'7'	; CYCLE DE MINUTES/NUMÉRO DU TX 7
;
;--- LIRE LES SWs 9-8-7 CYCLE DE TEMPS AVANT DE COMMANCER LA TRANSMISSION ---
;
SW7	CLRF	TMP_1
	BTFSS	PORTB,6
	GOTO	SW8
	BSF	TMP_1,0

SW8	BTFSS	PORTB,7
	GOTO	SW9
	BSF	TMP_1,1

SW9	BTFSS	PORTA,4
	GOTO	TX_CYCLE
	BSF	TMP_1,2

TX_CYCLE	MOVF	TMP_1,W
	CALL	TIME_CYCLE	
	ADDLW	D'1'
	MOVWF	CYCLE_MINUTE ;Temps du cycle de transmission

	MOVF	CYCLE_MINUTE,W	; # du FOX > CYCLE?
	SUBWF	TX_NUMBER,W
	BTFSC	STATUS,C
	CALL	ALARME	;Oui trouble
	RETURN
;
;--- ROUTINE D'ALARME ------------------------------------------------------
;
ALARME	MOVF	DIVISION,W	;Clignote la LED
	ANDLW	B'00000010'
	SKPZ
	BSF	PORTA,1
	SKPNZ
	BCF	PORTA,1
	GOTO	ALARME	
;
;--- ROUTINE D'ATTENTE AVANT LA CHASSE -------------------------------------
;
DELAYED_TIME BCF	FLAG,0	
REDO_WAIT	MOVF	DIVISION,W
	ANDLW	B'0001111'
	SKPNZ
	BSF	PORTA,1	;Montrer que le timer marche sur la LED
	SKPZ
	BCF	PORTA,1	;Montrer que le timer marche
	BTFSS	FLAG,0	;Verifier si tout le temps est ecoule
	GOTO	REDO_WAIT	;
	BCF	PORTA,1	;Quitter avec la LED eteinte
	RETURN		;Vers le programme principal
;
;--- SECTION DU PROGRAMME POUR FAIRE LE MORSE MOx UN NOMBRE DE FOIS --------
;
FAIRE_CYCLE	MOVLW	D'1'	;Initialisation de la premiere minute
	MOVWF	POINTEUR_TX	;du cycle
	CLRF	FLAG	
;
;--- Temps avant transmission et apres transmission ------------------------
;
ATTENTE_MIN	BCF	FLAG,2
	MOVF	POINTEUR_TX,W ;Minute du cycle
	XORWF	TX_NUMBER,W	;Position du TX dans le cycle
	SKPZ
	BSF	FLAG,2

	BTFSC	FLAG,0	; *** Verifier si la chasse est fini
	RETURN		; *** Fin de la chasse
	BTFSC	FLAG,2
	GOTO	ATTENTE_MIN
;
;--- Transmission de l'ID --------------------------------------------------
;
	BCF	FLAG,1	;Rappel du flag-Transmission faite
	BSF	PORTA,2	;On commance a transmettre
	MOVLW	D'145'	;8 WPM
	MOVWF	DURE	
	MOVLW	0X00
	MOVWF	PCLATH	;Page 0

	MOVF	MESSAGE,W	;Envoyer un ID a 0 sec. du cycle
	CALL	CODER

SEC54	MOVF	SECONDE,W	;Envoyer un ID a 6 sec. du cycle
	XORLW	D'54'
	SKPZ
	GOTO	SEC54
	MOVF	MESSAGE,W
	CALL	CODER

SEC48	MOVF	SECONDE,W
	XORLW	D'48'	;Envoyer un ID a 12 sec. du cycle
	SKPZ
	GOTO	SEC48
	MOVF	MESSAGE,W
	CALL	CODER

SEC42	MOVF	SECONDE,W	;Envoyer un ID a 18 sec. du cycle
	XORLW	D'42'
	SKPZ
	GOTO	SEC42
	MOVF	MESSAGE,W
	CALL	CODER

SEC36	MOVF	SECONDE,W	;Envoyer un ID a 24 sec. du cycle
	XORLW	D'36'
	SKPZ
	GOTO	SEC36
	MOVF	MESSAGE,W
	CALL	CODER

SEC30	MOVF	SECONDE,W	;Envoyer un ID a 30 sec. du cycle
	XORLW	D'30'
	SKPZ
	GOTO	SEC30
	MOVF	MESSAGE,W
	CALL	CODER

SEC24	MOVF	SECONDE,W	;Envoyer un ID a 36 sec. du cycle
	XORLW	D'24'
	SKPZ
	GOTO	SEC24
	MOVF	MESSAGE,W
	CALL	CODER

SEC18	MOVF	SECONDE,W	;Envoyer un ID a 42 sec. du cycle
	XORLW	D'18'
	SKPZ
	GOTO	SEC18
	MOVF	MESSAGE,W
	CALL	CODER

SEC12	MOVF	SECONDE,W	;Envoyer un ID a 48 sec. du cycle
	XORLW	D'12'
	SKPZ
	GOTO	SEC12
	MOVF	MESSAGE,W
	CALL	CODER
;
;--- TX de "De lettres d'appel du maitre de chasse" ---
;
SEC6	MOVF	SECONDE,W	;Envoyer les lettres a 54 sec. du cycle
	XORLW	D'6'
	SKPZ
	GOTO	SEC6
	MOVLW	D'45'	;Send DE at 25 WPM
	MOVWF	DURE	
	MOVLW	D'9'	;Envoyer "DE espace mot"
	CALL	CODER
	MOVLW	D'8'	;Envoyer les lettres d'appel
	CALL	CODER
	MOVLW	D'1'	;back to page number 1
	MOVWF	PCLATH	;Retour a la page 1
	
ATTENTE_FIN	BTFSS	FLAG,1	;attente de la fin de la minute de TX
	GOTO	ATTENTE_FIN
	BCF	PORTA,2
	GOTO	ATTENTE_MIN
;
;===========================================================================
;
	ORG	0X0200
FLASH	BSF	PORTA,1
	CALL	LOOP_BEGIN
	BCF	PORTA,1
	CALL	LOOP_BEGIN
	GOTO	FLASH

LOOP_BEGIN	MOVLW	0XFF
	MOVWF	TMPF1
	MOVWF	TMPF2
LOOP_WAIT	DECFSZ	TMPF1,F
	GOTO	LOOP_WAIT
	MOVLW	0XFF
	MOVWF	TMPW
	DECFSZ	TMPF2,F
	GOTO	LOOP_WAIT
	RETURN

;
;--- EEDATA ----------------------------------------------------------------
;
;	Initial loading the EEDATA memory
;
	ORG	0X2100	;Burning adress of the EEDATA
	DE	0X14	;"F"   Sender's call, EEDATA ADR. 0X00
	DE	0X0F	;"O"
	DE	0X19	;"X"
	DE	0X11	;"B"
	DE	0X0F	;"O"
	DE	0X19	;"X"
	DE	0XFF	;--- End of message ---

	END
;
;--- FIN -------------------------------------------------------------------
;
;=== SNIP ==================================================================
;
; MORSE ENCODING ...
;
; One morse character per BYTE, bitwise, LSB to MSB.
;
; 0 = dit, 1 = dah.  The byte is shifted to the right bit by bit, until the
; last 1 is left, this 1 is an END OF CHARACTER indicator.
; A maximum of 7 elements can be encoded, (error) is excluded.
;
;    CODERR               MSD  LSD    Comments
;    ------             ---  ---    --------------------
; KN -.--.   00101101	 2   13	Go only
; SK ...-.-  01101000  	 5    8	Clear
; AR .-.-.   00101010  	 2   10	Over, end of message
; BT -...-   00110001  	 3    1	Pause
; AS .-...   00100010	 2    2	Wait, stand by
;  / -..-.   00101001  	 2    9
;  0 -----   00111111  	 3   15
;  1 .----   00111110  	 3   14
;  2 ..---   00111100  	 3   12
;  3 ...--   00111000  	 3    8
;  4 ....-   00110000  	 3    0
;  5 .....   00100000  	 2    0
;  6 -....   00100001  	 2    1
;  7 --...   00100011  	 2    3
;  8 ---..   00100111  	 2    7
;  9 ----.   00101111  	 2   15
;  A .-      00000110  	 0    6
;  B -...    00010001  	 1    1
;  C -.-.    00010101  	 1    5
;  D -..     00001001  	 0    9
;  E .       00000010  	 0    2
;  F ..-.    00010100  	 1    4
;  G --.     00001011  	 0   11
;  H ....    00010000  	 1    0
;  I ..      00000100  	 0    4
;  J .---    00011110  	 1   14
;  K -.-     00001101  	 0   13
;  L .-..    00010010  	 1    2
;  M --      00000111  	 0    7
;  N -.      00000101  	 0    5
;  O ---     00001111  	 0   15
;  P .--.    00010110  	 1    6
;  Q --.-    00011011  	 1   11
;  R .-.     00001010  	 0   10
;  S ...     00001000  	 0    8
;  T -       00000011  	 0    3
;  U ..-     00001100  	 0   12
;  V ...-    00011000  	 1    8
;  W .--     00001110  	 0   14
;  X -..-    00011001  	 1    9
;  Y -.--    00011101  	 1   13
;  Z --..    00010011  	 1    3
;  SPACE	 00000000  	 0    0 	Word space (special exception)
;  EOM       11111111  	15   15	End of message  (special exception)
;
