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

Last change on this file since 621 was 621, checked in by krille_n_, 2 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.