The Sinclair QL Screen

See all articles from QL_DOC n2
Author(s): Réal Gagnon
Publication: QL_DOC
Pub Details: QL_DOC n2 (Issue 2)
Date: February-March 1988
Pages: 2-4

In English: An explanation of how the Sinclair QL's 32K screen memory is organised: where it starts and ends, how to save a screen with SBYTES, and how each 16-bit word encodes 8 pixels in 512×256 four-colour mode or 4 pixels in 256×256 eight-colour mode, including the flash bit. Worked examples show how to build a word and test it with POKE_W, and two SuperBASIC functions, color_l and color_h, return the colour of a screen point like the TS2068/Spectrum POINT function.

Printed title: L'ECRAN du SINCLAIR QL. The article below is in French, as printed in QL_DOC n2 (February-March 1988).


L’écran du QL occupe 32 K-octets de la mémoire RAM. C’est en partie pour cette raison que sur un QL standard de 128K, il n’y a que 80K disponible à la programmation, une partie étant réservée pour les variables systèmes et à la mémoire-écran.

La mémoire-écran débute à l’adresse 131072 décimale (20000 hex) et progresse pendant 32K en mot de 16 bits jusqu’à l’adresse 163840 (28000 hex).

*Pour sauver le contenu d’un écran, nous pouvons faire en SUPERBASIC

SBYTES xxxx_dessin_pic,131072,32768
ou
SBYTES xxxx_dessin_pic,2^17,2^15

Contrairement au 2068/SPRECTRUM, l’écran du QL est continu, c’est-à-dire qu’elle débute dans le coin supérieur gauche et se termine dans le coin inférieur droit.

Il y a deux modes graphiques, 512×256(4 couleurs) et 256×256(8 couleurs).

1- MODE 512×256

Ce mode graphique offre une résolution de 512 pixels horizontales et 256 verticales, avec une possibilité de 4 couleurs. Chaque mot de 16 bits détermine la couleur de 8 pixels à l’écran.

          V V V V V V V V_______OCTET HAUT (pair)
          R R R R R R R R       OCTET BAS
 pixel 1 _| |                    V -> vert
 pixel 2 ___|                    R -> rouge
          ^             ^
        bit7          bit0
                                   .Composition d'un mot
                                    (mode 512x256)

Ainsi si nous voulons le 4ième pixel rouge, la bit 5 de l’octet haut doit être à “0” et celle de l’octet bas à “1”.Voici les combinaisons possibles pour les 4 couleurs.

COULEUR        BIT "1"
noir           aucune
rouge          rouge
vert           vert
blanc          rouge+vert

2- MODE 256×256

Ce mode donne une résolution de 256 pixels horizontales et 256 verticales. Il y a maintenant 8 couleurs disponibles. Un mot de 16 bits de la mémoire-écran affecte 4 pixels.

          V F V F V F V F_______OCTET HAUT (pair)
          R B R B R B R B       OCTET BAS  (impair)
          --- ---               V -> vert
 pixel 1 __|   |                F -> flash
 pixel 2 ______|                R -> rouge
          ^             ^       B -> bleu
        bit7          bit0
                                   .Composition d'un mot
                                    (mode 256x256)

Voici les combinaisons possibles pour les 8 couleurs.

COULEUR        BIT "1"
noir           aucune
bleu           bleu
rouge          rouge
vert           vert
magenta        bleu+rouge
cyan           bleu+vert
jaune          vert+rouge
blanc          bleu+vert+rouge

NOTE: Pour chaque pixel, on met la bit FLASH à “1” si on veut qu’il flash! Donc chaque mot contrôle 4 pixels. Si nous voulons le premier pixel bleu, le second rouge, le troisième magenta et le quatrième vert, nous aurons:

Octet haut     00 00 00 10    -> 2 décimale
Octet bas      01 10 11 00    -> 108 décimale
               bl ro ma ve

*Pour joindre les 2 octets, on procède de la façon suivante:

Multiplie l'octet haut par 256               -> 2 * 256 = 512
Additionne le résultat avec l'octet bas      -> 512 + 108 = 620

Faites POKE_W 2^17,620 pour vérifier les 4 premiers pixels de la mémoire-écran. N’oubliez pas il faut être en mode TV!

3-APPLICATION

Comme application, vous une fonction qui est l’équivalent la fonction POINT du 2068/SPECTRUM. Elle retourne la couleur d’un point à l’écran.

  • Il y a une version pour chaque mode vidéo.
  • La procédure prend en considération l’écran en entier, la référence étant le coin inférieur gauche (0,0). Içi les WINDOWs ne sont pas pris en considération.

*Fonction pour MODE 256×256

DEFine FuNction color_l (x,y)              <- x,y sont les coordonnées
LOCal col,mem,haut,bas
mem = 163712 + (x DIV 8)* 2-y*128 <- trouve l'adresse
haut=PEEK (mem) DIV (4^(3-(x DIV 2)MOD 4)) <- sépare les 2 bits
bas=PEEK (mem+1) DIV (4^(3-x DIV 2)MOD 4)) correspondant au pixel
col=bas && 3 <- vérifie bit BLEU & ROUGE
col=col+(haut && 2) *2 <- vérifie bit VERT
col=col+(haut && 1) *4 <- vérifie bit FLASH
RETurn col <- retourne la couleur
END DEFine
Les valeurs possibles sont : 0 NOIR      1 BLEU
                             2 ROUGE     3 MAGENTA
                             4 VERT      5 CYAN
                             6 JAUNE     7 BLANC

*Fonction pour MODE 512×256

DEFine FuNction color_h (x,y)              <- x,y sont les coordonnées
LOCal col,mem,haut,bas
mem=163712+(x DIV 8)*2-y*128 <- trouve l'adresse
haut=PEEK (mem) DIV (2^(7-(x MOD 8))) <- sépare la bit qui représente le
bas=PEEK (mem+1) DIV (2^(7-(x MOD 8))) pixel
col= bas && 1 <- vérifie la bit ROUGE
col= col+(haut && 1)*2 <- vérifie la bit VERT
RETurn col*2 <- retourne la couleur
END DEFine
Les valeurs possibles sont :    0 NOIR    2 ROUGE
                                4 VERT    6 BLANC

On utilise la fonction de la façon suivante:

-si on veut vérifier le pixel à la position 100,50
 nous faisons couleur=col_h(100,50)
 si nous sommes en mode 512x256, sinon nous faisons
 couleur=col_l(100,50)
 pour le mode 256x256.

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.