HD63B45P
20 mai 2024

Des splitscreens en BASIC sur CRTC5

Par Claire CheshireCat

Ça fait déjà plusieurs articles que je vous parle du CRTC5. Il est temps qu’on voie ensemble comment profiter des fonctionnalités supplémentaires du composant. Si vous avez bidouillé un peu le CPC, ou regardé des démos, vous avez sûrement déjà entendu parler de split screens. C’est une technique qui permet de modifier l’adresse des données affichées à l’écran en cours d’affichage. C’est une méthode qu’utilisent les demomakers pour déplacer de grosses portions d’écran de manière fluide. Overflow en a fait une belle utilisation dans sa démo « Shadow of the Beast ».

Si vous avez déjà joué avec le CRTC en Basic, vous devez savoir qu’on peut définir l’adresse de l’écran via les registres 12 et 13 du chip graphique du CPC. Pour faire simple, je dirais simplement que l’écran « normal » du CPC est à l’adresse &3000 du point de vue du CRTC. Un deuxième écran est accessible à partir du Basic à l’adresse &1000. Le Compendium de Longshot explique tout en détails dans sa partie concernant le pointeur vidéo. Pour les besoins de notre programme, vous avez juste besoin de savoir que l’adresse &1000 du CRTC correspond à l’écran disponible en RAM en &4000 sur le CPC, et que l’adresse CRTC &3000 désigne l’écran normal en &C000. Si on veut afficher l’écran en &4000 il suffit de faire un « out &bc00,12:out &bd00,&10:out &bc00,13:out &bd00,&00 ». Le registre 12 reçoit ainsi les deux premiers chiffres de « &1000 » et le registre 13, les deux derniers.

Le CRTC5 permet de changer cette adresse 3 fois en cours d’affichage, c’est à dire qu’il permet d’afficher 4 pages écran à l’image. Il utilise pour cela les registres 19 et 20, 22 et 23, 25 et 26. Ils fonctionnent exactement de la même manière que les registres 12 et 13.

C’est bien beau de pouvoir changer les adresses d’affichage de l’écran en cours de route, mais comment indiquer au CRTC à quel endroit les changements opèrent ? C’est là que les registres 18,21 et 24 entrent en jeu : il suffit d’y noter à partir de quelle ligne de texte le changement d’écran à lieu. Dans le cas courant ont peu donc y mettre une valeur entre 0 et 24.

Pour finir, il reste un registre à modifier : Le 30 ! Ce dernier fait office d’interrupteur pour beaucoup de fonctionnalités. Pour celles qui nous intéressent, lorsqu’on le met à zéro (Cas par défaut) seul l’écran défini par les registres 12 et 13 est pris en compte. À 1 le premier split screen est utilisé, 2 lui permet de prendre en compte les deux premiers splits, et 3 affiche la totale.

Le programme Basic que je vous propose se contente de faire scroller les écrans en modifiant les registres 18, 21 et 24. Il est, je crois, suffisamment commenté pour être compréhensible.

Plaintext
10 MEMORY &3FFF
20 ' Detection CRTC
30 OUT &BC00,12:a=SGN(INP(&BF00)):OUT &BC00,52:b=SGN(INP(&BF00)):OUT &BC00,44:c=SGN(INP(&BF00)):OUT &BC00,31:d=SGN(INP(&BF00)):crtc=(2-d)*(1-a)+(4*b+(1-c)*(1-b)*5)*a:IF crtc=5 THEN 50
40 PRINT"Ce programme ne fonctionne":PRINT"que sur CRTC 5.":END
50 PRINT"CRTC 5 detecte"
60 ' Une petite tempo d'une seconde, le temps qu'on voie que le CRTC 5 est bien detecte
70 FOR x=1 TO 50:FRAME:NEXT
80 ' Si l'utilisateur sort du programme par un appui sur la touche break, on va vers un sous programme qui remet les parametres par defaut
90 ON BREAK GOSUB 330
100 MODE 1:INK 0,0:INK 1,6:INK 2,15:INK 3,24:PAPER 0:PEN 1
110 LOAD"dragon.scr",&C000
120 LOAD"rambo3.scr",&4000
130 ' on parametre tous les split screens pour qu'ils demarrent en 25, c'est a dire hors de l'ecran affichable
140 OUT &BC00,18:OUT &BD00,25:OUT &BC00,21:OUT &BD00,25:OUT &BC00,24:OUT &BD00,25
150 ' On veut afficher les 3 splitscreen
160 OUT &BC00,30:OUT &BD00,3
170 ' On definit les adresses memoire de debut de chacun des splitscreen : &10 pour &4000, &30 pour &c000.
180 OUT &BC00,19:OUT &BD00,&10:OUT &BC00,20:OUT &BD00,0
190 OUT &BC00,22:OUT &BD00,&30:OUT &BC00,23:OUT &BD00,0
200 OUT &BC00,25:OUT &BD00,&10:OUT &BC00,26:OUT &BD00,0
210 OUT &BC00,20:OUT &BD00,0
220 ' On anime !
230 FOR y=0 TO 2
240 FOR x=23 TO y STEP -1:FRAME:OUT &BC00,18+y*3:OUT &BD00,x:NEXT
250 NEXT
260 CALL &BB18
270 FOR y=2 TO 0 STEP -1
280 FOR x=y TO 24:FRAME:OUT &BC00,18+y*3:OUT &BD00,x:NEXT
290 NEXT
300 GOTO 230
310 '
320 'On remet une config normale
330 FOR x=18 TO 39:OUT &BC00,x:OUT &BD00,0:NEXT
340 CALL &BC06,&C0
350 PAPER 0:PEN 1

… Et si vous êtes l’heureux possesseur d’un CRTC5, le programme vous affichera l’animation suivante :

Le possibilités offertes par ces seules fonctionnalités sont assez énormes. On pourrait imaginer utiliser en Basic un écran de 34 lignes de haut, sur 40 caractères de large. Voir même un écran en fullscreen. On pourrait imaginer aussi un jeu type Pong, où les raquettes seraient stockées dans une partie d’écran qu’on afficherait avec un split (Pas de limite dans la taille de la raquette ou son graphisme). Un outil de dessin pourrait afficher l’image complète à l’écran et afficher également un menu au dessus ou en dessus du graphe… Et on n’a effleuré qu’une partie des nouvelles possibilités offertes par ce CRTC !

Je crois que ce composant va m’occuper un moment…