Index des articles > Hardware > Référence du Hardware TI

Référence du Hardware TI

Article posté par Billy Charvet

Espace d'adressage TI
---------------------

0x0 - 0x1FFFFF = Zone de 2 Mo.
La RAM (256K), et 7 Ghost Spaces.
(Sachant que 0x0-0x11F est la table des vecteurs,
qui peut être protégée contre l'écriture)

ROM_BASE vaut 0x200000 sur TI-89 et Voyage 200,
0x400000 sur TI-92 Plus et 0x800000 sur TI-89 Titanium.

offset depuis ROM_BASE:

+0 - +1FFFFF = Flash des TI-89/TI-92+ (2 Mo)
+0 - +3FFFFF = Flash des V200/TI-89 Ti (4 Mo)

+0 - +0x7 = Vecteur de Cold Reset. 8 octets
(valeurs de SSP et PC au boot)

+0 - +0xFFFF = Secteur de boot (64K) , impossible
à écrire. (Les 8 premiers octets sont
le vecteur de reset, c'est-à-dire pile
superviseur et compteur de programme initial.)

+10000 - +11FFF = Mémoire des certificats (impossible
d'y lire) 8 Ko.

+12000 - +17FFF = Base1: Boot de l'OS (24 Ko)
On peut y écrire.
(PedRom, Pyrix l'utilisent)

+18000 - +19FFF = 8 Ko protégés en lecture.

+1A000 - +1FFFFF/+3FFFFF = Base2, zone la plus
importante de l'OS.
1944 Ko ou 3992 Ko,
selon que la TI a 2 Mo ou
4 Mo de Flash.

0x60000-0x60001F = ASIC (32 octets)
0x70000-0x70001F = ASIC (32 octets) HW2/HW3 seulement.


Les auto-interruptions
----------------------

AI1 Déclenchée à une fréquence de OSC2/2^11. cf 0x600015:7/1

AI2 Déclenchée lorsque _UNE_ touche est _PRESSEE_.
(Garder la touche enfoncée ou appuyer plusieurs
touches ne la déclenche pas)
Mais elle peut être déclenchée plusieurs fois
par un seul appui, et même quand on lâche la
touche... cf 0x600019. Activée en écrivant un octet à 0x60001B.

AI3 Désactivée par l'AMS avant 2.06-2.09, (les premières versions
peuvent planter quand elle est activée).
Activée, elle est déclenchée à une fréquence de
OSC2/2^19. cf 0x600015:2.

AI4 Sert au link. Lire depuis 0x60000C et
parfois lire/écrire à 0x60000F pour l'activer.

AI5 Déclenchée par le timer programmable.
Par défaut (lors d'un reset), à une fréquence
de OSC2/(K*2^9), K=79 pour HW1, K=53 pour HW2.
cf 0x600015 et 0x600017.

AI6 Déclenchée par la touche ON. Même imperfections
que pour AI2. Ecrire un octet dans 0x60001A pour l'activer.

AI7 Déclenchée lors d'une tentative d'écriture dans la
table des vecteurs d'interruptions, lorsque celle-ci
est protégée. Cela permet aussi de détecter
les dépassements de pile, si l'on fait une pile dont
la limite est la table des vecteurs.
cf 0x600001:2

Les oscillateurs
----------------

Leur vitesse dépend de la charge des piles.
OSC3 diminue avec des piles usées.

OSC1

C'est l'horloge du 68000. A chaque tick,
une instruction est prise et exécutée.

Fréquence:
HW1 -> 10 Mhz
HW2 -> 12.5 Mhz

OSC2

Cette horloge sert pour les timers, le link
de la TI, et sur HW1, pour le LCD.

Fréquence:
HW1 -> 680 kHz à 770 kHz
HW2 -> max 520 kHz environ.

Connaissant la valeur en secondes de l'APD par défaut,
on peut calculer sa vitesse.

HW1 -> 242 688 000/APD
HW2 -> 162 816 000/APD

L'APD valant 300 à 360 secondes environ.
Si un mauvais programme reprogramme le timer d'une HW2
avec des réglages de HW1, l'APD dépassera les 400
secondes, et on devrait utiliser la formule du HW1.

OSC3

Cette horloge est présente sur HW2 et HW3 uniquement.
Elle sert pour le contrôleur LCD.
Fréquences inconnues... sur une HW2,
on peut avoir environ 680 kHz.

Les protections
---------------

Aucune écriture ne peut être faite de ROM_BASE
à ROM_BASE+0xFFFF. C'est le bootcode.
(Protection hardware, incontournable)

HardWare 1
----------
4 accès de suite à 0x1C0000-0x1FFFFF plantent la TI.

3 accès de suite à un secteur de Flash (64K) possédant
la "protection d'accès multiples" plantent la TI, ce qui
empêche l'exécution d'une telle zone.
(voir l'ASIC)

HardWare 2
----------

Une seule instruction récupérée d'un secteur possédant
la "protection d'exécution" plante la TI.
(cf 0x700012)

Une instruction récupérée d'un page de RAM (4K)
en "exécution interdite" plante la TI.
Cette protection considère que le ghost space
(0x40000-0x1FFFFF) fait partie de la dernière page
de RAM. Donc si la dernière page de RAM n'a pas le
flag "exécution interdite", le ghost space entier
est exécutable.
(Voir 0x700000.)

La table des vecteurs d'interruption
(0x000000-0x00011F) est protégée contre l'écriture.
Si on y écrit, l'interruption 7 est déclenchée.
Le port 0x600001 permet de régler cette protection.

La Protection
-------------

Les accès en écriture de ROM_BASE+0x10000
à ROM_BASE+0x1FFFFF n'ont aucun effet.
On ne peut pas lire les certificats. (ROM_BASE+0x10000-ROM_BASE+11FFF)
On ne peut pas lire de ROM_BASE+0x18000 à ROM_BASE+$19FFF.

De plus, sur HardWare 2, une partie de l'ASIC est protégée,
notamment celle permettant de régler l'exécution des pages
de RAM et des secteurs de Flash.

On ne peut donc pas écrire dans la Flash. Pour contourner
cette protection, il faut:

- Faire au moins 3 lectures dans ces zones: (offsets depuis ROM_BASE)
+0 - +0x0ffff (le bootcode, matériellement impossible à écrire)
+0x12000 - +0x17fff (Base 1, protégée en écriture par la Protection)
+0x1a000 - +0x1ffff (3 lectures consécutives planteront une HardWare 1)

- Ecrire entre 0x1c0000 et 0x1fffff, c'est-à-dire en RAM dans le huitième Ghost Space.

L'autre méthode, c'est sauter dans une des zones ci-haut avant d'écrire.
Sur le bootcode, ça ne sert à rien car on ne peut affecter son comportement.
Sur les certificats, on ne sait pas ce qu'il y a, c'est aussi une perte de temps.
La dernière zone concerne les 24 premiers Ko de Base 2, et peuvent être utilisés,
mais posent problème sur HW1.

Attention, désactiver la protection rend possible le fait d'écrire sur les certificats.
Si c'est le cas, AMS aura de gros problèmes (peut-être possibilité néanmoins
d'envoyer PedRom par FreeFlash ?) et le bootcode vérifie un octet dans les certificats,
refusant de faire quoi que ce soit (même de recevoir un OS) s'il obtient quelquechose
d'incorrect. En clair: une fois la Protection désactivée, vous rendez possible
l'écriture sur les certificats. Et si c'est le cas, il y a bien des chances qu'au
prochain Reset de la RAM votre TI soit inutilisable, bloquée sur un
"Corrupt Certificate Memory" à jamais.

L'ASIC
------

0x600000

:7 -> Permettre la sortie de la pin 100 (Laisser à 0)
:6 -> Permettre la sortie de la pin 99 (idem)
:5 -> Pour HardWare 0, données à la pin 100.
utilisée pour l'écran LCD des TI-92 I/II. Inutile sinon.
:4 -> Pour HardWare 0, données à la pin 99.
:3 -> rien
:2 -> Donnée reçue de la pin 99. 0 par défaut.
Est armé quand le voltage des piles est inférieur
au voltage de déclenchement, qui se règle avec le port 0x600018.

0x600001

:2 -> Protection de la table des vectors
L'int 7 sera déclenchée lors d'une écriture à cette
adresse, et à 0xE00000-0xFFFFFF.
:0 -> Sur HW1, s'il est armé, on a 128Ko de RAM.
Utilisé pour le HardWare 0.
Donc à laisser à 0 toujours.

0x600003

Sert à l'attente du bus, utile seulement au HardWare 0.
7: -> ???
:6-4 -> Etat d'attente pour les accès hors de la RAM.
:3 -> ???
:2-0 -> Etat d'attente pour les accès à la RAM.

En écriture seule. Si 0xED, 0xEE, 0xEF ou 0xF0 le LCD risque de se comporter
de manière étrange sur HW1.
Toujours régler cette valeur à 0xFF.

0x600005

Ecriture seule. Eteind le 68000 et le réveille si on
appuie sur ON ou dans certains cas:

:4 -> int 5 (timer programmable)
:3 -> int 4 (link)
:2 -> int 3 (OSC2/2^19)
:1 -> int 2 (appui d'une touche autre que ON)
:0 -> int 1 (OSC2/2^11)

Armer les flags 0 et 4 à la fois peut causer des problèmes.
Pour s'éteindre, la calculatrice ne doit pas avoir toutes les
interruptions désactivées. Mais pour s'allumer, cela ne
dépend pas du masque d'interruptions.
S'assurer que int 6 est active avant d'écrire 0x00...
Théoriquement, l'appui de ON réveille toujours la calculatrice,
mais...

0x60000C

Contrôle du link. 0x8D quand rien, écrire 0xE0 puis 0x8D pour réinitialiser,
0x8F pour envoyer.

:7 -> Autostart actif, devrait être armé si le flag 3 du port précédent l'est.
:6 -> Permettre l'accès direct au port. Désactive l'envoi/réception d'octets,
ainsi que les interruptions.
:5 -> Désactiver l'expiration du link.
:3 -> Déclencher une AI4 en cas d'erreur (expiration ou violation du protocole)
:2 -> Déclencher une AI4 si le link est actif.
:1 -> Déclencher une AI4 si le tampon de transmission est vide.
:0 -> Déclencher une AI4 lors de la réception d'un octet.

Une lecture active l'int 4.
Le link génère beaucoup d'interruptions, et le gestionnaire
appelé doit lire le port 0x60000D pour savoir pourquoi l'AI4 s'est déclenchée,
et régler les bonnes valeurs ici, sinon le 68k n'arrêtera pas de
déclencher l'AI4.
Lorsque l'OSC2 est éteint (donc la calculatrice aussi), AI4 n'est plus
déclenchée que par le flag 2. (N'importe quel activité de link)

0x60000D

Cause de l'appel d'AI4, en lecture seule.
Il faut lire les bits dans cet ordre: :3, :7, :5, :6.

:7 -> Erreur ? (non définie si :3 armé)
Il faut réinitialiser le link (si on ne veut pas enchaîner les AI4...)
:6 -> Le tampon de transmission est vide. (non défini si :5 ou :7 armé)
Le remplir de nouveau avec un octet à 0x60000F, ou effacer 0x60000C:1.
(Dans ce second cas la transmission est finie par exemple)
:5 -> Il y a un octet dans le tampon de réception. (non défini si :7 armé)
Il faut lire l'octet à 0x60000F.
:4 -> L'interruption du link ne peut se déclencher. Armé lorsqu'on est
dans un gestionnaire d'interruption.
:3 -> Le link est actif. (Les gestionnaires d'interruption de l'AMS s'arrêtent
dans ce cas.)
:2 -> Le link reçoit des données. Quelqu'un essaye d'envoyer quelquechose à la TI.
:1 -> Toujours armé ?
:0 -> Toujours 0 ?


0x60000E

Accès direct au port link. Désactivez l'accès par octets
d'abord, avec 0x60000C:6. Le link fonctionne en half-duplex.
Il y a deux lignes, "ring" et "tip".
Au départ, tip est activé par l'envoyeur en envoyant un bit 0. (En armant :2)
Au départ, ring est activé par l'envoyeur en envoyant un bit 1. (En effacant :3)

On active la bonne ligne, et le receveur signale qu'il a bien reçu en
activant l'autre ligne. Puis l'envoyeur désactive sa ligne, et enfin le
receveur désactive l'autre ligne. On envoie toujours par octets entiers,
LSB en premier. Une erreur est signalé en activant les deux lignes en
même temps pendant environ un quart de seconde.
tip correspond au fil rouge, le canal droit du son stéréo.
ring correspond au fil blanc, le canal gauche du son stéréo.

:6 -> Permettre l'accès direct au port.
:3 -> Statut de "ring". (1=activé)
:2 -> Statut de "tip". (1=activé)
:1 -> Donnée de "ring", si accès direct activé.
:0 -> Donnée de "tip", si accès direct activé.

0x60000F

.byte -> Donnée du tampon de réception ou vers le tampon d'émission.

0x600010

Ecriture seule.
.word -> Adresse depuis laquelle le LCD prend son image divisée par 8. HW1 seulement.
Sur HW2, c'est inutile. Voir 0x700017.

0x600012

Ecriture seule.
:13 à :8 -> "n". Le contrôleur DMA de l'écran utilisera (64-n)*16 pixels pour faire chaque ligne.
Si on le change, il faut modifier 0x60001C à des valeurs appropriées
pour adapter la fréquence de changement de ligne au nombre de pixels
d'une ligne. 0x80 par défaut.
:7 à :0 -> C'est "n", "256-n" étant la hauteur du LCD.
Chaque écran fera ce nombre de lignes, chacune étant constituée d'un nombre de pixels
abordé ci-haut. 0x31 par défaut.

A noter que le contraste devra être ajusté si on change la hauteur de l'écran.
Les lignes étant rafraichies plus souvent, l'écran s'assombrit.
De plus, ce port est fait de deux registres 8 bits. On peut écrire dans l'un sans
affecter l'autre.


0x600015

Réglage de l'oscillateur 2. Par défaut: 0x1b

:7 -> Désactive tous les compteurs générant des interruptions.
L'AI1 n'est pas fixée à (LCD-update*4). Si on modifie
le nombre de lignes ou la fréquence de changements
de ligne, les niveaux de gris et autres choses similaires
risques de ne pas marcher.
:5 - :4 -> Fréquence de l'incrémentation de 0x600017
(implique celle de l'AI5, 53/79 fois plus lente)
0 = OSC/2^5
1 = OSC/2^9
2 = OSC/2^12
3 = OSC/2^19
:3 -> Activer l'incrémentation de 0x600017
:2 -> Activer l'AI3, OSC/2^19 (aux alentours d'une fois par seconde)
:1 -> Active OSC2. Si désarmé, stoppe l'oscillateur 2 (et 3 ?)
:0 -> Active le contrôleur DMA du LCD. Si désarmé, l'écran s'éteint.
Sur HW2/HW3, une puce est utilisée. Tandis que sur HW1, le LCD
prendra environ 10 % de la bande passante du bus du 68000.

0x600017

.byte -> Compteur. L'AI5 est générée quand il passe de 0xFF à 0. (Overflow)
Vitesse d'incrémentation contrôlée par 0x600015. Après la
génération d'une interruption par overflow, le compteur retourne
à une valeur de (257-n), n se réglant en écrivant dans le port.
La lecture, quand à elle, retourne la valeur actuelle du compteur.
Donc pour déclencher AI5 tous les n incréments, écrire 257-n dans le port.
Par défaut, sur HW1: 0xB2 = 257-79 et sur HW2/HW3: 0xCC = 257-53

0x600018

.word: (0x280 par défaut)

:9 - :7 -> Niveau des piles: Règle le voltage de déclenchement de 0x600000:2.
Ecrivez la valeur que vous voulez tester dans ces 3 bits, puis testez le
bit 2 de 0x600000 pour savoir si les piles ont un voltage inférieur à:
0 : 4.6 V
1 : 4.5 V
2 : 4.3 V
3 : 4.0 V
4 : 3.7 V
5 : 3.4 V
6 : 3.2 V
7 : 2.9 V (Reset de la TI)

AMS affiche "BATT" en-dessous de 4.3 V et BATT blanc sur noir
en-dessous de 4.0 V.

:6 - :0 -> Masque des lignes pour le clavier.
Un bit armé -> la ligne ne sera pas lue à 0x60001b.
Attention, les gestionnaires d'interruptions de l'AMS écrivent ici
parfois. Désactiver les interruptions avant de l'utiliser.


0x60001A

:1 -> Si ce bit est armé, ON est pressée. Sinon, il vaut 0.
Ecrire cet octet active l'interruption 6.

0x60001B

.byte -> En cas d'écriture, active l'AI2.
En cas de lecture, fournit l'entrée des colonnes du clavier.
Un 0 indique qu'une touche sur une ligne non masquée dans la
colonne correspondante est pressée.

Matrice du clavier de la TI-89 :
Lignes Colonnes ->
| +-------+-------+-------+-------+-------+-------+-------+-------+
| | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
+-------+-------+-------+-------+-------+-------+-------+-------+-------|
| Bit 0 | alpha |diamond| shift | 2nd | right | down | left | up |
| Bit 1 | F5 | clear | ^ | / | * | - | + | ENTER |
| Bit 2 | F4 |backspc| T | , | 9 | 6 | 3 | (-) |
| Bit 3 | F3 |catalog| Z | ) | 8 | 5 | 2 | . |
| Bit 4 | F2 | mode | Y | ( | 7 | 4 | 1 | 0 |
| Bit 5 | F1 | home | X | = | | | EE | STO | APPS |
| Bit 6 | | | | | | | | ESC |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+

Ainsi, pour savoir si ENTER est pressée, écrire 0b1011111 dans 0x600018,
puis attendre une interruption clavier, et lire le bit 0 de 0x60001B. S'il vaut
0, ENTER est pressée.


0x60001C

:5 - :2 -> Fréquence du RS (vitesse d'écriture des lignes), de fréquence OSC/((16-n)*8 )
Par défaut: 0x21, soit 64 cycles par RS, donc 256 pixels par RS.
0xFF éteinds le LCD en quelquesorte.

60001d

:7 -> HW1 : S'il est armé, le multiplicateur de voltage est activé. Laisser 1.
:4 -> HW1 : LCD allumé si 0
HW2 : Bit 4 du contraste (MSB)
:3 - :0 Contraste, les 3 bits restants. Bit 3 MSB sur HW1.


Ports HardWare 2/3
----------------

Ces ports complètent l'ASIC seulement sur HW2/HW3.

0x700000 - 0x700007
-------------------

64 bits: Protection des pages de RAM. C'est un bitmask,
où chaque bit armé interdit l'exécution d'une page
de 4 Ko. Les bits sont regroupés par mots. Le premier
mot règle la protection des premières pages, le dernier
règle la fin de la RAM. Mais au sein de ces mots,
le bit le plus haut règle la page de RAM la plus haute.
(Alors essayer de tout régler en 2 mots longs peut amener
à des erreurs)

L'AMS 2.03 ne laisse que 2 pages aux programems,
l'AMS 2.04-2.09 en laissent 6.

Comme dit plus tôt, les Ghost Spaces sont considérés
comme faisant partie de la dernière page de RAM, alors reloger
en Ghost Space permet de contourner cette protection et exécuter
un programme de jusqu'à 64 Ko.

AMS 3 laisse 16 pages aux exécutables, permettant directement
d'exécuter 64 Ko, de plus le Ghost Space n'existe plus, il ne
faut plus utiliser cette astuce.

On peut lire ou écrire, mais l'écriture n'a aucun effet si
la Protection est active.

0x700008 - 0x700000F
------------------

Ce sont les doubles des ports contrôlant la protection d'exécution
de la RAM, de 0x700000 à 0x700007. Toute écriture sur un port de l'une
des deux zones affecte également l'autre zone.

0x700011
--------

Ecriture seule. 0x40, mis à 0x57 par le bootcode
si "i" est pressé durant le boot. Semble régler la
vitesse de transfert du port.

0x700012
--------

Protection d'exécution de la Flash.
:5 à :0 : n

Après avoir réglé n, le premier secteur protégé de la Flash est (ROM_BASE+(n+1)*0x10000)

Lors du boot, l'AMS la règle à 0x0018, ce qui protège
toute la Flash à partir de ROM_BASE+0x190000.

0x700014 - 0x700015
-------------------

La RTC (Real Time Clock).
Incrémentée toutes les 2^13 = 8192 secondes.
Lors de la lecture, il faut lire le mot entier, sous peine de lire de
fausses valeurs.
Elle ne change plus lorsque les piles sont enlevées, mais sa valeur
n'est pas perdue pendant ce temps. En revanche, retirer la pile de
sauvegarde fera perdre cette valeur. (La RTC aura par la suite une
valeur aléatoire.)

0x700017
--------

Le contrôleur LCD des HW2 ne prend pas les données directement de
la RAM mais d'une mémoire de 4 Ko. Le 68000 écrit dans sa RAM,
et pour une zone donnée, cela écrit simultanément dans la "mémoire vidéo".
Ce port permet de régler cette zone.

:1 et :0 -> 0: 0x4C00-0x5BFF
1: 0x5C00-0x6BFF
2: 0x6C00-0x7BFF
3: 0x7C00-0x8BFF

Ce port n'est pas l'équivalent de 0x600010 du HW1.
AMS ne vérifie rien, il considère toujours que le LCD est à 0x4C00.

0x70001D
--------

:7 -> Changé à chaque FS (chaque fois qu'un écran a été tracé)
:3 -> Bit de vérification des piles B
:2 -> Armé (?)
:1 -> LCD allumé ? (Si 0, éteint le LCD)
:0 -> Bit A de vérification des piles
Les deux bits de vérification doivent être armés avant
de vérifie le voltage avec 0x600000:2. Après cela, il faut
effacer B tandis que l

0x70001F
--------

Bit 2 : activate l'incrementation de 0x700014.w quand le bit 1 est armé.
Lors d'un Reset, l'AMS arme ce bit.

Bit 1 : Son effet dépend de l'état du bit 2.
bit2/bit1
1 1 : Etat choisi par l'AMS après un reset. La RTC fonctionne.
1 0 : Les auto-ints 1, 2, 3 et 5 sont désactivées. La RTC est arrêtée.
0 1 : RTC arrêtée. Les auto-ints fontionnent.
0 0 : La RTC est arrêtée. OSC2 diminue, les Auto-Ints sont
moins fréquentes.
AI1 : ~ 176 Hz au lieu de 256 Hz.
AI3 : ~ 40 par minute au lieu de 60.
AI5 : ~ 13.2 Hz au lieu de 19.3 Hz.
Le boot code n'affecte pas ce port au démarrage. Seul l'AMS le fait.

Bit 0 : 1) A un rapport avec le contraste
2) S'il vaut 0, les zones de mémoire depuis lesquelles la
Protection peut se désactiver deviennent exécutables, c'est-à-dire
ROM_BASE+0x12000 à ROM_BASE+0x17FFF et ROM_BASE+0x1A000 à ROM_BASE+0x1FFFF.
L'exécution dans le secteur de boot n'est pas protégée par
la protection que ce bit contrôle.

>> Vos commentaires [0]

Pas de commentaires

Poster un commentaire


Seuls les membres peuvent poster des commentaires