--- title: "The Sinclair QL Screen" type: "article" slug: "the-sinclair-ql-screen" url: "http://localhost/article/the-sinclair-ql-screen/" markdown_url: "http://localhost/article/the-sinclair-ql-screen.md" published_at: "2026-11-11T11:07:30+00:00" modified_at: "2026-11-11T11:07:30+00:00" featured_image: url: "http://localhost/wp-content/uploads/2022/04/20230809-041332.jpg" excerpt: "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 512x256 four-colour mode or 4 pixels in 256x256 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." post_tag: - name: "French language" slug: "french-language" taxonomy: "post_tag" url: "http://localhost/tag/french-language/" - name: "QL" slug: "ql" taxonomy: "post_tag" url: "http://localhost/tag/ql/" - name: "Superbasic (programming language)" slug: "superbasic-programming-language" taxonomy: "post_tag" url: "http://localhost/tag/superbasic-programming-language/" - name: "Tutorial" slug: "tutorial" taxonomy: "post_tag" url: "http://localhost/tag/tutorial/" - name: "Type-in program" slug: "type-in-program" taxonomy: "post_tag" url: "http://localhost/tag/type-in-program/" model: - name: "Sinclair QL" slug: "sinclair-ql" taxonomy: "model" url: "http://localhost/model/sinclair-ql/" indiv: - name: "Real Gagnon" slug: "real-gagnon" taxonomy: "indiv" url: "http://localhost/indiv/real-gagnon/" publication: "QL_DOC" publication_r: id: 52925 title: "QL_DOC" type: "periodical" url: "http://localhost/periodical/ql_doc/" authors: "Réal Gagnon" issue: "2" issues_articles: - id: 76708 title: "QL_DOC n2" type: "issue" url: "http://localhost/issue/ql_doc-n2/" pages: "2-4" pubdate: "February-March 1988" archive_link: false volumeissue: "n2" --- # The Sinclair QL Screen **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. ```