[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Programmation
> Calculatrices
> Ti
> Apprendre l'asm z80 pour TI > Codage - les bases > Le commencement
> Lecture du tutoriel
Le commencement
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Eeeeeeehhhhh oui, il faut bien commencer par le commencement...
Surtout, n'hésitez pas à vous attarder, la compréhension est essentielle pour la suite.
C'est un bon début...
En effet, votre programme commencera
toujours par un header.
Voyons sa structure :
Code : Autre1
2
3
4
5
6
7
| #define end .end
#define END .end
#define equ .equ
#define EQU .equ
#include "ti83plus.inc"
.org 9D93h
.db $BB,$6D |
Ce header vient d'un code d'exemple mais il en existe de nombreux. Votre programme ne commencera donc pas forcément par celui-ci.
Étudions ça progressivement ; vous connaissez peut-être le rôle des #define [texte1] [texte2] mais je considérerai que non.
Ils servent à remplacer toutes les occurrences de [texte1] par [texte2] dans le programme.
TASM est une application très tatillonne qui reconnaît des termes très précis. Par exemple, la fin du programme lui est spécifiée par
.end et pas end ou .END (Oui, la casse aussi a une importance

)
Selon vos envies ou vos habitudes, vous serez peut-être amené à utiliser d'autres termes et dans ce cas, pensez aux #define !
Voyons la suite...
Un
#include ; ce terme n'est peut-être pas inconnu si vous connaissez d'autres langages. Son utilité est d'insérer le contenu d'un fichier à l'endroit de son appel avant la compilation du programme.
Code : Autre
Ceci inclura le texte du fichier
ti83plus.inc entre
#define EQU .equ et
.org 9D93h dans l'exemple.
Je vous le remet si vous êtes faignants.
Code : Autre1
2
3
4
5
6
7
| #define end .end
#define END .end
#define equ .equ
#define EQU .equ
#include "ti83plus.inc"
.org 9D93h
.db $BB,$6D |
Les fichiers en .inc (include) sont en fait de simples fichiers texte dont l'extension a été modifiée pour distinguer son usage.
Ils stockent généralement des données relatives à la calculette. J'y consacrerai une partie plus tard ; ne vous en souciez pas trop pour l'instant.
Dernière instruction (enfin !) :
.org
C'est un peu plus complexe. Indispensable, mais vous pouvez oublier son utilité. Je vous la donne quand même

: il spécifie où le programme doit être chargé dans la mémoire pour son exécution.
Je profite de ceci pour prévenir les utilisateurs de ti83 qui auraient mal lu l'introduction ; l'adresse du lancement des programmes varie pour cette calculette. A titre indicatif, je la donne quand même : $9327
N'oubliez
SURTOUT PAS la ligne
.db $BB,$6D.
Si elle est omise, le programme sera compilé mais refusera de se lancer en vous reprochant un
ERR : INVALID !
.db sert à spécifier une donnée ; j'expliquerai la signification de cette ligne plus tard.
Essayez aussi de vous imposer une mise en forme : pas de tabulation pour le header, les labels et ce qui commence par un point, et une tabulation pour le reste.
J'allais oublier les .equ...
Cela fonctionne sous la forme
Code : Autre
Il remplace dans le programme tous les [texte] par les [nombre].
Et concrètement, ça sert à quoi ?
A faire le café 
Naaaaaaaan !
Ça sert dans la plupart des cas à
définir des romcalls et, euh, bah... C'est le sujet suivant !
L'ordre des instructions précédentes est totalement libre, on peut même les placer après le .org ; l'important est qu'elles définissent des valeurs avant leur utilisation.
Bon, concrètement, vous savez maintenant faire des programmes vides.
Retenez la forme :
Code : Autre1
2
3
4
5
6
7
8
9
10
11
12
| header
#define ------
#include ------
.org ------
.db $BB,$6D
Corps du programme
instructions diverses et variées...
.end |
Les romcalls sont un exemple d' "instructions diverses et variées".
Ce sont des "miniprogrammes" stockés dans la mémoire de la calculette qui permettent de réduire considérablement la complexité du programme. On peut faire la comparaison avec les fonctions en C ; une romcall prend des arguments en entrée, et retourne une ou plusieurs données en sortie.
Elles peuvent aussi bien avoir un effet visible (comme effacer l'écran) qu'invisible (on verra ça plus tard !).
On les appelle (à prendre dans le sens "appel de fonction") différemment selon les habitudes, et j'ai pour habitude d'utiliser
bcall(xxxx) où xxxx est le nom de la romcall.
Ça n'a pas d'importance de toute façon, utilisez un
#define avec le texte que vous voulez.
Le code correspondant est le suivant :
Code : Autre
Je ne vous demande pas de le comprendre.
On a donc un texte à remplacer par un autre, à moins que vous ne préfériez taper deux lignes de code au lieu d'une !
Ça ne vous rappelle rien ?
Il faut utiliser #define
On inclura donc dans le header :
Code : Autre1
| #define bcall(xxxx) rst 28h \ .dw xxxx |
" \" permet de placer deux lignes l'une à la suite de l'autre.
Vous avez peut-être remarqué que cette ligne n'apparaît pas dans le header de la partie précédente ; eh bien c'est juste qu'elle est déjà présente dans le fichier include. Vous commencez à comprendre leur utilité, non ?
Bon, xxxx désigne un nom, alors que les romcalls correspondent à des adresses mémoires ?
En fait, xxxx peut aussi bien désigner un texte qu'un nombre. A la base, ce sont bien des adresses mémoires, donc des nombres que nous utilisons. Mais avouez que
bcall(_ClearDraw) est plus explicite que
bcall($4540).
On remplace un nombre par du texte. Le compilateur doit donc remplacer du texte par un nombre, ce qui nous amène à utiliser
.equ !

Rappelez vous...
Code : Autre
Donc pour continuer sur ma lancée, on utilisera dans le header :
Code : AutrePar convention, le nom de toutes les romcalls débutent par un souligné "_". Après c'est vous qui voyez !
Eh oui, $4540 (Inutile de vous rappeler que c'est de l'hexadécimal

) n'a pas été pris au hasard ; il correspond à l'adresse mémoire où se trouve la romcall qui gère l'effacement de l'écran ; elle ne nécessite aucun argument.
Et quand il y en a, on les passe comment ? Et comment on fait pour savoir à quelle adresse correspond tel effet ?
Si j'ai pris un exemple où il n'y en a pas besoin, c'est que je vais en parler plus tard,

patience ! (A moins que je décide de ne pas en parler du tout, yêk

).
En ce qui concerne les adresses, je vous les donnerai en fonction des besoins du tutorial. Si vous êtes pressés, jetez donc un coup d'oeil à des
fichiers include !
Certaines romcalls "détruisent" des registres. C'est à dire qu'elles ne conservent pas leur valeur de départ. Par exemple, _ClearDraw (qui se nomme réellement _clrlcdfull) détruit TOUS les registres !
Vous en savez maintenant assez pour compiler votre
1er programme ! (Tatsiiiin !!)
Si j'ai bien suivi

, vous en connaissez maintenant assez sur le header et le corps du programme. D'accord, pas beaucoup mais assez !
Nous allons donc créer un programme qui efface l'écran
et qui ne plante pas.
Voyons... Nous n'avons besoin que d'une romcall qui a été définie précédemment.
Et j'allais oublier... L'instruction asm pour la fin d'un programme est
ret, qui nécessite donc une tabulation.
Bah ? je croyais que c'était .end pour la fin du programme ?
Attention,
.end indique à TASM où il doit s'arrêter de compiler ; tandis que
ret agira en tant que fermeture du programme lors de son exécution.
N'hésitez pas à relire les 1er chapitres jusqu'à bien les comprendre, je ne vous en voudrais pas !
Selon moi, on obtient quelque chose comme ça :
Secret (cliquez pour afficher)Code : Autre1
2
3
4
5
6
7
| #define bcall(xxxx) rst 28h \ .dw xxxx
_ClearDraw .equ $4540
.org $9D93
.db $BB,$6D
bcall(_ClearDraw)
ret
.end |
TASM laisse tout de même la possibilité de laisser des commentaires. Il suffit d'utiliser un point-virgule devant son texte ; il ne sera ainsi pas considéré comme du code.
OK, j'autorise des différences au niveau des
"appellations", c'est à dire "_ClearDraw" et "bcall(", et des
#define si vous utilisez une autre notation.
Au secours !! Ca ne marche pas !!
Si votre compilation échoue, retentez-la en utilisant le code ci-dessus tel quel, pour voir si votre erreur vient du code ou des applications. Si ça ne marche toujours pas,
éclatez votre ordinateur à coup de relisez la première partie, vérifiez que vous avez toutes les applications, qu'elles correspondent à votre calculette...
Si malgré cela la compilation échouait une fois de plus, envoyez moi un message avec l'erreur indiquée.
Une fois que vous avez un beau fichier transférable... transférez le !
Considérons xxxx comme le nom de votre programme (vous l'appelez comme vous voulez, je n'impose rien !).
Pour l'exécuter :
La commande
Asm( se trouve dans le catalogue. (2ND+0)
Logiquement, votre écran devrait ressembler à ça (après appui sur
ENTER 
) :
Ne vous inquiétez pas pour le Done, nous verrons comment le faire disparaître plus tard.
Quelle émotion, non ?
Non ?
Ok on continue
C'est bien beau d'avoir fait un programme, mais je suis sûr que vous l'avez trouvé léger et que vous en voulez plus ?
Nous allons donc voir les essentiels, c'est à dire les variables (enfin !), les fichiers include et les instructions du z80.
Courage !