Le problème
Si on ne change pas la séquence de démarrage, le gcc réclame la version 37 du dos avec le message laconique "Need version 37 of dos.library".
Se limiter à la version 37 est un non sens, le 1.2 (version 33) était livré avec le A500 et A2000, le 1.3 (version 34) était livré avec le A2000B.
Un petit fichier assembleur start.s
Ce n'est pas de l'assembleur 68000, mais de l'assembleur compris par gcc.
Le main référencé est préfixé par trois traits bas ___.
.text .even .globl start start: jmp ___main
Le code source hello.c
Le main en C a deux traits bas __.
On démarre sans startup C, pas question de récupérer la ligne de commande et encore moins les arguments.
#include <exec/execbase.h> #include <dos/dos.h> #include <proto/exec.h> #include <proto/dos.h> int __main(void) { struct ExecBase *SysBase = (*((struct ExecBase **) 4)) ; struct Library *DOSBase = NULL ; struct WBStartup *wbMsg = NULL ; struct Process *process ; long failureCode = 0 ; process = (struct Process *) SysBase->ThisTask ; if (!(process->pr_CLI)) { WaitPort (&process->pr_MsgPort) ; wbMsg = (struct WBStartup *) GetMsg (&process->pr_MsgPort) ; } DOSBase = (struct Library *)OpenLibrary ("dos.library", 0) ; if (DOSBase != NULL) { Write(Output(), "Hello World\n", 12) ; CloseLibrary ((struct Library *)DOSBase); } if (wbMsg) { Forbid () ; ReplyMsg ((struct Message *) wbMsg) ; } process->pr_Result2 = failureCode ; return failureCode ; }
Le makefile
SRC=.. BIN=bin target: $(BIN)/hello13 $(BIN)/hello13: $(SRC)/start.s $(SRC)/hello.c gcc -s -O2 -nostdlib -noixemul -fomit-frame-pointer -o $(BIN)/hello13 $(SRC)/start.s $(SRC)/hello.c clean: delete $(BIN)/hello13make