CODINGApprendre pas à pas la programmation en assembleur Z80 par Roudoudou ★ Scrollings en folie! ★

Le split-screen en assembleur

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].

Roudoudou

★ ANNÉE: 2026
★ AUTEUR: Roudoudou

Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 461 millisecondes et consultée 15 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.