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