> fichiers attachés
|
Salut à tous ! Finalement je me suis lancé : voici mon premier article dans Prograzine
(j'espère qu'il y en aura beaucoup d'autres). Mais, trève de baliverne, entrons dans le vif
du sujet : la programmation en assembleur sur la Ti-89 de Texas Instrument.
Pour les détenteurs de Ti-92+, il faudra faire quelques adaptations (minimes ne vous
inquiétez pas) pour faire fonctionner les programmes.
 | l |
Avant d'exécuter tout programme en assembleur sur votre Ti FAITES UN BACKUP DE LA MEMOIRE
Je ne serais en aucun cas responsables des pertes de mémoires dues aux programmes. Les sources et
fichiers compilés que je vous donne sont certifiés 0% bug.
|
Comme je pense qu'un long cours théorique serait sans doûte plus soporifique que passionnant
et que rien ne vaut l'apprentissage par l'exemple, j'ai décidé de construire ce cours autour de
programmes didactiques et commentés. Pour l'instant 4 articles sont prévus mais il y en aura sans
doûtes d'autres.
Dans ce premier article nous allons nous pencher sur un exemple tout simple : un programme qui
salue tout le monde d'un désormais classique : "Hello World !". Mais avant de nous y attaquer,
faisons d'abord quelques remarques préliminaires.
>Le coeur de la machine : le processeur |
Le processeur des Ti-92, Ti-92 II, Ti-92+ et Ti-89 est le 68000 (68k) à 10 MHz de chez Motorola.
Il n'est plus tout jeune mais il reste un des meilleurs sur le marché. il dispose de 8 registres
de données (D0, D1, ... D7) et de 8 registres d'adresse (A0, A1, ... A7). A7 est appelé le
registre de pile. Il posséde aussi un registre pointeur PC et un registre de drapeaux
(si vous ne savez pas ce que c'est, nous le verrons un peu plus tard).
La Ti-89 ne peut pas être programmée directement en assembleur. Sur les Ti-92 I et II
on utilisait Fargo et Fargo II. Aujourd'hui avec la nouvelle génération de calculatrice Ti-92+
et Ti-89 on a vu naitre de nouveaux operating systems. Personnellement j'utilise DoorsOS mais
vous pouvez en utiliser un autre comme Plus Shell moyennant quelques modifications des
programmes.
>Et en pratique comment on fait ? |
Et bien comme n'importe quel autre compilateur. Je vous consille d'abord de créer sur votre
ordinateur différents répertoires pour les sources des programmes, les fichiers, ... Il faudra
ensuite ajouter ces quelques lignes au fichier autoexec.bat
SET DOORSOS=C:\DOORS
SET PATH=%PATH%;%DOORSOS%\BIN
| l |
Ensuite il suffit de taper la source dans un fichier texte et de l'enregistrer dans un fichier
dont l'extension sera .asm (ex : source.asm). Pour la compiler il suffit alors de taper.
 | l |
Il ne faut pas mettre l'extension du fichier source quand on le compile, sinon cela ne marchera
pas.
|
Le fichier compilé porte l'extension .89z (.9xz s'il a été compilé pour Ti-92+). Pour l'utiliser
il suffira alors de l'envoyer sur la Ti avec Ti-GraphLink
>Hello World! : Notre premier programme |
>Qu'est-ce qu'on veut faire ? |
Notre premier programme va être très simple :
- Il écrit "Hello World !" en haut à gauche
- Il attend que l'utilisateur appuie sur une touche
Pour réaliser cela il va nous falloir 3 fonctions, 1 pour chaque action. On trouve les fonctions
nécessaires dans 3 librairies : graphlib, doorsos et userlib
Comme dans les programmes écrit en langage de haut niveau (C, C++,...) il faut déclarer en
tête du programme les librairies et les fonctions utilisées.
include "doorsos.h"
include "graphlib.h"
include "userlib.h"
xdef _ti89
xdef _main
| l |
 | l |
la ligne xdef _ti89 sert au compilateur à reconnaitre un programme pour ti-89, pour une ti-92+
il suffit de la remplacer par xdef _ti92plus.
|
>Comment utiliser les librairies ? |
Un point commun aux trois fonctions dont nous allons avoir besoin est qu'elle prennent toutes
les trois leurs paramètres d'entrée dans la pile. Mais au fait, la pile c'est quoi ? Et bien, la
pile est une zone de la mémoire où on peut empiler les données, c'est-à-dire les placer les unes
à côté des autres. Mais contrairement aux processeurs comme le x86 d'intel (486, Pentiums,...)
il n'existe pas d'instructions comme PUSH ou POP. On utilise à la place le registre de pile : A7.
Dans le registre A7, on trouve l'adresse de la dernière donnée envoyée sur la pile.
 | l |
La pile sur les Ti-89 et 92+ est "montée à l'envers" ! Cela signifie que si on place un octet
à l'adresse n dans la pile alors on placera la donnée suivante à l'adresse n-1.
|
En pratique comment fait-on pour placer une donnée dans la pile. Il faut utiliser
l'instruction MOVE. Supposons qu'il nous faille placer la valeur 6 dans la pile. Il faut taper :
décortiquons cette instruction :
- move : copie une valeur à un endroit
- .w : on envoie une valeur de 16 bits dans la pile (w=word, mot en anglais)
- #4 : la valeur de départ est 4
- -(a7) : le - signifie que l'on décrémente la valeur de A7 de la taille de la donné envoyée,
(ici 2 car 16 bits=2 octets) puis on envoie la valeur (ici 4) à l'adresse donnée par la valeur
de A7
 | l |
on peut remplacer w par b (byte=octet=8 bits) ou l (long word=32 bits). Mais dans le cas de b,
A7 sera tout de même décrémenté de 2 au lieu de 1 car il faut que A7 pointe toujours sur une
adresse pair.
|
Pour effacer l'écran on utilise la fonction clr_scr2 de la librairie graphlib. Cette fonction
ne réclame aucun paramètre, on peut donc l'appeler directement avec l'instruction jsr
>On attend la pression d'une touche |
Cette fois on utilise la fonction idle_loop de la librairie userlib. Qui ne prend pas de
paramètre dans la pile.
On utilise la fonction DrawStrXY de la librairie doorsos. Elle prend 4 paramètres dans la
pile dans cet ordre :
- la position en X (un mot=16 bits)
- la position en Y (un mot=16 bits)
- un pointeur sur la chaine de caractère à afficher (un double mot=32 bits)
- le type d'écriture
- 3 : blanc sur blanc (et oui !)
 | l |
Mais la pile est comme une pile d'assiette, la dernière variable déposée sera la première à en
sortir, c'est pourquoi il faut placer les paramètres dans l'ordre inverse.
|
Mais comment placer l'adresse d'une chaine de caractère dans la pile. En effet si nous savons
comment placer une valeur, on ne connait pas l'adresse de la chaine. On va d'abord définir une
variable qu'on appellera hello qui contiendra la chaine caractère. Cela se fait de ctte façon :
hello dc.b "Hello World!",0
| l |
 | l |
Toute chaine de caractère se termine par le caractère nul, c'est pourquoi on finit toujours par
un ",0".
|
 | l |
Généralement les déclarations de variable se groupent toutes à la fin du listing. De cette façon
elles sont beaucoup plus simples à modifier.
|
Ensuite pour envoyer dans la pile l'adresse de la variable hello, il suffit d'utiliser
l'instruction PEA :
Finalement il ne reste plus qu'à appeler la fonction à l'aide d'un classique
Et il faut aussi restaurer la pile sinon le programme plante, c'est à dire mettre dans A7
l'adresse qu'il y avait avant qu'on y mette les paramètres
Le 10 signifie qu'on ajoute 10 octets (3 mots de 2 octets et l'adresse de la variable hello (un
double mot de 4 octets) : 2+2+2+4=10
Pour clore le programme il suffit d'une bête instruction qui "rend la main à la calculatrice".
Mais rien ne vous empêche de placer les déclarations des variables après.
Et pour finir terminez le listing avec un
>Comment changer la police d'écran |
La Ti-89 possède en ROM 3 polices de tailles différentes (petite, moyenne et grande). Pour la
modifier il faut utiliser la fonction SetFontSys de la librairie doorsos. Elle prend un paramètre
dans la pile qui est la taille de la fonte à sélectionner :
En guide d'exercice, modifiez le programme pour que celui-ci affiche 3 fois Hello World avec 3
taille différentes.
Voilà pour le premier cours, vous trouverez avec cet article les sources du programme entier
ainsi que les versions compilées pour Ti-89 et 92+. La prochaine fois, nous verrons les tests,
les boucles, la gestion des fichier. A la prochaine.
|