Table des matières

Documentation rédigée par Whyp

Introduction

L’écran de la graph100 se compose de 8192 pixels, 128×64. Il est capable d’afficher soit en noir et blanc, soit en niveaux de gris. Pour pouvoir stocker des pixels, l’ecran possède un buffer vidéo, situé habituellement à l’adresse 1A20h :0000h, dans la ram. Si vous écrivez dans cette zone, l’ecran en sera directement affecté. Pour s´electionner un mode, vous devez entrez sa valeur dans le port 2 de la calculatrice. Par exemple pour passer en mode DB, vous devrez faire :

En C

outportb(2,0xDB);

En asm

mov al , 0 xDB
out 2 , al

Le mode normal C3

Le mode C3 est le mode utilisé par défaut par la graph100. C’est donc un mode noir et blanc, un bit représentant un pixel à acher à l’ecran. Comme le buffer contient toujours 8192 pixels, il mesure 8192 bit soit 1024 octet, 1 Ko. Les bits sont repartis par colonnes de huit, le d´ebut du buffer pointant vers le coin bas droite de l’ecran, la fin vers le haut gauche.

Le probleme rencontré lorsque l’on souhaite allumer un pixel seul, c’est qu’on ne peut pas manipuler les données bit à bit, mais seulement octet par octet (1 octet = 8 bits). La méthode va donc consister à créer un algorithme permettant de se positionner sur le bon octet à traiter dans le buffer video, puis à utiliser une commande specifique au processeur Nec qui va permettre de ne modifier qu’un bit de cet octet, celui que l’on souhaite allumer (le cas echeant l’eteindre).

Le mode noir et blanc D3

Il diffère du mode C3 uniquement par sa répartition du buffer video à l’ecran, bien plus simple à utiliser. Le début du buffer pointe toujours vers le coin bas droite de l’ecran, et la fin vers le haut gauche. La seule différence est qu’il affche le contenu du buffer lignes par lignes comme le montre le schéma ci-contre. Il est alors bien plus aisé et intuitif de dessiner quelque chose dans ce mode, et aussi légèrement plus rapide. Pour ce faire, on utilisera par exemple l’algorithme suivant. L’affchage n´ecessitant une grande rapidité d’exécution, l’assembleur est encore une fois de rigueur :

mov ax ,0 x1A20  ;On met dans es le segment du buffer vidéo
mov es ,ax       ;on ne peut affecter directement es, on passe par ax
mov bx ,x        ;X repr´esente l’abscisse
mov si ,y        ;Y l’ordonnée
shl si ,4        ;Une ligne mesure 16 octet (128bit). si pointe vers la bonne ligne
mov cl ,bl       ;0<=bx<128 Donc on peut manipuler bl au lieu de bx.
                 ; On place alors bl dans cl.
shr bl ,3        ;Divise bl par 8. Le résultat est dans bl
and cl ,7        ;On garde les 3 derniers bit de cl, c’est le reste de la division
add si ,bx       ;si pointe vers le bon octet (16*y+x)
db 0 x0F ,0x14 ,0 x0C7   ;set1 bh,cl
                 ; Met à 1 le clieme bit de bh (qui était nul jusque la)
                 ; Cette commande est expliquée plus précisément dans
                 ; le chapitre consacré au processeur
or es :[ si],bh  ;On place bh en mémoire vidéo en prenant soin de ne
                 ; pas effacer les autres

Cette routine a été optimisée au maximum pour bénéficier du plus rapide des affchages point par point.

Le mode niveau de gris DB

Ce mode permet l’utilisation de trois niveaux de gris : le blanc, le gris et le gris foncé.

on utilisation reste tout de fois assez simple,car il utilise un système de couches. Une couche est en fait une superposition de plusieurs pages dans le but de n’en affcher qu’une seule nuancée. Ces couches ont exactement la méme structure que la couche unique utilisée dans le mode D3,sauf qu’il faut en utiliser trois consécutives.

La taille du buffer vidéo passe alors de 1024 octets à 3072 octets. Mais seules deux couches sont réellement utiles ici, la première et la troisième. La seconde apporte une nuance quasiment imperceptible, donc inutile.

Ensuite, le calcul est simple, plus on superpose de bits allumés, plus le résultat à l’ecran est foncé. En considérant seulement les deux couches utiles, il en ressort la palette suivant :

Ces couches sont contigues, sans marque de distinction dans le buffer. Donc si la première commence (c’est le cas habituel) en 1A20h :0000, la seconde commencera en 1A60h :0000 et la troisième en 1AA0h :0000.

On y applique ensuite les régles de calcul présentées plus haut avec la possibilité de gagner quelques cycles d’horloges si on souhaite dessiner un pixel gris foncé en ajoutant simplement à la fin de la routine précédente le code suivant :

mov ax ,0 x1A80 ;On se deplace vers la couche suivante,
mov es ,ax
or es :[ si],bh ;et on affiche le bit au meme endroit

Il est bien évidemment possible dans toutes ces routines d’effacer un pixel en remplaant simplement les lignes suivantes :

db 0 x0F ,0x14 ,0 x0C7
or es :[ si],bh

Que l’on remplacera par :

db 0 x0F ,0x12 ,0 x0C7
and es:[ si],bh

Le mode niveau de gris CB

Ce mode n’est pas très utile car son homologue vu ci-dessus permet d’effectuer les même opérations plus simplement. Sachez simplement qu’il fonctionne comme le mode DB, mais en prenant exemple sur le mode C3 (et non le mode D3).