Sync usage with man page.
[netbsd-mini2440.git] / sys / arch / atari / stand / xxboot / fdboot / fdboot.S
blobff69d66fe94e562b77f471aa39d34244f99f35f6
1 /*      $NetBSD: fdboot.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
40 _start: bras    main
41 #else
42         .globl  start, main, fill
44         .text
46 start:  bras    main
47 #endif
49  * Fake gemdos-fs bootsector, to keep TOS away.
50  */
51         .ascii  "NetBSD"        | oem
52         .byte   0,0,0           | serial
53         .word   0               | bps
54         .byte   0               | spc
55         .word   0               | res
56         .byte   0               | fat
57         .word   0               | ndirs
58         .word   0               | sec
59         .byte   0               | media
60         .word   0               | spf
61         .word   0               | spt
62         .word   0               | side
63         .word   0               | hid
64         .even
66  * ROM loader does not save any register!
67  */
68 main:   movml   %d1-%d7/%a0-%a6,%sp@-
70         lea     %pc@(m_bot),%a3
71         movl    _membot:w,%d3
72         lea     MAXBOT,%a6
73         cmpl    %a6,%d3
74         bhis    exit                    | membot > MAXBOT
76         lea     %pc@(m_top),%a3
77         movl    _memtop:w,%d3
78         cmpl    #MINTOP,%d3
79         blts    exit                    | memtop < MINTOP
81         andw    #-4,%d3
82         movl    %d3,%a0
83         movl    %sp,%a0@-
84         movl    %a0,%sp                 | set new stack
86  * Determine the number of sectors per cylinder.
87  */
88         movq    #0,%d3
89 0:      movl    %a6,%a3                 | buffer
90         movq    #1,%d0                  | count
91         movq    #0,%d1                  | side
92         movl    %d1,%d2                 | track
93         addw    %d0,%d3                 | sector
94         bsr     rds0
95         beqs    0b
96         subqw   #1,%d3
97         addw    %d3,%d3
98         lea     %pc@(secpercyl),%a0
99         movw    %d3,%a0@
101  * Load secondary boot loader and disklabel.
102  */
103         movq    #NSEC,%d5               | # of sectors
104         movq    #1,%d4                  | first sector
105         movl    %a6,%a3                 | load address
106         bsr     rds1
107         lea     %pc@(m_rds),%a3
108         bnes    0f                      | I/O error
110  * int bootxx(readsector, disklabel, autoboot)
111  */
112         clrl    %sp@-                   | no autoboot
113         pea     %a6@(LBLST-MAXBOT)      | disklabel
114         pea     %pc@(rds2)              | readsector
115         jsr     %a6@(BXXST-MAXBOT)
116         lea     %pc@(m_sbl),%a3         | NetBSD not booted
117         lea     %sp@(12),%sp
118 0:      movl    %sp@,%sp                        | restore BIOS stack
119         movl    %d0,%d3
121 exit:   bsrs    puts                    | display error
122         lea     %pc@(m_key),%a3
123         bsrs    puts                    | wait for key
124 0:      movml   %sp@+,%d1-%d7/%a0-%a6
125         movq    #0,%d0
126         rts
128  * puts (in: a3, d3)
129  */
130 0:      cmpw    #35,%d0         | '#'
131         bnes    1f
132         bsrs    puti
133         bras    puts
134 1:      cmpw    #64,%d0         | '@'
135         bnes    2f
136         movw    #2,%sp@-
137         movw    #Bconin,%sp@-
138         trap    #BIOS
139         addql   #4,%sp
140         bras    puts
141 2:      bsrs    putc
142 puts:   movq    #0,%d0
143         movb    %a3@+,%d0
144         bnes    0b
145         rts
147 puti:   swap    %d3
148         bsrs    0f
149         swap    %d3
150 0:      rorw    #8,%d3
151         bsrs    1f
152         rorw    #8,%d3
153 1:      rorb    #4,%d3
154         bsrs    2f
155         rorb    #4,%d3
156 2:      movw    %d3,%d0
157         andw    #15,%d0
158         addw    #48,%d0
159         cmpw    #58,%d0
160         bcss    putc
161         addw    #39,%d0
162 putc:   movw    %d0,%sp@-
163         movw    #2,%sp@-
164         movw    #Bconout,%sp@-
165         trap    #BIOS
166         addql   #6,%sp
167         rts
169  * int readsec (void *buffer, u_int offset, u_int count);
170  */
171 rds2:   movml   %d2-%d5/%a2-%a3,%sp@-
172         movl    %sp@(28),%a3            | buffer
173         movl    %sp@(32),%d4            | offset
174         movl    %sp@(36),%d5            | count
175         bsrs    rds1
176         movml   %sp@+,%d2-%d5/%a2-%a3
177         rts
179 rds1:   bsrs    1f
180         bnes    0f
181         tstl    %d5
182         bnes    rds1
183 0:      rts
185 1:      movq    #0,%d0
186         movw    %pc@(secpercyl),%d0
187         movl    %d4,%d3
188         divuw   %d0,%d3
189         movw    %d3,%d2         | track
190         clrw    %d3
191         swap    %d3
192         lsrw    #1,%d0
193         divuw   %d0,%d3
194         movw    %d3,%d1         | side
195         swap    %d3
196         subw    %d3,%d0
197         addqw   #1,%d3          | sector
198         cmpl    %d0,%d5
199         bccs    rds0
200         movw    %d5,%d0
202 rds0:   movw    %d0,%sp@-               | count
203         movw    %d1,%sp@-               | side
204         movw    %d2,%sp@-               | track
205         movw    %d3,%sp@-               | sector
206         movw    _bootdev:w,%sp@-        | device
207         clrl    %sp@-           | filler
208         movl    %a3,%sp@-               | buffer
209         addl    %d0,%d4
210         subl    %d0,%d5
211         lsll    #8,%d0
212         addl    %d0,%d0
213         addl    %d0,%a3
214         movw    #Floprd,%sp@-
215         trap    #XBIOS
216         lea     %sp@(20),%sp
217         tstl    %d0
218         rts
220 secpercyl:
221         .word   0
223 m_bot:  .asciz  "fdboot: membot == 0x#\r\n"
224 m_top:  .asciz  "fdboot: memtop == 0x#\r\n"
225 m_sbl:  .asciz  "fdboot: bootxx => 0x#\r\n"
226 m_rds:  .asciz  "fdboot: Floprd => 0x#\r\n"
227 m_key:  .asciz  "\007\r\npress any key... @\r\n"
229 fill:   .space  22              | 510-(fill-start)
230         .word   0               | checksum
231 end: