startit.s revision 1.1 1 .text
2
3 .globl _startit
4 _startit:
5 move.l sp,a3
6 move.l 4,a6
7 lea (start_super,pc),a5
8 jmp (-0x1e,a6) | supervisor-call
9
10 start_super:
11 move.w #0x2700,sr
12
13 | the BSD kernel wants values into the following registers:
14 | a0: fastmem-start
15 | d0: fastmem-size
16 | d1: chipmem-size
17 | d3: Amiga specific flags
18 | d4: E clock frequency
19 | d5: AttnFlags (cpuid)
20 | d7: boothowto
21 | a4: esym location
22 | a2: Inhibit sync flags
23 | All other registers zeroed for possible future requirements.
24
25 lea (_startit,pc),sp | make sure we have a good stack ***
26
27 move.l (4,a3),a1 | loaded kernel
28 move.l (8,a3),d2 | length of loaded kernel
29 | move.l (12,a3),sp | entry point in stack pointer
30 move.l (12,a3),a6 | push entry point ***
31 move.l (16,a3),a0 | fastmem-start
32 move.l (20,a3),d0 | fastmem-size
33 move.l (24,a3),d1 | chipmem-size
34 move.l (28,a3),d7 | boothowto
35 move.l (32,a3),a4 | esym
36 move.l (36,a3),d5 | cpuid
37 move.l (40,a3),d4 | E clock frequency
38 move.l (44,a3),d3 | Amiga flags
39 move.l (48,a3),a2 | Inhibit sync flags
40 move.l (52,a3),d6 | Load to fastmem flag
41 sub.l a5,a5 | target, load to 0
42
43 cmp.b #0x7D,(36,a3) | is it DraCo?
44 beq nott | yes, switch off MMU later
45
46 | no, it is an Amiga:
47
48 | move.w #0xf00,0xdff180 |red
49 | move.b #0,0x200003c8
50 | move.b #63,0x200003c9
51 | move.b #0,0x200003c9
52 | move.b #0,0x200003c9
53
54 move.w #(1<<9),0xdff096 | disable DMA on Amigas.
55
56 | ------ mmu off start -----
57
58 btst #3,d5 | AFB_68040,SysBase->AttnFlags
59 beq not040
60
61 | Turn off 68040/060 MMU
62
63 sub.l a3,a3
64 .word 0x4e7b,0xb003 | movec a3,tc
65 .word 0x4e7b,0xb806 | movec a3,urp
66 .word 0x4e7b,0xb807 | movec a3,srp
67 .word 0x4e7b,0xb004 | movec a3,itt0
68 .word 0x4e7b,0xb005 | movec a3,itt1
69 .word 0x4e7b,0xb006 | movec a3,dtt0
70 .word 0x4e7b,0xb007 | movec a3,dtt1
71 bra nott
72
73 not040:
74 lea (zero,pc),a3
75 pmove (a3),tc | Turn off MMU
76 lea (nullrp,pc),a3
77 pmove (a3),crp | Turn off MMU some more
78 pmove (a3),srp | Really, really, turn off MMU
79
80 | Turn off 68030 TT registers
81
82 btst #2,d5 | AFB_68030,SysBase->AttnFlags
83 beq nott | Skip TT registers if not 68030
84 lea (zero,pc),a3
85 .word 0xf013,0x0800 | pmove a3@,tt0 (gas only knows about 68851 ops..)
86 .word 0xf013,0x0c00 | pmove a3@,tt1 (gas only knows about 68851 ops..)
87
88 nott:
89 | ---- mmu off end ----
90 | move.w #0xf60,0xdff180 | orange
91 | move.b #0,0x200003c8
92 | move.b #63,0x200003c9
93 | move.b #24,0x200003c9
94 | move.b #0,0x200003c9
95
96 | ---- copy kernel start ----
97
98 tst.l d6 | Can we load to fastmem?
99 beq L0 | No, leave destination at 0
100 move.l a0,a5 | Move to start of fastmem chunk
101 add.l a0,a6 | relocate kernel entry point
102 L0:
103 move.l (a1)+,(a5)+
104 sub.l #4,d2
105 bcc L0
106
107 lea (ckend,pc),a1
108 move.l a5,-(sp)
109 move.l #_startit_end-ckend,d2
110 L2:
111 move.l (a1)+,(a5)+
112 sub.l #4,d2
113 bcc L2
114
115 btst #3,d5
116 jeq L1
117 .word 0xf4f8
118 L1:
119 moveq.l #0,d2 | switch off cache to ensure we use
120 movec d2,cacr | valid kernel data
121
122 | move.w #0xFF0,0xdff180 | yellow
123 | move.b #0,0x200003c8
124 | move.b #63,0x200003c9
125 | move.b #0,0x200003c9
126 | move.b #0,0x200003c9
127 rts
128
129 | ---- copy kernel end ----
130
131 ckend:
132 | move.w #0x0ff,0xdff180 | petrol
133 | move.b #0,0x200003c8
134 | move.b #0,0x200003c9
135 | move.b #63,0x200003c9
136 | move.b #63,0x200003c9
137
138 move.l d5,d2
139 rol.l #8,d2
140 cmp.b #0x7D,d2
141 jne noDraCo
142
143 | DraCo: switch off MMU now:
144
145 sub.l a3,a3
146 .word 0x4e7b,0xb003 | movec a3,tc
147 .word 0x4e7b,0xb806 | movec a3,urp
148 .word 0x4e7b,0xb807 | movec a3,srp
149 .word 0x4e7b,0xb004 | movec a3,itt0
150 .word 0x4e7b,0xb005 | movec a3,itt1
151 .word 0x4e7b,0xb006 | movec a3,dtt0
152 .word 0x4e7b,0xb007 | movec a3,dtt1
153
154 noDraCo:
155 moveq #0,d2 | zero out unused registers
156 moveq #0,d6 | (might make future compatibility
157 move.l d6,a1 | would have known contents)
158 move.l d6,a3
159 move.l d6,a5
160 move.l a6,sp | entry point into stack pointer
161 move.l d6,a6
162
163 | move.w #0x0F0,0xdff180 | green
164 | move.b #0,0x200003c8
165 | move.b #0,0x200003c9
166 | move.b #63,0x200003c9
167 | move.b #0,0x200003c9
168
169 jmp (sp) | jump to kernel entry point
170
171 | A do-nothing MMU root pointer (includes the following long as well)
172
173 nullrp: .long 0x7fff0001
174 zero: .long 0
175
176 _startit_end:
177
178 .data
179 .globl _startit_sz
180 _startit_sz: .long _startit_end-_startit
181