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

Last change on this file since 318 was 293, checked in by krille_n_@…, 13 years ago

Commit 1/2 (Library, Configurators and Serial Server):

  • Changed Emulate.inc so that making 286 and 386 versions now works. Additionally, only one processor type define is needed in the makefile.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 7.3 KB
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for file access.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; FileIO_OpenWithPathInDSSIandFileAccessInAL
9; Parameters:
10; AL: FILE_ACCESS.(mode)
11; DS:SI: Ptr to NULL terminated path or file name
12; Returns:
13; AX: DOS error code if CF set
14; BX: File handle if CF cleared
15; CF: Clear if file opened successfully
16; Set if error
17; Corrupts registers:
18; AX, BX
19;--------------------------------------------------------------------
20ALIGN JUMP_ALIGN
21FileIO_OpenWithPathInDSSIandFileAccessInAL:
22 xchg dx, si ; Path now in DS:DX
23 mov ah, OPEN_EXISTING_FILE
24 int DOS_INTERRUPT_21h
25 xchg si, dx
[51]26 mov bx, ax ; Copy file handle to BX
[41]27 ret
28
29
30;--------------------------------------------------------------------
[66]31; FileIO_ReadDXCXbytesToDSSIusingHandleFromBX
32; Parameters:
33; BX: File handle
34; DX:CX: Number of bytes to read
35; DS:SI: Ptr to destination buffer
36; Returns:
37; AX: DOS error code if CF set
[293]38; CF: Clear if successful
[66]39; Set if error
40; Corrupts registers:
41; AX
42;--------------------------------------------------------------------
43ALIGN JUMP_ALIGN
44FileIO_ReadDXCXbytesToDSSIusingHandleFromBX:
45 push bp
46 mov bp, FileIO_ReadCXbytesToDSSIusingHandleFromBX
47 call SplitLargeReadOrWritesToSmallerBlocks
48 pop bp
49 ret
50
51;--------------------------------------------------------------------
[41]52; File position is updated so next read will start where
53; previous read stopped.
[133]54;
[41]55; FileIO_ReadCXbytesToDSSIusingHandleFromBX
56; Parameters:
57; BX: File handle
58; CX: Number of bytes to read
59; DS:SI: Ptr to destination buffer
60; Returns:
[293]61; AX: Number of bytes actually read if successful (0 if at EOF before call)
[41]62; DOS error code if CF set
[293]63; CF: Clear if successful
[41]64; Set if error
65; Corrupts registers:
66; Nothing
67;--------------------------------------------------------------------
68ALIGN JUMP_ALIGN
69FileIO_ReadCXbytesToDSSIusingHandleFromBX:
[51]70 xchg dx, si ; DS:DX now points to destination buffer
[41]71 mov ah, READ_FROM_FILE_OR_DEVICE
72 int DOS_INTERRUPT_21h
73 xchg si, dx
74 ret
75
76
77;--------------------------------------------------------------------
[66]78; FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX
79; Parameters:
80; BX: File handle
81; DX:CX: Number of bytes to write
82; DS:SI: Ptr to source buffer
83; Returns:
84; AX: DOS error code if CF set
[293]85; CF: Clear if successful
[66]86; Set if error
87; Corrupts registers:
88; AX
89;--------------------------------------------------------------------
90ALIGN JUMP_ALIGN
91FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX:
92 push bp
93 mov bp, FileIO_WriteCXbytesFromDSSIusingHandleFromBX
94 call SplitLargeReadOrWritesToSmallerBlocks
95 pop bp
96 ret
97
98;--------------------------------------------------------------------
[41]99; File position is updated so next write will start where
100; previous write stopped.
[133]101;
[41]102; FileIO_WriteCXbytesFromDSSIusingHandleFromBX:
103; Parameters:
104; BX: File handle
105; CX: Number of bytes to write
106; DS:SI: Ptr to source buffer
107; Returns:
[293]108; AX: Number of bytes actually written if successful (EOF check)
[41]109; DOS error code if CF set
[293]110; CF: Clear if successful
[41]111; Set if error
112; Corrupts registers:
113; Nothing
114;--------------------------------------------------------------------
115ALIGN JUMP_ALIGN
116FileIO_WriteCXbytesFromDSSIusingHandleFromBX:
117 xchg dx, si ; DS:DX now points to source buffer
118 mov ah, WRITE_TO_FILE_OR_DEVICE
119 int DOS_INTERRUPT_21h
120 xchg si, dx
121 ret
122
123
124;--------------------------------------------------------------------
[66]125; SplitLargeReadOrWritesToSmallerBlocks
126; Parameters:
127; BX: File handle
128; BP: Ptr to transfer function
129; DX:CX: Number of bytes to transfer
130; DS:SI: Ptr to transfer buffer
131; Returns:
132; AX: DOS error code if CF set
[293]133; CF: Clear if successful
[66]134; Set if error
135; Corrupts registers:
136; AX
137;--------------------------------------------------------------------
138ALIGN JUMP_ALIGN
139SplitLargeReadOrWritesToSmallerBlocks:
140 push ds
141 push si
142 push dx
143 push cx
144
145 xchg ax, cx ; DX:AX now holds bytes to transfer
146 mov cx, SPLIT_SIZE_FOR_LARGE_TRANSFERS
147 div cx ; AX = Number of full transfers
148 push dx ; Bytes for last transfer
149 test ax, ax
150 jz SHORT .TransferRemainingBytes
151 xchg dx, ax ; DX = Number of full transfers
152
153ALIGN JUMP_ALIGN
154.TransferNextBytes:
[105]155 call NormalizeDSSI
[66]156 call bp ; Transfer function
157 jc SHORT .ErrorOccurredDuringTransfer
[67]158 add si, SPLIT_SIZE_FOR_LARGE_TRANSFERS
[66]159 dec dx
160 jnz SHORT .TransferNextBytes
161.TransferRemainingBytes:
162 pop cx ; CX = Bytes for last transfer
163 jcxz .ReturnErrorCodeInAX ; No remaining bytes
[105]164 call NormalizeDSSI
[66]165 call bp
166.ReturnErrorCodeInAX:
167 pop cx
168 pop dx
169 pop si
170 pop ds
171 ret
172.ErrorOccurredDuringTransfer:
173 pop cx ; Remove bytes for last transfer
174 jmp SHORT .ReturnErrorCodeInAX
175
[105]176;--------------------------------------------------------------------
177; NormalizeDSSI
178; Parameters
179; DS:SI: Ptr to normalize
180; Returns:
181; DS:SI: Normalized pointer
182; Corrupts registers:
183; Nothing
184;--------------------------------------------------------------------
185ALIGN JUMP_ALIGN
186NormalizeDSSI:
187 push dx
188 push ax
189 NORMALIZE_FAR_POINTER ds, si, ax, dx
190 pop ax
191 pop dx
192 ret
[66]193
[105]194
[66]195;--------------------------------------------------------------------
[51]196; FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition:
197; Parameters:
198; BX: File handle
199; Returns:
200; DX:AX: Signed file size (if CF cleared)
201; AX: DOS error code (if CF set)
[293]202; CF: Clear if successful
[51]203; Set if error
204; Corrupts registers:
205; Nothing
206;--------------------------------------------------------------------
207ALIGN JUMP_ALIGN
208FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition:
209 push cx
210
211 ; Get file size to DX:AX
212 xor cx, cx
213 xor dx, dx
214 mov al, SEEK_FROM.endOfFile
215 call FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
216 jc SHORT .ReturnFileError
217 push dx
218 push ax
219
220 ; Reset file position
221 xor dx, dx
222 mov al, SEEK_FROM.startOfFile
223 call FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
224 pop ax
225 pop dx
226
227.ReturnFileError:
228 pop cx
229 ret
230
231
232;--------------------------------------------------------------------
[133]233; FileIO_CloseUsingHandleFromBX
234; Parameters:
235; BX: File handle
236; Returns:
237; AX: DOS error code if CF set
238; CF: Clear if file closed successfully
239; Set if error
240; Corrupts registers:
241; AX
242;--------------------------------------------------------------------
243ALIGN JUMP_ALIGN
244FileIO_CloseUsingHandleFromBX:
245 mov ah, CLOSE_FILE
246 SKIP2B f ; cmp ax, <next instruction>
247 ; Fall to FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
248
249
250;--------------------------------------------------------------------
[41]251; FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX:
252; Parameters:
253; AL: SEEK_FROM.(origin)
254; BX: File handle
[51]255; CX:DX: Signed offset to seek starting from AL
[41]256; Returns:
[51]257; DX:AX: New file position in bytes from start of file (if CF cleared)
258; AX: DOS error code (if CF set)
[293]259; CF: Clear if successful
[41]260; Set if error
261; Corrupts registers:
262; Nothing
263;--------------------------------------------------------------------
264FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX:
265 mov ah, SET_CURRENT_FILE_POSITION
266 int DOS_INTERRUPT_21h
267 ret
Note: See TracBrowser for help on using the repository browser.