CODING ★ PROGRAMMATION INITIATION - La mémoire écran ★

Au Vouleur!!!|Micro Mag)Ali Gator - 04 La mémoire écran|Micro-Mag)

Douzième leçon (comme le temps passe)! Vous voici fin prêts pour réaliser le logiciel du siècle. Quelques notions sur la Ram s'imposent.

Votre CPC est un 8 bits. En d'autres termes, il est capable d'adresser 256 x 256 = 65536 octets soit 64 ko. Quoi! On vous l'a vendu pour un 128 ko... Vous vous êtes fait rouler. En fait, les 6128 disposent de 64 ko adressables directement et de 64 ko pouvant servir d'espace de stockage, à condition de maîtriser les instructions du Bankmanager. La partie qui nous intéresse aujourd'hui se situe dans les premier 64 ko, les seuls que possède le CPC 464.

Structure de la Ram vidéo

Sur les 64 ko de cette Ram, 16 sont réservés à la mémoire écran et occupent le quart supérieur de l'adresse &C000 à &FFFF. Ladite mémoire est composée de 200 lignes de 80 octets. Première constatation: 200 * 80 = 16000. Il nous manque donc 384 octets pour faire 16 ko. Effectivement, tous les 2 ko, le système se réserve 48 octets pour la gestion de l'écran.

Notre CPC nous est donné pour une définition de 640 x 400 pixels. Donc, ce n'est pas 200 lignes mais 400 qui devraient composer l'écran. Désolé, les calculs peuvent se faire avec 400 positions mais l'affichage, lui, n'en reconnaîtra que 200. Maintenant, passez en mode 2 et faites PLOT 320, 200 : CALL &BB18 : PLOT 320,201

Un point s'est allumé au milieu de l'écran. Appuyez sur une touche. Le message Ready apparaît, mais aucune différence au niveau du point. Pourtant, deux points ont été affichés. Donc, si vous devez tracer une ligne à l'écran avec

des PLOT, gagnez du temps en incluant un STEP 2 dans la boucle de dessin. Pour une ligne horizontale en mode 0, on peut même utiliser un STEP 4. Le premier octet de la Ram vidéo est &C000. Après un reset, un POKE &C000, 200 allumera l'octet le plus haut à gauche. Normal, l'adresse &C000 nous est donnée comme la première de la Ram vidéo.

Maintenant, faites scroller l'écran en affichant quelques lignes, puis après un CLS faites à nouveau POKE &C000, 200. Un octet s'est allumé au milieu de l'écran. L'emplacement de la case &C000 est donc mouvant, ce qui est bien problématique pour travailler efficacement. D'où nécessité avant toute opération dans cette Ram de bien caler l'adresse &C000 en haut à gauche. La solution la plus simple en Basic consiste à définir le mode. La commande MODE 0, en plus de vider l'écran, force l'adresse &C000 dans le coin désiré. Avec un CALL &BBFF, vous obtiendrez le même effet avec en supplément un retour au mode 1 et aux couleurs initiales.

Localisation d'adresses

Maintenant faites

FOR H=&C000 TO &D000 :POKE H, 200 : NEXT

Des lignes apparaissent sur l'écran non pas l'une sous l'autre, mais espacées chacune de 8 lignes. Ici, on ne parle pas de lignes texte mais de lignes de pixels. Les 25 premières dessinées, commence seulement le deuxième passage sur la ligne en dessous. Nous pouvons donc déduire que si les 80 premiers octets de la Ram vidéo sont bien en ligne, le 81e n'est pas sous le premier comme on serait en droit de l'attendre. En fait, pour trouver l'adresse de l'octet inférieur, il faut rajouter 2048 (2 ko) à la valeur de celui du dessus. Ainsi l'adresse de l'octet situé directement sous le premier sera &C000 + 2048 = &C800 en hexadécimal. Pour preuve:

FOR H=0 TO 7 : X = H*2048 : POKE &C000+X, 255 : NEXT

Les huit octets correspondant à un LOCATE 1,1 en mode 2 se sont allumés. Difficile dans ces conditions de localiser un endroit bien défini dans cette mémoire écran. La position LOCATE 10, 12 est situable quel que soit le mode, mais quelles sont les adresses des octets qui composent ce caractère? Problème résolu avec le petit programme 'ADRESSE' ci-joint. Répondez aux questions posées et vous obtiendrez, quel que soit le mode, les octets formant un caractère texte.

Bits, couleurs et modes

On peut, suivant le mode, disposer de 2, 4 ou 16 couleurs.

L'explication se trouve dans la structure d'affichage de la mémoire écran.

  • En mode 2, on dispose de 80 colonnes, comme le nombre d'octets formant une ligne. Nous savons aussi qu'un caractère s'inscrit dans une matrice de 8 x 8 points. Il nous faudra doric, toujours en MODE 2, 8 octets empilés les uns sur les autres pour représenter un caractère texte. Un octet = 8 bits, chaque bit sera donc la représentation à l'écran d'un point de la matrice. Chaque point de la matrice est en fait le pixel qui s'allume à l'écran. Pour un bit la valeur possible est 0 ou 1, soit les deux couleurs possibles en mode 2.
  • En mode 1, nous reprenons le même raisonnement. Mais ici nous disposons de 2 octets x 8 lignes pour représenter un caractère. 2 octets nous donnent 16 bits toujours pour les 8 cases de la matrice. Soit 2 bits par case avec lesquels les possibilités de codage sont déjà plus intéressantes. Nous pouvons avoir 00, 01,10 et 11 correspondant aux encres 0,1,2 et 3 du mode 1.

Il est donc inutile que je vous explique pourquoi, en mode 0, nous disposons de 4 bits par pixel. Avec ceux-ci, il y a 16 possibilités de codage pour les 16 INKs disponibles dans ce mode.

Codage des pixels = sprites

En mode 2, il n'y a pas de problème, chaque bit représentent un pixel. En mode 1, nous savons que les bits vont par paire pour former un pixel. Cest déjà plus compliqué car il ne s'agit pas des deux bits consécutifs d'un octet mais des paires 7 3, 6 2, 5 1 et 4 0. Les choses s'embrouillent encore un peu plus en mode 0 où il y a 4 bits par pixel. Pour un octet, nous aurons 2 pixels formés par les bits 7, 3, 5,1, et 6, 2,4 et 0.

Tout ceci est bien compliqué et d'un intérêt relatif. Afficher à l'écran un motif avec une rafale de pokes dont chaque adresse et chaque valeur auraient été' calculées à la main relève du masochisme. Afficher un motif multicolore à l'écran revient à afficher un sprite. Maintenant que vous possédez quelques notions sur le fonctionnement de la mémoire écran, la compréhension du phénomène devrait être plus facile. Un sprite est formé de pixels de différentes couleurs formant un certain nombre d'octets stockés sous forme linéaire dans la RAM. Pour l'affichage, une routine binaire les prend un par un et les transfèrent à l'écran en effectuant les calculs d'adresse afin que chaque octet se retrouve au bon endroit.

Ici, nous sortons un peu du domaine réservé au Basic, mais il est bon d'évoluer. Vous ne maîtrisez pas le langage machine et désirez malgré tout utiliser des sprites dans vos jeux? C'est possible en reprenant le dossier «Lutins en goguette» d'Am-Mag n°39 du mois d'octobre 1988 (encore disponible). Vous y trouverez l'utilitaire de création de sprites (grâce auquel le codage des pixels s'exécute automatiquement), différentes routines d affichage prêtes à l'emploi ainsi qu'une démo d'enfer. Ce dossier, allié à la leçon de ce jour, devrait vous ouvrir de nouveaux horizons. Le mois prochain, nous pousserons un peu plus loin l'exploration du reste de la Ram de vos CPC.

MICROMAG n°8

★ EDITEUR: MICROMAG
★ ANNÉE: 1990
★ AUTEUR: CLAUDE LE MOULLEC

Page précédente : Ali Gator - 01 les Caracteres de Controle (Micro-Mag)

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 911 millisecondes et consultée 1423 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.