Oui, certes, je crois que je vais devoir m'y faire
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.