Bon, je reviens à ma question initiale :
Et euh... y a-t-il un moyen pour copier du code dans la pile ? En fait, en asm, je rassemble les pointeurs de libcall/syscall dont j'ai besoin dans la pile, et je les fait précéder à tout hasard de $4EF9
Ca ressemble à ça :
pile améliorée
\RegTable: ; WARNING: will fail using functions > lib@00FF (should use word sized offsets) moveq.l #0,d0 \RegLoop: move.b (a1)+,d0 bne.s \Continue tst.b (a1) bne.s \Continue ; End of table: dc.b 0,0 rts \Continue: pea (a4) RAMC RAM_kernel::LibsPtr addq.l #4,sp moveq.l #0,d0 ; PreOS bug: LibsPtr destroys d0 move.b (a2)+,d0 move.w #$4EF9,0(a6,d0.w) move.l a0,2(a6,d0.w) bra.s \RegLoop
avec les offsets qui vont bien pour obtenir les numéros des libcall/syscall et l'offset de leur pointeur dans la pile :
superbes tables
ButillibCallsTable: dc.b BUTILLIB_InitCmdLine dc.b BUTILLIB_GetCurrentArgPtr dc.b BUTILLIB_GetNextArgPtr dc.b BUTILLIB_IsArgSwitch dc.b BUTILLIB_IsNextArg dc.b BUTILLIB_GetFilePtr dc.b BUTILLIB_CheckFileType dc.b BUTILLIB_ExecSwitchRoutine dc.b BUTILLIB_SkipDummyLines dc.b BUTILLIB_SkipSpaces dc.b BUTILLIB_SkipLine dc.b BUTILLIB_GetFileHandle dc.b BUTILLIB_GetPrevArgPtr dc.b BUTILLIB_AdvanceToChar dc.b 0,0 ButillibCallsOffsets: dc.b INIT_CMDLINE dc.b GET_CURRENT_ARG_PTR dc.b GET_NEXT_ARG_PTR dc.b IS_ARG_SWITCH dc.b IS_NEXT_ARG dc.b GET_FILE_PTR dc.b CHECK_FILE_TYPE dc.b EXEC_SWITCH_ROUTINE dc.b SKIP_DUMMY_LINES dc.b SKIP_SPACES dc.b SKIP_LINE dc.b GET_FILE_HANDLE dc.b GET_PREV_ARG_PTR dc.b ADVANCE_TO_CHAR PedroMCallsTable: dc.b PEDROM_stdin dc.b PEDROM_printf dc.b PEDROM_fprintf dc.b 0,0 PedroMCallsOffsets: dc.b STDERR dc.b PRINTF dc.b FPRINTF
Comme ça avec des appels en jsr non-relogés (et a6 pointeur de stack frame permanent) :
juuuuummmmmmp
lea CMDLINE(a6),a0 ; Get CMDLINE* jsr GET_NEXT_ARG_PTR(a6) ; Skip current arg lea CMDLINE(a6),a0 ; Get CMDLINE* jsr IS_ARG_SWITCH(a6) ; Check if the arg is an switch
Vala, ça me fait tout ce que je veux sans m'embêter. On saute dans la pile et ça rebondit vers la bonne fonction de dll ou de pedrom.
Mais... comment on fait ça en C ?
En fait, ce que je ne sais pas faire, c'est enregistrer dans une table les offsets dans une structure (mon stack frame est une structure déclarée extern).
Si j'ai ça : typedef struct machin {int a; short b; void (*bidule)();} machin;, comment connaitre l'offset de bidule pour l'enregistrer dans un tableau ? Ca correspond au label ButillibCallsOffsets.