Sync usage with man page.
[netbsd-mini2440.git] / sys / arch / atari / stand / xxboot / wdboot / wdboot.S
blobfaecd5bf37903213f701156e920f22984e762d70
1 /*      $NetBSD: wdboot.S,v 1.1.4.3 2004/09/21 13:14:19 skrll Exp $     */
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  */
33 #include "xxboot.h"
35 #ifdef __ELF__
36         .globl  _start, main, fill
38         .text
39 _start:
40 #else
41         .globl  start, main, fill
43         .text
44 start:
45 #endif
47  * in: d3 ('DMAr' flag), d4 (SCSI target), d5 (boot pref), d7 (ACSI target)
48  */
49 main:   lea     %pc@(regsav),%a0
50         movml   %d3-%d5/%d7,%sp@-
51         movl    %sp,%a0@
53         movw    #-1,%sp@-
54         movw    #Kbshift,%sp@-
55         trap    #BIOS
56         addql   #4,%sp
58         tstb    %d5
59         beqs    0f                      | no boot preference
60         cmpb    #0x20,%d5
61         bnes    exit                    | bootpref != NetBSD
63 0:      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
73         movl    _memtop:w,%d3
74         cmpl    #MINTOP,%d3
75         blts    exit                    | memtop < MINTOP
77         andw    #-4,%d3
78         movl    %d3,%a0
79         movl    %sp,%a0@-
80         movl    %a0,%sp                 | set new stack
82         movq    #NSEC,%d5               | sector count
83         movq    #1,%d6                  | first sector
84         bsrs    rds0
85         tstl    %d0
86         bnes    0f
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
96 0:      movl    %sp@,%sp                        | restore BIOS stack
97         tstl    %d0
98         bmis    exit
99         movl    %d0,%sp@(8)             | new boot preference
101 exit:   movml   %sp@+,%d3-%d5/%d7
102         rts
105  * int readsec (void *buffer, u_int offset, u_int count);
106  */
107 rds1:   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
113 0:      movl    #255,%d5
114         cmpl    %d5,%d3
115         bccs    1f
116         movl    %d3,%d5
117 1:      bsrs    rds0
118         tstl    %d0
119         bnes    2f
120         addl    #(255*512),%a4
121         addl    %d5,%d6
122         subl    %d5,%d3
123         bnes    0b
124 2:      movml   %sp@+,%d2-%d7/%a2-%a6
125         rts
127  * in:  d4 (target) d5 (count), d6 (offset), a4 (buffer)
128  * out: d0 (<= 0)
129  * mod: d0, d1, d2, a0, a1, a5, a6
130  */
131 rds0:   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
147 0:      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
174 wait:   movl    #0x7d0,%d0
175         addl    _hz_200:w,%d0
176 2:      btst    #5,gpip:w
177         beqs    3f
178         cmpl    _hz_200:w,%d0
179         bhis    2b
180 err:    movq    #-1,%d0
181         rts
182 3:      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
189 4:      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
198 regsav: .long   0
200 fill:   .space  30
202 dpar:   .byte   0                       | tracks/cylinder
203         .byte   0                       | sectors/track
205         .ascii  "NetBSD"
206 hd_siz: .long   0
207 p0_dsc: .long   0, 0, 0
208 p1_dsc: .long   0, 0, 0
209 p2_dsc: .long   0, 0, 0
210 p3_dsc: .long   0, 0, 0
211 bsl_st: .long   0
212 bsl_sz: .long   0
213         .word   0
214 end: