; 178 INSTRUCTIONS
; 221 LIGNES DE LISTING
;
; MEMOIRE PROGRAMME UTILISEE 2%
; MEMOIRE RAM UTILISEE       1%
;
W		EQU	H'000'
F		EQU	H'001'
RP1		EQU	H'006'
RP0		EQU	H'005'
Z		EQU	H'002'
C		EQU	H'000'
TMR0		EQU	H'001'
PCL		EQU	H'002'
STATUS		EQU	H'003'
PORTA		EQU	H'005'
PORTB		EQU	H'006'
PCLATH		EQU	H'00A'
PIR1		EQU	H'00C'
RCSTA		EQU	H'018'
TXREG		EQU	H'019'
RCREG		EQU	H'01A'
OPTIONREG	EQU	H'081'
TRISA		EQU	H'085'
TRISB		EQU	H'086'
TXSTA		EQU	H'098'
SPBRG		EQU	H'099'
ADCON1		EQU	H'09F'
MEMO		EQU	H'070'
NUMMSG		EQU	H'071'
REBOND		EQU	H'072'
ADR_STRING_L	EQU	H'073'
ADR_STRING_H	EQU	H'074'
; Liaison série uC<->PC
		__CONFIG	H'3D39'
; 
; programme de reset
		ORG	H'0000'
		BCF	STATUS,RP1
		BSF	STATUS,RP0
; Passer port A en digital
		MOVLW	H'06'
		MOVWF	ADCON1
		MOVLW	H'01'
		MOVWF	TRISA
		CLRF	TRISB
		MOVLW	H'24'
		MOVWF	TXSTA
; baud rate=9600
		MOVLW	H'19'
		MOVWF	SPBRG
; Diviseur de TMR0 à 64
		MOVLW	H'85'
		MOVWF	OPTIONREG
		BCF	STATUS,RP1
		BCF	STATUS,RP0
		MOVLW	H'90'
		MOVWF	RCSTA
		CLRF	REBOND
		CLRF	MEMO
		CLRF	NUMMSG
		CLRF	PORTB
;
;
; 156 donne un passage toutes les 0.01s
BOUCLE		MOVLW	H'9C'
		SUBWF	TMR0,W
		BTFSS	STATUS,C
		GOTO	$+.24
		CLRF	TMR0
; Changement d'état du poussoir, système anti-rebonds
		BTFSS	PORTA,0
		GOTO	$+.7
		BTFSC	MEMO,1
		GOTO	$+.3
		INCF	REBOND,F
		GOTO	$+.2
		CLRF	REBOND
		GOTO	$+.6
		BTFSS	MEMO,1
		GOTO	$+.3
		INCF	REBOND,F
		GOTO	$+.2
		CLRF	REBOND
; 1/10ème de sec. pour valider le changement d'état du poussoir
		MOVLW	H'0A'
		SUBWF	REBOND,W
		BTFSS	STATUS,C
		GOTO	$+.6
		BTFSS	MEMO,1
		GOTO	$+.3
		BCF	MEMO,1
		GOTO	$+.2
		BSF	MEMO,1
;
; Test du poussoir et action
; Si appui non mémorisé
		BTFSC	MEMO,0
		GOTO	$+.37
; Si bouton appuyé
		BTFSS	MEMO,1
		GOTO	$+.34
; on charge alternativement texte1, texte2 ...
; dans l'adresse du texte à envoyer
		MOVF	NUMMSG,W
		BTFSS	STATUS,Z
		GOTO	$+.6
		MOVLW HIGH texte1
		MOVWF	ADR_STRING_H
		MOVLW LOW texte1
		MOVWF	ADR_STRING_L
		CALL	ENVOISTRING
		MOVLW	H'01'
		SUBWF	NUMMSG,W
		BTFSS	STATUS,Z
		GOTO	$+.6
		MOVLW HIGH texte2
		MOVWF	ADR_STRING_H
		MOVLW LOW texte2
		MOVWF	ADR_STRING_L
		CALL	ENVOISTRING
		MOVLW	H'02'
		SUBWF	NUMMSG,W
		BTFSS	STATUS,Z
		GOTO	$+.6
		MOVLW HIGH texte3
		MOVWF	ADR_STRING_H
		MOVLW LOW texte3
		MOVWF	ADR_STRING_L
		CALL	ENVOISTRING
		INCF	NUMMSG,F
		MOVLW	H'03'
		SUBWF	NUMMSG,W
		BTFSS	STATUS,Z
		GOTO	$+.2
		CLRF	NUMMSG
		BSF	MEMO,0
		GOTO	$+.4
; Si bouton relaché
		BTFSC	MEMO,1
		GOTO	$+.2
		BCF	MEMO,0
;
; réception d'un caractère
		BTFSS	PIR1,5
		GOTO	$+.8
; renvoyer le caractère en écho
		MOVF	RCREG,W
		MOVWF	TXREG
; inversion de l'état de LED 1
		BTFSS	PORTB,1
		GOTO	$+.3
		BCF	PORTB,1
		GOTO	$+.2
		BSF	PORTB,1
		GOTO	BOUCLE
;
; sous-programme envoi d'une chaine
; qui doit être terminée par un caractère nul
;
ENVOISTRING	BSF	PORTB,0
ENVOI2		BCF	STATUS,RP1
		BSF	STATUS,RP0
		BTFSS	TXSTA,1
		GOTO	$+.13
		BCF	STATUS,RP1
		BCF	STATUS,RP0
		CALL	GETCAR
		ADDLW	H'00'
		BTFSC	STATUS,Z
		GOTO	FINIR
		MOVWF	TXREG
		INCF	ADR_STRING_L,F
		BTFSC	STATUS,Z
		INCF	ADR_STRING_H,F
		GOTO	ENVOI2
		GOTO	$+.2
		GOTO	ENVOI2
FINIR		BCF	PORTB,0
		RETURN
;
; Sous-programme d'acquisition d'un caractère
;
GETCAR		MOVF	ADR_STRING_H,W
		MOVWF	PCLATH
		MOVF	ADR_STRING_L,W
		MOVWF	PCL
;
;
TEXTE1		RETLW	H'50'
		RETLW	H'72'
		RETLW	H'65'
		RETLW	H'6D'
		RETLW	H'69'
		RETLW	H'65'
		RETLW	H'72'
		RETLW	H'20'
		RETLW	H'65'
		RETLW	H'73'
		RETLW	H'73'
		RETLW	H'61'
		RETLW	H'69'
		RETLW	H'0D'
		RETLW	H'0A'
		RETLW	H'00'
;
TEXTE2		RETLW	H'43'
		RETLW	H'61'
		RETLW	H'20'
		RETLW	H'6D'
		RETLW	H'61'
		RETLW	H'72'
		RETLW	H'63'
		RETLW	H'68'
		RETLW	H'65'
		RETLW	H'20'
		RETLW	H'3F'
		RETLW	H'0D'
		RETLW	H'0A'
		RETLW	H'00'
;
TEXTE3		RETLW	H'45'
		RETLW	H'6E'
		RETLW	H'63'
		RETLW	H'6F'
		RETLW	H'72'
		RETLW	H'65'
		RETLW	H'20'
		RETLW	H'75'
		RETLW	H'6E'
		RETLW	H'20'
		RETLW	H'70'
		RETLW	H'27'
		RETLW	H'74'
		RETLW	H'69'
		RETLW	H'74'
		RETLW	H'20'
		RETLW	H'63'
		RETLW	H'6F'
		RETLW	H'75'
		RETLW	H'70'
		RETLW	H'20'
		RETLW	H'3F'
		RETLW	H'0D'
		RETLW	H'0A'
		RETLW	H'00'
		END
