bios_disk.S revision 1.6 1 1.6 drochner /* $NetBSD: bios_disk.S,v 1.6 1999/03/30 17:55:48 drochner 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.1 perry
101 1.1 perry data32
102 1.1 perry call _C_LABEL(real_to_prot) # back to protected mode
103 1.1 perry
104 1.1 perry xorl %eax, %eax
105 1.1 perry movb %bl, %al # return value in %ax
106 1.1 perry
107 1.1 perry pop %edi
108 1.1 perry pop %esi
109 1.1 perry pop %edx
110 1.1 perry pop %ecx
111 1.1 perry popl %ebx
112 1.1 perry popl %ebp
113 1.1 perry ret
114 1.1 perry
115 1.1 perry /*
116 1.1 perry #
117 1.6 drochner # get_diskinfo(): return a word that represents the
118 1.6 drochner # max number of sectors, heads and cylinders for this device
119 1.1 perry #
120 1.1 perry */
121 1.1 perry
122 1.1 perry ENTRY(get_diskinfo)
123 1.1 perry pushl %ebp
124 1.1 perry movl %esp, %ebp
125 1.1 perry push %es
126 1.1 perry pushl %ebx
127 1.1 perry push %ecx
128 1.1 perry push %edx
129 1.1 perry push %esi
130 1.1 perry push %edi
131 1.1 perry
132 1.6 drochner movb 8(%ebp), %dl # diskinfo(drive #)
133 1.1 perry
134 1.1 perry call _C_LABEL(prot_to_real) # enter real mode
135 1.1 perry
136 1.1 perry movb $0x08, %ah # ask for disk info
137 1.1 perry int $0x13
138 1.1 perry jnc ok
139 1.1 perry
140 1.1 perry /*
141 1.1 perry * Urk. Call failed. It is not supported for floppies by old BIOS's.
142 1.1 perry * Guess it's a 15-sector floppy. Initialize all the registers for
143 1.1 perry * documentation, although we only need head and sector counts.
144 1.1 perry */
145 1.1 perry # subb %ah, %ah # %ax = 0
146 1.1 perry # movb %ah, %bh # %bh = 0
147 1.1 perry # movb $2, %bl # %bl bits 0-3 = drive type, 2 = 1.2M
148 1.6 drochner movb $79, %ch # max track
149 1.1 perry movb $15, %cl # max sector
150 1.1 perry movb $1, %dh # max head
151 1.1 perry # movb $1, %dl # # floppy drives installed
152 1.1 perry # es:di = parameter table
153 1.1 perry # carry = 0
154 1.1 perry
155 1.1 perry ok:
156 1.6 drochner /* form a longword representing all this gunk */
157 1.6 drochner shll $8, %ecx
158 1.6 drochner movb %dh, %cl
159 1.6 drochner
160 1.1 perry data32
161 1.1 perry call _C_LABEL(real_to_prot) # back to protected mode
162 1.1 perry
163 1.6 drochner data32
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.5 fvdl
243 1.5 fvdl data32
244 1.5 fvdl call _C_LABEL(real_to_prot) # back to protected mode
245 1.5 fvdl
246 1.5 fvdl xorl %eax, %eax
247 1.5 fvdl movb %bl, %al # return value in %ax
248 1.5 fvdl
249 1.5 fvdl pop %edi
250 1.5 fvdl pop %esi
251 1.5 fvdl pop %edx
252 1.5 fvdl pop %ecx
253 1.5 fvdl popl %ebx
254 1.5 fvdl popl %ebp
255 1.5 fvdl ret
256 1.5 fvdl
257 1.5 fvdl ENTRY(int13_getextinfo)
258 1.5 fvdl pushl %ebp
259 1.5 fvdl movl %esp, %ebp
260 1.5 fvdl pushl %ebx
261 1.5 fvdl push %ecx
262 1.5 fvdl push %edx
263 1.5 fvdl push %esi
264 1.5 fvdl push %edi
265 1.5 fvdl
266 1.5 fvdl movb 8(%ebp), %dl # device
267 1.5 fvdl movl 12(%ebp), %esi # parameter block
268 1.5 fvdl movl $0x01a, (%esi) # length (v 1.x)
269 1.5 fvdl
270 1.5 fvdl call _C_LABEL(prot_to_real) # enter real mode
271 1.5 fvdl
272 1.5 fvdl movb $0x48, %ah # subfunction
273 1.2 ws int $0x13
274 1.2 ws setc %bl
275 1.2 ws
276 1.2 ws data32
277 1.2 ws call _C_LABEL(real_to_prot) # back to protected mode
278 1.2 ws
279 1.2 ws xorl %eax, %eax
280 1.2 ws movb %bl, %al # return value in %ax
281 1.2 ws
282 1.2 ws pop %edi
283 1.2 ws pop %esi
284 1.2 ws pop %edx
285 1.2 ws pop %ecx
286 1.2 ws popl %ebx
287 1.1 perry popl %ebp
288 1.1 perry ret
289