bios_disk.S revision 1.1.1.1 1 1.1 perry /* $NetBSD: bios_disk.S,v 1.1.1.1 1997/03/14 02:40:32 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.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.1 perry # get_diskinfo(): return a word that represents the
118 1.1 perry # max number of sectors and heads and drives 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.1 perry 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.1 perry # 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.1 perry data32
157 1.1 perry call _C_LABEL(real_to_prot) # back to protected mode
158 1.1 perry
159 1.1 perry xorl %eax, %eax
160 1.1 perry
161 1.1 perry /*form a longword representing all this gunk*/
162 1.1 perry movb %dh, %ah # max head
163 1.1 perry andb $0x3f, %cl # mask of cylinder gunk
164 1.1 perry movb %cl, %al # max sector (and # sectors)
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.1 perry popl %ebp
173 1.1 perry ret
174