bios_disk.S revision 1.8 1 1.8 perry /* $NetBSD: bios_disk.S,v 1.8 2000/05/21 16:59:28 perry 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.1 perry # BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
63 1.1 perry # Call with %ah = 0x2
64 1.1 perry # %al = number of sectors
65 1.1 perry # %ch = cylinder
66 1.1 perry # %cl = sector
67 1.1 perry # %dh = head
68 1.1 perry # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
69 1.1 perry # %es:%bx = segment:offset of buffer
70 1.1 perry # Return:
71 1.1 perry # %al = 0x0 on success; err code on failure
72 1.1 perry */
73 1.1 perry ENTRY(biosread)
74 1.1 perry pushl %ebp
75 1.1 perry movl %esp, %ebp
76 1.1 perry pushl %ebx
77 1.1 perry push %ecx
78 1.1 perry push %edx
79 1.1 perry push %esi
80 1.1 perry push %edi
81 1.1 perry
82 1.1 perry movb 16(%ebp), %dh
83 1.1 perry movw 12(%ebp), %cx
84 1.1 perry xchgb %ch, %cl # cylinder; the highest 2 bits of cyl is in %cl
85 1.1 perry rorb $2, %cl
86 1.1 perry movb 20(%ebp), %al
87 1.1 perry orb %al, %cl
88 1.1 perry incb %cl # sector; sec starts from 1, not 0
89 1.1 perry movb 8(%ebp), %dl # device
90 1.1 perry movl 28(%ebp), %ebx # offset
91 1.1 perry # prot_to_real will set %es to BOOTSEG
92 1.1 perry
93 1.1 perry call _C_LABEL(prot_to_real) # enter real mode
94 1.1 perry
95 1.1 perry movb $0x2, %ah # subfunction
96 1.1 perry addr32
97 1.1 perry movb 24(%ebp), %al # number of sectors
98 1.1 perry int $0x13
99 1.1 perry setc %bl
100 1.8 perry movb %ah, %bh # save error code
101 1.8 perry
102 1.1 perry data32
103 1.1 perry call _C_LABEL(real_to_prot) # back to protected mode
104 1.1 perry
105 1.1 perry xorl %eax, %eax
106 1.8 perry movw %bx, %ax # return value in %ax
107 1.1 perry
108 1.1 perry pop %edi
109 1.1 perry pop %esi
110 1.1 perry pop %edx
111 1.1 perry pop %ecx
112 1.1 perry popl %ebx
113 1.1 perry popl %ebp
114 1.1 perry ret
115 1.1 perry
116 1.1 perry /*
117 1.1 perry #
118 1.6 drochner # get_diskinfo(): return a word that represents the
119 1.6 drochner # max number of sectors, heads and cylinders for this device
120 1.1 perry #
121 1.1 perry */
122 1.1 perry
123 1.1 perry ENTRY(get_diskinfo)
124 1.1 perry pushl %ebp
125 1.1 perry movl %esp, %ebp
126 1.1 perry push %es
127 1.1 perry pushl %ebx
128 1.1 perry push %ecx
129 1.1 perry push %edx
130 1.1 perry push %esi
131 1.1 perry push %edi
132 1.1 perry
133 1.6 drochner movb 8(%ebp), %dl # diskinfo(drive #)
134 1.1 perry
135 1.1 perry call _C_LABEL(prot_to_real) # enter real mode
136 1.1 perry
137 1.1 perry movb $0x08, %ah # ask for disk info
138 1.1 perry int $0x13
139 1.1 perry jnc ok
140 1.1 perry
141 1.1 perry /*
142 1.1 perry * Urk. Call failed. It is not supported for floppies by old BIOS's.
143 1.1 perry * Guess it's a 15-sector floppy. Initialize all the registers for
144 1.1 perry * documentation, although we only need head and sector counts.
145 1.1 perry */
146 1.1 perry # subb %ah, %ah # %ax = 0
147 1.1 perry # movb %ah, %bh # %bh = 0
148 1.1 perry # movb $2, %bl # %bl bits 0-3 = drive type, 2 = 1.2M
149 1.6 drochner movb $79, %ch # max track
150 1.1 perry movb $15, %cl # max sector
151 1.1 perry movb $1, %dh # max head
152 1.1 perry # movb $1, %dl # # floppy drives installed
153 1.1 perry # es:di = parameter table
154 1.1 perry # carry = 0
155 1.1 perry
156 1.1 perry ok:
157 1.7 fvdl data32
158 1.7 fvdl call _C_LABEL(real_to_prot) # back to protected mode
159 1.7 fvdl
160 1.6 drochner /* form a longword representing all this gunk */
161 1.6 drochner shll $8, %ecx
162 1.6 drochner movb %dh, %cl
163 1.6 drochner
164 1.6 drochner movl %ecx, %eax
165 1.1 perry
166 1.1 perry pop %edi
167 1.1 perry pop %esi
168 1.1 perry pop %edx
169 1.1 perry pop %ecx
170 1.1 perry popl %ebx
171 1.1 perry pop %es
172 1.2 ws popl %ebp
173 1.2 ws ret
174 1.2 ws
175 1.2 ws /*
176 1.2 ws # int13_extension: check for availibility of int13 extensions.
177 1.2 ws */
178 1.2 ws
179 1.2 ws ENTRY(int13_extension)
180 1.2 ws pushl %ebp
181 1.2 ws movl %esp, %ebp
182 1.2 ws pushl %ebx
183 1.2 ws pushl %ecx
184 1.2 ws pushl %edx
185 1.2 ws pushl %esi
186 1.2 ws pushl %edi
187 1.2 ws
188 1.2 ws movb 8(%ebp), %dl # drive #
189 1.2 ws movw $0x55aa, %bx
190 1.2 ws
191 1.2 ws call _C_LABEL(prot_to_real) # enter real mode
192 1.2 ws
193 1.2 ws movb $0x41, %ah # ask for disk info
194 1.2 ws int $0x13
195 1.3 ws setnc %dl
196 1.2 ws
197 1.2 ws data32
198 1.2 ws CALL _C_LABEL(real_to_prot) # switch back
199 1.2 ws
200 1.2 ws xorl %eax, %eax
201 1.2 ws movb %dl, %al # return value in %ax
202 1.2 ws
203 1.2 ws cmpw $0xaa55, %bx
204 1.2 ws sete %dl
205 1.4 ws andb %dl, %al
206 1.2 ws
207 1.4 ws andb %cl, %al
208 1.2 ws
209 1.2 ws popl %edi
210 1.2 ws popl %esi
211 1.2 ws popl %edx
212 1.2 ws popl %ecx
213 1.2 ws popl %ebx
214 1.2 ws popl %ebp
215 1.2 ws ret
216 1.2 ws
217 1.2 ws /*
218 1.2 ws # BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
219 1.2 ws # Call with %ah = 0x42
220 1.5 fvdl # %ds:%si = parameter block
221 1.2 ws # %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
222 1.2 ws # Return:
223 1.2 ws # %al = 0x0 on success; err code on failure
224 1.2 ws */
225 1.2 ws ENTRY(biosextread)
226 1.2 ws pushl %ebp
227 1.2 ws movl %esp, %ebp
228 1.2 ws pushl %ebx
229 1.2 ws push %ecx
230 1.2 ws push %edx
231 1.2 ws push %esi
232 1.2 ws push %edi
233 1.2 ws
234 1.2 ws movb 8(%ebp), %dl # device
235 1.2 ws movl 12(%ebp), %esi # parameter block
236 1.2 ws
237 1.2 ws call _C_LABEL(prot_to_real) # enter real mode
238 1.2 ws
239 1.2 ws movb $0x42, %ah # subfunction
240 1.5 fvdl int $0x13
241 1.5 fvdl setc %bl
242 1.8 perry movb %ah, %bh # save error code
243 1.5 fvdl
244 1.5 fvdl data32
245 1.5 fvdl call _C_LABEL(real_to_prot) # back to protected mode
246 1.5 fvdl
247 1.5 fvdl xorl %eax, %eax
248 1.8 perry movw %bx, %ax # return value in %ax
249 1.5 fvdl
250 1.5 fvdl pop %edi
251 1.5 fvdl pop %esi
252 1.5 fvdl pop %edx
253 1.5 fvdl pop %ecx
254 1.5 fvdl popl %ebx
255 1.5 fvdl popl %ebp
256 1.5 fvdl ret
257 1.5 fvdl
258 1.5 fvdl ENTRY(int13_getextinfo)
259 1.5 fvdl pushl %ebp
260 1.5 fvdl movl %esp, %ebp
261 1.5 fvdl pushl %ebx
262 1.5 fvdl push %ecx
263 1.5 fvdl push %edx
264 1.5 fvdl push %esi
265 1.5 fvdl push %edi
266 1.5 fvdl
267 1.5 fvdl movb 8(%ebp), %dl # device
268 1.5 fvdl movl 12(%ebp), %esi # parameter block
269 1.5 fvdl movl $0x01a, (%esi) # length (v 1.x)
270 1.5 fvdl
271 1.5 fvdl call _C_LABEL(prot_to_real) # enter real mode
272 1.5 fvdl
273 1.5 fvdl movb $0x48, %ah # subfunction
274 1.2 ws int $0x13
275 1.2 ws setc %bl
276 1.2 ws
277 1.2 ws data32
278 1.2 ws call _C_LABEL(real_to_prot) # back to protected mode
279 1.2 ws
280 1.2 ws xorl %eax, %eax
281 1.2 ws movb %bl, %al # return value in %ax
282 1.2 ws
283 1.2 ws pop %edi
284 1.2 ws pop %esi
285 1.2 ws pop %edx
286 1.2 ws pop %ecx
287 1.2 ws popl %ebx
288 1.1 perry popl %ebp
289 1.1 perry ret
290