xref: /netbsd/sys/arch/i386/stand/lib/dos_file.S (revision 6550d01e)
1/*	$NetBSD: dos_file.S,v 1.6 2009/11/21 11:52:57 dsl Exp $	*/
2
3/* extracted from Tor Egge's patches for NetBSD boot */
4
5#include <machine/asm.h>
6
7/*
8# MSDOS call "INT 0x21 Function 0x3d" to open a file.
9# Call with	%ah = 0x3d
10# 		%al = 0x0  (access and sharing modes)
11#		%ds:%dx = ASCIZ filename
12#		%cl = attribute mask of files to look for
13*/
14
15	.globl _C_LABEL(doserrno)
16_C_LABEL(doserrno):	.long 1
17
18ENTRY(dosopen)
19	.code32
20	pushl	%ebp
21	movl	%esp, %ebp
22	pushl	%edx
23	pushl	%ebx
24	pushl	%esi
25	pushl	%edi
26
27	movl	0x8(%ebp), %edx		# File name.
28
29	call	_C_LABEL(prot_to_real)	# enter real mode
30	.code16
31
32	push	%ds
33	movl	%edx, %eax
34	shrl	$4, %eax
35	mov	%ds, %si
36	add	%si, %ax
37	mov	%ax, %ds
38	and	$0xf, %dx
39
40	movb	$0x3d, %ah		# Open existing file.
41	movb	$0x0 , %al		# ro
42
43	sti
44	int	$0x21
45	cli
46	pop	%ds
47
48	jnc	ok1
49	mov	%ax, _C_LABEL(doserrno)
50	movl	$-1, %edx
51	jmp err1
52ok1:
53	movl	$0,%edx
54	mov	%ax, %dx
55err1:
56	calll	_C_LABEL(real_to_prot) # back to protected mode
57	.code32
58
59	movl	%edx, %eax		# return value in %eax
60
61	popl	%edi
62	popl	%esi
63	popl	%ebx
64	popl	%edx
65	popl	%ebp
66	ret
67
68ENTRY(dosread)
69	.code32
70	pushl	%ebp
71	movl	%esp, %ebp
72	pushl	%ebx
73	pushl	%ecx
74	pushl	%edx
75	pushl	%esi
76	pushl	%edi
77
78	movl	0x8(%ebp), %ebx		# File handle
79	movl	0xc(%ebp), %edx		# Buffer.
80	movl	0x10(%ebp), %ecx	# Bytes to read
81
82	call	_C_LABEL(prot_to_real)	# enter real mode
83	.code16
84
85	push	%ds
86	movl	%edx, %eax
87	shrl	$4, %eax
88	mov	%ds, %si
89	add	%si, %ax
90	mov	%ax, %ds
91	and	$0xf, %dx
92
93	movb	$0x3f, %ah		# Read from file or device
94
95	sti
96	int	$0x21
97	cli
98	pop	%ds
99
100	jnc	ok2
101	mov	%ax, _C_LABEL(doserrno)
102	movl	$-1, %edx
103	jmp	err2
104ok2:
105	movl	$0,%edx
106	mov	%ax, %dx
107err2:
108	calll	_C_LABEL(real_to_prot)	# back to protected mode
109	.code32
110
111	movl	%edx, %eax		# return value in %eax
112
113	popl	%edi
114	popl	%esi
115	popl	%edx
116	popl	%ecx
117	popl	%ebx
118	popl	%ebp
119	ret
120
121ENTRY(dosclose)
122	.code32
123	pushl %ebp
124	movl  %esp, %ebp
125	pushl	%ebx
126	pushl	%esi
127	pushl	%edi
128
129	movl	0x8(%ebp), %ebx		# File handle
130
131	call	_C_LABEL(prot_to_real)	# enter real mode
132	.code16
133
134	movb	$0x3e, %ah		# Close file.
135
136	sti
137	int	$0x21
138	cli
139
140	jnc	ok3
141	mov	%ax, _C_LABEL(doserrno)
142	movl	$-1, %ebx
143	jmp	err3
144ok3:
145	movl	$0, %ebx
146err3:
147	calll	_C_LABEL(real_to_prot) # back to protected mode
148	.code32
149
150	movl	%ebx, %eax		# return value in %eax
151
152	popl	%edi
153	popl	%esi
154	popl	%ebx
155	popl	%ebp
156	ret
157
158ENTRY(dosseek)
159	.code32
160	pushl	%ebp
161	movl	%esp, %ebp
162	pushl	%ebx
163	pushl	%ecx
164	pushl	%edx
165	pushl	%esi
166	pushl	%edi
167
168	movl	0x8(%ebp), %ebx		# File handle
169	movl	0xc(%ebp), %ecx		# Offset
170	movl	0x10(%ebp) , %edx	# whence
171
172	call	_C_LABEL(prot_to_real)	# enter real mode
173	.code16
174
175	movb	$0x42, %ah		# Seek
176	movb	%dl, %al		# whence
177	mov	%cx, %dx		#offs lo
178	shrl	$0x10, %ecx		#offs hi
179
180	sti
181	int	$0x21
182	cli
183
184	jnc	ok4
185	mov	%ax, _C_LABEL(doserrno)
186	movl	$-1, %edx
187	jmp	err4
188ok4:
189	shll	$0x10, %edx	#new ofs hi
190	mov	%ax, %dx	#new ofs lo
191err4:
192	calll	_C_LABEL(real_to_prot) # back to protected mode
193	.code32
194
195	movl	%edx, %eax		# return value in %eax
196
197	popl	%edi
198	popl	%esi
199	popl	%edx
200	popl	%ecx
201	popl	%ebx
202	popl	%ebp
203	ret
204