CODINGLA BIBLE DU CPC 6128

La bible du CPC 6128 : 1.06.00 La Ram vidéo entre Z80 et 6845

Essayez maintenant ce petit programme sur le CPC:

10 MODE 2
20 FOR i=&c000 TO &ffff
30 POKE i,255
40 NEXT i

Vous obtenez sur l'écran une ligne étroite qui est rapidement dessinée vers la droite à partir de l'angle supérieur gauche de l'écran. A la fin de la première ligne, le dessin se poursuit exactement 8 lignes plus bas.
Une fois dessinées ces lignes étroites sur toute la surface de l'écran, le dessin reprend d'en haut mais en dessous des lignes déjà dessinées. Essayez le programme également en mode 1 et en mode 0. Puis modifiez aussi la ligne 30 ainsi:

30 POKE i,1

Vous obtenez maintenant une ligne de points qui remplit l'écran verticalement.
Lorsque le programme tourne en mode 2, on voit que les lignes verticales se trouvent sur le côté droit des caractères. En mode 1, nous obtenons 2 lignes verticales par caractère, en mode 0, 4 lignes.

Nous allons maintenant apporter une dernière modification au programme. Supprimez la ligne 10 du programme et entrez 'MODE 2' en mode direct. L'écran se vide et Ready apparaît dans l'angle supérieur gauche. Appuyez sur la touche de curseur BAS, jusqu'à ce que le message Ready disparaisse de l'écran. Le curseur se trouve maintenant dans la dernière ligne de l'écran. Faites à nouveau tourner le programme.

Le résultat est quelque peu agaçant.
Ce petit programme nous a révélé plusieurs choses importantes d'un seul coup. D'abord nous avons démontré que la mémoire écran commence en &C000 et finit en &FFFF. Curieusement, la taille de la mémoire écran est la même pour les trois modes écran. La seule différence entre les modes réside dans les couleurs.
Cependant on peut se demander à quoi servent 16 K de mémoire écran en mode 0, lorsqu'on ne représente que 20 caractères par ligne. 20 caractères par 25 lignes font 500 caractères sur l'écran. Pourquoi le CPC a-t-il besoin de 16384 cases mémoire pour représenter à l'écran ces 500 caractères?
La réponse est simple. Comme nous l'avons déjà indiqué, le CPC ne possède pas de Ram vidéo dans laquelle chaque caractère serait stocké dans un octet.
En mode 80 colonnes, un caractère sur l'écran occupe 8 octets, en 40 colonnes, un caractère occupe 16 octets et 32 octets en mode 20 colonnes. Cest d'ailleurs ce que montrait le programme qui produisait les lignes verticales.
Le mode 80 colonnes est à cet égard le plus simple à comprendre, puisque chaque bit mis produit un point dans la couleur actuelle d'écriture (pen). Si un bit n'est pas mis, c'est au contraire la couleur du fond de l'écran qui apparaît à cet endroit. Comme en mode 2, il n'y a qu'une couleur d'écriture possible, il n'y a pas d'autres possibilités.
Mais à quoi servent donc en mode 0 les 32 octets nécessaires pour un caractère?
Le fonctionnement des modes 0 et 1 n'est plus aussi simple à expliquer. Nous vous conseillons de taper le petit programme suivant et d'avoir sous les yeux les effets de ce programme, pendant que vous lirez nos explications. Les explications seront alors plus compréhensibles.

10 MODE 2
20 REM
30 PRINT "A"
40 FOR adresse=&c000 TO &f800 STEP &800
50 p$=BIN$(PEEK(adresse),8)
60 FOR 1=1 TO 8
70 IF MID$(p$,I,1)="l" THEN PRINT "X"; ELSE PRINT ".";
80 NEXT I
90 PRINT
100 NEXT adresse

Faites tourner ce programme et vous obtiendrez une image correspondant à la matrice de 'A'.
Modifiez maintenant l'instruction MODE de la ligne 10 en MODE 1 et faites tourner le programme. Le résultat est assez surprenant. Vous pouviez vous imaginer que seule une moitié de la matrice figurerait dans les octets lus. Mais il semble curieux a priori que la matrice n'utilise qu'une moitié d'octet, soient les bits 4 à 7.
Mais nous nous rapprochons de la solution de cet énigme, lorsque vous modifiez ainsi la ligne 20:

20 PEN 2

Non seulement la couleur d'écriture (PEN) s'est modifiée, mais la carte bits montrée par notre programme s'est aussi modifiée. Et voilà la solution de notre problème!
Si vous connaissez déjà le CPC, vous savez qu'en mode 40 colonnes, 4 couleurs sont possibles. Ces 4 couleurs sont tout simplement stockées avec le caractère lui-même. En effet 4 bits seulement déterminent les pixels (points de l'écran) allumés et les quartets low et high décident des couleurs (un quartet=un demi-octet, 4 bits). Avec le principe utilisé, le gâte array n'a qu'à doubler horizontalement les pixels correspondant à l'affichage, représentant ainsi 8 points, alors que seuls 4 bits sont stockés en mémoire.

En mode 0, pour représenter 20 caractères par ligne, cette méthode est encore étendue. Il n'y a plus ici que deux bits qui contiennent les informations sur les pixels. La position de ces deux pixels à l'intérieur de l'octet détermine la couleur dans laquelle ces pixels doivent être représentés. Il y a ainsi 16 combinaisons possibles, ce qui correspond exactement au nombre de couleurs disponibles. Comme seulement deux pixels sont stockés dans un octet, 4 x 8 = 32 octets sont nécessaires pour représenter un caractère avec 16 couleurs différentes possibles.

Essayez à nouveau le programme en mode 0 en utilisant différentes valeurs pour l'instruction PEN. Vous comprendrez vite le fonctionnement.
Les deux premiers points soulevés au début du chapitre sont ainsi éclaircis. Reste cependant le point du 'décalage' de la Ram écran. Ce problème a sa source dans l'électronique du CPC.
Même un Z80 avec une fréquence d'horloge de 4 MHz a besoin d'un certain temps pour décaler un bloc de données de 16 K. Par exemple, pour éviter d'avoir à décaler de 640 cases mémoire, lors du listage d'un programme assez long, la totalité de la zone de Ram vidéo, on a utilisé une propriété du CRTC. Par programmation adéquate des registres 12 et 13 du 6845, l'écran peut commencer pratiquement en n'importe quelle case mémoire paire de la Ram vidéo. Le scrolling (défilement de l'écran) peut ainsi se produire nettement plus vite, puisqu'il suffit de fournir les valeurs adéquates aux registres qui conviennent. La nouvelle ligne dans le bord inférieur de l'écran est vite effacée et remplacée par les nouveaux caractères.
Il n'est pas possible de faire commencer la Ram vidéo à une adresse impaire, par exemple en &C001, du fait de l'utilisation décrite plus haut du signal CCLK. comme bit d'adresse.
Le programme suivant montre qu'il est possible de manipuler les registres décrits, même en Basic:

10 adrreg = &bc00 : REM registre d'adresse du 6845
20 datreg = &bd00 : REM port du registre de donnée
30 OUT adrreg, 13 : REM sélectionner le registre
40 FOR offset = 1 TO 40
50 OUT datreg,offset : REM modifier 40 fois
60 for attendre = 1 TO 40 : REM et attendre un peu
70 NEXT attendre,offset

Ce programme réalise un scrolling horizontal de l'écran. Sans la boucle de temporisation, le scrolling se déroulerait tellement vite qu'il ne serait pas possible de suivre avec un œil humain.

Le scrolling vertical peut également être programmé en Basic. Il faut alors modifier les deux registres low-byte et high-byte. Mais comme il s'écoule beaucoup de temps entre les deux instructions OUT, on obtient des phénomènes désagréables à l'écran.
Mais, en ce qui concerne la Ram vidéo, il faut encore relever une particularité.
Multiplions les valeurs que nous connaissons entre elles.
En mode 2, un caractère se compose de 8 octets. Il y a 80 caractères par ligne et 25 lignes sur l'écran. La place occupée en mémoire est donc de 80 x 25 x 8 = 16000 octets. Mais une zone de 16 K comporte 2 puissance 14 = 16384 emplacements. Où sont les 384 octets manquants?

Très simple. Ils ne servent à rien, du moins tant qu'il n'y a pas de scrolling de l'écran.

Il est donc possible de placer ici des valeurs à stocker provisoirement. Ces valeurs seront cependant effacées par la première instruction CLS.

Vous vous demandez certainement comment il est donc possible de programmer du graphisme avec une organisation aussi compliquée de la mémoire écran.
Il semble également impossible de lire un caractère à partir de l'écran. Sur d'autres ordinateurs, cela ne pose pas de problème, puisqu'on peut placer un caractère sur l'écran avec POKE et qu'on peut donc lire le contenu de la Ram vidéo avec PEEK.
D'autre part il est normalement assuré que la Ram vidéo commence à une adresse déterminée.
Les choses ne se présentent cependant pas aussi mal que cela peut sembler au premier abord. Le système d'exploitation est en effet en mesure de discerner les adresses de début modifiables ou de déterminer un caractère à partir de la matrice de l'écran, comme cela se produit chaque fois que vous utilisez la touche COPY. Les routines utilisées à cet effet peuvent également être employées dans des programmes en langage-machine que vous aurez réalisés vous-même.
Vous retrouverez bon nombre de ces routines du système d'exploitation dans un prochain chapitre. Nous vous montrons concrètement comment utiliser le graphisme dans un exemple de dessin de rectangles et dans un programme de hardcopy graphique.

★ ANNÉE: ???

Page précédente : La bible du CPC 6128 : 1.05.01 Les 64 K supplémentaires du 6128
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.7-desktop/c
Page créée en 343 millisecondes et consultée 1372 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.