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 sauvegarde | RAM Offset |
Header fichier | 0000-0023 |   |
Données système | 0023-0841 | 8000-8D23 |
Données utilisateur | 0842-xxxx | 8D24-xxx |
Table d'allocation variables | yyyy-Fin-3 | yyy-FE6E |
2 bytes checksum | Fin-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:
00 | Réel | 05 | Programme |
01 | Liste | 06 | Programme protégé |
02 | Matrice | 07 | Pic |
03 | Variable Y= | 08 | GDB |
(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:
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:
Signe | Exposant | M1 | M2 | M3 | M4 | M5 | M6 | M7 |
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.