ATTRMOD EQU 77

INITVBI:
	lda VBIINIT
	cmp	#0
	beq initvbiok
	rts
initvbiok:
	lda	#1
	sta VBIINIT
        LDA #64
        ORA 54286
        STA 54286
        LDA #6
        LDX #VBLANK/256
        LDY #VBLANK&255
        JSR $E45C
        RTS

FINVBI:
        sec
        LDA 54286
        SBC #64
        STA 54286
        lda        #1
        sta        19300
        RTS

VBLANK:

// Compteur tempo pour ralentir la lecture
// du joystick, cela evite d'avoir une voiture
// qui traverse l'ecran en moins d'une seconde !
// Ca va vite un 800XL !!! 
        LDX TEMPO
        INX
        STX TEMPO
        CPX #2
        BNE SWAPPAGE
        
// Autoriser la gestion du joystick
        LDA #1
        STA STICKOK

// Reinitialise le compteur
        LDX #0
        STX TEMPO 

SWAPPAGE:
// Swapping des ecrans logique et physique
        lda        changepage
        cmp        #1
        bne WAITVBI

// Memorise e6 et e7
        lda        $e6
        pha
        lda        $e7
        pha

        lda        560
        sta        $e6
        lda        561
        sta        $e7
        ldy        #4

        lda        logique	/* L'ecran logique devient physique ! */
        sta        ($e6),y
        iny
        lda        logique+1
        sta        ($e6),y

        ldy        logique	// On memorise la nouvelle adresse de l'ecran physique dans les reg Y et X
        ldx        logique+1

        lda        physique     // On positionne le pointeur logique avec les valeurs de l'ancien ecran physique
        sta        logique
        lda        physique+1
        sta        logique+1
        
        sty        physique	// On positionne le pointeur physique avec les nouvelles valeurs de l'ecran physique
        stx        physique+1

        lda        #0		// On indique que le swapping est fait !
        sta        changepage
	sta	   syncVBI	// Si nous avions demande une synchro VBI en plus du changement logique physique, la synchro est faite !
	sta	   ATTRMOD	// On en profite pour desactiver le changement de couleur protection ecran !
        lda        #200
        sta        704
// Restaure e6 et e7
        pla
        sta        $e7
        pla        
        sta        $e6
	JMP $E45F

WAITVBI lda	   syncVBI	// Cet partie du code ne sert qui si l'on veut faire une synchro VBI.
	cmp	   #1		// Il n'y a aucune modification de pointeurs
	bne FINTRTVBI
	lda        #0
	sta	   syncVBI
FINTRTVBI:  
	
        JMP $E45F

VBIINIT  db 0
TEMPO   .DB 0
STICKOK .DB 0

logique db 0,0

physique db 0,0
                