; =========================================================================
;
;   File...... TEST.SRC
;   Purpose... Programming Template
;   Author....  
;   Started...
;   Updated...
;
; =========================================================================


;-------------------------- DEVICE DIRECTIVES --------------------------


IFDEF		__SASM  ;SASM Directives
		DEVICE		SX28AC, OSCHS3, TURBO, BOROFF, SYNC, OPTIONX, CARRYX
		IRC_CAL		IRC_SLOW
ELSE		;Parallax Assembler Directives
		DEVICE		SX28AC, OSCXT2, TURBO, BOROFF, SYNC
ENDIF

		ID		"PATGEN"

		RESET		Initialize	; Reset vector

;---------------------------- DEBUG SETTINGS ---------------------------

		FREQ	50_000_000

;------------------------------- EQUATES -------------------------------

SyncH		EQU		rb.0		; Synchro Horizontale sur RB0
SyncV		EQU		rb.1		; Synchro Verticale sur RB1

Black		EQU		%0000
Blue		EQU		%0001		; Bit 2°
Red		EQU		%0010		; Bit 2¹
Green		EQU		%0100		; Bit 2²
Cyan		EQU		Green + Blue
Magenta		EQU		Red + Blue
Yellow		EQU		Red + Green
White		EQU		Red + Green + Blue

		;MODE Register Settings to access the port control registers
TRIS		EQU		$0F		; Data Direction Register
PLP		EQU		$0E		; Pull-Up Resistor Enable Register
LVL		EQU		$0D		; TTL/CMOS Select Register
ST		EQU		$0C		; Schmitt Trigger Enable Register
WKEN		EQU		$0B		; Wake Up Enable Register
WKED		EQU		$0A		; Wake Up Edge Select Register
WKPND		EQU		$09		; MIWU Pending Register
CMP		EQU		$08		; Comparator Enable Register

;------------------------------ VARIABLES ------------------------------

		ORG	8

LoopCounter	DS	1			; Step Counter
LineCounter	DS	2			; Line Conter
FrameCounter	DS	1			; Frame Counter
FlipFlop	DS	1			; Used to blink pattern

;-------------------------------- MACRO's -------------------------------

BasicDelay	MACRO		Value			; Absorbe un nombre de µcycles = (Value × 4)
		LOCAL		LocLoop			; Etiquette interne à la macro
		mov		LoopCounter,#Value	; 2 µC, initialisation du compteur de bouclettes
LocLoop		DJNZ		LoopCounter,LocLoop	; 4 µC sinon 2 en sortie de boucle
		ENDM

Delay		MACRO		Value,Offset		; Temporisation incluant une franchise (Offset) 
Loops		SET		(Value-(Offset))/4
Cycles		SET		(Value-(Offset))//4
		REPT		Loops/250		; Correspond à 250×4 soit 1000 µcycles d'horloge
		  BasicDelay	250
		ENDR
		BasicDelay	Loops//250		; Complété par le reste de la division par 250
		IF		Cycles=3		; Afinage
		  jmp		$+1			; Absorbe 3 µcycles en une seule instruction
		ELSE
		  REPT		Cycles			; Répétition de NOP modulo 4
		    nop
		  ENDR
		ENDIF
		ENDM

Wait		MACRO		Value			; Temporisation, inclue les 4 µcycles du bloc d'instructions qui la précéde
		  Delay		Value,4			; Minoration des 4 µcycles 
		ENDM

SetColor	MACRO		Color, Delay		; Emission de la couleur (Color), durée = (Delay)
		mov		w,ra			; 1 µC, lecture du port RA
		and		w,#%1000		; 1 µC, effacement des 3 bits de couleur
		or		w,#Color		; 1 µC, positionnement des bits impactés
		mov		ra,w			; 1 µC, émission de cette nouvelle couleur
		wait		Delay			; Temporisation, tient compte des µcycles absorbés par les instructions précédentes
		ENDM

ColorBars	MACRO		DelayBar		; Emission des 8 barres colorées, durée de chaque barre = (DelayBar)
		SetColor	White,DelayBar		; Première barre verticale
		SetColor	Yellow,DelayBar
		SetColor	Cyan,DelayBar
		SetColor	Green,DelayBar
		SetColor	Magenta,DelayBar
		SetColor	Red,DelayBar
		SetColor	Blue,DelayBar
		SetColor	Black,DelayBar		; La huitième barre est aussi la dernière
		ENDM

NextLine	MACRO		Current,Next		; Absorbe 14 µCycles sauf sortie vers MainLoop qui en absorbe que 9
		LOCAL		LocLab1,LocLab2		; Déclaration des étiquettes privées
		djnz		LineCounter, LocLab1	; 4/2 µC, décomptage sur octet de poids faible
		test		LineCounter+1		; 1 µC, test de nullité sur l'octet de poids fort
NextAddr	SET		Next
		IF		NextAddr=MainLoop
		  jnz		LocLab2			; 4/2 µC
		  jmp		@MainLoop		; 1+3 µC, soit 9 consommés au total
		ELSE
		  jz		Next??:SetUp		; 4/2 µC, 7 déjà consommés, les 7 manquants seront absorbés par le setup
		  skip					; 2 µC, 7 déjà consommés, encore 7 à absorber
		ENDIF
LocLab1		jmp		$+3			; 3 µC, 7 déjà consommés, encore 7 à absorber
LocLab2		dec		LineCounter+1		; 1 µC, décomptage propagé sur octet de poids fort
		skip					; 2 µC, 10 déjà consommés, encore 4 à absorber
		jmp		$+1			; 3 µC, 10 déjà consommés, plus que 4 à absorber
		nop					; 1 µC, 11 déjà consommés, plus que 3 à absorber
		jmp		Current??:Start		; 3 µC, 14 consommés au total
		ENDM

PresetCount	MACRO		Value				; Initialisation du compteur ligne, absorbe 4 µCycles
		mov		LineCounter,#(Value//256)	; 2 µC, chargement du compteur, octet de poids faible
		mov		LineCounter+1,#(Value/256)	; 2 µC, idem, octet de poids fort
		ENDM

;#######################################################################################################################################
;#######################################################################################################################################

;-------------------------- SIGNALS TIMING CHART -------------------------

;	Line		Front		Horiz.		Back		Display
;	Frequ.		Porch		Synch.		Porch
;	(kHz)		(µcycles)	(µcycles)	(µcycles)	(µcycles)
;	15		161		238		323		2456
;	24		142		150		222		1336	
;	31		81		152		161		1184

;	Line		Leading		Vert.		Lagging		Pattern
;	Frequ.		Blank		Synch.		Blank
;	(kHz)		(lines)		(lines)		(lines)		(lines)
;	15		13		3		23		224
;	24		11		4		25		384
;	31		14		3		33		480

;#######################################################################################################################################
;#######################################################################################################################################

;-------------------------- INTERRUPT ROUTINE --------------------------

		LIST		F=INHX8M

		ORG 		0
Interrupt
		reti

;------------------------ INITIALIZATION ROUTINE -----------------------

		ORG 		8
Initialize	mov		ra,#%0000		; Set port A low
		mov		rb,#%11111111		; Set port B high
		mov		rc,#%11111111		; Set port C high

		; Pull-Up Resistor Configuration
		mode		PLP			; Allow Pull-Up Resistor configuration
		mov		!ra,#%1111		; Set port A, bit 0-3 to normal
		mov		!rb,#%00001111		; Set port B bits 4-7 with pull-up resistors
		mov		!rc,#%00000000		; Set port C bits 0-7 with pull-up resistors

		; Port Direction Configuration
		mode		TRIS			; Allow Direction configuration
		mov		!ra,#%0000		; Set port A bits 0-3 to output
		mov		!rb,#%11110000		; Set port B bits 0-3 to output, 4-7 to input
		mov		!rc,#%11111111		; Set port C bits 0-7 to input

		; Device Configuration Options
		mov		!option,#%01111111	; Raz bit RTW, RTCC inhibé, WREG accessible à la place

;---------------------------- MAIN PROGRAM -----------------------------

Main		setb		SyncH
		setb		SyncV
		clr		FlipFlop		; Initialisation du flip flop
		jmp		PresetFrCnt

		; Compteur de trames pour clignotement, absorbe 7 µCycles
MainLoop	djnz		FrameCounter,NoPreset	; 2/4 µC
		not		FlipFlop		; 1 µC, inversion du flip flop
PresetFrCnt	mov		FrameCounter,#30	; 2 µC, clignotement toutes les 30 trames (½ seconde)
		skip					; 2 µC, ajustement à 7 µC si rechargement FrameCount
NoPreset	jmp		$+1			; 3 µC, ajustement à 7 µCycles pour décomptage normal

		; Lecture de la	fréquence ligne sur les 2 premiers microswitches.
		; Absorbe 11 µCycles quelque soit la boucle à exécuter.
		jnb		rb.5,Jmp31k		; 2/4 µC, lecture de la fréquence programmée par les dip-switches
		jnb		rb.4,Jmp24k		; 2/4 µC
Jmp15k		jmp		$+1			; 3 µC pour ajustage absorpsion à 11 µC
		jmp		@Start15k		; 1+3 µC, instruction de page incluse avec "@"
Jmp24k		nop					; 1 µC pour ajustage absorpsion à 11 µC	
		jmp		@Start24k		; 1+3 µC, instruction de page incluse avec "@"
Jmp31k		jmp		$+1			; 3 µC pour ajustage absorpsion à 11 µC
		jmp		@Start31k		; 1+3 µC, instruction de page incluse avec "@"	

;#######################################################################################################################################
;#######################################################################################################################################

		org		$0200

Start15k	EQU		$

;****************************** Impulsion de synchronisation trame ******************************

SyncHor15k	SET		$
:SetUp		PresetCount	3				; Nombre de lignes allouées à l'impulsion de synchronisation verticale
		jmp		SyncHor15k:Start

		; Palier de suppression arrière (Back Porch), suite
SyncHor15k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		323				; Durée du palier arrière

		; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame
		SetColor	Black,2456+161-14		; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	SyncHor15k,Lagging15k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
SyncHor15k	SET		$
:Start		mov		w,rb				; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
		clrb		wreg.0				; 1 µC, positionnement du bit affecté à la synchronisation horizontale
		clrb		wreg.1				; 1 µC, positionnement du bit affecté à la synchronisation verticale
		mov		rb,w				; 1 µC, émission de cette nouvel état
		Wait		238				; Durée de l'impulsion ligne

		; Palier de suppression arrière (Back Porch)
		jmp		SyncHor15k:Loop			; Rebouclage avec absorption de 3 µcycles

;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) **********

Lagging15k	SET		$
:SetUp		PresetCount	23				; Nombre de lignes allouées au blanking arrière
		jmp		Lagging15k:Start

		; Palier de suppression arrière(Back Porch),suite
Lagging15k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		323				; Durée du palier arrière

		; Blanking des lignes à la suite de l'impulsion de synchronisation trame
		SetColor	Black,2456+161-14		; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Lagging15k,Pattern15k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
Lagging15k	SET		$
:Start		mov		w,rb				; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
		clrb		wreg.0				; 1 µC, positionnement du bit affecté à la synchronisation horizontale
		setb		wreg.1				; 1 µC, effacement du bit affecté à la synchronisation verticale
		mov		rb,w				; 1 µC, émission de cet nouvel état
		Wait		238				; Durée de l'impulsion ligne

		; Palier de suppression arrière (Back Porch)
		jmp		Lagging15k:Loop			; Rebouclage avec absorption de 3 µcycles

;****************************** Affichage du motif de la mire ******************************

Pattern15k	SET		$
:SetUp		PresetCount	224				; 224 Nombre de lignes allouées pour afficher la mire
		jmp		Pattern15k:Start

		; Palier de suppression arrière (Back Porch), suite
Pattern15k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		323				; Durée du palier arrière

		; Affichage des 8 barres colorées de la mire
		ColorBars	307				; Chaque barre occupe 307 µcycles

		; Palier de suppression avant (Front Porch)
		SetColor	Black,161-14			; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Pattern15k,Leading15k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
Pattern15k	SET		$
:Start		jmp		$+1				; Absorbtion de 3 µcycles
		clrb		SyncH				; Emission de l'impulsion SyncH
		Wait		238				; Durée de l'impulsion

		; Palier de suppression arrière (Back Porch)
		jmp		Pattern15k:Loop			; Rebouclage avec absorption de 3 µcycles

;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) **************

Leading15k	SET		$
:SetUp		PresetCount	13				; 4 µC, nombre de lignes allouées au blanking avant
		jmp		Leading15k:Start		; 3 µCycles
		
		; Palier de suppression arrière (Back Porch), suite
Leading15k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		323				; Durée du palier arrière

		; Blanking des lignes précédant l'impulsion de synchronisation trame
		; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop
		; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor××k:SetUp)
		SetColor	Black,2456+161-34		; Contenu = niveau du noir + palier avant, minoré de 34 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Leading15k,MainLoop		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
		; Un délai supplémentaire de 20 µCycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14
Leading15k	SET		$
:Start		Delay		20,-3				; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1"
		clrb		SyncH				; Emission de l'impulsion SyncH
		Wait		238				; Durée de l'impulsion

		; Palier de suppression arrière (Back Porch)
		jmp		Leading15k:Loop			; Rebouclage avec absorption de 3 µcycles
		
;#######################################################################################################################################
;#######################################################################################################################################

		org		$0400

Start24k	EQU		$

;****************************** Impulsion de synchronisation trame ******************************

SyncHor24k	SET		$
:SetUp		PresetCount	4				; Nombre de lignes allouées à l'impulsion de synchronisation verticale
		jmp		SyncHor24k:Start

		; Palier de suppression arrière (Back Porch), suite
SyncHor24k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		222				; Durée du palier arrière

		; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame
		SetColor	Black,1536+142-14		; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	SyncHor24k,Lagging24k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
SyncHor24k	SET		$
:Start		mov		w,rb				; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
		clrb		wreg.0				; 1 µC, positionnement du bit affecté à la synchronisation horizontale
		clrb		wreg.1				; 1 µC, positionnement du bit affecté à la synchronisation verticale
		mov		rb,w				; 1 µC, émission de cette nouvel état
		Wait		150				; Durée de l'impulsion ligne

		; Palier de suppression arrière (Back Porch)
		jmp		SyncHor24k:Loop			; Rebouclage avec absorption de 3 µcycles

;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) **********

Lagging24k	SET		$
:SetUp		PresetCount	25				; Nombre de lignes allouées au blanking arrière
		jmp		Lagging24k:Start

		; Palier de suppression arrière(Back Porch),suite
Lagging24k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		222				; Durée du palier arrière

		; Blanking des lignes à la suite de l'impulsion de synchronisation trame
		SetColor	Black,1536+142-14		; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Lagging24k,Pattern24k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
Lagging24k	SET		$
:Start		mov		w,rb				; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
		clrb		wreg.0				; 1 µC, positionnement du bit affecté à la synchronisation horizontale
		setb		wreg.1				; 1 µC, effacement du bit affecté à la synchronisation verticale
		mov		rb,w				; 1 µC, émission de cet nouvel état
		Wait		150				; Durée de l'impulsion ligne

		; Palier de suppression arrière (Back Porch)
		jmp		Lagging24k:Loop			; Rebouclage avec absorption de 3 µcycles

;****************************** Affichage du motif de la mire ******************************

Pattern24k	SET		$
:SetUp		PresetCount	384				; Nombre de lignes allouées pour afficher la mire
		jmp		Pattern24k:Start

		; Palier de suppression arrière (Back Porch), suite
Pattern24k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		222				; Durée du palier arrière

		; Affichage des 8 barres colorées de la mire
		ColorBars	1536/8				; Chaque barre occupe 192 µcycles

		; Palier de suppression avant (Front Porch)
		SetColor	Black,142-14			; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Pattern24k,Leading24k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
Pattern24k	SET		$
:Start		jmp		$+1				; Absorbtion de 3 µcycles
		clrb		SyncH				; Emission de l'impulsion SyncH
		Wait		150				; Durée de l'impulsion

		; Palier de suppression arrière (Back Porch)
		jmp		Pattern24k:Loop			; Rebouclage avec absorption de 3 µcycles

;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) **************

Leading24k	SET		$
:SetUp		PresetCount	11				; Nombre de lignes allouées au blanking avant
		jmp		Leading24k:Start

		; Palier de suppression arrière (Back Porch), suite
Leading24k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		222				; Durée du palier arrière

		; Blanking des lignes précédant l'impulsion de synchronisation trame
		; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop
		; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor××k:SetUp)
		SetColor	Black,1536+142-34		; Contenu = niveau du noir + palier avant, minoré de 34 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Leading24k,MainLoop		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
		; Un délai supplémentaire de 20 µCycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14
Leading24k	SET		$
:Start		Delay		20,-3				; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1"
		clrb		SyncH				; Emission de l'impulsion SyncH
		Wait		150				; Durée de l'impulsion

		; Palier de suppression arrière (Back Porch)
		jmp		Leading24k:Loop			; Rebouclage avec absorption de 3 µcycles

;#######################################################################################################################################
;#######################################################################################################################################

		org		$0600

Start31k	EQU		$

;****************************** Impulsion de synchronisation trame ******************************

SyncHor31k	SET		$
:SetUp		PresetCount	3				; Nombre de lignes allouées à l'impulsion de synchronisation verticale
		jmp		SyncHor31k:Start

		; Palier de suppression arrière (Back Porch), suite
SyncHor31k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		161			; Durée du palier arrière

		; Blanking des lignes tout pendant la durée de l'impulsion de synchronisation trame
		SetColor	Black,1184+81-14		; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	SyncHor31k,Lagging31k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
SyncHor31k	SET		$
:Start		mov		w,rb				; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
		clrb		wreg.0				; 1 µC, positionnement du bit affecté à la synchronisation horizontale
		clrb		wreg.1				; 1 µC, positionnement du bit affecté à la synchronisation verticale
		mov		rb,w				; 1 µC, émission de cette nouvel état
		Wait		152				; Durée de l'impulsion ligne

		; Palier de suppression arrière (Back Porch)
		jmp		SyncHor31k:Loop			; Rebouclage avec absorption de 3 µcycles

;********** Champ à la suite de l'impulsion de synchronisation trame ( blanking arrière) **********

Lagging31k	SET		$
:SetUp		PresetCount	33				; Nombre de lignes allouées au blanking arrière
		jmp		Lagging31k:Start

		; Palier de suppression arrière(Back Porch),suite
Lagging31k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		161				; Durée du palier arrière

		; Blanking des lignes à la suite de l'impulsion de synchronisation trame
		SetColor	Black,1184+81-14		; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Lagging31k,Pattern31k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
Lagging31k	SET		$
:Start		mov		w,rb				; 1 µC, lecture du port RB, manipulation de bits sur W à partir de WREG
		clrb		wreg.0				; 1 µC, positionnement du bit affecté à la synchronisation horizontale
		setb		wreg.1				; 1 µC, effacement du bit affecté à la synchronisation verticale
		mov		rb,w				; 1 µC, émission de cet nouvel état
		Wait		152				; Durée de l'impulsion ligne

		; Palier de suppression arrière (Back Porch)
		jmp		Lagging31k:Loop			; Rebouclage avec absorption de 3 µcycles

;****************************** Affichage du motif de la mire ******************************

Pattern31k	SET		$
:SetUp		PresetCount	480				; Nombre de lignes allouées pour afficher la mire
		jmp		Pattern31k:Start

		; Palier de suppression arrière (Back Porch), suite
Pattern31k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		161				; Durée du palier arrière

		; Affichage des 8 barres colorées de la mire
		ColorBars	1184/8				; Chaque barre occupe 148 µcycles

		; Palier de suppression avant (Front Porch)
		SetColor	Black,81-14			; Contenu = niveau du noir + palier avant, minoré de 14 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Pattern31k,Leading31k		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
Pattern31k	SET		$
:Start		jmp		$+1				; Absorbtion de 3 µcycles
		clrb		SyncH				; Emission de l'impulsion SyncH
		Wait		152				; Durée de l'impulsion

		; Palier de suppression arrière (Back Porch)
		jmp		Pattern31k:Loop			; Rebouclage avec absorption de 3 µcycles

;************** Champ précédant l'impulsion de synchronisation trame (blanking avant) **************

Leading31k	SET		$
:SetUp		PresetCount	14				; Nombre de lignes allouées au blanking avant
		jmp		Leading31k:Start

		; Palier de suppression arrière (Back Porch), suite
Leading31k	SET		$
:Loop		setb		SyncH				; Effacement de l'impulsion de synchronisation horizontale
		Wait		161				; Durée du palier arrière

		; Blanking des lignes précédant l'impulsion de synchronisation trame
		; Le nombre de µcycles doit être minoré de 34 pour lire les micro-switches lors du rebouclage par MainLoop
		; 34 µcycles = 9 (NextLine) + 18 (MainLoop) + 7 (SyncHor××k:SetUp)
		SetColor	Black,1184+81-34		; Contenu = niveau du noir + palier avant, minoré de 34 µcycles

		; Décomptage des lignes du bloc en fin du palier de suppression avant (14 µcycles)
		NextLine	Leading31k,MainLoop		; Décomptage lignes et test si zéro

		; Impulsion de synchronisation horizontale
		; Un délai supplémentaire de 20 µCycles (34-14) doit être inséré car le test du compteur n'en a consommé que 14
Leading31k	SET		$
:Start		Delay		20,-3				; Délai majoré de 3 µcycles pour remplacer le conventionnel "jmp $+1"
		clrb		SyncH				; Emission de l'impulsion SyncH
		Wait		152				; Durée de l'impulsion

		; Palier de suppression arrière (Back Porch)
		jmp		Leading31k:Loop			; Rebouclage avec absorption de 3 µcycles

		END