1/*	$NetBSD: wdboot.S,v 1.1.4.3 2004/09/21 13:14:19 skrll Exp $	*/
2
3/*
4 * Copyright (c) 1995 Waldi Ravens
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *        This product includes software developed by Waldi Ravens.
18 * 4. The name of the author may not be used to endorse or promote products
19 *    derived from this software without specific prior written permission
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#include "xxboot.h"
34
35#ifdef __ELF__
36	.globl	_start, main, fill
37
38	.text
39_start:
40#else
41	.globl	start, main, fill
42
43	.text
44start:
45#endif
46/*
47 * in: d3 ('DMAr' flag), d4 (SCSI target), d5 (boot pref), d7 (ACSI target)
48 */
49main:	lea	%pc@(regsav),%a0
50	movml	%d3-%d5/%d7,%sp@-
51	movl	%sp,%a0@
52
53	movw	#-1,%sp@-
54	movw	#Kbshift,%sp@-
55	trap	#BIOS
56	addql	#4,%sp
57
58	tstb	%d5
59	beqs	0f			| no boot preference
60	cmpb	#0x20,%d5
61	bnes	exit			| bootpref != NetBSD
62
630:	btst	#3,%d0			| Alternate?
64	bnes	exit
65	subql	#1,%d0
66	movl	%d0,%a3			| autoboot flag
67
68	movl	_membot:w,%d3
69	lea	MAXBOT,%a4
70	cmpl	%a4,%d3
71	bhis	exit			| membot > MAXBOT
72
73	movl	_memtop:w,%d3
74	cmpl	#MINTOP,%d3
75	blts	exit			| memtop < MINTOP
76
77	andw	#-4,%d3
78	movl	%d3,%a0
79	movl	%sp,%a0@-
80	movl	%a0,%sp			| set new stack
81
82	movq	#NSEC,%d5		| sector count
83	movq	#1,%d6			| first sector
84	bsrs	rds0
85	tstl	%d0
86	bnes	0f
87/*
88 * loader (readsector, disklabel, autoboot)
89 */
90	pea	%a3@			| autoboot
91	pea	%a4@(LBLST-MAXBOT)	| disklabel
92	pea	%pc@(rds1)		| readsector
93	jsr	%a4@(BXXST-MAXBOT)
94	lea	%sp@(12),%sp		| NetBSD not booted
95
960:	movl	%sp@,%sp			| restore BIOS stack
97	tstl	%d0
98	bmis	exit
99	movl	%d0,%sp@(8)		| new boot preference
100
101exit:	movml	%sp@+,%d3-%d5/%d7
102	rts
103
104/*
105 * int readsec (void *buffer, u_int offset, u_int count);
106 */
107rds1:	movml	%d2-%d7/%a2-%a6,%sp@-
108	movl	%pc@(regsav),%a0
109	movml	%a0@,%d3-%d5/%d7
110	movl	%sp@(48),%a4		| buffer
111	movl	%sp@(52),%d6		| offset
112	movl	%sp@(56),%d3		| count
1130:	movl	#255,%d5
114	cmpl	%d5,%d3
115	bccs	1f
116	movl	%d3,%d5
1171:	bsrs	rds0
118	tstl	%d0
119	bnes	2f
120	addl	#(255*512),%a4
121	addl	%d5,%d6
122	subl	%d5,%d3
123	bnes	0b
1242:	movml	%sp@+,%d2-%d7/%a2-%a6
125	rts
126/*
127 * in:  d4 (target) d5 (count), d6 (offset), a4 (buffer)
128 * out: d0 (<= 0)
129 * mod: d0, d1, d2, a0, a1, a5, a6
130 */
131rds0:	lea	%pc@(dpar),%a6
132	tstb	%a6@
133	bnes	0f
134	movb	%d4,%d0
135	andb	#1,%d0
136	aslb	#4,%d0
137	orb	#0xa0,%d0
138	movb	%d0,idesdh:l
139	movl	%a4,%a0
140	movq	#0,%d1
141	movb	#0,idedor:l
142	movb	#0xec,idecr:l		| IDENTIFY DRIVE
143	bsrs	wait
144	bnes	err
145	movb	%a4@(7),%a6@		| tracks/cylinder
146	movb	%a4@(13),%a6@(1)		| sectors/track
1470:	movl	%d6,%d1
148	movq	#0,%d0
149	movb	%a6@(1),%d0
150	movq	#0,%d2
151	movb	%a6@,%d2
152	mulu	%d0,%d2
153	divu	%d2,%d1
154	movb	%d1,idecl:l
155	lsrl	#8,%d1
156	movb	%d1,idech:l
157	lsrl	#8,%d1
158	divu	%d0,%d1
159	movb	%d4,%d0
160	andb	#1,%d0
161	aslb	#4,%d0
162	orb	%d0,%d1
163	orb	#0xa0,%d1
164	movb	%d1,idesdh:l
165	swap	%d1
166	addqw	#1,%d1
167	movb	%d1,idesn:l
168	movl	%a4,%a0
169	movb	%d5,idesc:l
170	movw	%d5,%d1
171	subqw	#1,%d1
172	movb	#0,idedor:l
173	movb	#0x20,idecr:l
174wait:	movl	#0x7d0,%d0
175	addl	_hz_200:w,%d0
1762:	btst	#5,gpip:w
177	beqs	3f
178	cmpl	_hz_200:w,%d0
179	bhis	2b
180err:	movq	#-1,%d0
181	rts
1823:	movb	idesr:l,%d0
183	btst	#0,%d0
184	bnes	err
185	btst	#3,%d0
186	beqs	err
187	movq	#63,%d0
188	lea	idedr:l,%a1
1894:	movw	%a1@,%a0@+
190	movw	%a1@,%a0@+
191	movw	%a1@,%a0@+
192	movw	%a1@,%a0@+
193	dbra	%d0,4b
194	dbra	%d1,wait
195	movq	#0,%d0
196	rts
197
198regsav:	.long	0
199
200fill:	.space	30
201
202dpar:	.byte	0			| tracks/cylinder
203	.byte	0			| sectors/track
204
205	.ascii	"NetBSD"
206hd_siz:	.long	0
207p0_dsc:	.long	0, 0, 0
208p1_dsc:	.long	0, 0, 0
209p2_dsc:	.long	0, 0, 0
210p3_dsc:	.long	0, 0, 0
211bsl_st:	.long	0
212bsl_sz:	.long	0
213	.word	0
214end:
215