home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
100-199
/
ff101.lzh
/
StartUps
/
BothStartup.asm
< prev
next >
Wrap
Assembly Source File
|
1987-09-05
|
6KB
|
261 lines
* BothStartup.obj
*
* A drop in replacement for Astartup.obj
* For Workbench programs, or CLI programs with or without command
* line parameters.
* Modified from Astartup.asm by Bryce Nesbitt. Release V1.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
dosCmdLen equr d6
dosCmdBuf equr d5
;
startup: move.l d0,dosCmdLen
move.l a0,dosCmdBuf
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:
lea.l argvBuffer-_stdin(a3),a2
lea.l argvArray-_stdin(a3),a1
moveq.l #1,d2 ; param counter
;------ fetch command name:
moveq.l #0,d0
move.b (a0)+,d0 ; size of command name
move.l a2,(a1)+ ; ptr to command name
bra.s 1$
2$ move.b (a0)+,(a2)+
1$ dbf d0,2$
clr.b (a2)+
;------ collect parameters:
move.l dosCmdLen,d0
move.l dosCmdBuf,a0
;------ skip control characters and space:
parmloopa: move.b (a0)+,d1
subq.l #1,d0
ble.s parmExit
cmp.b #' ',d1
ble.s parmloopa
;------ copy parameter:
addq.l #1,d2
cmp.w #32,d2
beq parmExit ;!!Too many parms!!
move.l a2,(a1)+
bra.s 5$
4$ move.b (a0)+,d1
subq.l #1,d0
cmp.b #' ',d1
ble.s endofarg
5$ move.b d1,(a2)+
bra.s 4$
endofarg clr.b (a2)+ ;Null terminate
bra.s parmloopa
;------ Clear out ends, and go away
parmExit: clr.b (a2)+
clr.l (a1)+
move.l d2,d0 ; Arg count
pea argvArray ; Arg array pointer
move.l d0,-(sp)
;------ 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
******* DATA ***********************************************************
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 32 ;maximum 32 args
argvBuffer ds.b 256 ;and 256 characters
END