*	TINYSTART is written by Klaus Pedersen (micro@imada.dk), and
*	distributed, together with "LOAD_INF".
*   Based on Borland's and Atari's (Ken B.) startup code.
	
                IMPORT main

                GLOBL _BasPag
                GLOBL _app
                GLOBL _PgmSize
                GLOBL __text, __data, __bss

                GLOBL exit, errno ; these make TC stdio happy!

TextStart       EQU $08 
TextSize        EQU $0C 
DataStart       EQU $10 
DataSize        EQU $14
BssStart        EQU $18
BssSize         EQU $1C 
CmdLine         EQU $80


* Text segment...
                TEXT

__text:         moveq   #0,D1
                move.l  A0,D0
                bne.b   NotApp
                moveq   #1,D1
                movea.l 4(SP),A0

NotApp:         move.l  A0,_BasPag
                move.w  D1,_app

* Calculate program size...
                movea.l TextSize(A0),A1
                adda.l  DataSize(A0),A1
                adda.l  BssSize(A0),A1
                adda.w  #$100,A1
                move.l  A1,_PgmSize

* Set stack at top of BSS...
                move.l  A0,D0
                add.l   A1,D0
                and.b   #$FC,D0
                movea.l D0,SP

* Make A3 point to Command line...
                lea     CmdLine(A0),A3

* Shrink memory...
                move.l  A1,-(SP)
                move.l  A0,-(SP)
                move.l  #$4A0000,-(SP)
                trap    #1
                lea     12(SP),SP

* Pass command Line...
                moveq   #0,D0
                move.b  (A3)+,D0   ; anything in command-line?
                beq.b   EmptyCommand
                clr.b   0(A3,D0.w) ; terminate command-line
                lea     ArgPointer,A0 ; Argument array (2 long)
                move.l  A3,4(A0)   ; write address of command line
                moveq   #2,D0      ; set argc.

EmptyCommand:

* Execute main program...
*   D0 = argc, if (argc<2) then no parameter(s)...
*   A0 = *argv[2], argv[0] is dummy, argv[1] is a pointer to the command
*        null terminated commandline...
*   In non TURBO_C env. pass these on the stack...

                bsr     main

exit:           move.w  D0,-(SP)
                move.w  #$4C,-(SP)
                trap    #1


* Initialized data segment...
                DATA
__data:

errno:          DC.W 0             ; needed to keep stdio happy!

* Variable segment...
                BSS
__bss:

_BasPag:        DS.L 1
_PgmSize:       DS.L 1
_app:           DS.W 1

ArgPointer:     DS.L 2             ; only 2 args is used (a null and 1.)

                END
