Casio FX : Les appels système MODEx
Des instructions totalement méconnues existent dans les programmes des libs, il s'agit des MODEx.
Il s'agit d'appels système très puissant, non-documentées et leur fonctionnement reste obscur car leur usage est interdit dans les programmes standards situés en RAM. Frustrant ! Mais il nous en fallait plus pour nous arrêter, et nous avons malgré tout réussi à en exploiter réellement 2 : MODE32 et MODE33.
Pour se faire, voici en substance la façon de procéder :
Définir les valeurs des paramètres d'appel du MODEx.
Mémoriser puis détourner le pointeur de zone de contrôle du dernier programme lancé (1771 à 1773) afin de le positionner sur la librairie qui exploite l'instruction MODEx désirée.
Lancer l'appel en effectuant un GOSUB à la ligne où se situe l'instruction dans la librairie. Un RETURN présent dans le source de la librairie (et consécutif au MODEx) nous permet de revenir sans heurt dans notre programme .
Restaurer les valeurs initiales du pointeur de zone de contrôle du dernier programme lancé
Poursuivre l'exécution de notre programme.
Il existe une autre méthode pour détourner ces appels systèmes, celle employée des espagnols (voir le manuel d'Alquimista - pages 28 à 37), qui consiste à bidouiller la pile des appels des GOSUB/RETURN.
Ainsi, il devient dès lors possible d'utiliser les autres MODEx, à savoir MODE30, MODE31 et MODE34.
MODE32
Fonction
Ajoute 33 à la valeur ASCII de chaque composante d'une chaine de caractère. Pas de réelle application à cette fonction, il faut bien le reconnaître, si ce n'est de générer une sorte de cryptage par décalage de la chaîne d'entrée.
Exemple : A → b , B → c, etc.
Paramètres
Un seul paramètre qui correspond à la chaine de caractère à traiter.
Où le trouver ?
Le seul appel au MODE 32 exploitable est celui de la LIB 0900, ligne 50 car il est suivi d'un RETURN nous permettant de retourner dans un le programme qui l'a appelé.
Code source : Mise en oeuvre
Il est IMPERATIF de respecter dans le source suivant la case des variables (les minuscules et majuscules).
10 DEFSEG=0:X=1771:A=PEEKX:B=PEEK(X+1)
20 INPUT "STRING :",g$
25 POKEX,204:POKEX+1,247:POKEX+2,5
30 GOSUB50
35 POKEX,A:POKEX+1,B:POKEX+2,0
40 PRINT g$;:END
Explication du code
Ligne 10 : Mémorise le pointeur de la zone de programme actuellement chargé en mémoire. Sera utile pour remettre ce pointeur en état, vu que nous allons jouer avec !
Ligne 20 : Enregistrement des paramètres souhaités.
Ligne 25 : Positionnement du pointeur de la zone du programme chargé en mémoire vers la LIB 0900. A partir d'ici, l'ordinateur pense que nous sommes dans la LIB 0900.
Ligne 30 : On se branche sur la ligne 50 par le biais d'un GOSUB, ce qui nous garanti un retour à notre programme d'origine au premier RETURN rencontré dans le source de la LIB 0900.
Ligne 35 : De retour dans notre programme, on remet le pointeur de la zone du programme tel qu'il était à l'origine.
MODE33
Fonction
Permet de copier un bloc d'octets.
Paramètres
Trois paramètres interviennent dans ce mode :
L'adresse de début du bloc
L'adresse de fin du bloc
L'adresse de destination
Où le trouver ?
Le seul appel au MODE 33 exploitable est celui de la LIB 0900, ligne 2090 car il est suivi d'un RETURN nous permettant de retourner dans un le programme qui l'a appelé.
Code source : Mise en oeuvre
Il est IMPERATIF de respecter dans le source suivant la case des variables (les minuscules et majuscules).
10 DEFSEG=0:X=1771:A=PEEKX:B=PEEK(X+1)
15 INPUT"BEGINING : ",d,"ENDING : ",F,"DESTINATION : ",a
20 n=F-d:f=d-1:e=n+f:o=a+n-1:IFFRE1+e-f<0;PRINT "MODE33 FAILED";:END
25 POKEX,204:POKEX+1,247:POKEX+2,5
30 GOSUB2090
35 POKEX,A:POKEX+1,B:POKEX+2,0
40 PRINT"MODE33 Ok!"
Explication du code
Ligne 10 : Mémorise le pointeur de la zone de programme actuellement chargé en mémoire. Sera utile pour remettre ce pointeur en état, vu que nous allons jouer avec !
Ligne 15 : Enregistrement des paramètres souhaités.
Ligne 20 : Préparation des variables qui vont être sollicitées à la ligne 2090 de la LIB 0900.
Ligne 25 : Positionnement du pointeur de la zone du programme chargé en mémoire vers la LIB 0900. A partir d'ici, l'ordinateur pense que nous sommes dans la LIB 0900.
Ligne 30 : On se branche sur la ligne 2090 par le biais d'un GOSUB, ce qui nous garanti un retour à notre programme d'origine au premier RETURN rencontré dans le source de la LIB 0900.
Ligne 35 : De retour dans notre programme, on remet le pointeur de la zone du programme tel qu'il était à l'origine.
Exemple d'application
On a pas besoin tous les jours de copier des blocs d'octets à la volée, c'est un fait, surtout sur cette machine. Malgré tout, voici un exemple de mise en application du code ci-dessus.
L'objectif est de copier la première ligne affichée à l'écran dans la mémoire CALC. Voici la manoeuvre :
Allumez le FX-850P
Appuyez sur la touche IN pour purger le contenu de votre CALC.
Placez vous en BASIC en appuyant sur MODE puis 1.
Apparait la liste de vos programmes… C'est la première ligne que nous allons copier.
Placez vous dans la plage mémoire où vous avez saisi le programme MODE33.
Exécutez-le en tapant RUN.
Début de bloc : 0 (la mémoire de l'écran commence à l'octet 0).
Fin de bloc : 31 (on tire jusqu'au bout de la ligne).
Destination : 1024 (c'est l'adresse où est stocké le contenu du CALC.
L'exécution du programme est terminée.
Repassez en MODE 0, et appuyez sur la touche OUT, et admirez le résultat.