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