J'ai lu un comment de Kerm chez Cemetech qui disait que zStart patch l'OS pour l'exécuter après un RAM Clear. Et je crois que zStart/noshell auront obligatoirement à mettre au moins la table de vecteurs dans cmdShadow, sinon qu'est-ce qu'on va faire quand le programme fait un appel à l'un des routines d'ion ?
Je crois que j'ai vu ce que fait zStart. Regarde ces deux bouts de code :
ld b, 8 ;ion a 8 routines
ld hl, cmdShadow+80 ;la table de vecteurs d'ion commence à partir d'ici
makeVectorsLoop:
ld (hl), $CD ;c'est le HEX pour "call"
inc hl
ld (hl), cmdShadow&255 ;LSB : tous les routines vont faire un appel à cmdShadow
inc hl
ld (hl), cmdShadow>>8 ;MSB
inc hl
djnz makeVectorsLoop ;répéter
ld hl, ionFaker ;le code qui va exécuter la routine
ld de, cmdShadow ;sauvé dans au début de cmdShadow
ld bc, ionFakerEnd-ionFaker
ldir
in a, (06) ;SMC la page de flash actuelle dans la routine ionFaker
ld (smc_ionFaker-ionFaker+cmdShadow+1), a
Ce code-ci crée la table de vecteur et charge un petit code pour exécuter les routines dans cmdShadow.
Puis quand on fait un appel à une des routines d'ion, le code d'ionFaker va s'exécuter :
;chargé dans cmdShadow
ionFaker:
ex (sp), hl ;hl = valeur dans la pile (le prochain octet après le call)
push de ;sauver de
ld de, cmdShadow+80+3 ;début du vecteur + 3 (parce que hl = l'adresse de l'appel + 3)
or a ;reset carry
sbc hl, de ;(adresse de la routine appelée + 3) - (l'adresse du début du vecteur + 3)
;hl = un numéro entre 0 et 21 (0 = la première routine, 21 = la 8ème)
ld de, myIonVectors ;une autre table qui contient des sauts aux routines d'ion dans zStart
add hl, de ;un numéro entre 0 et 21 + myIonVectors, l'offset de la routine appelée
push af ;sauver af
smc_ionFaker:
ld a, 00 ;smc a remplacé $00 avec la page de FLASH où se trouve zStart (et donc les routines d'ion)
out (06), a ;charger la page FLASH
pop af ;restaurer a
pop de ;restaurer de
ex (sp), hl ;(sp) = l'adresse de la routine appelée
ret ;sauter à la routine
ionRet: ;toutes les routines sautent ici, je suppose que l'on restaure la page FLASH actuelle
push af
ld a, $C2
out (06), a
pop af
ret
Alors les routines mêmes il semble qu'elles restent dans zStart, on les met pas dans safeRAM/à la fin du programme.