Comment "Hacker" la TI82

La base pour hacker la TI82 est la sauvegarde de la mémoire. Cette sauvegarde peut être transférée sur un PC où elle peut être modifiée et ensuite retransférée sur une TI82. La sauvegarde contient toutes les valeurs et les données des programmes de la mémoire de la calculatrice, et même bien plus, du moment où la sauvegarde a été effectuée. La disposition d'une sauvegarde de mémoire nommée backup.82p est décrite dans la figure.1. Les correspondances avec les adresses de la RAM-TI82 est aussi donnée.



Organisation de la mémoire et des sauvegardes de la TI82
 Offset sauvegardeRAM Offset
Header fichier0000-0023 
Données système0023-08418000-8D23
Données utilisateur0842-xxxx8D24-xxx
Table d'allocation variablesyyyy-Fin-3yyy-FE6E
2 bytes checksumFin-2 
Figure.1

La table d'allocation des variables (VAT) est copiée directement depuis la RAM de la TI82. Elle contient des informations à propos du nom, du type et des adresses des variables. La VAT est construite à l'envers (elle commence à "FE6E" et va en diminuant) et chaque entrée, sauf les programmes, a le format ci-dessous (figure.2). Sous certaines conditions, les sytème enregistre des données juste après la dernière entrée de la VAT, et ANS devrait y être enregistré aussi. La calculatrice doit surement déplacer ces données vers un endroit sûr quand une sauvegarde est effectuée, mais nous ne sommes surs de rien.

Zero Token2 Token1 Adresse Haute Adresse Basse Type
Figure.2

Les Zero bytes viennent en premier dans la mémoire. Cependant, tant que la VAT est construite vers la bas dans la mémoire, le byte de type est celui qui est la premier de l'entrée. Les types existants sont les suivants:

00Réel05Programme
01Liste06Programme protégé
02Matrice07Pic
03Variable Y=08GDB

(D'autres valeurs sont parfois utilisées, mais la plupart sont utilisées dans les headers. Voir les variables pour une liste plus complète.). Les 4 MSB (bit plus signifiants) du type sont utilisés par le système et peuvent avoir n'importe quelle valeur, donc il faut les masquer avant d'utiliser le byte type. Adresse haute et Adresse basse sont les bytes hauts et bas qui correspondent respectivement aux variables adresse dans la RAM. La RAM commence à $8000 et la RAM utilisateur (où les données utilisateur sont stockées) commence à $8D24. Les adresses sont souvent stockées le byte le plus bas d'abord (tant que c'est un système z80) mais dans ce cas, tant que tout est à l'envers, elle apparaissent byte haut en premier.
A la suite des adresses, il y a 2 token bytes. Toutes les noms de variables, excepté pour les programmes, sont dans la TI82 stockés dans un ou 2 token byte. If l'adresse n'en utilise qu'un, c'est le token1 qui contient l'adresse. Si l'adresse en utilise 2, elle utilise et token1 et token2. Par exemple, 60 00 est le token pour l'image pic1, 60 01 est celui de pic2, etc. La plupart des tokens sont les mêmes sur la TI82 et la TI83.
Finallement, chaque entrée de VAT se termine par un 00. Pour chaque nouvelle variable crée, une entrée dans la VAT est crée aussi. Voici un fragment de VAT qui peut servir d'exemple:

00185E901C0300195E901A03

On commence par la droite: 03 indique qu'il s'agit d'une variable de type "Y=". Son adresse dans la mémoire est $901A et son token est 5E19 qui est égal à Y0. Le suivant, est aussi un type "Y=", 5E18 ce qui indique qu'il s'agit de Y9. Il est positionné juste après le premier. C'est normal: les entrées VAT consécutives représentent des variables consécutives dans la mémoire.
Les types "Y=" et quelques autres sont mis lorsqu'ils sont initializés. Pour prévenir des fragmentations, quand une variable est effacée, toutes les variables qui sont stockées après la variable effacée sont déplacés vers la bas pour remplir les trous. La même chose se passe avec la VAT, les entrées les plus vielles sont déplacées vers le bas (mais en haut dans la mémoire!!) d'un pas. Bien sûr la VAT est aussi mise à jour pour refletter les nouvelles positions des variables qui ont été déplacées vers le haut
Après avoir pris connaissance de ce qui précède, on peut y aller...



Altérer des bytes arbitraires de la RAM

La méthode que j'ai utilisé est similaire à la méthode des dump de ROM:
1. Créer une variable réelle
2. Faire une sauvegarde de la mémoire sur le pc
3. Dans la sauvegarde "backup.82p", changer l'adresse de la variable réelle de façon à ce qu'elle pointe sur la location de RAM voulant être changée
4. Fixer "backup.82p"
5. Voilà, on peut maintenant changer directement les bytes désirés en y enregistrant les valeurs.
Le format d'une variable réelle se représente sous cette forme:

SigneExposantM1M2M3M4M5M6M7
Figure 4.

Le MSB du byte signe est le signe du nombre (positif ou négatif), si il est non défini, le nombre est positif, si il est défini alors le nombre est négatif. Les 4 LSB sont utilisés pour enregistrer le type de variable auquel le réel appartient. Les bytes restants sont utilisés par le système et peuvent prendre n'importe quelle valeur. L'exposant indice l'exposant (et oui ki l'eut cru??). A la suite viennent 14 digits codés en BCD format. Chaque case représente un digit.
Il existe encore quelques problèmes avec cette méthode. Premièrement, on doit toujours changer 9 digits d'un seul coup ce qui peut être hazardeux si on ne prend pas de précautions. Deuxièmement, en utilisant des variables réelles actuelles on peut seulement créer des patterns limités. De ce fait, à cause du codage BCD, chaque case représente un digit et ne peut contenir que des valeurs comprises entre 0 et 9 et non A à F. Heureusement, tout problème possède toujours une solution. Cette solution est:
1. Créer une autre variable réelle
2. Faire un backup
3. Changer sa valeur (et non son adresse cette fois-ci) dans le backup. Dans ce cas précis, il est possible de mettre n'importe qu'elle valeur.
4. Transférer le backup sur la calculette (après l'avoir fixé...)
5. Enregistrer le secon réel dans le premier. Lorsque cette opérations est effectuée, la calculatrice ne vérifie pas si le contenu de la source est valide. Elle copie seuleument.
Une autre méthode très utile pour lancer des programmes assembleurs sur la TI82 consiste à créer une Matrice et changer son adresse de façon à la placer dans la ROM! Ensuite en écrivant le correct élément dans la Matrice, il est possible de modifier la RAM système. Cette méthode est plus efficace si plusieurs variables de la RAM ont besoin d'être changées.
Changer le nom des variables que l'on utilise pour ça en quelchose que normalement on utiliserait pas est aussi une bonne idée tant que l'on est sur qu'un programme basic ne va pas venir empiéter et changer ces valeurs.


Lancer les codes machine Z80

Le mot à $8114 dans la RAM est un pointeur qui contient l'adresse vers laquelle la calculatrice va quand une touche a été enfoncée. En changeant ce pointeur, il est possible de lancer du code machine directement. Le TI-82 ASH est basé sur ce fait.
La partie système de la RAM contient d'autres locations qui sont utilisées comme $8114 mais la fonctions appelée s'éxécute en même temps que d'autres. Ces locations peuvent aussi être utilisées pour éxécuter du code assembleur, mais la valeur $8114 est la voie la plus facile pour y arriver.
Pour pouvoir lancer un programme en assembleur sur la TI82, il faut l'enregistrer quelque part sur dans la mémoire de la calculatrice. La calculatrice n'a pas de variables remarquables pour ce fait, mais les images ont été les premières utilisées. La façon la plus facile d'insérer du code dans une image est de tout d'abord créer une image sur la calculatrice, ensuite apres avoir effectué une copie sur le PC, y insérer le code machine, puis de la retransférer. Ensuite, il faut faire un backup afin de modifier les adresses comme précédemment. Lorsque tout ceci est effectué, il faut créer une variable réelle. Dans la première, on enregistre l'adresse $8D24 (là ou doit résider le fameux code) et dans la seconde, $8114. Ensuite il suffit de faire var1 -> var2.
Pour effectuer un retour vers le TI-OS, il faut d'abord restaurer le pointeur de touche puis faire un ret.
Le problème lorsque l'on utilise les images est que la taille est toujours la même. C'est-à-dire que lorsque le programme est petit, il y a un vide inutile alors qu'il n'est pas possible de dépasser une certaine taille (1000Ko).

Informations techniques

La ROM de la TI82 fait une taille de 128Ko. Mais le Z80 ne peut adresse que 64Ko et les 32Ko de la RAM pour aller dans ces 64, la ROM a été divisée en 8 ROM pages à 16Ko. Les espaces adresses sont arrengés comme indiqué ci-dessous:
Page0$0000-$3FFF
Page0-7$4000-$7FFF
Ram$8000-$FFFF
figure 4.
La ROM page 0 contient les routines de la ROM qui sont le plus souvent utilisées. La deuxième ère de ROM peut contenir n'importe lesquelles des 8 ROM pages (16Ko chacune), dépendament du type de tâche que la système est en train de réaliser. Le ROM switching mécanisme est connecté à un port du processeur Z80.