* WBStartup.obj * * For Workbench programs, or CLI programs that require no command * line parameters. * Modified from Astartup.asm by Bryce Nesbitt. Release 1.0 * ******* Included Files ************************************************* NOLIST INCLUDE "exec/types.i" IFND EXEC_ABLES_I INCLUDE "exec/ables.i" ENDC IFND EXEC_EXECBASE_I INCLUDE "exec/execbase.i" ENDC IFND LIBRARIES_DOS_I INCLUDE "libraries/dos.i" ENDC IFND LIBRARIES_DOESEXTENS_I INCLUDE "libraries/dosextens.i" ENDC IFND WORKBENCH_STARTUP_I INCLUDE "workbench/startup.i" ENDC LIST ******* Imported ******************************************************* xref _Input xref _Output xref _main ; C code entry point callsys macro xref _LVO\1 jsr _LVO\1(a6) endm blink macro bchg.b #1,$bfe001 endm ******* Exported ******************************************************* xdef _SysBase xdef _DOSBase xdef _errno xdef _stdin xdef _stdout xdef _stderr xdef _exit ; standard C exit function ************************************************************************ * * Standard Program Entry Point * * main (argc, argv) * int argc; ;Passed as 32 bits. 0=from Workbench * char *argv[]; ;Passed as 32 bits. If from workbench, * ;then this is the WB message pointer. * ; ;a3 - frame pointer ;a4 - ThisTask ;a5- DOSBase ; startup: lea.l ss,a3 ; set up "frame pointer" clr.l (a3)+ ; _errno move.l sp,(a3)+ ; initailSP ;------ get Exec's library base pointer: move.l 4,a6 ; get _AbsExecBase move.l a6,(a3)+ ; _SysBase ;------ Open the DOS library: lea.l DOSName(pc),A1 callsys OldOpenLibrary ; Look ma, no error check! move.l d0,(a3)+ ; _DOSBase move.l d0,a5 ;------ get the address of our task move.l ThisTask(a6),a4 ;------ are we running as a son of Workbench? tst.l pr_CLI(A4) beq fromWorkbench clr.l (a3)+ ; returnMsg ;======================================================================= ;====== CLI Startup Code =============================================== ;======================================================================= ;------ find command name: fromCLI move.l pr_CLI(a4),a0 add.l a0,a0 ; bcpl pointer conversion add.l a0,a0 move.l cli_CommandName(a0),a0 add.l a0,a0 ; bcpl pointer conversion add.l a0,a0 ;------ create buffer and array: ;[a0=BCPL command name] lea.l argvBuffer-_stdin(a3),a1 lea.l argvArray-_stdin(a3),a2 move.l a1,(a2) ; ptr to command name ;------ fetch command name: moveq #0,d0 move.b (a0)+,d0 ; size of command name cmp.w #31,d0 ; restrict size bhi.s enter move.w #30,d0 ; 30 + 1 loops lpback move.b (a0)+,(a1)+ enter dbf d0,lpback clr.b (a1)+ ; null terminate name move.l a2,-(sp) ; pointer to argvArrary moveq #1,d0 ; argc always = 1. move.l d0,-(sp) ; this version only passes the name ;------ get standard input handle: move.l a5,a6 ; Get DOSBase callsys Input move.l d0,(a3)+ ; _stdin ;------ get standard output handle: callsys Output move.l d0,(a3)+ ; _stdout move.l d0,(a3)+ ; _stderr ;------ call C main entry point bra domain ;======================================================================= ;====== Workbench Startup Code ========================================= ;======================================================================= ;------ we are now set up. wait for a message from our starter fromWorkbench: ;[a4=ThisTask] ;[a5=DOSBase] lea.l pr_MsgPort(A4),a0 ; our process base callsys WaitPort lea.l pr_MsgPort(A4),a0 ; our process base callsys GetMsg ;------ save the message so we can return it later move.l d0,(a3)+ ; set returnMsg. NOTE: no ReplyMsg yet! ;------ push argc and argv. if argc = 0 program came from ;------ Workbench, and argv will have the WB message. move.l d0,-(SP) ; set argv to the WB message clr.l -(SP) ; set argc to 0 ;------ get the first argument ;[d0=WBMessage] move.l a5,a6 ;Get DOSBase move.l d0,a2 move.l sm_ArgList(a2),d0 beq.s docons ;------ and set the current directory to the same directory move.l d0,a0 move.l wa_Lock(a0),d1 callsys CurrentDir docons: ;------ ignore the toolwindow argument domain: jsr _main moveq.l #0,d0 ; Successful return code bra.s exit2 ************************************************************************ * * C Program exit(returncode) Function * * Warning: no resources are deallocated. If you took it, you must * have already given it back!! * * _exit: move.l 4(SP),d0 ; extract return code exit2: lea.l ss,a3 ; set "frame pointer" back up move.l initialSP-ss(a3),SP ; restore stack pointer move.l d0,-(SP) ; save return code ;------ close DOS library: move.l 4,a6 move.l _DOSBase-ss(a3),a1 callsys CloseLibrary ;------ if we ran from CLI, skip workbench cleanup: move.l returnMsg-ss(a3),d0 beq.s exitToDOS ;------ return the startup message to our parent ;------ we forbid so workbench can't UnLoadSeg() us ;------ before we are done: FORBID ;[d0=returnMsg] move.l d0,a1 callsys ReplyMsg ;------ this rts sends us back to DOS: exitToDOS: move.l (SP)+,d0 rts DOSName dc.b 'dos.library',0 cnop 0,2 ******* BSS *********************************************************** BSS ss ; placemarker _errno ds.l 1 ; error number from OS routines initialSP ds.l 1 ; initial stack pointer _SysBase ds.l 1 ; exec library base pointer _DOSBase ds.l 1 ; dos library base pointer returnMsg ds.l 1 ; Workbench message, or zero for CLI startup _stdin ds.l 1 _stdout ds.l 1 _stderr ds.l 1 argvArray ds.l 1 ; pointer to arg array argvBuffer ds.b 32 ; Max 32 character command name END