JOUONS AVEC LES ATTRIBUTS D'ÉCRAN HIRES (1)
par André Chéramy et Claude Sittler


UN PEU D'ORDRE DANS LES IDÉES

L'écran HIRES se présente comme une matrice de 240 x 200 pixels soit 48000 pixels. A cette matrice visible correspond en mémoire une zone de 8000 octets situés de #A000 à #BF3F. On peut calculer que chaque octet stocke 6 pixels (un sextet). Sous la partie graphique, l'écran HIRES comporte encore trois lignes en mode TEXT qui occupent 120 octets dans une zone située de #BF68 à #BFDF. Il existe donc une zone non utilisée (non documentée) de 40 octets sise de #BF40 à #BF67 ! Pour mémoire, l'écran TEXT, ligne service inclue, occupe la RAM de #BB80 à #BFDF. Notez encore que selon le mode écran en vigueur, la commande ESAVE de SEDORIC sauve la contenu de la RAM de #A000 à #BF3F (mode HIRES) ou de #BB80 à #BFDF (mode TEXT).
Revenons en à notre écran HIRES, parfois décrit comme comportant 200 lignes de 240 pixels, ce qui n'est pas faux, mais quand même un peu abusif. Il serait plus honnête de dire que l'écran HIRES comporte 200 lignes de 40 sextets et que chaque sextet peut contenir soit un attribut d'écran, soit 6 pixels. Pourquoi cette nuance ? Parce que tout attribut d'écran placé dans l'écran "gâche" un sextet, dont les 6 points correspondants deviennent inutilisables pour du dessin. Il est impossible d'afficher une photo couleur sur l'écran : à chaque changement de couleur, il y aurait un trou dans la photo !
Si vous avez bien réalisé ce qu'impliquent les concepts rappelés ci-dessus, vous devez comme nous baver d'admiration pour les concepteurs des magnifiques jeux dont bénéficie notre machine favorite ! Nous vous engageons, si vous le pouvez, à visiter le site web de Jonathan Bristow, section "graphics".

 

UN PETIT PROGRAMME POUR SITUER LE PROBLÈME DES ATTRIBUTS

100 'Initialisation des bits b0 à b5
110 B0=1:B1=2:B2=4:B3=8:B4=16:B5=32
120 'Initialisation des adresses
130 A0=#A002:A1=#A02A:A2=#A052
140 A3=#A07A:A4=#A0A2:A5=#A0CA
200 HIRES:PAPER3:INK4:'JAUNE, BLEU    
300 PRINT"Les pixels avec le b6 à 1"
310 C=#40:'Soit 0100 0000
320 GOSUB 1010
330 PRINT"Affichage des pixels nus"
340 C=0:'Les b6 et b7 seront à zéro
350 GOSUB 1010
360 PRINT"Les pixels avec le b7 à 1"
370 C=#80 :'Soit 1000 0000
380 GOSUB 1010
390 PRINT"Les pixels avec b6 et b7 à 1"
400 C=#C0 :'Soit 1100 0000
410 GOSUB 1010
420 PRINT"Idem avec encre BLANCHE"
430 I=0:A=#07
440 GOSUB 2010
450 PRINT"Idem avec papier BLEU"
460 I=1:A=#14
470 GOSUB 2010
999 TEXT:END
1000 'Affichage des pixels b0 à b5
1010 POKE A0+2,B0+C:'Pixel b0
1011 POKE A1+2,B1+C:'Pixel b1
1012 POKE A2+2,B2+C:'Pixel b2
1013 POKE A3+2,B3+C:'Pixel b3
1014 POKE A4+2,B4+C:'Pixel b4
1015 POKE A5+2,B5+C:'Pixel b5
1016 GET R$:PRINT:RETURN
2000 'Mise en place d'un attribut A
2010 POKE A0+I,A:'1ere ligne
2011 POKE A1+I,A:'2eme ligne
2012 POKE A2+I,A:'3eme ligne
2013 POKE A3+I,A:'4eme ligne
2014 POKE A4+I,A:'5eme ligne
2015 POKE A5+I,A:'6eme ligne
2016 GET R$:PRINT:RETURN
5000 'SAVEO"ATTRIRES.BAS"

Ce petit programme, qui met en oeuvre un exemple très simple, va vous permettre de comprendre :
1) comment sont affichés les pixels,
2) l'effet des attributs d'écran et enfin
3) le rôle mal documenté du b7.

Rappelons que les 8 bits d'un octet sont numérotés de droite à gauche de b0 à b7. Vous trouverez ce programme "ATTRIRES.BAS" sur la disquette du CEO de juin.
    
 b5  b4  b3  b2  b1  b0 dechexa
     11#01
    1 2#02
   1  4#04
  1   8#08
 1    16#10
1     32#20



Le programme proposé affiche un carré de 6 x 6 pixels dans lequel une diagonale est tracée. Il s'agit en fait de 6 sextets affichés l'un en dessous de l'autre sur 6 lignes consécutives de l'écran HIRES. Les 6 points de la diagonale sont codés (un par ligne) par les bits b0 à b6 de ces 6 sextets (initialisation réalisée à la ligne 110 du programme).

 

Dans le 1er test, les 6 octets correspondant à ces 6 sextets sont POKÉs dans l'écran après que leur b6 ait été forcé à 1 (en ajoutant #40) afin qu'ils soient reconnus comme des pixels et que s'affiche cette diagonale, en bleu sur papier jaune.
Dans le 2ème test, le b6 n'est pas mis à 1, donc les 6 octets sont considérés comme des attributs et ne sont pas affichés (rien de visible sur les 4 premières lignes), sauf lorsque l'attribut correspond à une couleur de papier (la 5ème ligne est noire, car 16 = papier noir) et lorsque b5 = 1, cas où les pixels de l'octet sont malgré tout reconnus (bogue) (le 1er point de la 6ème ligne est bleu).

Le 3ème test est identique au second, sauf que le b7 est forcé à 1 (inversion vidéo locale des 6 sextets). On voit que les 4 premiers sextets sont tout bleu au lieu d'être tout jaune. De même, l'ancienne ligne noire n'est inversée que sur le sextet où elle devient blanche. Ensuite elle redevient noire. Sur la 6ème ligne, le point bleu sur jaune est devenu jaune sur bleu.

Dans le 4ème test, les b6 et b7 sont forcés à 1. Il faut donc comparer avec le 1er test. A lieu d'avoir une diagonale bleue sur jaune, on a une diagonale jaune sur bleu. Le reste de la ligne HIRES n'est pas affecté.

Dans le 5ème test qui suit, on ne touche pas au dessin précédant (b6 et b7 toujours à 1), mais on place 2 cases à gauche des 6 sextets, l'attribut #07 (encre blanche). Comme tous les attributs (sauf attribut papier) celui-ci est invisible, mais on ne pourrait dessiner là où il se trouve sans l'écraser. Toutefois il modifie la couleur de l'encre dans les sextets situés à sa droite. On voit donc maintenant une diagonale noire (l'inverse de blanc) sur fond bleu (inchangé, toujours l'inverse de la couleur du papier).

Dans le 6ème test, on ne touche ni au dessin tracé lors du 4ème test (b6 et b7 toujours à 1), ni aux attributs encre placés lors du 5ème test, mais on ajoute un attribut de papier bleu (#14) 1 case à gauche des 6 sextets (donc entre l'attribut encre et le dessin). Cette fois, les attributs couleur de papier sont visibles, puisqu'ils prennent immédiatement effet sous forme d'un carré bleu (colonne de 6 attributs papier bleu = 6 petits segments bleus). On voit une diagonale noire (inverse de l'encre blanche) sur fond jaune (inverse du papier bleu, lequel se poursuit d'ailleurs ultérieurement sur la droite).

LE CONCOURS DU SIÈCLE !

Si vous avez bien suivi l'exemple ci-dessus, voici un petit problème à résoudre pour la prochaine fois : comment placer dans l'écran HIRES un attribut papier fonctionnel, sans qu'il soit visible. En d'autres termes, comment éviter qu'un attribut papier prenne effet sur sa propre case, mais seulement sur celles qui sont situées à sa droite ?


Les articles du mois