home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
disks
/
disk399.lzh
/
CCLib
/
GCC
/
crt0.asm
< prev
next >
Wrap
Assembly Source File
|
1990-11-02
|
8KB
|
335 lines
*crt0.asm
* Copyright (C) 1990 Paul Gittings.
*
* This file is part of aMIGA gARGANTUAN c cOMPILER (agcc).
*
* agcc is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* agcc is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with agcc; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
* A startup/__main routine for use with agcc and CCLib.library
* ctr0.o should be used if floating point is required.
* ctr0_no_fp.o should be used when an application does not use
* floating point.
* The following libraries are loaded:
* Dos.library
* CCLib.library
* MathIeeeDoubBas.library
*
* This routine is based on:
* Robert Albrecht's _main.c and
* Bryce Nesbitt's BothStartup.asm
*
* Paul Gittings 21/2/1990
* ACSnet paulg@tplrd.tpl.oz
* snail 172 Union St.
* Erskineville 2043
* NSW
* Australia
*
******* Included Files *************************************************
; NOLIST
; INCLUDE "exec/types.i"
; IFND EXEC_ABLES_I
; INCLUDE "exec/ables.i"
; ENDC
FORBID MACRO
IFC '\1',''
ADDQ.B #1,TDNestCnt(A6)
ENDC
IFNC '\1',''
MOVE.L 4,\1
ADDQ.B #1,TDNestCnt(\1)
ENDC
ENDM
; IFND EXEC_EXECBASE_I
; INCLUDE "exec/execbase.i"
; ENDC
ThisTask EQU $114
TDNestCnt EQU $127
; IFND LIBRARIES_DOS_I
; INCLUDE "libraries/dos.i"
; ENDC
; IFND LIBRARIES_DOESEXTENS_I
; INCLUDE "libraries/dosextens.i"
; ENDC
pr_CLI EQU $0ac
pr_MsgPort EQU $05c
;
; Offsets into user data
;
ud_argc EQU 96
ud_argv EQU 100
******* Imported *******************************************************
xref _main ; C code entry point
; cclib routines.
xref _ClearSTDIO
xref _SetupSTDIO
xref _GetSTDIO
callsys macro
xref _LVO\1
jsr _LVO\1(a6)
endm
******* Exported *******************************************************
xdef _SysBase
xdef _DOSBase
xdef _MathIeeeDoubBasBase
xdef _CCLibBase
xdef _errno
xdef _stdin
xdef _stdout
xdef _stderr
xdef __math
xdef _blocksize
xdef _exit_fcn
xdef _type
xdef _exit ; standard C exit function
xdef __exit
************************************************************************
*
* Standard Program Entry Point
*
* If called from CLI then a0 will point to a buffer containing the
* command line but not including the command name. Also, d0 will
* contain the length of this line.
*
*
;
;a3 - frame pointer
;a4 - ThisTask
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
clr.l (a3)+ ; _exit_fcn
move.l sp,(a3)+ ; _initialSP
;------ get Exec's library base pointer:
move.l 4,a6 ; get _AbsExecBase
move.l a6,(a3)+ ; _SysBase
;------ Open the DOS library:
clr.l d0
lea.l DOSName(pc),A1
callsys OpenLibrary
tst.l d0
beq bailout
move.l d0,(a3)+ ; _DOSBase
;------ Open Math Ieee Double library:
clr.l d0
lea.l MathIeeeName(pc),a1
callsys OpenLibrary
tst.l d0
beq bailout
move.l d0,(a3)+ ; _MathIeeeDoubBasBase
;------ Open CCLib library:
clr.l d0
lea.l CCLibName(pc),a1
callsys OpenLibrary
tst.l d0
beq bailout
move.l d0,(a3)+ ; _CCLibBase
;------ get the address of our task
move.l ThisTask(a6),a4
;------ were we started from the Workbench
tst.l pr_CLI(A4)
beq.s fromWorkbench
;------ No, then we were started by CLI.
;------ so clear out workbench msg pointer
clr.l (a3)+ ; returnMsg
bra.s skipwbstartup
;
;------- Do some Workbench specific startup work
;
;------ we are now set up. wait for a message from our starter
fromWorkbench: ;[a4=ThisTask]
nostartupmsg:
lea.l pr_MsgPort(A4),a0 ; our process base
callsys WaitPort
;------ Get the message and save in returnMsg
lea.l pr_MsgPort(A4),a0 ; our process base
callsys GetMsg
tst.l d0
beq.s nostartupmsg ; ROM kernal manual says we could
; get a signal but no msg...
move.l d0,(a3)+ ; returnMsg
skipwbstartup:
clr.l (a3)+ ; _stdin
clr.l (a3)+ ; _stdout
clr.l (a3)+ ; _stderr
clr.l (a3)+ ; _type
clr.l (a3) ; _blocksize
lea.l ss,a3
;
; SetupSTDIO(&stdin, &stdout, &stderr, &errno, &blocksize, &type,
; MathIeeeDoubBasBase, dosCmdLen, dosCmdBuf, returnMsg,
; _exit)
;
pea __exit
move.l returnMsg-ss(a3),-(sp)
move.l dosCmdBuf,-(SP)
move.l dosCmdLen,-(SP)
move.l _MathIeeeDoubBasBase-ss(a3),-(sp)
pea _type-ss(a3)
pea _blocksize-ss(a3)
pea _errno-ss(a3)
pea _stderr-ss(a3)
pea _stdout-ss(a3)
pea _stdin-ss(a3)
jsr _SetupSTDIO
add.w #44,sp
tst.l d0
beq.s bailout
;------ get pointer to the block of user data (ud) belonging to
;------ this task.
jsr _GetSTDIO ; put ud into d0
tst.l d0
beq.s bailout
;------ push argv and argc from the ud onto the stack
;------ and call main()
move.l d0,a1
move.l ud_argv(a1),-(sp) ; put ud->_argv onto stack
clr.l d0
move.w ud_argc(a1),d0 ; get ud->_argc and
move.l d0,-(sp) ; push to stack
jsr _main ; hand over to C main routine.
clr.l _errno ; Successful return code
bra.s exit2
;------ get here if something went wrong during startup.
bailout:
move.l #$DEADBEEF,_errno
bra.s exit2
************************************************************************
*
* C Program exit(returncode) Function
*
*
; a1 - general
; a3 - Frame pointer
; a6 - Exec Base pointer
_exit:
__exit:
move.l 4(SP),_errno ; save error code
exit2: lea.l ss,a3 ; set "frame pointer" back up
;------ check for an exit function set up by call to atexit().
;------ If there is one execute it.
move.l _exit_fcn-ss(a3),a1
cmp.l #0,a1
beq.s no_atexit_fcn
jsr (a1)
no_atexit_fcn:
move.l _initialSP-ss(a3),SP ; restore stack pointer
move.l 4,a6
;------ If MathIeeeDoubBas.library is open close it
move.l _MathIeeeDoubBasBase-ss(a3),a1
cmp.l #0,a1
beq.s no_MIDB
callsys CloseLibrary
no_MIDB:
;------ If CCLib.library is open close it
move.l _CCLibBase-ss(a3),a2
cmp.l #0,a2
beq.s no_CCLib
;------ close all files free memory
jsr _ClearSTDIO
move.l a2,a1
callsys CloseLibrary
no_CCLib:
;------ If DOS library is open close it
move.l _DOSBase-ss(a3),a1
cmp.l #0,a1
beq.s exitToDOS
callsys CloseLibrary
exitToDOS:
move.l _errno-ss(a3),d0 ; save return code
rts
******* DATA ***********************************************************
DOSName: dc.b 'dos.library',0
EVEN
MathIeeeName: dc.b 'mathieeedoubbas.library',0
EVEN
CCLibName: dc.b 'CClib.library',0
EVEN
__math dc.w 1 ; Set to indicate MathIEEEDoubBas is loaded.
EVEN
BSS b.crt0
ss ; placemarker
_errno ds.l 1 ; error number from OS routines
_exit_fcn ds.l 1 ; exit function ptr. setup by call to atexit
_initialSP ds.l 1 ; initial stack pointer
_SysBase ds.l 1 ; exec library base pointer
_DOSBase ds.l 1 ; dos library base pointer
_MathIeeeDoubBasBase ds.l 1 ; Math Ieee Double library base pointer
_CCLibBase ds.l 1 ; CCLib library base pointer
returnMsg ds.l 1 ; Workbench message, or zero for CLI startup
_stdin ds.l 1 ; STANDARD
_stdout ds.l 1 ; I/O FILE
_stderr ds.l 1 ; POINTERS
_type ds.l 1
_blocksize ds.l 1 ; blocksize global variable
END