xref: /netbsd-src/sys/arch/amiga/stand/loadbsd/startit.s (revision 34815acdf9c90502e94f6be3fe88e54bed7bf395)
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
10start_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
73not040:
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
88nott:
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
102L0:
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
110L2:
111	move.l	(a1)+,(a5)+
112	sub.l	#4,d2
113	bcc	L2
114
115	btst	#3,d5
116	jeq	L1
117	.word	0xf4f8
118L1:
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
131ckend:
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
154noDraCo:
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
173nullrp:	.long	0x7fff0001
174zero:	.long	0
175
176_startit_end:
177
178	.data
179	.globl	_startit_sz
180_startit_sz: .long _startit_end-_startit
181