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

Last change on this file since 592 was 592, checked in by krille_n_, 4 years ago

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
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; FileIO_ReadDXCXbytesToDSSIusingHandleFromBX
69;   Parameters:
70;       BX:     File handle
71;       DX:CX:  Number of bytes to read
72;       DS:SI:  Ptr to destination buffer
73;   Returns:
74;       AX:     DOS error code if CF set
75;       CF:     Clear if successful
76;               Set if error
77;   Corrupts registers:
78;       AX
79;--------------------------------------------------------------------
80ALIGN JUMP_ALIGN
81FileIO_ReadDXCXbytesToDSSIusingHandleFromBX:
82    push    bp
83    mov     bp, FileIO_ReadCXbytesToDSSIusingHandleFromBX
84    call    SplitLargeReadOrWritesToSmallerBlocks
85    pop     bp
86    ret
87
88
89;--------------------------------------------------------------------
90; FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX
91;   Parameters:
92;       BX:     File handle
93;       DX:CX:  Number of bytes to write
94;       DS:SI:  Ptr to source buffer
95;   Returns:
96;       AX:     DOS error code if CF set
97;       CF:     Clear if successful
98;               Set if error
99;   Corrupts registers:
100;       AX
101;--------------------------------------------------------------------
102ALIGN JUMP_ALIGN
103FileIO_WriteDXCXbytesFromDSSIusingHandleFromBX:
104    push    bp
105    mov     bp, FileIO_WriteCXbytesFromDSSIusingHandleFromBX
106    call    SplitLargeReadOrWritesToSmallerBlocks
107    pop     bp
108    ret
109
110
111;--------------------------------------------------------------------
112; File position is updated so next read will start where
113; previous read stopped.
114;
115; FileIO_ReadCXbytesToDSSIusingHandleFromBX
116;   Parameters:
117;       BX:     File handle
118;       CX:     Number of bytes to read
119;       DS:SI:  Ptr to destination buffer
120;   Returns:
121;       AX:     Number of bytes actually read if successful (0 if at EOF before call)
122;               DOS error code if CF set
123;       CF:     Clear if successful
124;               Set if error
125;   Corrupts registers:
126;       Nothing
127;--------------------------------------------------------------------
128ALIGN JUMP_ALIGN
129FileIO_ReadCXbytesToDSSIusingHandleFromBX:
130    mov     ah, READ_FROM_FILE_OR_DEVICE
131    SKIP2B  f
132    ; Fall to FileIO_WriteCXbytesFromDSSIusingHandleFromBX
133
134;--------------------------------------------------------------------
135; File position is updated so next write will start where
136; previous write stopped.
137;
138; FileIO_WriteCXbytesFromDSSIusingHandleFromBX
139;   Parameters:
140;       BX:     File handle
141;       CX:     Number of bytes to write
142;       DS:SI:  Ptr to source buffer
143;   Returns:
144;       AX:     Number of bytes actually written if successful (EOF check)
145;               DOS error code if CF set
146;       CF:     Clear if successful
147;               Set if error
148;   Corrupts registers:
149;       Nothing
150;--------------------------------------------------------------------
151FileIO_WriteCXbytesFromDSSIusingHandleFromBX:
152    mov     ah, WRITE_TO_FILE_OR_DEVICE
153    xchg    dx, si              ; DS:DX now points to buffer
154    int     DOS_INTERRUPT_21h
155    xchg    si, dx
156    ret
157
158
159;--------------------------------------------------------------------
160; SplitLargeReadOrWritesToSmallerBlocks
161;   Parameters:
162;       BX:     File handle
163;       BP:     Ptr to transfer function
164;       DX:CX:  Number of bytes to transfer
165;       DS:SI:  Ptr to transfer buffer
166;   Returns:
167;       AX:     DOS error code if CF set
168;       CF:     Clear if successful
169;               Set if error
170;   Corrupts registers:
171;       AX
172;--------------------------------------------------------------------
173ALIGN JUMP_ALIGN
174SplitLargeReadOrWritesToSmallerBlocks:
175    push    ds
176    push    si
177    push    dx
178    push    cx
179
180    xchg    ax, cx                  ; DX:AX now holds bytes to transfer
181    mov     cx, SPLIT_SIZE_FOR_LARGE_TRANSFERS
182    div     cx                      ; AX = Number of full transfers
183    push    dx                      ; Bytes for last transfer
184    test    ax, ax
185    jz      SHORT .TransferRemainingBytes
186    xchg    dx, ax                  ; DX = Number of full transfers
187
188ALIGN JUMP_ALIGN
189.TransferNextBytes:
190    call    NormalizeDSSI
191    call    bp                      ; Transfer function
192    jc      SHORT .ErrorOccurredDuringTransfer
193    add     si, SPLIT_SIZE_FOR_LARGE_TRANSFERS
194    dec     dx
195    jnz     SHORT .TransferNextBytes
196.TransferRemainingBytes:
197    pop     cx                      ; CX = Bytes for last transfer
198    jcxz    .ReturnErrorCodeInAX    ; No remaining bytes
199    call    NormalizeDSSI
200    call    bp
201.ReturnErrorCodeInAX:
202    pop     cx
203    pop     dx
204    pop     si
205    pop     ds
206    ret
207.ErrorOccurredDuringTransfer:
208    pop     cx                      ; Remove bytes for last transfer
209    jmp     SHORT .ReturnErrorCodeInAX
210
211;--------------------------------------------------------------------
212; NormalizeDSSI
213;   Parameters
214;       DS:SI:  Ptr to normalize
215;   Returns:
216;       DS:SI:  Normalized pointer
217;   Corrupts registers:
218;       Nothing
219;--------------------------------------------------------------------
220ALIGN JUMP_ALIGN
221NormalizeDSSI:
222    push    dx
223    push    ax
224    NORMALIZE_FAR_POINTER ds, si, ax, dx
225    pop     ax
226    pop     dx
227    ret
228
229
230;--------------------------------------------------------------------
231; FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition
232;   Parameters:
233;       BX:     File handle
234;   Returns:
235;       DX:AX:  Signed file size (if CF cleared)
236;       AX:     DOS error code (if CF set)
237;       CF:     Clear if successful
238;               Set if error
239;   Corrupts registers:
240;       Nothing
241;--------------------------------------------------------------------
242ALIGN JUMP_ALIGN
243FileIO_GetFileSizeToDXAXusingHandleFromBXandResetFilePosition:
244    push    cx
245
246    ; Get file size to DX:AX
247    xor     cx, cx
248    xor     dx, dx
249    mov     al, SEEK_FROM.endOfFile
250    call    FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
251    jc      SHORT .ReturnFileError
252    push    dx
253    push    ax
254
255    ; Reset file position
256    xor     dx, dx
257    mov     al, SEEK_FROM.startOfFile
258    call    FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
259    pop     ax
260    pop     dx
261
262.ReturnFileError:
263    pop     cx
264    ret
265
266
267;--------------------------------------------------------------------
268; FileIO_CloseUsingHandleFromBX
269;   Parameters:
270;       BX:     File handle
271;   Returns:
272;       AX:     DOS error code if CF set
273;       CF:     Clear if file closed successfully
274;               Set if error
275;   Corrupts registers:
276;       AX
277;--------------------------------------------------------------------
278ALIGN JUMP_ALIGN
279FileIO_CloseUsingHandleFromBX:
280    mov     ah, CLOSE_FILE
281    SKIP2B  f   ; cmp ax, <next instruction>
282    ; Fall to FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
283
284
285;--------------------------------------------------------------------
286; FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX
287;   Parameters:
288;       AL:     SEEK_FROM.(origin)
289;       BX:     File handle
290;       CX:DX:  Signed offset to seek starting from AL
291;   Returns:
292;       DX:AX:  New file position in bytes from start of file (if CF cleared)
293;       AX:     DOS error code (if CF set)
294;       CF:     Clear if successful
295;               Set if error
296;   Corrupts registers:
297;       Nothing
298;--------------------------------------------------------------------
299FileIO_SeekFromOriginInALtoOffsetInDXAXusingHandleFromBX:
300    mov     ah, SET_CURRENT_FILE_POSITION
301    int     DOS_INTERRUPT_21h
302    ret
Note: See TracBrowser for help on using the repository browser.