bios_disk.S revision 1.9 1 1.9 dyoung /* $NetBSD: bios_disk.S,v 1.9 2002/10/10 18:52:42 dyoung Exp $ */
2 1.1 perry
3 1.1 perry /*
4 1.1 perry * Ported to boot 386BSD by Julian Elischer (julian (at) tfs.com) Sept 1992
5 1.1 perry *
6 1.1 perry * Mach Operating System
7 1.1 perry * Copyright (c) 1992, 1991 Carnegie Mellon University
8 1.1 perry * All Rights Reserved.
9 1.1 perry *
10 1.1 perry * Permission to use, copy, modify and distribute this software and its
11 1.1 perry * documentation is hereby granted, provided that both the copyright
12 1.1 perry * notice and this permission notice appear in all copies of the
13 1.1 perry * software, derivative works or modified versions, and any portions
14 1.1 perry * thereof, and that both notices appear in supporting documentation.
15 1.1 perry *
16 1.1 perry * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17 1.1 perry * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
18 1.1 perry * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19 1.1 perry *
20 1.1 perry * Carnegie Mellon requests users of this software to return to
21 1.1 perry *
22 1.1 perry * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
23 1.1 perry * School of Computer Science
24 1.1 perry * Carnegie Mellon University
25 1.1 perry * Pittsburgh PA 15213-3890
26 1.1 perry *
27 1.1 perry * any improvements or extensions that they make and grant Carnegie Mellon
28 1.1 perry * the rights to redistribute these changes.
29 1.1 perry */
30 1.1 perry
31 1.1 perry /*
32 1.1 perry Copyright 1988, 1989, 1990, 1991, 1992
33 1.1 perry by Intel Corporation, Santa Clara, California.
34 1.1 perry
35 1.1 perry All Rights Reserved
36 1.1 perry
37 1.1 perry Permission to use, copy, modify, and distribute this software and
38 1.1 perry its documentation for any purpose and without fee is hereby
39 1.1 perry granted, provided that the above copyright notice appears in all
40 1.1 perry copies and that both the copyright notice and this permission notice
41 1.1 perry appear in supporting documentation, and that the name of Intel
42 1.1 perry not be used in advertising or publicity pertaining to distribution
43 1.1 perry of the software without specific, written prior permission.
44 1.1 perry
45 1.1 perry INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
46 1.1 perry INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
47 1.1 perry IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
48 1.1 perry CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
49 1.1 perry LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
50 1.1 perry NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
51 1.1 perry WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
52 1.1 perry */
53 1.1 perry
54 1.1 perry /* extracted from netbsd:sys/arch/i386/boot/bios.S */
55 1.1 perry
56 1.1 perry #include <machine/asm.h>
57 1.1 perry
58 1.1 perry #define addr32 .byte 0x67
59 1.1 perry #define data32 .byte 0x66
60 1.1 perry
61 1.1 perry /*
62 1.9 dyoung # BIOS call "INT 0x13 Function 0x0" to reset the disk subsystem
63 1.9 dyoung # Call with %ah = 0x0
64 1.9 dyoung # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
65 1.9 dyoung # Return:
66 1.9 dyoung # %al = 0x0 on success; err code on failure
67 1.9 dyoung */
68 1.9 dyoung ENTRY(biosdiskreset)
69 1.9 dyoung pushl %ebp
70 1.9 dyoung movl %esp, %ebp
71 1.9 dyoung pushl %ebx
72 1.9 dyoung push %edx
73 1.9 dyoung push %edi
74 1.9 dyoung
75 1.9 dyoung movb 8(%ebp), %dl # device
76 1.9 dyoung
77 1.9 dyoung call _C_LABEL(prot_to_real) # enter real mode
78 1.9 dyoung
79 1.9 dyoung movb $0x0, %ah # subfunction
80 1.9 dyoung int $0x13
81 1.9 dyoung setc %bl
82 1.9 dyoung movb %ah, %bh # save error code
83 1.9 dyoung
84 1.9 dyoung data32
85 1.9 dyoung call _C_LABEL(real_to_prot) # back to protected mode
86 1.9 dyoung
87 1.9 dyoung xorl %eax, %eax
88 1.9 dyoung movw %bx, %ax # return value in %ax
89 1.9 dyoung
90 1.9 dyoung pop %edi
91 1.9 dyoung pop %edx
92 1.9 dyoung popl %ebx
93 1.9 dyoung popl %ebp
94 1.9 dyoung ret
95 1.9 dyoung
96 1.9 dyoung /*
97 1.1 perry # BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
98 1.1 perry # Call with %ah = 0x2
99 1.1 perry # %al = number of sectors
100 1.1 perry # %ch = cylinder
101 1.1 perry # %cl = sector
102 1.1 perry # %dh = head
103 1.1 perry # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
104 1.1 perry # %es:%bx = segment:offset of buffer
105 1.1 perry # Return:
106 1.1 perry # %al = 0x0 on success; err code on failure
107 1.9 dyoung #
108 1.9 dyoung # Note: On failure, you must reset the disk with biosdiskreset() before
109 1.9 dyoung # sending another command.
110 1.1 perry */
111 1.1 perry ENTRY(biosread)
112 1.1 perry pushl %ebp
113 1.1 perry movl %esp, %ebp
114 1.1 perry pushl %ebx
115 1.1 perry push %ecx
116 1.1 perry push %edx
117 1.1 perry push %esi
118 1.1 perry push %edi
119 1.1 perry
120 1.1 perry movb 16(%ebp), %dh
121 1.1 perry movw 12(%ebp), %cx
122 1.1 perry xchgb %ch, %cl # cylinder; the highest 2 bits of cyl is in %cl
123 1.1 perry rorb $2, %cl
124 1.1 perry movb 20(%ebp), %al
125 1.1 perry orb %al, %cl
126 1.1 perry incb %cl # sector; sec starts from 1, not 0
127 1.1 perry movb 8(%ebp), %dl # device
128 1.1 perry movl 28(%ebp), %ebx # offset
129 1.1 perry # prot_to_real will set %es to BOOTSEG
130 1.1 perry
131 1.1 perry call _C_LABEL(prot_to_real) # enter real mode
132 1.1 perry
133 1.1 perry movb $0x2, %ah # subfunction
134 1.1 perry addr32
135 1.1 perry movb 24(%ebp), %al # number of sectors
136 1.1 perry int $0x13
137 1.1 perry setc %bl
138 1.8 perry movb %ah, %bh # save error code
139 1.8 perry
140 1.1 perry data32
141 1.1 perry call _C_LABEL(real_to_prot) # back to protected mode
142 1.1 perry
143 1.1 perry xorl %eax, %eax
144 1.8 perry movw %bx, %ax # return value in %ax
145 1.1 perry
146 1.1 perry pop %edi
147 1.1 perry pop %esi
148 1.1 perry pop %edx
149 1.1 perry pop %ecx
150 1.1 perry popl %ebx
151 1.1 perry popl %ebp
152 1.1 perry ret
153 1.1 perry
154 1.1 perry /*
155 1.1 perry #
156 1.6 drochner # get_diskinfo(): return a word that represents the
157 1.6 drochner # max number of sectors, heads and cylinders for this device
158 1.1 perry #
159 1.1 perry */
160 1.1 perry
161 1.1 perry ENTRY(get_diskinfo)
162 1.1 perry pushl %ebp
163 1.1 perry movl %esp, %ebp
164 1.1 perry push %es
165 1.1 perry pushl %ebx
166 1.1 perry push %ecx
167 1.1 perry push %edx
168 1.1 perry push %esi
169 1.1 perry push %edi
170 1.1 perry
171 1.6 drochner movb 8(%ebp), %dl # diskinfo(drive #)
172 1.1 perry
173 1.1 perry call _C_LABEL(prot_to_real) # enter real mode
174 1.1 perry
175 1.1 perry movb $0x08, %ah # ask for disk info
176 1.1 perry int $0x13
177 1.1 perry jnc ok
178 1.1 perry
179 1.1 perry /*
180 1.1 perry * Urk. Call failed. It is not supported for floppies by old BIOS's.
181 1.1 perry * Guess it's a 15-sector floppy. Initialize all the registers for
182 1.1 perry * documentation, although we only need head and sector counts.
183 1.1 perry */
184 1.1 perry # subb %ah, %ah # %ax = 0
185 1.1 perry # movb %ah, %bh # %bh = 0
186 1.1 perry # movb $2, %bl # %bl bits 0-3 = drive type, 2 = 1.2M
187 1.6 drochner movb $79, %ch # max track
188 1.1 perry movb $15, %cl # max sector
189 1.1 perry movb $1, %dh # max head
190 1.1 perry # movb $1, %dl # # floppy drives installed
191 1.1 perry # es:di = parameter table
192 1.1 perry # carry = 0
193 1.1 perry
194 1.1 perry ok:
195 1.7 fvdl data32
196 1.7 fvdl call _C_LABEL(real_to_prot) # back to protected mode
197 1.7 fvdl
198 1.6 drochner /* form a longword representing all this gunk */
199 1.6 drochner shll $8, %ecx
200 1.6 drochner movb %dh, %cl
201 1.6 drochner
202 1.6 drochner movl %ecx, %eax
203 1.1 perry
204 1.1 perry pop %edi
205 1.1 perry pop %esi
206 1.1 perry pop %edx
207 1.1 perry pop %ecx
208 1.1 perry popl %ebx
209 1.1 perry pop %es
210 1.2 ws popl %ebp
211 1.2 ws ret
212 1.2 ws
213 1.2 ws /*
214 1.2 ws # int13_extension: check for availibility of int13 extensions.
215 1.2 ws */
216 1.2 ws
217 1.2 ws ENTRY(int13_extension)
218 1.2 ws pushl %ebp
219 1.2 ws movl %esp, %ebp
220 1.2 ws pushl %ebx
221 1.2 ws pushl %ecx
222 1.2 ws pushl %edx
223 1.2 ws pushl %esi
224 1.2 ws pushl %edi
225 1.2 ws
226 1.2 ws movb 8(%ebp), %dl # drive #
227 1.2 ws movw $0x55aa, %bx
228 1.2 ws
229 1.2 ws call _C_LABEL(prot_to_real) # enter real mode
230 1.2 ws
231 1.2 ws movb $0x41, %ah # ask for disk info
232 1.2 ws int $0x13
233 1.3 ws setnc %dl
234 1.2 ws
235 1.2 ws data32
236 1.2 ws CALL _C_LABEL(real_to_prot) # switch back
237 1.2 ws
238 1.2 ws xorl %eax, %eax
239 1.2 ws movb %dl, %al # return value in %ax
240 1.2 ws
241 1.2 ws cmpw $0xaa55, %bx
242 1.2 ws sete %dl
243 1.4 ws andb %dl, %al
244 1.2 ws
245 1.4 ws andb %cl, %al
246 1.2 ws
247 1.2 ws popl %edi
248 1.2 ws popl %esi
249 1.2 ws popl %edx
250 1.2 ws popl %ecx
251 1.2 ws popl %ebx
252 1.2 ws popl %ebp
253 1.2 ws ret
254 1.2 ws
255 1.2 ws /*
256 1.2 ws # BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
257 1.2 ws # Call with %ah = 0x42
258 1.5 fvdl # %ds:%si = parameter block
259 1.2 ws # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
260 1.2 ws # Return:
261 1.2 ws # %al = 0x0 on success; err code on failure
262 1.2 ws */
263 1.2 ws ENTRY(biosextread)
264 1.2 ws pushl %ebp
265 1.2 ws movl %esp, %ebp
266 1.2 ws pushl %ebx
267 1.2 ws push %ecx
268 1.2 ws push %edx
269 1.2 ws push %esi
270 1.2 ws push %edi
271 1.2 ws
272 1.2 ws movb 8(%ebp), %dl # device
273 1.2 ws movl 12(%ebp), %esi # parameter block
274 1.2 ws
275 1.2 ws call _C_LABEL(prot_to_real) # enter real mode
276 1.2 ws
277 1.2 ws movb $0x42, %ah # subfunction
278 1.5 fvdl int $0x13
279 1.5 fvdl setc %bl
280 1.8 perry movb %ah, %bh # save error code
281 1.5 fvdl
282 1.5 fvdl data32
283 1.5 fvdl call _C_LABEL(real_to_prot) # back to protected mode
284 1.5 fvdl
285 1.5 fvdl xorl %eax, %eax
286 1.8 perry movw %bx, %ax # return value in %ax
287 1.5 fvdl
288 1.5 fvdl pop %edi
289 1.5 fvdl pop %esi
290 1.5 fvdl pop %edx
291 1.5 fvdl pop %ecx
292 1.5 fvdl popl %ebx
293 1.5 fvdl popl %ebp
294 1.5 fvdl ret
295 1.5 fvdl
296 1.5 fvdl ENTRY(int13_getextinfo)
297 1.5 fvdl pushl %ebp
298 1.5 fvdl movl %esp, %ebp
299 1.5 fvdl pushl %ebx
300 1.5 fvdl push %ecx
301 1.5 fvdl push %edx
302 1.5 fvdl push %esi
303 1.5 fvdl push %edi
304 1.5 fvdl
305 1.5 fvdl movb 8(%ebp), %dl # device
306 1.5 fvdl movl 12(%ebp), %esi # parameter block
307 1.5 fvdl movl $0x01a, (%esi) # length (v 1.x)
308 1.5 fvdl
309 1.5 fvdl call _C_LABEL(prot_to_real) # enter real mode
310 1.5 fvdl
311 1.5 fvdl movb $0x48, %ah # subfunction
312 1.2 ws int $0x13
313 1.2 ws setc %bl
314 1.2 ws
315 1.2 ws data32
316 1.2 ws call _C_LABEL(real_to_prot) # back to protected mode
317 1.2 ws
318 1.2 ws xorl %eax, %eax
319 1.2 ws movb %bl, %al # return value in %ax
320 1.2 ws
321 1.2 ws pop %edi
322 1.2 ws pop %esi
323 1.2 ws pop %edx
324 1.2 ws pop %ecx
325 1.2 ws popl %ebx
326 1.1 perry popl %ebp
327 1.1 perry ret
328