Survol
Ceci prouve la puissance de l'Asm. Ce tutorial parlera des utilisations des ROM
calls _CreateProg (_CreateProg = 4339h) et _CreateProtProg. Ces deux ROM calls
créent des programmes sur la TI-83 Plus. La différence entre les deux réside
dans le fait que _CreateProg créée un programme qui peut être édité sur la
calculatrice, et _CreateProtProg créée un programme qui ne peut pas l'être.
Programmation
Ce programme va créer un programme Asm Getkey et un programme en TIBasic pour
exécuter le programme Getkey.
.NOLIST
;Ce programme peut avoir l'air long, mais la plupart de ces lignes sont
nécessaires
#define equ .equ
#define EQU .equ
#define END .end
#include "ti83PlusAsm.inc"
.LIST
.org 9D95h
B_CALL(_clrLCDFull)
B_CALL(_Homeup) ;Vide l'écran
ld hl,prgmcreate ;Charge le texte
sous le label PrgmCreate
B_CALL(_puts)
B_CALL(_Newline)
ld hl,asmcreate ;Charge le
texte Asmcreate
B_CALL(_puts) ;Affiche le texte
B_CALL(_zeroop1) ;Met Op1 à zéro
ld hl,progname1 ;le nom du programme
ld de,op1
;copier-le dans op1
ld bc,5 ;5 caractères dans le nom
ldir
;copie du nom...
ld hl,241
;longueur du programme (en octets)
B_CALL(_createprog) ; création du programme non protégé (peut
être édité sur la calculatrice)
inc de
;skip 1st length byte
inc de
;skip 2nd length byte
ld hl,prog1
;données du programme Asm sous le label prog1 label
ld bc,241
;longueur des données du programme
ldir
;copie les données du programme
ld hl,basiccreate ;Charge le texte à partir du
label Basiccreate
B_CALL(_puts)
B_CALL(_zeroop1)
ld hl,progname2 ;Le nom du programme
ld de,op1
;le copier dans op1
ld bc,7
;7 caractères dans le nom
ldir
;copie du nom...
ld hl,6
;longueur du programme (en octets)
B_CALL(_createprog) ;création du programme
inc de
;skip 1st length byte
inc de
;skip 2nd length byte
ld hl,prog2
;données du programme
ld bc,6
;longueur des données du programme
ldir
;copie les données
ret
progname1:
.db PROGOBJ,"ASM",0 ;"ASM" est le nom du programme Asm Getkey
prog1:
;Données du programme Asm
.db t2bytetok,tAsmPrgm,tEnter ;Voir
la section Token ci-dessous pour des explications
.db "EF4045EF5845",tEnter
.db "21EC9DEF0A45",tEnter
.db "EF7249F5EF40",tEnter
.db "45EF584521F8",tEnter
.db "9DEF0A45F1CD",tEnter
.db "BC9DEF7249EF",tEnter
.db "2E45C9F5E6F0",tEnter
.db "1F1F1F1F6F26",tEnter
.db "0011DC9DD519",tEnter
.db "7EEF0445D1F1",tEnter
.db "E60F6F260019",tEnter
.db "7EEF0445C930",tEnter
.db "313233343536",tEnter
.db "373839414243",tEnter
.db "444546507573",tEnter
.db "682061206B65",tEnter
.db "792E004B6579",tEnter
.db "20636F64653A",tEnter
.db "2000"
progname2:
.db PROGOBJ,"BASIC",0
;Nom du programme en Basic
prog2:
.db t2bytetok,tAsm,tProg,"ASM" ;Données du programme Basic
prgmcreate:
.db "Program Creator!",0
asmcreate:
.db "Creating ASM...",0
basiccreate:
.db "Creating BASIC...",0
.end
END
Si vous voulez créer des programmes qui ne peuvent pas être édités sur la
calculatrice, remplacez _createprog par _createprotprog.
Nouvelles commandes
_CreateProg - Crée un programme qui peut être édité
_CreateProtProg - Crée un programme qui ne peut pas être
édité
ldir - Charge des données d'un endroit à un autre
Tokens
La chose la plus difficile à propos de programmes qui en créent d'autres sont
étonnement les tokens. Pensez aux commandes Clrhome et Disp en
TIBasic. Ce sont des tokens. Il en va de même avec Cos( et Sin( et
Tan( et n'importe quoi d'autres que vous affichez à l'écran en utilisant
un bouton ou en regardant dans un menu. Nous savons tous que chaque caractère
que nous tapons fait un octet. De combien de mémoire dispose ma calculatrice ?
Pas beaucoup comparé au disque dur de mon ordinateur. Donc au lieu de stocker
les commandes (Clrhome, Disp, Cos(, Sin(, Tan(, etc.) comme une chaîne de
caractères, Texas Instruments a été assez futé pour les stocker sur un octet
chacune. C'est pourquoi la commande stockée dans la mémoire de la calculatrice
est appelé un token ("jeton", en anglais). Quoi!? Nous avons utilisé tEnter,
tprog, etc.. dans le programme! Ceux-ci sont les noms en Asm des tokens. Le "t"
signifie Token, donc tEnter serait l'équivalent d'une pression sur la
touche Enter, ou dans notre cas, un retour à la ligne. Pour une liste complète
des tokens de TI-83 Plus, allez voir le fichier include
ti83PlusAsm.inc.
Presque tous les tokens de TI-83 Plus font 1 octet, à
l'exception de certains. C'est à ce propos que même moi j'ai eu besoin d'aide.
J'ai posé la question à Matthew Roberts. Après quelques jours, il avait trouvé
la réponse. Si vous regardez les tokens ">" et "tAsm", vous remarquez qu'ils ont
la même adresse en mémoire. C'est parce que tAsm est un token de 2 octets. C'est
pourquoi si vous assemblez le programme avec seulement tAsm, le résultat serait
">". Donc pour avoir la commande Asm( au lieu de ">", nous avons du
utiliser le token t2ByteTok. Il définit la longueur du token à 2 octets. Si vous
voulez savoir quels tokens font 2 octets, regardez dans le fichier include
ti83PlusAsm.inc (100Ko) en dessous de 2byteTokens.
Autre chose à savoir à propos des données du programme, vous
devez indiquer à la calculatrice de quelle taille doit être le programme qu'elle
crée. Vous chargerez cette valeur dans le registre bc, car c'est là que le ROM
call _createprog cherche la taille du programme. Comment savoir quelle taille
font les données du programme ? Eh bien c'est simple. Comptez combien de tokens
et de caractères vous utilisez à l'intérieur de guillemets. Faites la somme de
ces nombres, et le total vous donne la taille des données de votre programme en
octets. =)
Conclusion
Encore une fois, je voudrais remercier Matthew Roberts pour son aide avec les
tokens à 2 octets. Où serais-je sans lui ? Pas la peine de répondre. Allons vérifier la
mémoire avec un programme Asm !
Cliquez pour revenir au menu du site... ou ici pour retourner au menu du tutorial.