Revenir au plan du site
La ruptuuuuure, faut qu'on la faaaaassssseeee....!
suite de l'article [Rupture stable en Basic]

Comment coller nos deux écrans proprement?


Pour rappel, voici nos réglages de départ


Le rôle du registre R6


Le registre R6 indique le nombre de blocs de données à afficher. Contrairement au registre 4, il n'y a pas de -1 qui tienne. Si on demande 25 blocs, on en a 25. Donc, pour afficher 19 blocs dans la première zone, il suffit d'en demander 19. Simple, basique.

Et pour faire disparaitre notre VBL pendant l'affichage du premier bloc, nous lui donnerons une position impossible en réglant R7 à 255, puis R7 à la valeur qui nous intéresse, à savoir 11. Tant que nous y sommes, on ajustera la valeur de R4 de la seconde zone pour avoir un total de blocs à 39 et retrouver notre 50Hz parfait.

Comment se synchroniser pour les changements de registres ?


Élément très important pour ne pas faire n'importe quoi au mauvais moment, nous allons utiliser les interruptions et c'est là qu'on retrouve l'important d'avoir un bel écran à 50Hz. C'est que nous savons aussi comment vont se comporter nos interruptions (toutes les 52 lignes...).

Si je règle le registre 6 à 19, je vois qu'une interruption a lieu deux blocs avant la fin de mon premier groupe de blocs. Je vais m'en servir.


Comment savoir que l'interruption est la bonne ?


Contrairement au Plus et l'interruption raster, il n'y a pas de possibilité directe de savoir où se déclenche l'interruption. Il faut compter. Compter, ok, mais à partir de quand? Quoi?

On va d'abord se synchroniser sur la VBL, code presque classique. Pour s'assurer d'être au début de la VBL, nous testons d'abord la non présence de la VBL.
NoVBL
ld b,#F5
.loop in a,(c) : rra : jr c,.loop
VBL
in a,(c) : rra : jr nc,VBL

Nous sommes au début de la VBL, on compte sur le dessin, 4 visibles plus celle de la VBL, on attends 5 fois et on changer le background pour vérifier.
buildsna : bankset 0
org #100 : run #100

ld sp,#100 : ld hl,#C9FB : ld (#38),hl : ei ; init pile+INT

ld bc,#BC06 : out (c),c : ld bc,#BD00+19 : out (c),c

ld bc,#7F10 : out (c),c : ld a,#55 : out (c),a ; border en bleu vif
out (c),0 ; sélectionner le papier écran
ld hl,#4443 ; bleu marine / jaune pastel

novbl ld b,#F5
.vbl in a,(c) : rra : jr nc,.vbl
.novbl in a,(c) : rra : jr c,.novbl

mainLoop
halt : halt : halt : halt
ld b,#7F : out (c),l : ld b,10 : djnz $ : ld b,#7F : out (c),h
halt : halt
jr mainLoop

Nous sommes "bien" placés. Bien entre guillemets parce qu'il va falloir attendre un peu.


La première salve de changement se fera sur la deuxième interruption visible de l'écran :
- désactiver la VBL
- spécifier la taille de l'écran visible
- spécifier le nombre de blocs au total pour couper l'écran

La deuxième salve peu après notre trait jaune pour ne pas modifier les valeurs critiques avant d'avoir commencé notre deuxième écran :
- activer la VBL en position 11 (soit la même position qu'un écran standard)
- racourcir le deuxième écran visible (pour éviter qu'il rebique tout en haut)
- augmenter légèrement le nombre de blocs total pour être exactement comme un écran standard à 39 blocs

Il vous faudra télécharger une [image de ma chatte] pour pouvoir assembler ce source.
buildsna : bankset 0
org #100 : run #100

ld sp,#100 : ld hl,#C9FB : ld (#38),hl : ei ; init pile+INT

ld bc,#BC06 : out (c),c : ld bc,#BD00+19 : out (c),c

ld bc,#7F00 : out (c),c : ld a,#54 : out (c),a
ld bc,#7F01 : out (c),c : ld a,#4E : out (c),a
ld bc,#7F02 : out (c),c : ld a,#43 : out (c),a
ld bc,#7F03 : out (c),c : ld a,#4B : out (c),a

novbl ld b,#F5
.vbl in a,(c) : rra : jr nc,.vbl
.novbl in a,(c) : rra : jr c,.novbl
ld b,0 : djnz $

mainLoop
halt : halt
ld bc,#BC07 : out (c),c : ld bc,#BD00+255 : out (c),c ; desactiver la VBL
ld bc,#BC06 : out (c),c : ld bc,#BD00+19 : out (c),c ; notre écran visible fait 19 blocs
ld bc,#BC04 : out (c),c : ld bc,#BD00+18 : out (c),c ; notre écran "complet" fait 19 blocs (R4=19-1)

halt : halt : halt
; attendre 16 lignes soit 16x64 nops ou 4x256 nops, le DJNZ qui saute prend 4 nops
ld b,0 : djnz $
ld bc,#BC07 : out (c),c : ld bc,#BD00+11 : out (c),c ; activer la VBL à l'emplacement standard
ld bc,#BC06 : out (c),c : ld bc,#BD00+8 : out (c),c ; on raccourci le deuxième écran visible
ld bc,#BC04 : out (c),c : ld bc,#BD00+19 : out (c),c ; le deuxième écran "complet" fait 20 blocs pour avoir 39 au total
halt
jr mainLoop

teucha defb #54,#4E,#43,#4B

org #C000 : incbin 'teucha.bin' ; petite image

Notre dessin (qui fait exprès 152 lignes soit 19 blocs de 8 lignes) se répète. L'écran est stable à 312 lignes.


Pour afficher autre chose dans le deuxième écran, regardons ce qu'on peut faire dans [l'article suivant].