Tutorial 24
Un programme en crée d'autres

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 !

Tutorial 25

    Cliquez pour revenir au menu du site... ou ici pour retourner au menu du tutorial.