Sync usage with man page.
[netbsd-mini2440.git] / sys / arch / atari / stand / xxboot / sdboot / sdboot.S
blob04fd0562f4e37b61316b6f3e41e5a3306e6bbf5e
1 /*      $NetBSD: sdboot.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         cmpl    #0x444d4172,%d3         | SCSI bootdev?
59         beqs    0f
60         movq    #-1,%d4                 | no, ACSI
61         bras    1f
63 0:      tstb    %d5
64         beqs    1f                      | no boot preference
65         cmpb    #0x20,%d5
66         bnes    exit                    | bootpref != NetBSD
68 1:      btst    #3,%d0                  | Alternate?
69         bnes    exit
70         subql   #1,%d0
71         movl    %d0,%a3                 | autoboot flag
73         movl    _membot:w,%d0
74         lea     MAXBOT,%a4
75         cmpl    %a4,%d0
76         bhis    exit                    | membot > MAXBOT
78         movl    _memtop:w,%d0
79         cmpl    #MINTOP,%d0
80         blts    exit                    | memtop < MINTOP
82         andw    #-4,%d0
83         movl    %d0,%a0
84         movl    %sp,%a0@-
85         movl    %a0,%sp                 | set new stack
87         movq    #NSEC,%d5               | sector count
88         movq    #1,%d6                  | first sector
89         bsrs    rds0
90         tstl    %d0
91         bnes    0f
93  * loader (readsector, disklabel, autoboot)
94  */
95         pea     %a3@                    | autoboot
96         pea     %a4@(LBLST-MAXBOT)      | disklabel
97         pea     %pc@(rds1)              | readsector
98         jsr     %a4@(BXXST-MAXBOT)
99         lea     %sp@(12),%sp            | NetBSD not booted
101 0:      movl    %sp@,%sp                        | restore BIOS stack
102         tstl    %d0
103         bmis    exit
104         movl    %d0,%sp@(8)             | new boot preference
106 exit:   movml   %sp@+,%d3-%d5/%d7
107         rts
110  * int readsec (void *buffer, u_int offset, u_int count);
111  */
112 rds1:   movml   %d2-%d7/%a2-%a6,%sp@-
113         movl    %pc@(regsav),%a0
114         movml   %a0@,%d3-%d5/%d7
115         movl    %sp@(48),%a4            | buffer
116         movl    %sp@(52),%d6            | offset
117         movl    %sp@(56),%d3            | count
118 0:      movl    #255,%d5
119         cmpl    %d5,%d3
120         bccs    1f
121         movl    %d3,%d5
122 1:      bsrs    rds0
123         tstl    %d0
124         bnes    2f
125         addl    #(255*512),%a4
126         addl    %d5,%d6
127         subl    %d5,%d3
128         bnes    0b
129 2:      movml   %sp@+,%d2-%d7/%a2-%a6
130         rts
132  * in:  d4/d7 (target) d5 (count), d6 (offset), a4 (buffer)
133  * out: d0 (<= 0)
134  * mod: d0, d1, d2, a0, a5, a6
135  */
136 rds0:   tstl    %d4
137         bmis    0f
138         movw    %d4,%sp@-                       | device
139         pea     %a4@                    | buffer
140         movw    %d5,%sp@-                       | count
141         movl    %d6,%sp@-                       | offset
142         movw    #DMAread,%sp@-
143         trap    #XBIOS
144         lea     %sp@(14),%sp
145         rts
147 0:      st      flock:w
148         movl    _hz_200:w,%d0
149         addql   #2,%d0
150 1:      cmpl    _hz_200:w,%d0
151         bccs    1b
152         movml   %d6/%a4,%sp@-
153         lea     dmahi:w,%a6
154         movb    %sp@(7),%a6@(4)
155         movb    %sp@(6),%a6@(2)
156         movb    %sp@(5),%a6@
157         lea     %pc@(r0com),%a6
158         movb    %sp@(1),%a6@(1)
159         movb    %sp@(2),%a6@(5)
160         movb    %sp@(3),%a6@(9)
161         movb    %d5,%a6@(13)
162         addql   #8,%sp
163         lea     dmodus:w,%a6
164         lea     daccess:w,%a5
165         movw    #0x198,%a6@
166         movw    #0x098,%a6@
167         movw    %d5,%a5@
168         movw    #0x88,%a6@
169         movq    #0,%d0
170         movb    %d7,%d0
171         orb     #0x08,%d0
172         swap    %d0
173         movw    #0x8a,%d0
174         bsrs    shake
175         lea     %pc@(r0com),%a0
176         movq    #3,%d2
177 2:      movl    %a0@+,%d0
178         bsrs    shake
179         dbra    %d2,2b
180         movq    #0x0a,%d0
181         movl    %d0,%a5@
182         movl    #0x190,%d1
183         bsrs    wait
184         movw    #0x8a,%a6@
185         movw    %a5@,%d0
186         andw    #0xff,%d0
187         beqs    0f
188 r0err:  movq    #-1,%d0
189 0:      movw    #0x80,%a6@
190         clrb    flock:w
191 r0ret:  rts
193 shake:  movl    %d0,%a5@
194         movq    #0x0a,%d1
195 wait:   addl    _hz_200:w,%d1
196 0:      btst    #5,gpip:w
197         beqs    r0ret
198         cmpl    _hz_200:w,%d1
199         bccs    0b
200         addql   #4,%sp
201         bras    r0err
203 r0com:  .long   0x0000008a
204         .long   0x0000008a
205         .long   0x0000008a
206         .long   0x0001008a
208 regsav: .long   0
210 fill:   .space  24
212         .ascii  "NetBSD"
213 hd_siz: .long   0
214 p0_dsc: .long   0, 0, 0
215 p1_dsc: .long   0, 0, 0
216 p2_dsc: .long   0, 0, 0
217 p3_dsc: .long   0, 0, 0
218 bsl_st: .long   0
219 bsl_sz: .long   0
220         .word   0
221 end: