Et pour en revenir au problème de l'assembleur
_nostub, voici la routine
EXECUTE_IN_GHOST_SPACE telle qu'elle est dans
tipatch.lib, à mettre
tout au début du programme:
lea tigcc_compiled.,%a0
move.l %a0,%d0
cmpi.l #0x40000,%d0
jbcc __ghost_done
bset.l #18,%d0
clr.l %d1
move.w (%a0,-2),%d1
add.l %d0,%d1
subq.l #1,%d1
move.l %d1,-(%sp)
move.l %d0,-(%sp)
movea.l 0xC8,%a0
movea.l (%a0,1384),%a0
jsr (%a0)
addq.l #8,%sp
movea.l 0xC8,%a0
cmpi.l #1000,(%a0,-4)
jbcc __ghost_install
pea __ghost_done(%pc)
bset.b #2,(%sp,1)
rts
__ghost_install:
movem.l %a2-%a6/%d3-%d7,-(%sp)
lea (%sp,-20),%sp
move.l #0x3E000,%a3
move.l %a0,%d0
andi.l #0x600000,%d0
addi.l #0x20000,%d0
move.l %d0,(%sp,12)
move.l %d0,(%sp,16)
trap #0xC
move.w #0x2700,%sr
move.l #0xF,%d3
pea __ghost_cont(%pc)
bset.b #2,(%sp,1)
clr.w -(%sp)
move.l 0xAC,%a0
jmp (%a0)
__ghost_cont:
lea (%sp,20),%sp
movem.l (%sp)+,%a2-%a6/%d3-%d7
__ghost_done:
où
tigcc_compiled. est un label marquant le
tout début du programme. (C'est un hack affreux qu'on a été obligés d'utiliser avec l'ancien linker. Le nouveau linker gère maintenant un symbole
__ld_entry_point prévu pour ça.) Tout le reste ne devrait pas nécessiter d'explication particulière.
Remarque les différences fondamentales avec
enter_ghost_space:
1.
EXECUTE_IN_GHOST_SPACE s'exécute tout au début. Ça élimine le risque d'avoir une adresse de retour en l'espace non-fantôme qui traîne.
2.
EXECUTE_IN_GHOST_SPACE reloge le programme vers l'espace fantôme avec
EX_patch. (C'est le
ROM_CALL "mystérieux" appelé.) Ça élimine le risque de sauter vers une adresse en l'espace non-fantôme.
Cela fait de
EXECUTE_IN_GHOST_SPACE une solution fiable, contrairement à
enter_ghost_space.