Précisions pour ion



1) Compilation
2) Différence ion/83
3) librairies
4) Règles/Ajouts
5) Un prgm Ion sans le shell
6) Les Modules
7) Exemples de conversions
 

1) Compilation

Ion permet facilement de créer des programmes pour ti83+ et ti83 sans beaucoup de syntaxe en plus.

Les préparatifs :  placez Ion (ion.inc et asm.bat au moins doivent être présent), Tasm, et Devpac83 ds le même répertoire (iondev par exemple).

Placez votre fichier .z80 ou .asm ds ce rep.
Allez sous dos, tapez
cd \ [enter]
cd \iondev [enter]
asm X (nom du fichier sans l'extension)

Les erreurs vous seront indiqués par un message "There were errors". Deux fichiers seront générés, un avec l'extension .83p (pour la ti83) et un autre .8xp (pour la ti83+)
Le programme sera détecté par ion.

2) Diffèrences

Voici un prgm pour effacer l'écran. Notez bien les diffèrences.

    .nolist
    #include "ion.inc" ; ion.inc est utilisé à la place de ti83asm.inc
    .list
#idef Ti83p
    .org    progstart-2 ; partie pour la ti83+
    .db $BB,$6D
#else
    .org progstart ; partie pour la ti83
#endif
    ret
    jr    nc,start ; va au label start. Ce sera la première commande exec par le prgm
    .db    "Efface Ecran" ; titre du prgm
start
    bcall(_clrlcdfull) ; efface l'écran
    bcall(_getkey) ; saisie d'une touche, ici utilisé pour faire pause
    ret
    .end

La programmation pour ion est presque similaire à la programmation pour ti83 simple.

Il existe quelques différences de syntaxe ou de commande qui ont un nom diffèrent. Pour cela je vous conseille d'avoir sous la main les fichiers ti83asm.inc (ou squish.inc), ion.inc et ti83plus.inc. Ils vous permettront de retrouver la commande pour chaque calculatrice.

bcall marche uniquement pour app une routine système, pour app un label, call suffit.

call _grbufcpy_v sur ti83 -- call _grbufcpy pour ion.

_pushop1/op3 et _pushop1/op3 sont déjà définies dans ion.inc.

Une grande différence est pour la mémoire. La ti83+ est structuré diff de la 83.

Pour créer vos propre variable :

#define (cursav) $8265 sur 83 -- cursav = saferam1.

Avec Ion, vous pouvez utilisez trois zones de mémoires definies dans ion.inc :

- saferam1 768 octets (APD buffer, APD = automatic powerdown)
-saferam2 512 octets (Mémoire statistique)
-saferam3 128 octets (Textshadow)

3) Les Librairies

Il existe 7 librairies qui sont incluses dans ion.

Pour appeler une librairie, call <librairie>

IonVersion : Retourne le numéro de la version de ion dans hl (256 = version 1.0...) et dans e le nombre de librairies. Détruit les registres a, de et hl
Cette librairie n'a d'utilité que si votre programme nécessite absolument une version de ion particulière.
 

IonRandom : génère un nombre aléatoire compris entre zéro et le nombre dans le registre b. Ce nombre est stocké dans le registre a. Le registre b est mis à zéro.
 

Ionfastcopy : équivalent à la commande grbufcpy_v mais plus rapide, détruit les registres af, bc , de, hl.
 

Ionputsprite : équivalent de la routine de Movax.
Entrée : b -- la hauteur du sprite en pixel <=8, a -- coord x, l --coord y, ix -- sprite. Les registres af, bc, de, hl, ix sont détruits.
Sortie : Le sprite est dessiné (Xor) dans Plotsscreen (pour afficher le sprite à l'écran, il faut effectué un _grbufcpy ou Ionfastcopy).

Ionlargepsprite :  Pour dessiner des sprites de n'importe quelles dimensions.
Entrée : ix -- sprite, a -- coord x, l -- coord y, b -- hauteur du sprite en pixel, c -- b/2
Sortie : Le sprite est dessiné (Xor) dans Plotsscreen (pour afficher le sprite à l'écran, il faut effectué un _grbufcpy ou Ionfastcopy). Les registres af, bc, de, hl, ix, af' sont détruit..

Iongetpixel : Cette commande permet d'agir au pixel près.
Entrée : a --- x coord, e -- y coord
Sortie : hl -- offset (adresse memoire en héxa ) du pixel dans plotscreen, a mask du pixel, détruit af, bc, de, hl.

Iondetect : ??
Entrée : hl -- place mémoire ou chercher, ix -- chaîne à détecter
Sortie : hl -- instruction du programme, le flag est mis à jour(Z = échec, NZ = succès)

Iondecompress :??
Entrée : hl --données compressées, de -- place ou il faudra charger les données décompressées, longueur des données compressées, c --facteur de compression.
 
 

4) Règles et Ajout

Un programme pour ti83+ ne peut normalement excéder 8196 octets (7000 si les librairies sont utilisées). Si vous voulez excéder cette limite, il faut désactiver les interruptions avec la commande di et les réactiver à la fin du programme avec la commande ei (Quelqu'un pourrait m'aider à ce sujet ??).

Rappeler vous que les programmes doivent marcher pour les deux calculatrices (83 et 83+) donc tester votre programme.
Si il y a du code spécifique à une calculatrice, il faut le déclarer entre les parties #ifdef Ti83p et #else.

 Exemple :

#ifdef ti83p
; mettez ici votre code pour la ti83+
#else
; mettez ici votre code pour ti83
#endif

Il peut arriver que certaines routines aient besoin d'une modification pour marcher avec l'une ou l'autre des calculatrices.

5) Un programme avec ion sans passer par l'interface

Il est possible de réaliser des programmes avec ion sans que le shell détecte ce programme. Pour lancer le programme sur une Ti83+, asm(prgm_xxxx). Attention vous ne pourrez pas utilisez les librairies.
 Voici un "hello world" : Le programme est dans sa forme originale tel que l'on me l'a envoyé.

 ;pour être compatible avec le shell ION, il suffit de rajouter la ligne suivante :
;#DEFINE SHELL
;Uniquement valable pour TI83+
#DEFINE TI83P
#INCLUDE "ion.inc"
    .org progstart-2
    .db $BB,$6D ;identification d'un prog asm par la TI83+
#IFDEF SHELL
    ret
    jr nc,debut
    .db "Hello World !" ;titre du prog
#ENDIF
debut:
    bcall(_clrlcdfull)
    bcall(_indicatorOff)
    ld HL,$0202
    ld (currow),HL
    ld HL,String
    bcall(_puts)
loop:
    bcall(_GetK)
    cp $37 ;touche MODE (pas présent dans ion.inc)
    jp nz,loop
    bcall(_clrscrf) ;efface l'écran
    bcall(_homeup) ;curseur en haut à gauche
    ret
String:
.db "Hello World !",0
.end

 Seul un fichier pour ti83+ sera généré. Si vous ne voulez plus avoir des erreurs, il faut modifier le fichier asm.bat comme ceci :

@echo off
echo ----- Assembling %1 for the TI-83 Plus...
echo #define TI83P >temp.z80
if exist %1.z80 type %1.z80 >>temp.z80
if exist %1.asm type %1.asm >>temp.z80
tasm -80 -i -b temp.z80 %1.bin
if errorlevel 1 goto ERRORS
devpac83 %1
if exist %1.8xp del %1.8xp
rename %1.83p %1.8xp
goto DONE
:ERRORS
echo ----- There were errors.
:DONE
del temp.z80 >nul
del temp.lst >nul
del %1.bin >nul

Je remercie la personne qui me l'a envoyé.

6) Les modules

Les modules sont des programmes réagissant à certaines touches pressées.

    .nolist
    #include "ion.inc"
    .list
#ifdef TI83P
    .org sram-2
    .db $BB,$6D
#else
    .org sram
#endif
    ret
    .db 1
start:
; placez ici le code de votre module
    ld a,1 ; retour normal
    ret

Avant d'exécuter un module, Ion initialise certaines variables.

Dans le registre a, le code de la touche pressées ( a contient 255 au démarrage de ion et 55 à la fermeture)
Dans op1, le nom du programme.

Règles :

Vous devez seulement utilisez saferam2 si vous en avez besoin.
Si votre module modifie du code après $BFFF, il faut désactiver les interruptions avec di.
A la fin du module, Ion attend une valeur de retour dans le registre a. Si a contient 0, Ion redémarre.
Vous ne pouvez utilisez les librairies de ion dans votre module.
Votre module ne doit pas excéder 768 octets.