|************************************************************************* |* * |* DSTART.S Startup module for Pascal programs using dLibs * |* * |************************************************************************* |* |* entry points |* .globl __base | basepage pointer .globl __start | startup entry point .globl _etext | end of text segment .globl _edata | end of data segment .globl _end | end of BSS segment (end of program) .globl __BREAK | location of stack/heap break .globl __ARGC | number of arguments .globl __ARGS | argument list pointer .globl __envp | environment string pointer .globl _errno | system error number | | external references | |.globl __stklen | Stack size value from C (unsigned long) | | useful constants | MINSTK = 16384 | Minimum 16K stack size MARGIN = 512 | Minimum memory to return to OS | | GEMDOS functions | Cconws = 0x09 | Console write string Pterm = 0x4C | Process terminate (with exit code) Mshrink = 0x4A | Shrink program space | | basepage offsets | p_hitpa = 0x04 | top of TPA p_tbase = 0x08 | base of text p_tlen = 0x0C | length of text p_dbase = 0x10 | base of data p_dlen = 0x14 | length of data p_bbase = 0x18 | base of BSS p_blen = 0x1C | length of BSS p_env = 0x2C | environment string p_cmdlin = 0x80 | command line image | | STARTUP ROUTINE (must be first object in link) | .text .globl start .globl _start __start: start: _start: | | save initial stack and basepage pointers | movel sp,a5 | a5 = initial stack pointer movel sp@(4),a4 | a4 = basepage address movel a4,__base movel a4@(p_tbase),d3 addl a4@(p_tlen),d3 movel d3,_etext | end of text segment movel a4@(p_dbase),d3 addl a4@(p_dlen),d3 movel d3,_edata | end of data segment movel a4@(p_bbase),d3 addl a4@(p_blen),d3 movel d3,_end | end of BSS (end of program) movel d3,__BREAK; | set initial _break value movel a4@(p_env),__envp | save environment pointer | | call C function to get command line arguments | lea a4@(p_cmdlin),a0 | get pointer to command line image moveb a0@+,d0 extw d0 | extract length | movew d0,sp@- | cmdlen | movel a0,sp@- | cmdline | jsr __initar | call _initargs(cmdline, cmdlen) | addql #6,sp movew d0,__ARGC | save length movel a0,__ARGS | save pointer to string | | calculate free space available to program | movel __BREAK,d3 movel d3,a3 | a3 = base of free space negl d3 addl a4@(p_hitpa),d3 subl #MARGIN,d3 | d3 = free space | | calculate new stack size (store in d2) | | ASSUME 8K STACK FOR THE MOMENT. movel __stklen,d2 | d2 = _STKSIZ tstl d2 | if __STKSIZ is zero beq minimum | use MINSTK bra setstk | use __STKSIZ minimum: movel #MINSTK,d2 | use MINSTK | | check to see if there is enough room for requested stack | setstk: cmpl d3,d2 blt shrink | if (available < requested) movel #stkerr,sp@- movew #Cconws,sp@- trap #1 | report a stack error addql #6,sp movew #-39,sp@- movew #Pterm,sp@- trap #1 | and return error -39 (ENSMEM) | | set up new stack pointer and Mshrink | shrink: addl a3,d2 | new stack = free base + stack size movel d2,sp subl a4,d2 | keep space = new stack - __base movel d2,sp@- movel a4,sp@- clrw sp@- movew #Mshrink,sp@- trap #1 | Mshrink(0, _base, keep); addl #12,sp | | call C entry point function _main() | jsr PASCALMAIN | if _main returns movew #0,sp@- | Terminate program normally trap #1 | movew d0,sp@(4) | insert return value and fall thru | | check for stack overflow (done after all OS traps) | chkstk: cmpl __BREAK,sp bgt nosweat | if (_break > sp) movel #stkovf,sp@- movew #Cconws,sp@- trap #1 | report a stack overflow addql #6,sp movew #-1,sp@- movew #Pterm,sp@- trap #1 | and return error -1 (ERROR) nosweat: movel traprtn,sp@- | else, restore return address rts | and do a normal return. | | this call to _main ensures that it the user's main() function will be | linked, even if it is in a library. | jsr PASCALMAIN | NO PATH TO THIS STATEMENT movew d0,sp@- movew #0x4c,sp@- trap #1 | | initialized data space | .data .even stkerr: | not enough memory for stack .ascii "Not enough memory" .byte 0x0d,0x0a,0x00 stkovf: | impending stack overflow .ascii "Stack overflow" .byte 0x0d,0x0a,0x00 _errno: | system error number .word 0 __ARGC: | number of command line args .word 0 __ARGS: | pointer to command line arg list .long 0 | | uninitialized data space | .even __base: | pointer to basepage .long 0 _etext: | pointer to end of text segment .long 0 _edata: | pointer to end of data segment .long 0 _end: | pointer to end of BSS (end of program) .long 0 __BREAK: | pointer to stack/heap break .long 0 __envp: | pointer to environment string .long 0 traprtn: | storage for return PC in trap hooks .long 0