xref: /netbsd-src/sys/arch/atari/stand/xxboot/wdboot/wdboot.S (revision ae23d92f756cf01807af054d2355aad95e40a856)
1/*	$NetBSD: wdboot.S,v 1.3 2022/06/26 14:14:46 tsutsui 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	.globl	_start, main, fill
36
37	.text
38_start:
39/*
40 * in: d3 ('DMAr' flag), d4 (SCSI target), d5 (boot pref), d7 (ACSI target)
41 */
42main:	lea	%pc@(regsav),%a0
43	movml	%d3-%d5/%d7,%sp@-
44	movl	%sp,%a0@
45
46	movw	#-1,%sp@-
47	movw	#Kbshift,%sp@-
48	trap	#BIOS
49	addql	#4,%sp
50
51	tstb	%d5
52	beqs	0f			| no boot preference
53	cmpb	#0x20,%d5
54	bnes	exit			| bootpref != NetBSD
55
560:	btst	#3,%d0			| Alternate?
57	bnes	exit
58	subql	#1,%d0
59	movl	%d0,%a3			| autoboot flag
60
61	movl	_membot:w,%d3
62	lea	MAXBOT,%a4
63	cmpl	%a4,%d3
64	bhis	exit			| membot > MAXBOT
65
66	movl	_memtop:w,%d3
67	cmpl	#MINTOP,%d3
68	blts	exit			| memtop < MINTOP
69
70	andw	#-4,%d3
71	movl	%d3,%a0
72	movl	%sp,%a0@-
73	movl	%a0,%sp			| set new stack
74
75	movq	#NSEC,%d5		| sector count
76	movq	#1,%d6			| first sector
77	bsrs	rds0
78	tstl	%d0
79	bnes	0f
80/*
81 * loader (readsector, disklabel, autoboot)
82 */
83	pea	%a3@			| autoboot
84	pea	%a4@(LBLST-MAXBOT)	| disklabel
85	pea	%pc@(rds1)		| readsector
86	jsr	%a4@(BXXST-MAXBOT)
87	lea	%sp@(12),%sp		| NetBSD not booted
88
890:	movl	%sp@,%sp			| restore BIOS stack
90	tstl	%d0
91	bmis	exit
92	movl	%d0,%sp@(8)		| new boot preference
93
94exit:	movml	%sp@+,%d3-%d5/%d7
95	rts
96
97/*
98 * int readsec (void *buffer, u_int offset, u_int count);
99 */
100rds1:	movml	%d2-%d7/%a2-%a6,%sp@-
101	movl	%pc@(regsav),%a0
102	movml	%a0@,%d3-%d5/%d7
103	movl	%sp@(48),%a4		| buffer
104	movl	%sp@(52),%d6		| offset
105	movl	%sp@(56),%d3		| count
1060:	movl	#255,%d5
107	cmpl	%d5,%d3
108	bccs	1f
109	movl	%d3,%d5
1101:	bsrs	rds0
111	tstl	%d0
112	bnes	2f
113	addl	#(255*512),%a4
114	addl	%d5,%d6
115	subl	%d5,%d3
116	bnes	0b
1172:	movml	%sp@+,%d2-%d7/%a2-%a6
118	rts
119/*
120 * in:  d4 (target) d5 (count), d6 (offset), a4 (buffer)
121 * out: d0 (<= 0)
122 * mod: d0, d1, d2, a0, a1, a5, a6
123 */
124rds0:	lea	%pc@(dpar),%a6
125	tstb	%a6@
126	bnes	0f
127	movb	%d4,%d0
128	andb	#1,%d0
129	aslb	#4,%d0
130	orb	#0xa0,%d0
131	movb	%d0,idesdh:l
132	movl	%a4,%a0
133	movq	#0,%d1
134	movb	#0,idedor:l
135	movb	#0xec,idecr:l		| IDENTIFY DRIVE
136	bsrs	wait
137	bnes	err
138	movb	%a4@(7),%a6@		| tracks/cylinder
139	movb	%a4@(13),%a6@(1)		| sectors/track
1400:	movl	%d6,%d1
141	movq	#0,%d0
142	movb	%a6@(1),%d0
143	movq	#0,%d2
144	movb	%a6@,%d2
145	mulu	%d0,%d2
146	divu	%d2,%d1
147	movb	%d1,idecl:l
148	lsrl	#8,%d1
149	movb	%d1,idech:l
150	lsrl	#8,%d1
151	divu	%d0,%d1
152	movb	%d4,%d0
153	andb	#1,%d0
154	aslb	#4,%d0
155	orb	%d0,%d1
156	orb	#0xa0,%d1
157	movb	%d1,idesdh:l
158	swap	%d1
159	addqw	#1,%d1
160	movb	%d1,idesn:l
161	movl	%a4,%a0
162	movb	%d5,idesc:l
163	movw	%d5,%d1
164	subqw	#1,%d1
165	movb	#0,idedor:l
166	movb	#0x20,idecr:l
167wait:	movl	#0x7d0,%d0
168	addl	_hz_200:w,%d0
1692:	btst	#5,gpip:w
170	beqs	3f
171	cmpl	_hz_200:w,%d0
172	bhis	2b
173err:	movq	#-1,%d0
174	rts
1753:	movb	idesr:l,%d0
176	btst	#0,%d0
177	bnes	err
178	btst	#3,%d0
179	beqs	err
180	movq	#63,%d0
181	lea	idedr:l,%a1
1824:	movw	%a1@,%a0@+
183	movw	%a1@,%a0@+
184	movw	%a1@,%a0@+
185	movw	%a1@,%a0@+
186	dbra	%d0,4b
187	dbra	%d1,wait
188	movq	#0,%d0
189	rts
190
191regsav:	.long	0
192
193fill:	.space	30
194
195dpar:	.byte	0			| tracks/cylinder
196	.byte	0			| sectors/track
197
198	.ascii	"NetBSD"
199hd_siz:	.long	0
200p0_dsc:	.long	0, 0, 0
201p1_dsc:	.long	0, 0, 0
202p2_dsc:	.long	0, 0, 0
203p3_dsc:	.long	0, 0, 0
204bsl_st:	.long	0
205bsl_sz:	.long	0
206	.word	0
207end:
208