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

Last change on this file since 624 was 621, checked in by Krister Nordvall, 3 years ago

Changes:

  • Fixed three different bugs all causing the boot menu to show drives using IRQs even though the BIOS had been built without MODULE_IRQ.
  • Fixed two bugs in XTIDECFG where loading a BIOS from file and then loading the old settings from EEPROM would
    • overwrite ROMVARS.wFlags in the loaded BIOS file (in RAM). The possibly resulting mismatch of module flags could make it impossible to change settings for modules included in the BIOS or allow changing settings for modules not included in the BIOS.
    • not copy the color theme over to the loaded BIOS.
  • Also fixed two very minor bugs in XTIDECFG in BiosFile_LoadFileFromDSSItoRamBuffer and BiosFile_SaveRamBufferToFileInDSSI where the error handling in these routines would close whatever file handle that happened to match the error code returned by DOS in AX.
  • Made significant changes to the new flash ROM programming routines to reduce the size. Also fixed a minor bug that would cause the second verification to be skipped and return success when programming a 64 KB block of data.
  • Changed the custom BIOS build file names to the 8.3 format.
  • Changed some help strings in XTIDECFG to clarify things.
  • Other minor optimizations and fixes.
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-2013 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;--------------------------------------------------------------------
37%ifndef EXCLUDE_FROM_XTIDECFG
38ALIGN JUMP_ALIGN
39FileIO_CreateWithPathInDSSIandAttributesInCX:
40 mov ah, CREATE_OR_TRUNCATE_FILE
41 SKIP2B bx
42 ; Fall to FileIO_OpenWithPathInDSSIandFileAccessInAL
43%endif
44
45;--------------------------------------------------------------------
46; FileIO_OpenWithPathInDSSIandFileAccessInAL
47; Parameters:
48; AL: FILE_ACCESS.(mode)
49; DS:SI: Ptr to NULL terminated path or file name
50; Returns:
51; AX: DOS error code if CF set
52; BX: File handle if CF cleared
53; CF: Clear if file opened successfully
54; Set if error
55; Corrupts registers:
56; AX, BX
57;--------------------------------------------------------------------
58FileIO_OpenWithPathInDSSIandFileAccessInAL:
59 mov ah, OPEN_EXISTING_FILE
60 xchg dx, si ; Path now in DS:DX
61 int DOS_INTERRUPT_21h
62 xchg si, dx
63 mov bx, ax ; Copy file handle to BX
64 ret
65
66
67;--------------------------------------------------------------------
68; File position is updated so next read will start where
69; previous read stopped.
70;
71; FileIO_ReadCXbytesToDSSIusingHandleFromBX
72; Parameters:
73; BX: File handle
74; CX: Number of bytes to read
75; DS:SI: Ptr to destination buffer
76; Returns:
77; AX: Number of bytes actually read if successful (0 if at EOF before call)
78; DOS error code if CF set
79; CF: Clear if successful
80; Set if error
81; Corrupts registers:
82; Nothing
83;--------------------------------------------------------------------
84ALIGN JUMP_ALIGN
85FileIO_ReadCXbytesToDSSIusingHandleFromBX:
86 mov ah, READ_FROM_FILE_OR_DEVICE
87 SKIP2B f
88 ; Fall to FileIO_WriteCXbytesFromDSSIusingHandleFromBX
89
90;--------------------------------------------------------------------
91; File position is updated so next write will start where
92; previous write stopped.
93;
94; FileIO_WriteCXbytesFromDSSIusingHandleFromBX
95; Parameters:
96; BX: File handle
97; CX: Number of bytes to write
98; DS:SI: Ptr to source buffer
99; Returns:
100; AX: Number of bytes actually written if successful (EOF check)
101; DOS error code if CF set
102; CF: Clear if successful
103; Set if error
104; Corrupts registers:
105; Nothing
106;--------------------------------------------------------------------
107FileIO_WriteCXbytesFromDSSIusingHandleFromBX:
108 mov ah, WRITE_TO_FILE_OR_DEVICE
109 xchg dx, si ; DS:DX now points to buffer
110 int DOS_INTERRUPT_21h
111 xchg si, dx
112 ret
113
114
115;--------------------------------------------------------------------
116; FileIO_ReadDXCXbytesToDSSIusingHandleFromBX
117; Parameters:
118; BX: File handle
119; DX:CX: Number of bytes to read
120; DS:SI: Ptr to destination 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_ReadDXCXbytesToDSSIusingHandleFromBX:
130 push bp
131 mov bp, FileIO_ReadCXbytesToDSSIusingHandleFromBX
132 jmp SHORT SplitLargeReadOrWriteToSmallerBlocks
133
134
135;--------------------------------------------------------------------
136; FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX
137; Parameters:
138; BX: File handle
139; DX:CX: Number of bytes to write
140; DS:SI: Ptr to source buffer
141; Returns:
142; AX: DOS error code if CF set
143; CF: Clear if successful
144; Set if error
145; Corrupts registers:
146; AX
147;--------------------------------------------------------------------
148ALIGN JUMP_ALIGN
149FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX:
150 push bp
151 mov bp, FileIO_WriteCXbytesFromDSSIusingHandleFromBX
152 ; Fall to SplitLargeReadOrWriteToSmallerBlocks
153
154;--------------------------------------------------------------------
155; SplitLargeReadOrWriteToSmallerBlocks
156; Parameters:
157; [SP]: Saved BP (restored on return)
158; BX: File handle
159; BP: Ptr to transfer function
160; DX:CX: Number of bytes to transfer
161; DS:SI: Ptr to transfer buffer
162; Returns:
163; AX: DOS error code if CF set
164; CF: Clear if successful
165; Set if error
166; Corrupts registers:
167; AX
168;--------------------------------------------------------------------
169SplitLargeReadOrWriteToSmallerBlocks:
170 push ds
171 push si
172 push dx
173 push cx
174
175 xchg ax, cx ; DX:AX now holds bytes to transfer
176 mov cx, SPLIT_SIZE_FOR_LARGE_TRANSFERS
177 div cx ; AX = Number of full transfers
178 push dx ; Bytes for last transfer
179 test ax, ax
180 jz SHORT .TransferRemainingBytes
181 xchg dx, ax ; DX = Number of full transfers
182
183ALIGN JUMP_ALIGN
184.TransferNextBytes:
185 call NormalizeDSSI
186 call bp ; Transfer function
187 jc SHORT .ErrorOccurredDuringTransfer
188 add si, SPLIT_SIZE_FOR_LARGE_TRANSFERS
189 dec dx
190 jnz SHORT .TransferNextBytes
191.TransferRemainingBytes:
192 pop cx ; CX = Bytes for last transfer
193 jcxz .ReturnErrorCodeInAX ; No remaining bytes
194 call NormalizeDSSI
195 call bp
196 SKIP1B dl
197.ErrorOccurredDuringTransfer:
198 pop cx ; Remove bytes for last transfer
199.ReturnErrorCodeInAX:
200 pop cx
201 pop dx
202 pop si
203 pop ds
204 pop bp ; Restore BP saved to stack by "caller"
205 ret
206
207
208;--------------------------------------------------------------------
209; NormalizeDSSI
210; Parameters
211; DS:SI: Ptr to normalize
212; Returns:
213; DS:SI: Normalized pointer
214; Corrupts registers:
215; Nothing
216;--------------------------------------------------------------------
217ALIGN JUMP_ALIGN
218NormalizeDSSI:
219 push dx
220 push ax
221 NORMALIZE_FAR_POINTER ds, si, ax, dx
222 pop ax
223 pop dx
224 ret
225
226
227;--------------------------------------------------------------------
228; FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition
229; Parameters:
230; BX: File handle
231; Returns:
232; DX:AX: Signed file size (if CF cleared)
233; AX: DOS error code (if CF set)
234; CF: Clear if successful
235; Set if error
236; Corrupts registers:
237; Nothing
238;--------------------------------------------------------------------
239ALIGN JUMP_ALIGN
240FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition:
241 push cx
242
243 ; Get file size to DX:AX
244 xor cx, cx
245 xor dx, dx
246 mov al, SEEK_FROM.endOfFile
247 call FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
248 jc SHORT .ReturnFileError
249 push dx
250 push ax
251
252 ; Reset file position
253 xor dx, dx
254 mov al, SEEK_FROM.startOfFile
255 call FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
256 pop ax
257 pop dx
258
259.ReturnFileError:
260 pop cx
261 ret
262
263
264;--------------------------------------------------------------------
265; FileIO_CloseUsingHandleFromBX
266; Parameters:
267; BX: File handle
268; Returns:
269; AX: DOS error code if CF set
270; CF: Clear if file closed successfully
271; Set if error
272; Corrupts registers:
273; AX
274;--------------------------------------------------------------------
275ALIGN JUMP_ALIGN
276FileIO_CloseUsingHandleFromBX:
277 mov ah, CLOSE_FILE
278 SKIP2B f
279 ; Fall to FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
280
281;--------------------------------------------------------------------
282; FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
283; Parameters:
284; AL: SEEK_FROM.(origin)
285; BX: File handle
286; CX:DX: Signed offset to seek starting from AL
287; Returns:
288; DX:AX: New file position in bytes from start of file (if CF cleared)
289; AX: DOS error code (if CF set)
290; CF: Clear if successful
291; Set if error
292; Corrupts registers:
293; Nothing
294;--------------------------------------------------------------------
295FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX:
296 mov ah, SET_CURRENT_FILE_POSITION
297 int DOS_INTERRUPT_21h
298 ret
Note: See TracBrowser for help on using the repository browser.