;MIRE.ASM
;30-11-97
;Mire TV vidéo-composite norme L 625 lignes dont 572 vidéos NOIR/BLANC
;PA0=SORTIE SYNCHRO LIGNE
;PA1=VIDEO GRIS bit1
;PA2=VIDEO BARRE BLANCHE 	
;PA3=VIDEO GRIS bit0 (LSB)
;pour Qx= 6.000 Mhz
;RAPPEL REGISTRE D'ETAT = STATUS : p:30
;----------------------------------------------------------------------
;
;                        w =   7
;                     wreg =   7
;           
	LIST   P=PIC16C84
;qq
	include p16c84.inc

;SVP definir ScratchPadRam ici:
;Si vous utilisez un PIC16C5X definissez	"departRam equ 0x10" 
;sinon definissez		         	"departRam equ 0x20"
;----------------------------------------------------------------------
w       equ     0
f	equ	1

;attention: le PIC16C84 possède 36 octets de RAM
;adresses OCh à 2Fh
;attention: le nb qui suit Ram0+... doit être écrit en Hexa !

Ram0	equ     000C
AA	equ     Ram0+00	;mon registre de travail
BB	equ     Ram0+01	;mon registre de travail	
CC	equ	Ram0+02	;mon registre de travail
DD	equ	Ram0+03	;mon registre de travail
WW	equ	Ram0+04	;pour sauvegarder w pendant INT

t1      equ     Ram0+05	;pour les tempos
t2	equ	Ram0+06
t3	equ	Ram0+07

tL	equ	Ram0+08	;durée du top ligne
dL	equ	Ram0+09	;durée ligne

NL0	equ	Ram0+0A	;compteur Lignes poids faible
NL1	equ	Ram0+0B	;compteur Lignes poids fort
NTopT	equ	Ram0+0C	;compteur tops trame

        org     0       ;start address 0


        goto    start

;----------------------------------------------------------------------
;traitement interruption
;ici débordement du Timer0
; 6.00 Mz/4/8/12=15625 Hz

	org	0004	;INT
	movwf	WW

	movf	dL,w
	movwf	TMR0	;ici on passe tous les 64us
	call	topLi
	call Ligne

	bcf	INTCON,2	;ré-autorise int Timer0 voir p:136 et p:156
	movf	WW,w
	retfie

;----------------------------------------------------------------------
;INITIALISATION DES PORTS
;----------------------------------------------------------------------
        org     0020


start	clrwdt

	movlw	B'00000000'	;0=sortie 1=entree (RA4=aussi RTCC)
	TRIS	PORTA		;config du port A (TRISA en page 1)
	movlw	B'00000000'
	TRIS	PORTB		;config du port B

	bcf	PORTB,7		;sortie vers optocoupleur
;----------------------------------------------------------------------
;PROGRAMMATION DU REGISTRE OPTION
;VOIR page 144 et 143
;soit Timer0 = 1/8 -> PS2,1,0 = 010b  VOIR PAGE 135
;PSA (bit3) = 0 -> prédiv affecté au Timer0 voir p:73
;RTE (bit4) = 0 -> inc sur front montant
;RTS (bit5) = 0 -> branche Timer0 sur horloge interne
;INTEDG=x
;RBPU (bit7)=1 -> pas de R tirage à Vdd du port B (10k ext à GND sur PB7)


;	   bits:  76543210
	movlw	B'10000010'
	OPTION
;----------------------------------------------------------------------

;PROG DU REGISTRE INTCON
;voir page 155 et surtout p:136
;bit0 RBIF=x (sortie?)
;bit1 INTF=x (sortie?)
;bit2 RTIF=x (SORTIE?)
;bit3 RBIE=0 -> INT du port RB4 à RB7 interdites.
;bit4 INTE=0 -> INT de RB0/INT interdite.
;bit5 RTIE=1 -> INT par debordement Timer0.
;bit6 EEIE=0 -> INT EEPROM interdites
;bit7 GIE=1  ->INT GLOBALE autorisée.

	movlw	B'10100000'
	movwf	INTCON

;-------------------------------------------------------------------------
;essai


;-------------------------------------------------------------------------
	clrwdt

	movlw	.245	;(256-13)
	movwf	dL	;duree ligne

	movlw	.2	;2	recharge le décompteur
	movwf	NL1
	movlw	.57	;57	312=1*256+56  312-24=288  288=1*256+32
	movwf	NL0

	movlw	.5
	movwf	NTopT

;BOUCLE PRINCIPALE

loop1	clrwdt
	
	
	goto	loop1
       
;----------------------------------------------------------------------
;DEBUT DES PROCEDURES
;----------------------------------------------------------------------

Ligne	decfsz	NL0,f 	;decremente compteur lignes
	goto	suite1
	decfsz	NL1,f
	goto	suite1

	movlw	.2	;2	recharge le décompteur
	movwf	NL1
	movlw	.40	;57	312=1*256+56  312-24=288  288=1*256+32
	movwf	NL0

;on va appeler top trame lors des 24 dernieres lignes

suite1	movlw	.2
	subwf	NL1,w
	btfss	STATUS,0	;bit c
	goto	suite2
	movlw	.24	;pour generer 10 tops trames
	subwf	NL0,w	;pour le  tester si < 10
	btfsc	STATUS,0	;bit c
	goto	suite2

;	bsf	PORTA,1
;	bcf	PORTA,1
	call	topT
	goto	finLi

suite2
	
;	movlw	.10	;10 dernieres lignes noires
;	subwf	NL0,w
;	btfss	STATUS,0	;bit carry
;	goto	finLi

	movlw	.2
	subwf	NL1,w
	btfsc	STATUS,0	;bit c
	goto	finLi


;test pour décider de tracer 1 ligne horizontale ou pas
	movlw	B'00011111'
	andwf	NL0,w	;=0 si NL0[2,1,0]='00000' c.a.d si NL0= n * 64
	btfss	STATUS,2	;skip si zéro
	goto	suite5	;pas de tracé ligne H
	call	videoH	;trace 1 ligne horizontale
	goto	finLi

suite5	call 	videoV	;trace n points de n lignes verticales

		
finLi	return

;----------------------------------------------------------------------
;Top Ligne durée 4.8 us

topLi	movlw	.2
	movwf	tL

	bcf	PORTA,0
topL1	decfsz	tL,f
	goto	topL1
	nop
	bsf	PORTA,0
	return

;----------------------------------------------------------------------
topT	decf	NTopT,f
	movlw	.2
	movwf	tL

	bsf	PORTA,0	;top Ligne inverse pendant Top trame
;topL2	decfsz	tL,f
;	goto	topL2
;	nop
	bcf	PORTA,0

	return

;----------------------------------------------------------------------
videoV	
;	movlw	.3
;	movwf	t1
;t1V1	decfsz	t1,f
;	goto	t1V1

	bsf	PORTA,2
	bcf	PORTA,2
	nop
	nop
	nop
	nop
	bsf	PORTA,3	;debut pavé gris 0
	nop
	nop
	bcf	PORTA,3	;fin pavé gris 0
	bsf	PORTA,1	;debut pavé gris 1	
	nop
	nop
	nop
	bsf	PORTA,3	;debut pavé gris 0
	nop
	nop
	nop
	bcf	PORTA,1	;fin pavé gris 1
	bcf	PORTA,3	;fin pavé gris 0
	bsf	PORTA,2
	bcf	PORTA,2
	nop
	nop
	nop
	nop
	bcf	PORTB,0	;debut salve à 3 MHz
	nop
	nop
	nop
	nop
	bsf	PORTB,0
	nop
	nop
	nop
	nop
	bsf	PORTA,2
	bcf	PORTA,2
	nop
	nop
	nop
	nop
	bsf	PORTA,2
	bcf	PORTA,2
	
	

	return
;----------------------------------------------------------------------
;trace une ligne horizontale
videoH	nop		;pour tempo
;	movlw	.3
;	movwf	t1
;t1loop1	decfsz	t1,f
;	goto	t1loop1

	bsf	PORTA,2
	
	movlw	.13
	movwf	t1
t1loop2	decfsz	t1,f
	goto	t1loop2

	nop	;pour affiner tempo	

	bcf	PORTA,2

	return
;----------------------------------------------------------------------

	ORG     2007H	; Fuses
	DATA    3FF5	;osc=XT , watchdog=yes


;----------------------------------------------------------------------
        end



