1 | * ------------------------------------------------------------------------------
|
---|
2 | * lowram.s -- create a GEMDOS compatible basepage for the Buchla 700
|
---|
3 | * Version 10 -- 1988-03-28 -- D.N. Lynx Crowe
|
---|
4 | * ------------------------------------------------------------------------------
|
---|
5 | * Provides a GEMDOS compatible basepage and calls start_ to
|
---|
6 | * get things rolling for applications on the Buchla 700.
|
---|
7 | *
|
---|
8 | * Also sets the stack pointer to the high end of RAM.
|
---|
9 | *
|
---|
10 | * WARNING: This code ONLY works for programs loaded into RAM.
|
---|
11 | * ------------------------------------------------------------------------------
|
---|
12 | * We expect the following to be the relative layout of memory:
|
---|
13 | *
|
---|
14 | * lowram load address (this chunk of code)
|
---|
15 | * ...
|
---|
16 | * p_lowtpa start of 'TPA' / basepage address
|
---|
17 | * ...
|
---|
18 | * start_ first module (starts 'text' area)
|
---|
19 | * ...
|
---|
20 | * ... -text-
|
---|
21 | * ...
|
---|
22 | * _etext end of 'text' area + 1
|
---|
23 | * basedat start of 'data' area (will usually be _etext)
|
---|
24 | * ...
|
---|
25 | * ... -data-
|
---|
26 | * ...
|
---|
27 | * _edata end of 'data' area + 1
|
---|
28 | * basebss start of 'bss' area (will usually be _edata)
|
---|
29 | * ...
|
---|
30 | * ... -BSS-
|
---|
31 | * ...
|
---|
32 | * _end end of actual 'bss' area + 1
|
---|
33 | * ...
|
---|
34 | * ... -heap-
|
---|
35 | * ...
|
---|
36 | * HI_RAM-$400 end of pseudo 'bss' area (cleared by fsmain.s)
|
---|
37 | * ...
|
---|
38 | * ... -stack margin-
|
---|
39 | * ...
|
---|
40 | * HI_RAM end of RAM + 1, initial stack address
|
---|
41 | * ------------------------------------------------------------------------------
|
---|
42 | * The startup code in fsmain.s uses the bss length to know how much RAM
|
---|
43 | * to clear. We give it HI_RAM-$400-basebss, and put the stack at HI_RAM.
|
---|
44 | * The startup code clears from p_bbase through p_bbase+p_blen-1, inclusive.
|
---|
45 | * This keeps fsmain.s from wiping itself out when it zaps the bss area.
|
---|
46 | *
|
---|
47 | * The startup code (start_) in fsmain.s is entered with the address of
|
---|
48 | * the basepage passed as a long word parameter on the top of the stack.
|
---|
49 | * ------------------------------------------------------------------------------
|
---|
50 | .text
|
---|
51 | *
|
---|
52 | .page
|
---|
53 | *
|
---|
54 | * Globals defined here:
|
---|
55 | *
|
---|
56 | .xdef LOWRAM
|
---|
57 | .xdef _Lo_RAM
|
---|
58 | .xdef _Hi_RAM
|
---|
59 | *
|
---|
60 | .xdef basebss
|
---|
61 | .xdef basedat
|
---|
62 | .xdef p_lowtpa
|
---|
63 | .xdef p_env
|
---|
64 | *
|
---|
65 | .xdef _p_tlen
|
---|
66 | .xdef _p_dlen
|
---|
67 | *
|
---|
68 | * Globals referred to here:
|
---|
69 | *
|
---|
70 | .xref start_ * entry point in fsmain.s
|
---|
71 | .xref _panic * entry point in fsmain.s
|
---|
72 | *
|
---|
73 | .xref _edata * supplied by loader
|
---|
74 | .xref _etext * supplied by loader
|
---|
75 | *
|
---|
76 | * ------------------------------------------------------------------------------
|
---|
77 | * Memory setup:
|
---|
78 | * ------------
|
---|
79 | * The equate for HI_RAM must be set to match the memory configuration used.
|
---|
80 | *
|
---|
81 | * For a 512K system, _Hi_RAM = $080000
|
---|
82 | * For a 1024K system, _Hi_RAM = $100000
|
---|
83 | *
|
---|
84 | _Hi_RAM .equ $100000 * highest RAM address + 1
|
---|
85 | *
|
---|
86 | .page
|
---|
87 | *
|
---|
88 | * LOWRAM -- Startup code for Buchla 700 application programs
|
---|
89 | * ------ ------------------------------------------------
|
---|
90 | _Lo_RAM:
|
---|
91 | LOWRAM: lea basebss,a0 * setup bss base
|
---|
92 | move.l a0,p_bbase * ...
|
---|
93 | lea _Hi_RAM-$400,a1 * setup faked bss length
|
---|
94 | suba.l a0,a1 * ...
|
---|
95 | move.l a1,p_blen * ...
|
---|
96 | *
|
---|
97 | lea basedat,a0 * setup data base
|
---|
98 | move.l a0,p_dbase * ...
|
---|
99 | lea _edata,a1 * setup data length
|
---|
100 | suba.l a0,a1 * ...
|
---|
101 | move.l a1,p_dlen * ...
|
---|
102 | *
|
---|
103 | lea start_,a0 * setup text base
|
---|
104 | move.l a0,p_tbase * ...
|
---|
105 | lea _etext,a1 * setup text length
|
---|
106 | suba.l a0,a1 * ...
|
---|
107 | move.l a1,p_tlen * ...
|
---|
108 | *
|
---|
109 | lea _Hi_RAM,a7 * setup stack pointer
|
---|
110 | *
|
---|
111 | lea p_lowtpa,a0 * setup TPA base
|
---|
112 | move.l a0,p_lowtpa * ...
|
---|
113 | move.l a7,p_hitpa * setup high TPA
|
---|
114 | *
|
---|
115 | move.l #p_lowtpa,-(a7) * Pass basepage address
|
---|
116 | jsr start_ * Start things going
|
---|
117 | addq.l #4,a7 * Clean up stack
|
---|
118 | *
|
---|
119 | move.l #pmsg,-(a7) * OOPS: panic()
|
---|
120 | jsr _panic * ... shouldn't ever return
|
---|
121 | addq.l #4,a7
|
---|
122 | *
|
---|
123 | hstop: stop #$2000 * "Die, sucker!"
|
---|
124 | bra hstop
|
---|
125 | *
|
---|
126 | .page
|
---|
127 | *
|
---|
128 | * The mess below is the basepage. It defines the start of the pseudo 'TPA'.
|
---|
129 | * This MUST live in the 'text' segment for things to work.
|
---|
130 | *
|
---|
131 | p_lowtpa: dc.l 0 * low address of TPA
|
---|
132 | p_hitpa: dc.l 0 * high address + 1 of TPA
|
---|
133 | p_tbase: dc.l 0 * low address of text segment
|
---|
134 | p_tlen: dc.l 0 * length of text segment
|
---|
135 | p_dbase: dc.l 0 * low address of data segment
|
---|
136 | p_dlen: dc.l 0 * length of data segment
|
---|
137 | p_bbase: dc.l 0 * low address of BSS segment
|
---|
138 | p_blen: dc.l 0 * length of BSS segment
|
---|
139 | p_dta: dc.l 0 * pointer to DTA
|
---|
140 | p_parent: dc.l 0 * pointet to parent basepage
|
---|
141 | dc.l 0
|
---|
142 | p_env: dc.l 0 * pointer to environment string
|
---|
143 | ds.l 20
|
---|
144 | p_cmdlin: dc.b 0 * command line tail image
|
---|
145 | ds.b 127
|
---|
146 | *
|
---|
147 | BPLEN .equ *-p_lowtpa * MUST be $0100 (or we goofed)
|
---|
148 | *
|
---|
149 | _p_tlen .equ p_tlen * text length for MIDAS-VII
|
---|
150 | _p_dlen .equ p_dlen * data length for MIDAS-VII
|
---|
151 | *
|
---|
152 | * ------------------------------------------------------------------------------
|
---|
153 | .data
|
---|
154 | * ------------------------------------------------------------------------------
|
---|
155 | .even
|
---|
156 | *
|
---|
157 | basedat: dc.b '***** data *****' * start of data
|
---|
158 | *
|
---|
159 | pmsg: dc.b 'returned from start_()',0 * panic() message
|
---|
160 | *
|
---|
161 | * ------------------------------------------------------------------------------
|
---|
162 | .bss
|
---|
163 | * ------------------------------------------------------------------------------
|
---|
164 | .even
|
---|
165 | *
|
---|
166 | basebss: ds.l 1 * start of BSS
|
---|
167 | *
|
---|
168 | .end
|
---|