[109c83b] | 1 | * ------------------------------------------------------------------------------
|
---|
| 2 | * fsmain.s -- startup code for the Buchla 700 standalone C runtime library
|
---|
| 3 | * Version 3 -- 1987-06-29 -- D.N. Lynx Crowe
|
---|
| 4 | *
|
---|
| 5 | * This code clears 'bss' space, sets up some global variables,
|
---|
| 6 | * and calls Croot(), which sets up the file system and calls main().
|
---|
| 7 | *
|
---|
| 8 | * This routine should be entered with the address of the basepage
|
---|
| 9 | * as its parameter.
|
---|
| 10 | * ------------------------------------------------------------------------------
|
---|
| 11 | .text
|
---|
| 12 | *
|
---|
| 13 | .xdef start_
|
---|
| 14 | *
|
---|
| 15 | .xref _Croot
|
---|
| 16 | *
|
---|
| 17 | .xdef _panic
|
---|
| 18 | .xdef _brk
|
---|
| 19 | *
|
---|
| 20 | .xdef __heap
|
---|
| 21 | .xdef __break
|
---|
| 22 | .xdef __pmesg
|
---|
| 23 | *
|
---|
| 24 | .xdef _errno
|
---|
| 25 | *
|
---|
| 26 | p_bbase .equ $18 * bss base
|
---|
| 27 | p_blen .equ $1C * bss length
|
---|
| 28 | *
|
---|
| 29 | .page
|
---|
| 30 | *
|
---|
| 31 | * start_ -- Initial entry point -- Must be first object file in link statement
|
---|
| 32 | * ------ ------------------------------------------------------------------
|
---|
| 33 | *
|
---|
| 34 | * WARNING: Hazardous assumptions
|
---|
| 35 | *
|
---|
| 36 | * We assume that:
|
---|
| 37 | *
|
---|
| 38 | * the system has set the stack pointer for us.
|
---|
| 39 | * the system passed us a pointer to a valid basepage.
|
---|
| 40 | * the stack is above the heap.
|
---|
| 41 | * BSS is located in RAM.
|
---|
| 42 | *
|
---|
| 43 | * If any of these assumptions is in error, we're in for serious trouble.
|
---|
| 44 | *
|
---|
| 45 | start_: clr.l a6 * Clear frame pointer
|
---|
| 46 | movea.l 4(a7),a1 * Set pointer to base page
|
---|
| 47 | movea.l p_bbase(a1),a0 * Setup to clear bss space
|
---|
| 48 | *
|
---|
| 49 | start1: clr.w (a0)+ * Clear a word
|
---|
| 50 | cmpa.l a0,a7 * See if we're done
|
---|
| 51 | bne start1 * Loop if not done yet
|
---|
| 52 | *
|
---|
| 53 | move.l p_bbase(a1),d0 * Calculate break address
|
---|
| 54 | add.l p_blen(a1),d0 * ...
|
---|
| 55 | move.l d0,__break * Set initial break
|
---|
| 56 | move.l d0,__heap * Set heap start
|
---|
| 57 | *
|
---|
| 58 | move.l #0,-(a7) * Pass NULL to Croot (no command line)
|
---|
| 59 | jsr _Croot * call Croot() routine
|
---|
| 60 | addq.l #4,a7 * ...
|
---|
| 61 | *
|
---|
| 62 | move.l #pmsg1,-(a7) * panic(pmsg1);
|
---|
| 63 | jsr _panic * ...
|
---|
| 64 | addq.l #4,a7 * ...
|
---|
| 65 | *
|
---|
| 66 | hstop: stop #$2000 * "Die, sucker!"
|
---|
| 67 | bra hstop
|
---|
| 68 | *
|
---|
| 69 | .page
|
---|
| 70 | *
|
---|
| 71 | * _panic -- hard halt for fatal errors
|
---|
| 72 | * ------ --------------------------
|
---|
| 73 | _panic: movea.l 4(a7),a0 * Save panic message address
|
---|
| 74 | move.l a0,__pmesg * ...
|
---|
| 75 | *
|
---|
| 76 | trap #15 * Invoke ROMP (we hope ...)
|
---|
| 77 | *
|
---|
| 78 | pstop: stop #$2700 * HARD HALT
|
---|
| 79 | bra pstop
|
---|
| 80 | *
|
---|
| 81 | .page
|
---|
| 82 | *
|
---|
| 83 | * _brk -- set break value
|
---|
| 84 | * ---- ---------------
|
---|
| 85 | * WARNING: This only works if the stack is above the heap.
|
---|
| 86 | *
|
---|
| 87 | _brk: cmpa.l __break,a7 * compare current break with stack
|
---|
| 88 | bcs pstop * actual stack overflow!
|
---|
| 89 | *
|
---|
| 90 | movea.l 4(sp),a0 * get new break
|
---|
| 91 | move.l a0,d0 * compare with current stack,
|
---|
| 92 | adda.l #$100,a0 * ... including 256-byte slop factor
|
---|
| 93 | cmpa.l a0,a7 * if (sp < a0+256)
|
---|
| 94 | bcs badbrk * bad break;
|
---|
| 95 | *
|
---|
| 96 | move.l d0,__break * OK break: save the break
|
---|
| 97 | clr.l d0 * Set OK return
|
---|
| 98 | rts * return
|
---|
| 99 | *
|
---|
| 100 | badbrk: moveq.l #-1,d0 * Load return reg
|
---|
| 101 | rts * Return
|
---|
| 102 | *
|
---|
| 103 | .page
|
---|
| 104 | *
|
---|
| 105 | *************************************************************************
|
---|
| 106 | * Data Area *
|
---|
| 107 | *************************************************************************
|
---|
| 108 | *
|
---|
| 109 | .data
|
---|
| 110 | *
|
---|
| 111 | pmsg1: dc.b ' returned from Croot() ',0
|
---|
| 112 | *
|
---|
| 113 | *************************************************************************
|
---|
| 114 | * BSS Area *
|
---|
| 115 | *************************************************************************
|
---|
| 116 | *
|
---|
| 117 | .bss
|
---|
| 118 | .even
|
---|
| 119 | *
|
---|
| 120 | __pmesg: ds.l 1 * panic() message string address
|
---|
| 121 | __heap: ds.l 1 * Heap start (initial break)
|
---|
| 122 | __break: ds.l 1 * Current break location
|
---|
| 123 | _errno: ds.w 1 * System error number
|
---|
| 124 | *
|
---|
| 125 | .end
|
---|