1

Swar tlm,

En regardant TI-GCC avec un regard livide et absent (a des années-lumieres de là... hum )
j'en suis venu a me demander quel été le code (ASM) qui se cachais derriere la fonction #define MIN_AMS xxx et
au passage comment TIGCC detecte de quel hardware et quelle calculette il s'agit... fou

Alors si quelqu'un est motivé pour m'éclairer dans cette pénombre grisâtre qui m'envahit en regardant mes sources je lui en serait reconnaissant. kiss pam
- Pourquoi demander "Pourquoi ?" quand on ne sait pas pour quoi ?! -
- Ben pars'que !
Et schtok !

2

3

Oui, tout est dans les sources. smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

AMS:
*** _get_jump_table.s:
        .xdef __get_jump_table

.section _st20
__get_jump_table:
| Get the address of the jump table (needed a few times).
| Note that calling a function will destroy %a0; be sure to check whether
| this is still valid for screen-saving support whenever you make a change in
| between.
        move.l 0xC8,%a0
*** _detect_ams.s:
        .xdef __MIN_AMS_required_AND_NOT___kernel_library_header

.section _st41
        bcc.s __ams_version_is_OK__
        bra.s __ams_version_not_OK__

.section _st10012, "d"
        .asciz " or higher needed"
*** _compare_ams_1_01.s:
        .xdef __MIN_AMS_1_01_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x3CC,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "1.01"
*** _compare_ams_1_05.s:
        .xdef __MIN_AMS_1_05_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x3CC,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "1.05"
*** _compare_ams_2_00.s:
        .xdef __MIN_AMS_2_00_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #1000,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.00"
*** _compare_ams_2_01.s:
        .xdef __MIN_AMS_2_01_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x508,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.01"
*** _compare_ams_2_02.s:
        .xdef __MIN_AMS_2_02_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x5B7,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.02"
*** _compare_ams_2_03.s:
        .xdef __MIN_AMS_2_03_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x5B7,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.03"
*** _compare_ams_2_04.s:
        .xdef __MIN_AMS_2_04_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x5E2,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.04"
*** _compare_ams_2_05.s:
        .xdef __MIN_AMS_2_05_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x5EF,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.05"
*** _compare_ams_2_07.s:
        .xdef __MIN_AMS_2_07_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x607,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.07"
*** _compare_ams_2_08.s:
        .xdef __MIN_AMS_2_08_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x607,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.08"
*** _compare_ams_2_09.s:
        .xdef __MIN_AMS_2_09_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x607,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "2.09"
*** _compare_ams_3_00.s:
        .xdef __MIN_AMS_3_00_AND_NOT___kernel_library_header

.section _st40
| Check the number of ROM calls available.
        cmp.l #0x608,(%a0,-4) /* TIOS_entries */

.section _st10011, "d"
        .ascii "3.00"
*** _detect_ams_1_05.s:
        .xdef __MIN_AMS_1_05_AND_NOT___kernel_library_header

.section _st61
        bne.s __ams_version_1_05_OK__ /* AMS >1.05 */
        cmpa.l #0x278eac,%a0 /* TI-89 AMS 1.05 */
        beq.s __ams_version_1_05_OK__
        cmpa.l #0x478280,%a0 /* TI-92+ AMS 1.05 */
        bne.s __ams_version_not_OK__
__ams_version_1_05_OK__:
*** _detect_ams_2_03.s:
        .xdef __MIN_AMS_2_03_AND_NOT___kernel_library_header

.section _st61
        bne.s __ams_version_2_03_OK__ /* AMS >2.03 */
        movea.l (%a0,0x440*4),%a1 /* ReleaseVersion (AMS 2 only ROM_CALL) */
        cmpi.b #'2',3(%a1) /* AMS 2.02 */
        beq.s __ams_version_not_OK__
__ams_version_2_03_OK__:
*** _detect_ams_2_08.s:
        .xdef __MIN_AMS_2_08_AND_NOT___kernel_library_header

.section _st61
        bne.s __ams_version_2_08_OK__ /* AMS >2.09 */
        movea.l (%a0,0x440*4),%a1 /* ReleaseVersion (AMS 2 only ROM_CALL) */
        cmpi.b #'7',3(%a1) /* AMS 2.07 */
        beq.s __ams_version_not_OK__
__ams_version_2_08_OK__:
*** _detect_ams_2_09.s:
        .xdef __MIN_AMS_2_09_AND_NOT___kernel_library_header

.section _st61
        bne.s __ams_version_2_09_OK__ /* AMS >2.09 */
        movea.l (%a0,0x440*4),%a1 /* ReleaseVersion (AMS 2 only ROM_CALL) */
        cmpi.b #'9',3(%a1) /* AMS 2.09 */
        bne.s __ams_version_not_OK__
__ams_version_2_09_OK__:


HW:
| Hardware version detection, adapted from gray.s
| Copyright (C) 2002 Thomas Nussbaumer.
| Copyright (C) 2003 Kevin Kofler.
| See License.txt for licensing conditions.

        .xdef __get_hw_version

__get_hw_version:
    |--------------------------------------------------------------------------
    | get the HW parm block using the algorithm suggested by Julien Muchembled
    |--------------------------------------------------------------------------
        move.l   0xc8:w,%d0
        andi.l   #0xE00000,%d0 | get the ROM base
        movea.l  %d0,%a0
        movea.l  260(%a0),%a1  | get pointer to the hardware param block
        adda.l   #0x10000,%a0
        cmpa.l   %a0,%a1       | check if the HW parameter block is near enough
        bcc.s    L.is_hw1      | if it is too far, it is HW1
        cmpi.w   #22,(%a1)     | check if the parameter block contains HW ver
        bls.s    L.is_hw1      | if it is too small, it is HW1

    |--------------------------------------------------------------------------
    | check for VTI (trick suggested by Julien Muchembled)
    |--------------------------------------------------------------------------
        trap     #12         | enter supervisor mode. returns old (%sr) in %d0.w
        move.w   #0x3000,%sr | set a non-existing flag in %sr (but keep s-flag)
        move.w   %sr,%d1     | get %sr content and check for non-existing flag
        move.w   %d0,%sr     | restore old %sr content
        btst.l   #12,%d1     | this non-existing flag can only be set on the VTI
        beq.s    L.not_vti   | flag not set -> no VTI

    |--------------------------------------------------------------------------
    | VTI detected -> treat as HW1
    |--------------------------------------------------------------------------
        | Fall through...

L.is_hw1:
    |--------------------------------------------------------------------------
    | HW1 detected
    |--------------------------------------------------------------------------
        moveq.l  #1,%d0      | set %d0 to 1 (HW1)
        rts                  | return 1

L.not_vti:
    |--------------------------------------------------------------------------
    | Real calculator detected, so read the HW version from the HW parm block
    |--------------------------------------------------------------------------
        move.l   22(%a1),%d0 | get the hardware version
        rts                  | return it


Calculette:
*** _get_jump_table.s:
        .xdef __get_jump_table

.section _st20
__get_jump_table:
| Get the address of the jump table (needed a few times).
| Note that calling a function will destroy %a0; be sure to check whether
| this is still valid for screen-saving support whenever you make a change in
| between.
        move.l 0xC8,%a0
*** _detect_calc.s:
        .xdef __detect_calc

| This object file needs the jump table in %a0.
        .xdef __ref_all___get_jump_table

.section _st30
__detect_calc:
| At first, assume TI-92 Plus.
| It takes less space to write the values into %d0 first and then check whether they are correct.
        moveq #1,%d0
| Move the address of the jump table to %d1.
        move.l %a0,%d1
        and.l #0x400000,%d1
| Now %d1 is 0 on a TI-89, TI-89 Titanium or V200, or 0x400000 on a TI-92+.
        jbne __calc_in_d0__
| Otherwise, assume TI-89 / TI-89 Titanium.
        clr.w %d0
| Get the address of the ScrRect variable into a1.
        move.l (%a0,0x2F*4),%a1 /* ScrRect */
| If ScrRect+2 (x2) is less than 200, it is a TI-89 or TI-89 Titanium.
        cmp.b #200,2(%a1)
        jbcs __calc_in_d0__
| Otherwise, it is a V200.
        moveq #3,%d0
__calc_in_d0__:
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

Heu...oki merci Kevin Kofler !
Cependant, j'ai un pitit problème avec tes sources eek
Dans la détection HW j'ai un truc bizard qui apparait a ce niveau :
" btst.l #12,%d1 | this non-existing flag can only be set on the VTI
beq.s L.not_vti | flag not set -> no VTI "

le btst.l est remplacé par un btst.b avec n'importe quoi derriere...Illegal instruction.

PS : j'assemble on-calc avec as92 (de asmstudio 1.7 qui a été distribué sur ticalc.org)
et je débogge (toujours on-calc) avec db92 v0.41a

Alors, est-ce que ca viens de as92 qui m'assemble ca n'importe comment ?
Ou bien y a-t-il une erreur ? (sachant que pour l'assembler je suis obliger de respecter la syntaxe du M68000 qui est btst.s Dn,<ea> ou btst.s #x,<ea> (et si je me trompe pas #12 est bien la valeur 12 non ? et non une adresse effective ??? )

Autre chose : Elle est où la routine dans AMS ?! sick C'est illisible... tongue
- Pourquoi demander "Pourquoi ?" quand on ne sait pas pour quoi ?! -
- Ben pars'que !
Et schtok !

6

7

Crapaud
: Alors, est-ce que ca viens de as92 qui m'assemble ca n'importe comment ?

Oui.
as92 bogue dans tous les sens. AS de nitro est beaucoup plus utilisable.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

c'est bien possible que ça soit as92, il y a qqes bugs (genre les add.s #imm, x(an) qui sont mal assemblés....)
Il y a aussi as qui assemble on-calc, mais il ne peut pas faire de programmes kernels, et dès que la source est un peu grosse il buggue de partout. C'est pour ça que je suis resté à as92
Autre chose : Elle est où la routine dans AMS ?!

quelle routine dans l'AMS exactement ?

sinon, si tu veux juste avoir des méthodes pour détecter les versions de calc et d'hardware, tu peux regarder le topic de FlashZ dans cette même section
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

9

Flanker
: Il y a aussi as qui assemble on-calc, mais il ne peut pas faire de programmes kernels, et dès que la source est un peu grosse il buggue de partout. C'est pour ça que je suis resté à as92
Je rappelle que le code source est dispo, si quelqu'un veut corriger les bugs ou rajouter le mode kernel, qu'il n'hésites pas.
So much code to write, so little time.

10

Flanker :
c'est bien possible que ça soit as92, il y a qqes bugs (genre les add.s #imm, x(an) qui sont mal assemblés....)
Il y a aussi as qui assemble on-calc, mais il ne peut pas faire de programmes kernels, et dès que la source est un peu grosse il buggue de partout. C'est pour ça que je suis resté à as92
Autre chose : Elle est où la routine dans AMS ?!

quelle routine dans l'AMS exactement ?

sinon, si tu veux juste avoir des méthodes pour détecter les versions de calc et d'hardware, tu peux regarder le topic de FlashZ dans cette même section


Le source de as92 n'est pas disponile ? Il n'y a plus de MAJ non-plus ?

Pour AMS je demandais en fait où se trouvait la routine de détection de la version de AMS dans ce qu'avait répondu Kevin Kofler (j'aimerait comprendre comment détecter la version d'AMS sur n'importe quelle...version d'AMS justement grin
- Pourquoi demander "Pourquoi ?" quand on ne sait pas pour quoi ?! -
- Ben pars'que !
Et schtok !

11

regarde la fonction AB_prodid smile
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

12

Ah!
Oui mais AB_ProdID ne fourni que des infos sur le HW et le type de calcullette non ? (ou alors j'ai mal lu... hum )
Moi c'est la version de AMS qui m'interresse tongue
- Pourquoi demander "Pourquoi ?" quand on ne sait pas pour quoi ?! -
- Ben pars'que !
Et schtok !

13

Exemple concret : 01-1-B-52

Le B (=11 en hexa) veut dire 11ème version d'AMS

sinon, ROM_CALL_440 est un pointeur vers '2.08', la 11ème version d'AMS (seulement sur AMS 2.xx)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

14

ba étant donné que j'aimerai détecter n'importe quelle version de AMS il vaudrait mieux que je me base sur prodid alors... hum
J'avais pas vu l'histoire du n° de révision d'AMS couic
Et ou est-ce que je peut trouver une table de correspondace des AMS/ProdID ?
- Pourquoi demander "Pourquoi ?" quand on ne sait pas pour quoi ?! -
- Ben pars'que !
Et schtok !

15

get_ams:
; -> renvoie dans a0 un pointeur vers la version d'AMS
 move.l  #200,a0
 cmp.l   #1000,-4(a0)
 ble     _get_ams_1
_get_ams_2
 move.l  4352(a0),a0
 rts
_get_ams_1:
 move.l  3660(a0),a0
 lea     -16(a0),a0
 rts
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

16

Merci beaucoup ! Je teste ca des ce soir !
(Ca marche aussi avec HW3 ?)
- Pourquoi demander "Pourquoi ?" quand on ne sait pas pour quoi ?! -
- Ben pars'que !
Et schtok !

17

je vais voir ça tout de suite
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

18

oui
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

19

ShwoueaièTTTTTTTT ! Thx a lot man !
- Pourquoi demander "Pourquoi ?" quand on ne sait pas pour quoi ?! -
- Ben pars'que !
Et schtok !

20

smile
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

21

Flanker :
get_ams:
; -> renvoie dans a0 un pointeur vers la version d'AMS
 move.l  #200,a0
 cmp.l   #1000,-4(a0)
 ble     _get_ams_1
_get_ams_2
 move.l  4352(a0),a0
 rts
_get_ams_1:
 move.l  3660(a0),a0
 lea     -16(a0),a0
 rts

C'est faux. Ne marche pas sur TI-92+ AMS 1.00. Il faut tester aussi si le ROM_CALL n° 3660/4 existe, et sinon, renvoyer "1.00". Cf. la définition de ReleaseVersion de TIGCCLIB.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

22

Nan mais alors Flanker !
Tu sais po ca ? smile
Site personnel
Site professionnel

msn / mail : racine.f(at)free.fr

23

vois ton newbie le Flanker... smile
polite

24

trifus
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

25

wink
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.