Table des matières

Retourner au sommaire

Aurore boréale

Basé sur l'article publié dans Quasar CPC numéro 9, Demomaking, par Zik.

Wow ! Ça bouuuuge ! 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.

Avant-propos

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 !

Le principe

Avec un peu d'imagination vous pourrez voir une aur... hum, non, y'a rien à voir ici. 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.

Le programme

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.

Gestion des tables

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 !

Listings

Génération des tables

Télécharger le listing BASIC.

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 !"

Routine de l'effet

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

Vidéos de l'effet

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.