-comment détecter le modèle de calculatrice sur lequel le programme tourne?
Traditionnellement, on utilise par exemple:
* ROM_base, qui est actuellement l'adresse de la table des ROM_CALLs AND 0xE00000 (move.l 0xC8.w,dn; and.l #0xE00000,dn). Vaut 0x200000 sur 89 et V200, 0x400000 sur 92+ et 0x800000 sur 89T. ROM_base est utilisée dans les lanceurs spécifiques pour programmes compressés générés par TIGCC (pstarters) et le lanceur générique ttstart.
* le Hardware Parameter Block (voir FL_getHardwareParmBlock et HARDWARE_PARM_BLOCK dans la doc), dont le field hardwareID donne le modèle. De mémoire (la doc de TIGCC, six ans après la sortie de la V200 et quatre ans après celle de la 89T, ne contient pas l'info), les valeurs de ces 32 bits pour V200 et 89T sont respectivement 8 et 9.
On peut aussi vouloir détecter VTI spécifiquement, pour s'accomoder de ses manques (routines de grayscale) ou pour rendre plus difficile à un utilisateur de VTI le reverse-engineering (XPand et HW3Patch - ces deux-là ne sont pas fournis avec le source, parce que mal utilisé, le source est dangereux). TIEmu n'a ni le bug qui permet de détecter VTI, ni les bugs de VTI qui rendent plus difficile le reverse engineering de XPand et HW3Patch.
-comment fait-on sur hardware3 (c'est bien le cas de la 89T ?) pour placer ses propres handler?
Depuis 2004, sur tous les modèles (parce que c'est plus petit de faire comme ça que de détecter si on est sur 89T ou pas), TIGCC désactive et active la protection en écriture ('Protected Memory Violation', AUTO_INT_7) de la zone 0x0-0x11F (table des vecteurs):
#define SetIntVec(i,h) ({asm volatile ("bclr.b #2,0x600001");(void) (*(INT_HANDLER*)(i) = (h));asm volatile ("bset.b #2,0x600001");})
ah et aussi quelle différence entre les masques 000 et 001 pour les interruptions?
000 = toutes les interruptions activées.
001 = toutes les interruptions sauf AUTO_INT_1.
006 = toutes les interruptions désactivées, y compris la touche ON (AUTO_INT_6). Même si en fait, la touche ON est un peu plus compliquée que ça, voir j89hw.txt.
007 = dans les faits, pareil qu'AUTO_INT_6, parce qu'AUTO_INT_7 (protection de la table des vecteurs) est une Non Maskable Interrupt sur un 68000.