source: xtideuniversalbios/trunk/Assembly_Library/Src/File/FileIO.asm@ 474

Last change on this file since 474 was 446, checked in by aitotat@…, 12 years ago

Changes to Assembly Library:

  • File Library can now create files.
File size: 8.6 KB
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for file access.
3
[376]4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program 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; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20
[41]21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
[446]25; FileIO_CreateWithPathInDSSIandAttributesInCX
26; Parameters:
27; CX: File attribute flags
28; DS:SI: Ptr to NULL terminated path or file name
29; Returns:
30; AX: DOS error code if CF set
31; BX: File handle if CF cleared
32; CF: Clear if file opened successfully
33; Set if error
34; Corrupts registers:
35; AX, BX
36;--------------------------------------------------------------------
37ALIGN JUMP_ALIGN
38FileIO_CreateWithPathInDSSIandAttributesInCX:
39 xchg dx, si ; Path now in DS:DX
40 mov ah, CREATE_OR_TRUNCATE_FILE
41 jmp SHORT CreateOrOpenFile
42
43
44;--------------------------------------------------------------------
[41]45; FileIO_OpenWithPathInDSSIandFileAccessInAL
46; Parameters:
47; AL: FILE_ACCESS.(mode)
48; DS:SI: Ptr to NULL terminated path or file name
49; Returns:
50; AX: DOS error code if CF set
51; BX: File handle if CF cleared
52; CF: Clear if file opened successfully
53; Set if error
54; Corrupts registers:
55; AX, BX
56;--------------------------------------------------------------------
57ALIGN JUMP_ALIGN
58FileIO_OpenWithPathInDSSIandFileAccessInAL:
59 xchg dx, si ; Path now in DS:DX
60 mov ah, OPEN_EXISTING_FILE
[446]61CreateOrOpenFile:
[41]62 int DOS_INTERRUPT_21h
63 xchg si, dx
[51]64 mov bx, ax ; Copy file handle to BX
[41]65 ret
66
67
68;--------------------------------------------------------------------
[66]69; FileIO_ReadDXCXbytesToDSSIusingHandleFromBX
70; Parameters:
71; BX: File handle
72; DX:CX: Number of bytes to read
73; DS:SI: Ptr to destination buffer
74; Returns:
75; AX: DOS error code if CF set
[293]76; CF: Clear if successful
[66]77; Set if error
78; Corrupts registers:
79; AX
80;--------------------------------------------------------------------
81ALIGN JUMP_ALIGN
82FileIO_ReadDXCXbytesToDSSIusingHandleFromBX:
83 push bp
84 mov bp, FileIO_ReadCXbytesToDSSIusingHandleFromBX
85 call SplitLargeReadOrWritesToSmallerBlocks
86 pop bp
87 ret
88
89;--------------------------------------------------------------------
[41]90; File position is updated so next read will start where
91; previous read stopped.
[133]92;
[41]93; FileIO_ReadCXbytesToDSSIusingHandleFromBX
94; Parameters:
95; BX: File handle
96; CX: Number of bytes to read
97; DS:SI: Ptr to destination buffer
98; Returns:
[293]99; AX: Number of bytes actually read if successful (0 if at EOF before call)
[41]100; DOS error code if CF set
[293]101; CF: Clear if successful
[41]102; Set if error
103; Corrupts registers:
104; Nothing
105;--------------------------------------------------------------------
106ALIGN JUMP_ALIGN
107FileIO_ReadCXbytesToDSSIusingHandleFromBX:
[51]108 xchg dx, si ; DS:DX now points to destination buffer
[41]109 mov ah, READ_FROM_FILE_OR_DEVICE
110 int DOS_INTERRUPT_21h
111 xchg si, dx
112 ret
113
114
115;--------------------------------------------------------------------
[66]116; FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX
117; Parameters:
118; BX: File handle
119; DX:CX: Number of bytes to write
120; DS:SI: Ptr to source buffer
121; Returns:
122; AX: DOS error code if CF set
[293]123; CF: Clear if successful
[66]124; Set if error
125; Corrupts registers:
126; AX
127;--------------------------------------------------------------------
128ALIGN JUMP_ALIGN
129FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX:
130 push bp
131 mov bp, FileIO_WriteCXbytesFromDSSIusingHandleFromBX
132 call SplitLargeReadOrWritesToSmallerBlocks
133 pop bp
134 ret
135
136;--------------------------------------------------------------------
[41]137; File position is updated so next write will start where
138; previous write stopped.
[133]139;
[41]140; FileIO_WriteCXbytesFromDSSIusingHandleFromBX:
141; Parameters:
142; BX: File handle
143; CX: Number of bytes to write
144; DS:SI: Ptr to source buffer
145; Returns:
[293]146; AX: Number of bytes actually written if successful (EOF check)
[41]147; DOS error code if CF set
[293]148; CF: Clear if successful
[41]149; Set if error
150; Corrupts registers:
151; Nothing
152;--------------------------------------------------------------------
153ALIGN JUMP_ALIGN
154FileIO_WriteCXbytesFromDSSIusingHandleFromBX:
155 xchg dx, si ; DS:DX now points to source buffer
156 mov ah, WRITE_TO_FILE_OR_DEVICE
157 int DOS_INTERRUPT_21h
158 xchg si, dx
159 ret
160
161
162;--------------------------------------------------------------------
[66]163; SplitLargeReadOrWritesToSmallerBlocks
164; Parameters:
165; BX: File handle
166; BP: Ptr to transfer function
167; DX:CX: Number of bytes to transfer
168; DS:SI: Ptr to transfer buffer
169; Returns:
170; AX: DOS error code if CF set
[293]171; CF: Clear if successful
[66]172; Set if error
173; Corrupts registers:
174; AX
175;--------------------------------------------------------------------
176ALIGN JUMP_ALIGN
177SplitLargeReadOrWritesToSmallerBlocks:
178 push ds
179 push si
180 push dx
181 push cx
182
183 xchg ax, cx ; DX:AX now holds bytes to transfer
184 mov cx, SPLIT_SIZE_FOR_LARGE_TRANSFERS
185 div cx ; AX = Number of full transfers
186 push dx ; Bytes for last transfer
187 test ax, ax
188 jz SHORT .TransferRemainingBytes
189 xchg dx, ax ; DX = Number of full transfers
190
191ALIGN JUMP_ALIGN
192.TransferNextBytes:
[105]193 call NormalizeDSSI
[66]194 call bp ; Transfer function
195 jc SHORT .ErrorOccurredDuringTransfer
[67]196 add si, SPLIT_SIZE_FOR_LARGE_TRANSFERS
[66]197 dec dx
198 jnz SHORT .TransferNextBytes
199.TransferRemainingBytes:
200 pop cx ; CX = Bytes for last transfer
201 jcxz .ReturnErrorCodeInAX ; No remaining bytes
[105]202 call NormalizeDSSI
[66]203 call bp
204.ReturnErrorCodeInAX:
205 pop cx
206 pop dx
207 pop si
208 pop ds
209 ret
210.ErrorOccurredDuringTransfer:
211 pop cx ; Remove bytes for last transfer
212 jmp SHORT .ReturnErrorCodeInAX
213
[105]214;--------------------------------------------------------------------
215; NormalizeDSSI
216; Parameters
217; DS:SI: Ptr to normalize
218; Returns:
219; DS:SI: Normalized pointer
220; Corrupts registers:
221; Nothing
222;--------------------------------------------------------------------
223ALIGN JUMP_ALIGN
224NormalizeDSSI:
225 push dx
226 push ax
227 NORMALIZE_FAR_POINTER ds, si, ax, dx
228 pop ax
229 pop dx
230 ret
[66]231
[105]232
[66]233;--------------------------------------------------------------------
[51]234; FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition:
235; Parameters:
236; BX: File handle
237; Returns:
238; DX:AX: Signed file size (if CF cleared)
239; AX: DOS error code (if CF set)
[293]240; CF: Clear if successful
[51]241; Set if error
242; Corrupts registers:
243; Nothing
244;--------------------------------------------------------------------
245ALIGN JUMP_ALIGN
246FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition:
247 push cx
248
249 ; Get file size to DX:AX
250 xor cx, cx
251 xor dx, dx
252 mov al, SEEK_FROM.endOfFile
253 call FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
254 jc SHORT .ReturnFileError
255 push dx
256 push ax
257
258 ; Reset file position
259 xor dx, dx
260 mov al, SEEK_FROM.startOfFile
261 call FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
262 pop ax
263 pop dx
264
265.ReturnFileError:
266 pop cx
267 ret
268
269
270;--------------------------------------------------------------------
[133]271; FileIO_CloseUsingHandleFromBX
272; Parameters:
273; BX: File handle
274; Returns:
275; AX: DOS error code if CF set
276; CF: Clear if file closed successfully
277; Set if error
278; Corrupts registers:
279; AX
280;--------------------------------------------------------------------
281ALIGN JUMP_ALIGN
282FileIO_CloseUsingHandleFromBX:
283 mov ah, CLOSE_FILE
284 SKIP2B f ; cmp ax, <next instruction>
285 ; Fall to FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
286
287
288;--------------------------------------------------------------------
[41]289; FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX:
290; Parameters:
291; AL: SEEK_FROM.(origin)
292; BX: File handle
[51]293; CX:DX: Signed offset to seek starting from AL
[41]294; Returns:
[51]295; DX:AX: New file position in bytes from start of file (if CF cleared)
296; AX: DOS error code (if CF set)
[293]297; CF: Clear if successful
[41]298; Set if error
299; Corrupts registers:
300; Nothing
301;--------------------------------------------------------------------
302FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX:
303 mov ah, SET_CURRENT_FILE_POSITION
304 int DOS_INTERRUPT_21h
305 ret
Note: See TracBrowser for help on using the repository browser.