— Basé sur l'article publié dans Quasar CPC numéro 9, Demomaking, par Zik.
Même si le hasard des calendiers de sortie fit que cette technique fût dévoilée en avant-première dans Quasar CPC numéro 9, l'honneur en revient à Memory. C'est en effet lui qui pensa le premier cet effet et le dévoila sous forme de preview lors du Bordelik Meeting 4 ; il est d'ailleurs utilisé dans sa partie de la démo du Bordelik Meeting 4 sortie quelques temps après. C'est en fait une extension des rasters parallaxes : deux successions de rouleaux se meuvent et s'entrecroisent. Je vous invite à regarder les petites vidéos ci-dessous pour mieux vous rendre compte du résultat.
Sachez tout d'abord que cet article est étroitement lié à la rubrique sur la rupture ligne-à-ligne ; le but de cet article est en effet de vous montrer une des nombreuses applications de la rupture ligne-à-ligne. Je précise par ailleurs que, pour vous éviter un effort intellectuel supplémentaire, j'ai repris exactement la même rupture que celle de l'exemple de ladite rubrique, à savoir : 6 caractères de rupture classique puis 224 lignes de rupture ligne-à-ligne, et enfin le reste de l'écran en rupture classique. Je vous conseille de lire l'autre rubrique avant de vous attaquer à celle-ci : je n'expliquerai pas la rupture !
Voilà le principe : on affiche 2 rouleaux (ou plus si vous voulez) à chaque ligne de la rupture à des positions définies par deux tables (une pour chaque rouleau) dont on incrémente le pointeur à chaque ligne. On incrémente ensuite à chaque synchro écran les pointeurs des tables pour avoir un mouvement.
Côté programme, ça donne quoi ? Eh bien c'est très simple (et si !). Mes deux pointeurs de table de mouvement sont IX et IY ; à ces mots j'en vois certains qui commencent à me regarder de travers ! Et je leur rétorque aussitôt que j'ai délibérément choisi IX et IY pour pouvoir optimiser mon programme en vitesse ! Eh oui, il ne faut pas dédaigner ces registres parce-qu'ils sont lents, ils sont aussi très pratiques et utiles (la preuve !). Donc je vais vous parler de la boucle d'affichage (label Boucle
) ; les registres IX et IY pointent sur les tables précalculées par le programme BASIC (on verra ça plus tard) alors que les autres registres contiennent des valeurs suspectes.
B contient le nombre de lignes à traiter, D, E, A et C contiennent des valeurs correspondant au sprite du premier rouleau (c'est simplement une histoire d'optimisation) et H contient l'octet de poids fort de l'adresse où afficher : le même &C0
que dans &C000
si vous voyez ce que je veux dire. En faisant un LD L,(IX)
et plus loin INC IX
, je prends la position (à l'octet) où afficher et j'incrémente le pointeur. La combinaison H-L forme donc directement l'adresse vidéo où afficher ce dont se chargent les LD (HL),reg ou valeur
+ INC L
et non pas INC HL
; puisque l'on n'affiche que sur une ligne (96 octets de large ici) L ne déborde pas : H n'est jamais modifié.
La rupture faisant 224 ligne et Boucle
ne prenant qu'un nombre de lignes égal à Hauteur
, il faut attendre jusqu'à la fin d'où une petite boucle Loop3
et son LD B,224-hauteur
.
Dernier détail : l'ensemble de ces deux boucles est sous DI
pour éviter qu'une méchante interruption ne viennent nous perturber.
Parlons maintenant de la mise à jour des pointeurs IX et IY. Cela se passe en Plot1
et Plot2
en paralèle avec Compt1
et Compt2
. En fait, ces deux derniers comptent le numéro de la position dans les tables, on fait ensuite quelques comparaisons et l'on remet compteur et pointeur au départ si l'on arrive à la fin de la table correspondante ; sinon, on se contente de les incrémenter.
Horreur ! Et si mon pointeur est à une dizaine de valeurs de la fin de la table alors que je m'apprête à afficher une centaine de lignes, ma boucle va aller au-delà de la table ! Pour éviter ça, on ajoute à la fin des tables une copie du début sur une longueur égale à Hauteur
(les deux LDIR
dans l'initialisation), facile !
Bon, amusez vous bien avec ça !
1 ' 2 ' Programme de création des tables 3 ' Quasar CPC / Zik 1995 4 ' 5 MEMORY &7FFF 10 BORDER 0:INK 0,0 11 FOR c=2 TO 9 12 READ e:INK c,e 13 NEXT 14 DATA 3,6,15,24,4,8,17,26 15 ' 16 MODE 2 17 a=36864:b=-0.2:n=52:x=0 18 DEG 19 FOR ang=0 TO 359 STEP 2 20 n=n+b 21 valeur=(SIN(ang)*COS(ang)+1)*n 22 POKE a,valeur 23 PLOT x,valeur*2 24 IF ang=180 THEN b=-b 25 a=a+1:x=x+1 26 NEXT 27 PRINT:PRINT"Nombre de valeurs : ";x 28 CALL &BB18 29 CLS 30 x=0 31 a=&9800 32 FOR ang=-90 TO 629 STEP 6 33 valeur=(SIN(ang)+1)*23+46 34 POKE a,valeur 35 PLOT x,valeur*2 36 a=a+1:x=x+1 37 NEXT 38 FOR ang=90 TO 809 STEP 6 39 valeur=(SIN(ang)+1)*23 40 POKE a,valeur 41 PLOT x,valeur*2 42 a=a+1:x=x+1 43 NEXT 44 PRINT:PRINT"Nombre de valeurs : ";x 45 PRINT"Les tables sont prêtes !"
Télécharger le listing au format Maxam 1.5
; ; Exemple de gestion de ; rupture ligne-à-ligne ; par Zik ; pour ; Quasar CPC numéro 9 ; d'après une idée de Memory ; Table1 Equ &9000 ; On doit réserver après chaque table Table2 Equ &9800 ; autant d'octets que la hauteur de l'effet LTab1 Equ 180 ; Nombre d'octets de Table1 LTab2 Equ 240 ; Nombre d'octets de Table2 Hauteur Equ 150 ; Nombre de lignes de l'effet HLTab1 Equ ltab1/256 ; Poids fort de LTab1 LLTab1 Equ -hltab1*256+ltab1 ; Poids faible de LTab1 HLTab2 Equ ltab2/256 ; idem LLTab2 Equ -hltab2*256+ltab2 ; idem Org &8000 Limit &8fff ; Pour Maxam Nolist ; idem ; ; Initialisations ; (CRTC, interruptions et tables) ; xor a call &bc0e ; MODE 0 ld de,table1+ltab1 ld hl,table1 ld bc,hauteur ldir ld de,table2+ltab2 ld hl,table2 ld bc,hauteur ldir ld bc,&bc01 out (c),c ld bc,&bd00+48 out (c),c ld bc,&bc02 out (c),c ld bc,&bd00+50 out (c),c di ld hl,(&38) ld (inter+1),hl ld hl,&c9fb ld (&38),hl ei ; ; Programme principal ; Prog ld b,&f5 Synchro in a,(c) rra jr nc,synchro ld b,255 Loop djnz loop ld bc,&bc07 out (c),c ld bc,&bdff out (c),c ld bc,&bc04 out (c),c ld bc,&bd06 out (c),c ld de,&c001 ld hl,&c000 ld bc,48*2-1 ld (hl),0 ldir ; Effaçage de la ligne Plot1 ld ix,table1 inc ix Compt1 ld hl,0 inc hl ld a,h cp hltab1 jr nz,suite1 ld a,l cp lltab1 jr nz,suite1 ld ix,table1 ld hl,0 Suite1 ld (compt1+1),hl ld (plot1+2),ix Plot2 ld iy,table2 inc iy Compt2 ld hl,0 inc hl ld a,h cp hltab2 jr nz,suite2 ld a,l cp lltab2 jr nz,suite2 ld iy,table2 ld hl,0 Suite2 ld (compt2+1),hl ld (plot2+2),iy halt ld b,3 ; Adaptation CRTC (mettre 2 sur CRTC 1) Loop1 ds 60 djnz loop1 ld bc,&bc04 out (c),c ld bc,&bd00 out (c),c ld bc,&bc09 out (c),c ld bc,&bd00 out (c),c di ld de,76*256+112 ld a,176 ld bc,hauteur*256+140 ld h,&c0 Boucle ld l,(ix) ; 5 ld (hl),d ; 2 inc l ; 1 ld (hl),e ; 2 inc l ; 1 ld (hl),a ; 2 inc l ; 1 ld (hl),c ; 2 inc ix ; 3 ld l,(iy) ; 5 ld (hl),124 ; 3 inc l ; 1 ld (hl),67 ; 3 inc l ; 1 ld (hl),131 ; 3 inc l ; 1 ld (hl),188 ; 3 inc iy ; 3 ds 18 djnz boucle ; 4/3 ld b,224-hauteur Loop3 ds 60 djnz loop3 ei ld bc,&bc09 out (c),c ld bc,&bd07 out (c),c ds 63 ld bc,&bc04 out (c),c ld bc,&bd03 out (c),c ld b,8 Loop4 ds 60 djnz loop4 ld bc,&bc07 out (c),c ld bc,&bd00 out (c),c ; ; Test clavier ; ld bc,&f40e out (c),c ld bc,&f6c0 out (c),c xor a out (c),a ld bc,&f792 out (c),c ld bc,&f645 out (c),c ld b,&f4 in a,(c) ld bc,&f782 out (c),c ld bc,&f600 out (c),c rla jp c,prog ; ; Retour ; ld bc,&bc07 out (c),c ld bc,&bd00+30 out (c),c ld bc,&bc04 out (c),c ld bc,&bd00+38 out (c),c ld bc,&bc02 out (c),c ld bc,&bd00+46 out (c),c ld bc,&bc01 out (c),c ld bc,&bd00+40 out (c),c di Inter ld hl,0 ld (&38),hl ei ld a,2 call &bc0e ret
Listing
Vidéo de ce que produit le listing donné précédemment. |
Noice / Bordelik Meeting IV
Première apparition de l'effet sur CPC dans la démo Noice du groupe TAF. |