home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
001-099
/
ff055.lzh
/
ScreenSave
/
AStartup.asm
next >
Wrap
Assembly Source File
|
1987-03-01
|
10KB
|
440 lines
*==========================
*amiga.dev/programs #11, from cscheppner, 10335 chars, Tue Feb 24 17:40:06 1987
*--------------------------
*TITLE: Astartup.asm --- with 1.2 fixes, handles quotes better
************************************************************************
*
* Astartup.asm --- C Program Startup/Exit (CLI and WorkBench)
*
* Modified from the following source by cscheppner
* (commented out non-functional ToolWindow code)
************************************************************************
*
*
*
* Source Control:
* --------------
*
* $Header: startup.asm,v 1.1 86/08/25 12:50:07 root Exp $
*
* $Locker: root $
*
* $Log: startup.asm,v $
* Revision 1.1 86/08/25 12:50:07 root
* Initial revision
*
* Revision 33.6 86/06/12 10:34:36 neil
* changed so any version of dos is OK
*
* Revision 33.5 86/06/11 19:03:47 neil
* fixed CloseLibrary if open of dos failed
*
* Revision 33.4 86/06/09 16:48:59 neil
* now processes escapes also
*
* Revision 33.3 86/06/09 16:18:12 neil
* another checkpoint -- quoted strings now work
*
* Revision 1.1 85/11/23 13:49:01 neil
* Initial revision
*
*
************************************************************************
******* Included Files *************************************************
INCLUDE "exec/types.i"
INCLUDE "exec/alerts.i"
INCLUDE "exec/nodes.i"
INCLUDE "exec/lists.i"
INCLUDE "exec/ports.i"
INCLUDE "exec/libraries.i"
INCLUDE "exec/tasks.i"
INCLUDE "libraries/dos.i"
INCLUDE "libraries/dosextens.i"
INCLUDE "workbench/startup.i"
******* Imported *******************************************************
xlib macro
xref _LVO\1
endm
xref _AbsExecBase
xref _Input
xref _Output
xref _main ; C code entry point
xlib Alert
xlib FindTask
xlib Forbid
xlib GetMsg
xlib OpenLibrary
xlib CloseLibrary
xlib ReplyMsg
xlib Wait
xlib WaitPort
xlib CurrentDir
xlib Open
xlib Close
******* Exported *******************************************************
xdef _SysBase
xdef _DOSBase
xdef _errno
xdef _stdin
xdef _stdout
xdef _stderr
xdef _exit ; standard C exit function
xdef _WBenchMsg
callsys macro
CALLLIB _LVO\1
endm
************************************************************************
*
* Standard Program Entry Point
*
************************************************************************
*
* main (argc, argv)
* int argc;
* char *argv[];
*
************************************************************************
startup: ; reference for Wack users
move.l sp,initialSP ; initial task stack pointer
move.l d0,dosCmdLen
move.l a0,dosCmdBuf
;------ get Exec's library base pointer:
move.l _AbsExecBase,a6
move.l a6,_SysBase
;------ get the address of our task
suba.l a1,a1
callsys FindTask
move.l d0,a4
;------ are we running as a son of Workbench?
tst.l pr_CLI(A4)
beq fromWorkbench
;=======================================================================
;====== CLI Startup Code ===============================================
;=======================================================================
fromCLI:
;------ attempt to open DOS library:
bsr openDOS
;------ find command name:
suba.l a0,a0
move.l pr_CLI(a4),d0
lsl.l #2,d0 ; bcpl pointer conversion
move.l cli_CommandName(a0,d0.l),d0
lsl.l #2,d0 ; bcpl pointer conversion
;------ create buffer and array:
movem.l a2/a3,-(sp)
lea argvBuffer,a2
lea argvArray,a3
;------ fetch command name:
move.l d0,a0
moveq.l #0,d0
move.b (a0)+,d0 ; size of command name
clr.b 0(a0,d0.l) ; terminate the string
move.l a0,(a3)+
;------ collect parameters:
move.l dosCmdLen,d0
move.l dosCmdBuf,a0
;------ null terminate the string, eat trailing garbage
lea 0(a0,d0.l),a1
stripjunk:
cmp.b #' ',-(a1)
;-- jimm: 8/25/86: per kodiak's recommendation
; bls.s stripjunk
dbhi D0,stripjunk
clr.b 1(a1)
newarg:
;------ skip spaces
move.b (a0)+,d1
beq.s parmExit
cmp.b #' ',d1
beq.s newarg
cmp.b #9,d1 ; tab
beq.s newarg
;------ push address of the next parameter
move.l a2,(a3)+
;------ process quotes
cmp.b #'"',d1
beq.s doquote
;------ copy the parameter in
move.b d1,(a2)+
nextchar:
;------ null termination check
move.b (a0)+,d1
beq.s parmExit
cmp.b #' ',d1
beq.s endarg
move.b d1,(a2)+
bra.s nextchar
endarg:
clr.b (a2)+
bra.s newarg
doquote:
;------ process quoted strings
move.b (a0)+,d1
beq.s parmExit
cmp.b #'"',d1
beq.s endarg
;------ '*' is the BCPL escape character
cmp.b #'*',d1
bne.s addquotechar
move.b (a0)+,d1
cmp.b #'N',d1
beq.s 1$
cmp.b #'n',d1
bne.s 2$
1$:
;------ got a *N -- turn into a newline
moveq #10,d1
bra.s addquotechar
2$:
cmp.b #'E',d1
beq.s 3$
cmp.b #'e',d1
bne.s addquotechar
3$:
;------ got a *E -- turn into a escape
moveq #27,d1
addquotechar:
move.b d1,(a2)+
bra.s doquote
parmExit:
;------ all done -- null terminate the baby
clr.b (a2)
clr.l (a3)
;------ compute the # of arguments
move.l #dosCmdBuf,d0
sub.l a3,d0
not.l d0
lsr.l #2,d0
movem.l (sp)+,a2/a3
pea argvArray
move.l d0,-(sp)
*
* The above code relies on the end of line containing a control
* character of any type, i.e. a valid character must not be the
* last. This fact is ensured by DOS.
*
;------ get standard input handle:
jsr _Input
move.l d0,_stdin
;------ get standard output handle:
jsr _Output
move.l d0,_stdout
move.l d0,_stderr
;------ call C main entry point
jsr _main
;------ return success code:
moveq.l #0,D0
move.l initialSP,sp ; restore stack ptr
rts
;=======================================================================
;====== Workbench Startup Code =========================================
;=======================================================================
fromWorkbench:
;------ open the DOS library:
bsr openDOS
;------ we are now set up. wait for a message from our starter
bsr waitmsg
;------ save the message so we can return it later
move.l d0,_WBenchMsg
;------ push the message on the stack for wbmain
move.l d0,-(SP)
clr.l -(SP) indicate: run from Workbench
;------ get the first argument
move.l d0,a2
move.l sm_ArgList(a2),d0
beq.s docons
;------ and set the current directory to the same directory
move.l _DOSBase,a6
move.l d0,a0
move.l wa_Lock(a0),d1
callsys CurrentDir
docons:
* Note: This code commented out for 2 reasons. WorkBench never passes
* the ToolWindow ptr in the WBenchMsg, and there is no matching
* cleanup for this code. cs
* ;------ get the toolwindow argument
* move.l sm_ToolWindow(A2),d1
* beq.s domain
* ;------ open up the file
* move.l #MODE_OLDFILE,d2
* callsys Open
* ;------ set the C input and output descriptors
* move.l d0,_stdin
* move.l d0,_stdout
* move.l d0,_stderr
* beq.s domain
* ;------ set the console task (so Open( "*", mode ) will work
* ; waitmsg has left the task pointer in A4 for us
* lsl.l #2,d0
* move.l d0,a0
* move.l fh_Type(a0),pr_ConsoleTask(A4)
domain:
jsr _main
moveq.l #0,d0 Successful return code
bra.s exit2
************************************************************************
*
* C Program Exit Function
*
************************************************************************
*
* Warning: this function really needs to do more than this.
*
************************************************************************
_exit:
move.l 4(SP),d0 ; extract return code
exit2:
move.l initialSP,SP ; restore stack pointer
move.l d0,-(SP) ; save return code
;------ close DOS library:
move.l _AbsExecBase,A6
move.l _DOSBase,d0
beq.s 1$
move.l d0,a1
callsys CloseLibrary
1$:
;------ if we ran from CLI, skip workbench cleanup:
tst.l _WBenchMsg
beq.s exitToDOS
;------ return the startup message to our parent
;------ we forbid so workbench can't UnLoadSeg() us
;------ before we are done:
callsys Forbid
move.l _WBenchMsg,a1
callsys ReplyMsg
;------ this rts sends us back to DOS:
exitToDOS:
move.l (SP)+,d0
rts
;-----------------------------------------------------------------------
noDOS:
ALERT (AG_OpenLib!AO_DOSLib)
moveq.l #100,d0
bra.s exit2
;-----------------------------------------------------------------------
; This routine gets the message that workbench will send to us
; called with task id in A4
waitmsg:
lea pr_MsgPort(A4),a0 * our process base
callsys WaitPort
lea pr_MsgPort(A4),a0 * our process base
callsys GetMsg
rts
;-----------------------------------------------------------------------
; Open the DOS library:
openDOS
lea DOSName(pc),A1
moveq #0,d0
callsys OpenLibrary
move.l D0,_DOSBase
beq noDOS
rts
DOSName DOSNAME
************************************************************************
DATA
************************************************************************
VerRev dc.w 33,1
_SysBase dc.l 0
_DOSBase dc.l 0
_errno dc.l 0
_stdin dc.l -1
_stdout dc.l -1
_stderr dc.l -1
initialSP dc.l 0
_WBenchMsg dc.l 0
dosCmdLen dc.l 0
dosCmdBuf dc.l 0
argvArray ds.l 32
argvBuffer ds.b 256