CRTC 6845
2 juin 2024

Un scroll hardware en Basic

Par Claire CheshireCat

Cet article est paru pour la première fois dans le numéro 4 de l’excelllllent fanzine ùCPM. Le code fonctionne sur n’importe quel CRTC.

Dans le précédent numéro d’ùCPM, nous avons vu comment détecter le type de CRTC dont est équipé votre CPC. Si cela avait un intérêt théorique, en pratique on n’allait pas bien loin. Pour cette fois, nous allons faire scroller -Sans saccade, bien entendu- un logo à l’écran, et nous allons au passage effleurer quelques registres supplémentaires du CRTC6845. Le domaine est vaste : Des démos récentes utilisent les mêmes techniques de manière un peu plus poussées. Cet article constitue le premier orteil trempé dans le grand bain. Prenez vos bouées, vos lunettes de plongée, et partons à l’attaque !

Tout pour le CRTC

Ce composant électronique est le chef d’orchestre de l’affichage dans notre cher CPC. Il ne compte qu’en caractères mode 1. Pour lui, un écran standard ça n’est que 25 lignes de 40 caractères, dont il demande l’affichage de manière séquentielle. Avec le paramétrage au démarrage du CPC, le CRTC demandera les caractères en position 0 à 39 sur la première ligne texte, 40 à 79 sur la seconde, 80 à 119 sur la troisième, et ainsi de suite jusqu’à ce qu’il ait affiché le nombre de lignes qu’on lui a demandé.

Et si on veut afficher plus de caractères sur une ligne ? C’est le registre 1 qui s’en charge. Mais il y a subtilité : le CRTC va toujours commencer au même endroit de l’écran, ce qui entraîne que si le border à droite est supprimé pour laisser plus de place aux caractères, celui de gauche est toujours présent ! Cette fois c’est le registre 2 qui intervient : Il permet de décaler l’écran vers la gauche ou vers la droite. Sur le plan technique c’est un peu plus compliqué que ça. On en parlera une prochaine fois. Retenez juste que la valeur 46 est la valeur standard, et qu’augmenter cette valeur d’une unité décalera l’image d’un caractère vers la gauche. La diminuer entraînera un déplacement à droite. Les CRTC 2 apprécieront que vous modifiiez la valeur du registre 3 à 5, encore une fois pour des raisons techniques à voir une autre fois.

Pour finir, le CRTC fonctionne plutôt par pages de 1024 caractères (40 caractères de large x 25 lignes de haut ça fait 1000, ce qui explique la résolution texte de notre CPC). Comme on a décidé d’afficher un écran de 48 caractères de large, avec 25 lignes l’écran se répète : Quand il arrive à 1024 caractères, le CRTC repasse à zéro et on revoit donc le haut de l’image. Pour éviter cela on peut simplement demander au CRTC d’afficher moins de lignes : 1024/48=21,333. On mettra donc la valeur 21 dans le registre 6. Pour peaufiner, on utilise le registre 7 pour descendre un peu l’écran de manière à le centrer sur le moniteur. Le registre 7 est un peu l’équivalent du registre 4 en vertical : Sa valeur standard est 30, l’augmenter montera l’écran et la diminuer le descendra.

Pêchons les caractères

Le gros morceau du programme reste les registres 12 et 13 du CRTC : Mis ensemble, ils permettent d’indiquer au CRTC à quelle adresse de la mémoire il doit aller chercher les caractères. Malheureusement, c’est beaucoup moins simple qu’on aurait pu l’espérer : comme on a vu plus haut, le CRTC ne parle qu’en pages de 1024 caractères. 4 pages sont adressables avec ce composant : La première concerne la mémoire de 0 à 16383 (On ne peut rien y dessiner en Basic car c’est là qu’est hébergé le code), la suivante 16384 à 32767 (Celle-ci peut être utilisée si votre programme n’est pas trop grand), la troisième va de 32768 à 49151 et contient tous les appels système (On ne touche pas !), et pour finir, la quatrième va de 49152 à 65535, c’est la page écran standard dans votre CPC. Seuls les premiers 64K du CPC sont adressables par le CRTC : Même une extension mémoire de 2 Mo ne vous donnera pas accès à plus de mémoire vidéo.

Le petit blond à lunettes du fond va nous rétorquer qu’une page de 16 Ko contient 16384 octets et qu’un caractère c’est seulement 1 octet. Si on ne peut afficher que 1024 octets par page, à quoi servent les 15360 octets restants ? C’est là que les ingénieurs d’Amstrad ont été malins : Le CRTC ne compte bien qu’en caractères, mais le Gate Array se charge de décoder tout ça pour afficher l’intégralité des octets de la page. En gros, le CRTC lui dit « Là je veux que tu affiches la ligne n du caractère de l’adresse machin (Oui, un caractère fait plusieurs lignes vidéo) de la page truc », et le Gate Array transforme ces informations en une adresse mémoire où il ira chercher l’octet à afficher.

Pour indiquer la page et le caractère où commence l’écran (On appelle cela « Pointeur écran »), c’est relativement simple : Vous n’avez qu’à additionner le numéro de caractère (de 0 à 1023) à &3000 pour la page 3 (0 pour la page 0, &1000 pour la 1 et &2000 pour la 2). Vous obtenez un nombre 16 bits, sur deux octets. Celui de poids faible (nombre modulo 256) va dans le registre 13, celui de poids fort (nombre \ 256) a sa place dans le registre 12.

Dans notre programme de scroll on déplace le pointeur écran à chaque frame, ce qui a pour effet de déplacer l’image. C’est la variable « direction » qui permet de définir le déplacement. Je l’ai mise à 47 pour avoir un mouvement diagonal, mais on aurait pu mettre les valeurs 49,48, -47, -48, -49, -1, 0, 1… N’hésitez pas à tester des valeurs pour voir quels déplacements ils induisent.

Un petit mot sur la ligne 210, le « AND &7FF » permet simplement de s’assurer qu’on aura toujours un déplacement inférieur à 1024 qui, on on l’a vu, est la limite maximale sur une page.

Les lignes 90 à 110 permettent de convertir des coordonnées du « mode 48 colonnes » en coordonnées 40 colonnes, qui est le seul que le Basic du CPC comprenne.

Plaintext
10 DEFINT a-z
20 BORDER 13
30 MODE 1
40 ' Affichage du logo "|cpm" en grande taille
50 PRINT"|CPM"
60 FOR y=6 TO 0 STEP -1
70 FOR x=31 TO 0 STEP -1
80 color=TEST(x*2,399-y*2)
90 addr=x+y*48
100 y2=addr\40
110 x2=addr MOD 40
120 LOCATE x2+1,y2+1:PAPER color:PRINT" "
130 NEXT:NEXT
140 OUT &BC00,1:OUT &BD00,48 ' 48 caracteres mode 1 de largeur au lieu de 40
150 OUT &BC00,3:OUT &BD00,5 ' Adaptation CRTC 2
160 OUT &BC00,6:OUT &BD00,21 ' 21 caracteres en vertical au lieu de 25
170 OUT &BC00,2:OUT &BD00,50 ' On cale l'ecran bien a gauche
180 OUT &BC00,7:OUT &BD00,28
190 ' MOUVEMENT
200 direction=-47
210 crtcaddr=((crtcaddr+direction) AND &7FF) + &3000
220 reg12=crtcaddr\256
230 reg13=crtcaddr MOD 256
240 FRAME
250 OUT &BC00,12:OUT &BD00,reg12
260 OUT &BC00,13:OUT &BD00,reg13
270 IF INKEY$="" THEN 210
280 'CALL &BB18
290 OUT &BC00,1:OUT &BD00,40
300 OUT &BC00,2:OUT &BD00,46
310 OUT &BC00,6:OUT &BD00,25
320 OUT &BC00,7:OUT &BD00,30

Pour le DSK, cliquez ici !

Edit : À peine l’article sorti, Siko me transmet des liens vers des articles antédiluviens qui présentent le même genre de programme ! Entre 1985 et 2024 on n’a pas inventé grand chose.

Le listing suivant est paru dans le Popular Computing Weekly du 26 Septembre 1985. La méthode employée est différente de celle que j’utilise et va sûrement causer des soucis aux moniteurs LCDs.

Vous pouvez télécharger l’article complet en PDF