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

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

Changes to Assembly Library:

  • File Library can now create files.
File size: 8.6 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for file access.
3
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
21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
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;--------------------------------------------------------------------
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
61CreateOrOpenFile:
62    int     DOS_INTERRUPT_21h
63    xchg    si, dx
64    mov     bx, ax      ; Copy file handle to BX
65    ret
66
67
68;--------------------------------------------------------------------
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
76;       CF:     Clear if successful
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;--------------------------------------------------------------------
90; File position is updated so next read will start where
91; previous read stopped.
92;
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:
99;       AX:     Number of bytes actually read if successful (0 if at EOF before call)
100;               DOS error code if CF set
101;       CF:     Clear if successful
102;               Set if error
103;   Corrupts registers:
104;       Nothing
105;--------------------------------------------------------------------
106ALIGN JUMP_ALIGN
107FileIO_ReadCXbytesToDSSIusingHandleFromBX:
108    xchg    dx, si              ; DS:DX now points to destination buffer
109    mov     ah, READ_FROM_FILE_OR_DEVICE
110    int     DOS_INTERRUPT_21h
111    xchg    si, dx
112    ret
113
114
115;--------------------------------------------------------------------
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
123;       CF:     Clear if successful
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;--------------------------------------------------------------------
137; File position is updated so next write will start where
138; previous write stopped.
139;
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:
146;       AX:     Number of bytes actually written if successful (EOF check)
147;               DOS error code if CF set
148;       CF:     Clear if successful
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;--------------------------------------------------------------------
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
171;       CF:     Clear if successful
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:
193    call    NormalizeDSSI
194    call    bp                      ; Transfer function
195    jc      SHORT .ErrorOccurredDuringTransfer
196    add     si, SPLIT_SIZE_FOR_LARGE_TRANSFERS
197    dec     dx
198    jnz     SHORT .TransferNextBytes
199.TransferRemainingBytes:
200    pop     cx                      ; CX = Bytes for last transfer
201    jcxz    .ReturnErrorCodeInAX    ; No remaining bytes
202    call    NormalizeDSSI
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
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
231
232
233;--------------------------------------------------------------------
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)
240;       CF:     Clear if successful
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;--------------------------------------------------------------------
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;--------------------------------------------------------------------
289; FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX:
290;   Parameters:
291;       AL:     SEEK_FROM.(origin)
292;       BX:     File handle
293;       CX:DX:  Signed offset to seek starting from AL
294;   Returns:
295;       DX:AX:  New file position in bytes from start of file (if CF cleared)
296;       AX:     DOS error code (if CF set)
297;       CF:     Clear if successful
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.