source: vendor/emx/current/src/dos/pmio.asm

Last change on this file was 18, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 8.0 KB
Line 
1;
2; PMIO.ASM -- File I/O for the kernel
3;
4; Copyright (c) 1991-1995 by Eberhard Mattes
5;
6; This file is part of emx.
7;
8; emx is free software; you can redistribute it and/or modify it
9; under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2, or (at your option)
11; any later version.
12;
13; emx is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17;
18; You should have received a copy of the GNU General Public License
19; along with emx; see the file COPYING. If not, write to
20; the Free Software Foundation, 59 Temple Place - Suite 330,
21; Boston, MA 02111-1307, USA.
22;
23; See emx.asm for a special exception.
24;
25
26 INCLUDE EMX.INC
27 INCLUDE SIGNAL.INC
28 INCLUDE PROCESS.INC
29
30 PUBLIC DEBUG_FLAG
31 PUBLIC OPEN, SEEK, READ, WRITE, CREATE_TMP, CLOSE
32 PUBLIC FORCE_STDOUT, FIND_FILE, ACCESS
33
34
35SV_DATA SEGMENT
36
37DEBUG_FLAG DB FALSE
38STDOUT_NAME DB "CON", 0
39
40SV_DATA ENDS
41
42
43
44PMIO_BEGIN MACRO
45 PUSH PROCESS_PTR
46 MOV PROCESS_PTR, NO_PROCESS
47 ENDM
48
49PMIO_END MACRO
50 POP PROCESS_PTR
51 ENDM
52
53SV_CODE SEGMENT
54
55 ASSUME CS:SV_CODE, DS:NOTHING, ES:SV_DATA
56
57
58;
59; Open file
60;
61; In: AX:EDX Pointer to name
62; CL Access code
63;
64; Out: CY Error
65; EAX File handle or error code
66;
67 ASSUME DS:SV_DATA
68OPEN PROC NEAR
69 PMIO_BEGIN
70 PUSH DS
71 MOV DS, AX
72 ASSUME DS:NOTHING
73 MOV AH, 3DH
74 MOV AL, CL
75 INT 21H
76 POP DS
77 ASSUME DS:SV_DATA
78 PMIO_END
79 RET
80OPEN ENDP
81
82;
83; Close file
84;
85; In: BX File handle
86;
87 ASSUME DS:SV_DATA
88CLOSE PROC NEAR
89 PMIO_BEGIN
90 MOVZX EBX, BX
91 MOV AH, 3EH
92 INT 21H
93 PMIO_END
94 RET
95CLOSE ENDP
96
97;
98; Create temporary file
99;
100; In: AX:EDX Pointer to name
101;
102 ASSUME DS:SV_DATA
103CREATE_TMP PROC NEAR
104 PMIO_BEGIN
105 PUSH DS
106 PUSH ECX
107 MOV CX, 0000H
108 MOV DS, AX
109 ASSUME DS:NOTHING
110 MOV AH, 5AH
111 INT 21H
112 POP ECX
113 POP DS
114 ASSUME DS:SV_DATA
115 PMIO_END
116 RET
117CREATE_TMP ENDP
118
119
120;
121; In: BX File handle
122; EDX Position
123;
124 ASSUME DS:SV_DATA
125SEEK PROC NEAR
126 PMIO_BEGIN
127 PUSH EAX
128 MOVZX EBX, BX
129 MOV AL, 0
130 MOV AH, 42H
131 INT 21H
132 POP EAX
133 PMIO_END
134 RET
135SEEK ENDP
136
137
138;
139; In: BX File handle
140; ECX Number of bytes
141; AX:EDX Pointer to buffer
142;
143; Out: CY Error
144; NC NZ EOF
145; NC ZR OK
146;
147 ASSUME DS:SV_DATA
148READ PROC NEAR
149 PMIO_BEGIN
150 PUSH EAX
151 PUSH DS
152 MOV DS, AX
153 ASSUME DS:NOTHING
154 MOVZX EBX, BX
155 MOV AH, 3FH
156 INT 21H
157 JC SHORT READ_RET
158 CMP ECX, EAX
159 CLC
160READ_RET: POP DS
161 ASSUME DS:SV_DATA
162 POP EAX
163 PMIO_END
164 RET
165READ ENDP
166
167
168;
169; In: BX File handle
170; ECX Number of bytes
171; AX:EDX Pointer to buffer
172;
173; Out: CY Error
174; NC NZ Disk full
175; NC ZR OK
176;
177 ASSUME DS:SV_DATA
178WRITE PROC NEAR
179 PMIO_BEGIN
180 PUSH EAX
181 PUSH DS
182 MOV DS, AX
183 ASSUME DS:NOTHING
184 MOVZX EBX, BX
185 MOV AH, 40H
186 INT 21H
187 JC SHORT WRITE_RET
188 CMP ECX, EAX
189 CLC
190WRITE_RET: POP DS
191 ASSUME DS:SV_DATA
192 POP EAX
193 PMIO_END
194 RET
195WRITE ENDP
196
197
198;
199; Force stdout to refer to the CON device (put error message on screen)
200;
201 ASSUME DS:SV_DATA
202FORCE_STDOUT PROC NEAR
203 PMIO_BEGIN
204 XOR EDX, EDX
205 LEA DX, STDOUT_NAME
206 MOV AH, 3DH
207 MOV AL, 41H ; Deny none; write
208 INT 21H
209 JC SHORT FS_RET
210 MOV EBX, EAX
211 MOV ECX, 1 ; stdout
212 MOV AH, 46H ; Force duplicate file handle
213 INT 21H
214FS_RET: PMIO_END
215 RET
216FORCE_STDOUT ENDP
217
218
219;
220; Find file in directories listed by an environment variable
221;
222; In: DS:SI File name
223; DS:BX Buffer (filled by FIND_FILE), must be large enough
224; ES:EDI Search path (separated by ';', 0 terminated)
225;
226; Out: CY Not found
227;
228; Note: ES:EDI must point to the value of the environment variable
229; The buffer pointed to by DS:BX will contain the path name on success
230; Blanks are not removed
231;
232FIND_FILE PROC NEAR
233 PUSH EDI
234 PUSH CX
235FF_NEXT_DIR:
236;
237; Now ES:DI points to the next directory
238; Build path name at DS:BX
239;
240 PUSH BX
241 PUSH SI
242 XOR CX, CX
243FF_DIR_COPY: MOV AL, ES:[EDI]
244 OR AL, AL
245 JZ SHORT FF_DIR_END
246 CMP AL, ";"
247 JE SHORT FF_DIR_END
248 MOV [BX], AL
249 INC EDI
250 INC BX
251 INC CX
252 JMP SHORT FF_DIR_COPY
253FF_DIR_END: JCXZ FF_EMPTY
254 MOV AL, [BX-1]
255 CMP AL, "\"
256 JE SHORT FF_FNAME_COPY
257 CMP AL, "/"
258 JE SHORT FF_FNAME_COPY
259 CMP AL, ":"
260 JE SHORT FF_FNAME_COPY
261 MOV BYTE PTR [BX], "\"
262 INC BX
263FF_FNAME_COPY: MOV AL, [SI]
264 MOV [BX], AL
265 INC SI
266 INC BX
267 OR AL, AL
268 JNZ SHORT FF_FNAME_COPY
269FF_EMPTY: POP SI
270 POP BX
271 JCXZ FF_SKIP_DIR
272;
273; Look for file
274;
275 PUSH EDX
276 MOVZX EDX, BX
277 CALL ACCESS
278 POP EDX
279 JNC SHORT FF_RET
280;
281; Try next directory
282;
283FF_SKIP_DIR: CMP BYTE PTR ES:[EDI], 0
284 JE SHORT FF_FAILURE
285 INC EDI
286 JMP SHORT FF_NEXT_DIR
287
288FF_FAILURE: MOV BYTE PTR [BX], 0
289 STC
290FF_RET: POP CX
291 POP EDI
292 RET
293FIND_FILE ENDP
294
295
296
297;
298; In: DS:EDX Name
299;
300; Out: CY Not found or not a file
301;
302ACCESS PROC NEAR
303 PUSH AX
304 PUSH CX
305 MOV AH, 43H ; Get/set file attributes
306 MOV AL, 00H ; Get file attributes
307 INT 21H
308 JC SHORT ACCESS_RET
309 TEST CX, 18H ; Volume label, directory?
310 JZ SHORT ACCESS_RET
311 STC
312ACCESS_RET: POP CX
313 POP AX
314 RET
315ACCESS ENDP
316
317
318SV_CODE ENDS
319
320 END
Note: See TracBrowser for help on using the repository browser.