> Calculatrice
PrograZine issue #9 - http://www.citeweb.net/discase/9/TI_ASM1.htm Edito Sommaire Contribution Contacts


Assembleur Ti-89
par Jicé - Jice.Sirot@wanadoo.fr
Debutant Ti-89 assembleur
> fichiers attachés
hello.zip




    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.
>Introduction

    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.
>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).
>L'Operating System

    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.
DOORS source
l
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 efface l'écran
  • 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
>Le début du listing

    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 ?
>La pile : c'est quoi ?

    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.
>La pile par l'exemple

    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 :
	move.w	#4,-(a7)
l
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.

>On efface l'écran

    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
	jsr	graphlib::clr_scr2
l

>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.
	jsr	userlib::idle_loop
l

>On écrit à l'écran

    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
    • 0 : blanc sur noir
    • 3 : blanc sur blanc (et oui !)
    • 4 : noir sur blanc
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 :
	pea	hello(pc)
l
Finalement il ne reste plus qu'à appeler la fonction à l'aide d'un classique
	jsr	doorsos::DrawStrXY
l
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
	lea 	10(a7),a7
l
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
>On termine le programme

    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.
	rts
l
Et pour finir terminez le listing avec un
	end
l

>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 :
  • 0 : la petite
  • 1 : la moyenne
  • 2 : la grande
En guide d'exercice, modifiez le programme pour que celui-ci affiche 3 fois Hello World avec 3 taille différentes.
>Conclusion

    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.
Cet article est la propriété de Jicé. La copie et la diffusion sont libres sauf dans un but lucratif sans accord explicite de l'auteur.