Les fonctions graphiques du 800XL

 

Pour pouvoir faire du graphisme, il faudra au préalable passer dans un mode graphique...

 

La toute première possibilité pour dessiner un point, une droite sera d'utiliser les commandes du BASIC:

PLOT x,y et DRAWTO x1,y1

Il faut juste faire attention aux limites qui dépendent du mode graphique choisi (Il n'y a pas de gestion du clipping).

La couleur d'un point se fait grâce à la commande COLOR.

La commande DRAWTO a pour paramètres les coordonnées finales de la droite. Cette commande prend comme point initial de la droite les valeurs (x,y) du point dessiné précédemment par une commande PLOT au DRAWTO.

 

Ensuite, pour aller plus vite, il faut passer en assembleur:

Première solution, l'utilisation du CIO:

Tout d'abord la fonction PLOT:

Dans l'exemple qui suit, je sépare exprès la procédure "mode graphique" et la procédure PLOT pour rendre le code plus lisible:

Procédure mode graphique:

Image non trouvée !

Procédure PLOT:

Je ne rentre pas dans le détail pour l'appel, ce n'est qu'un appel classique au CIO.

Ce qu'il faut savoir: La couleur du point est à charger dans l'accumulateur (marrant...). Les coordonnées sont à stocker aux adresses $54 pour la ligne, $55 & $56 pour la colonne.

Il faut utiliser la commande "PUT CHARACTER", bien qu'il n'y ait pas de caractère à envoyer. D'ailleur la taille sera positionnée à 0.

Image non trouvée !Dans cet exemple, j'affiche des points n'importe où sur l'écran. J'utilise donc RANDOM, mais je ne vais pas vérifier ensuite les coordonnées. Le point peut donc être hors zone...

Cependant, j'ai voulu faire un exemple très simple, c'est ainsi plus facile à lire.

 

Et le programme BASIC pour charger le tout :

Image non trouvée !Ce code va lancer les codes machines. Il exécutera ensuite un programme BASIC qui fait exactement la même chose, mais bien plus lentement !

 

Puis la fonction DRAWTO:

Procédure mode graphique:

Image non trouvée !Toujours la même procédure, mais on change de mode : mode graphique 8. On pourra se faire une procédure paramétrée par la suite...

Procédure DRAWTO:

Il y a toujours le code du PLOT.

Et j'ai ajouté le code du DRAWTO. Là, c'est une commande spéciale: code commande à 17.

La couleur est à stocker non plus dans l'accumulateur comme pour le PLOT, mais dans ATACHR. Les coordonnées finales de la droite sont toujours aux adresses $54 pour la ligne, $55 & $56 pour la colonne. (ça au moins, cela ne change pas...).

Le but: afficher plusieurs droites aléatoirement sur l'écran. Toujours pas de contrôle sur les limites...

Image non trouvée !

Et enfin, le programme BASIC pour charger le tout :

Image non trouvée !Ce code va lancer les codes machines. Il exécutera ensuite un programme BASIC qui fait exactement la même chose, mais bien plus lentement là aussi !

 

A noter qu'il est possible d'effectuer une opération graphique particulière : le FILL-IN.

Cette fonction sera expliquée dans le chapitre sur le CIO, la commande XIO sous BASIC

 

Enfin, on peut accéder directement à la mémoire écran:

Alors, imaginons...

Pour afficher un point, on pourrait être tenté de dire un octet = 1 point. Dans ce cas, l'octet indiquerai la couleur de ce point. Bonne idée, mais cette solution est un peu en avance sur son temps...

Le 800XL ne peut afficher au maximum que 4 couleurs dans le mode graphique 7. Or on peut enregistrer 4 états sur 2 bits. Dans ce cas, sur notre octet qui fait 8 bits, 6 ne serviraient pas ! Pour l'époque, c'est la catastrophe, la RAM, ce n'était pas pour rien, et 64 Ko étaient énormes et réservés qu'à quelques machines!!! Il ne faut donc pas gaspiller.

Mais l'idée n'est pas mauvaise, alors reprenons plus simplement:

Dans le mode graphique 8: 2 couleurs, le fond et une couleur. Ce qui fait 2 états possibles. On peut donc afficher 1 point à partir d'un bit. Soit 8 points en mode graphique 8. Facile non ?

On connait le début de la mémoire écran (PEEK(88) + 256 *PEEK(89)). Il faut alors savoir que le bit de poid fort à cette adresse sera le premier point en haut à gauche, le bit de poid faible sera le 8ième point à partir du point en haut à gauche. L'octet suivant représentera ensuite le dessin des 8 points suivant.

Voici un petit exemple de programme qui fait défiler un point de gauche à droite:

(A noter que j'ai mis la variation de x de 7 à 0 pour bien faire comprendre que:le bit le plus à gauche (c.à d. 7ième bits) dessine le point à gauche, et le bit 0 dessine le point le plus à droite !)

Image non trouvée !

Voilà, le principe est là:

Pour 1 bit, la valeur 0 indique qu'il faut afficher un point avec la couleur du registre 710 (couleur du fond), la valeur 1 indique qu'il faut afficher un point avec la couleur du registre 709.

 

Maintenant, revenons au mode graphique 7 à 4 couleurs: le fond et 3 autres couleurs qui se codent sur 2 bits. Eh bien vous reprenez ce qui a été vu pour le mode graphique 8, mais avec 2 bits par point. Vous n'afficherez donc plus 8 points par octet mais 4 points...

Pour 1 bit, la valeur 0 indique qu'il faut afficher un point avec la couleur du registre 712, la valeur 1 indique qu'il faut afficher un point avec la couleur du registre 708, la valeur 2 pour 709 et 3 pour 710.

De là, il est tout à fait possible d'imaginer toutes les fonctions graphiques que l'on veut:

rectangle, cercle, cercle plein, ... et pourquoi pas un sprite !