En effet. Mais de toute façon, pour les programmes pour kernel, le format n'est pas du tout celui-là. Les programmes pour kernel sont beaucoup plus compliqués. Déjà, le relogement fait plein de trucs supplémentaires par rapport à ce qu'un relogement fait normalement (par exemple insérer des adresses absolues de
ROM_CALLs, ce qui est totalement inutile vu que l'utilisation de la table en
$c8 prend moins de place). Ensuite, pour gagner de la place, le relogement change des informations nécessaires pour reloger le programme, et il faut donc le déreloger après l'exécution avant de pouvoir le reloger à nouveau. Et enfin, la table de relogements des programmes pour kernel est dans le header, pas à la fin du programme.
Pour reloger un programme pour kernel, ce n'est pas la peine d'essayer de le faire toi-même (c'est beaucoup trop compliqué - presque tout le code d'un kernel est du code de relogement), il faut appeler une fonction exportée par le kernel. Voilà ce qu'il faut faire:
;si pas de kernel ou reloc2/unreloc2 non supportés, refuse
pea.l (a1)
tst.l $3c
beq IncompatibleKernel
move.l $3c,a1
cmp.w #$a352,(a1)
beq IncompatibleKernel
tst.l $44
beq IncompatibleKernel
move.l $44,a1
cmp.w #$a352,(a1)
beq IncompatibleKernel
movea.l (a7)+,a1
;reloge le programme
movem.l d0-d7/a0-a6,-(a7)
; [Les 2 lignes suivantes mettent en a6 l'adresse du début du handle contenant le programme.]
move.l a0,a6
suba.l #$3fffe,a6
move.l a6,DoorsUnrelocAddr
move.l $3c,a0
jsr (a0)
movem.l (a7)+,d0-d7/a0-a6
Et pour le déreloger:
move.l DoorsUnrelocAddr(PC),d0
beq NoDoorsUnreloc
;déreloge le programme
move.l d0,a6
move.l $44,a0
jsr (a0)
NoDoorsUnreloc:
(C'est extrait des sources de
DB92. C'est moi qui ai codé cet extrait-là.)