source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/Buffers.asm @ 614

Last change on this file since 614 was 614, checked in by krille_n_, 3 years ago

Changes:

  • BIOSDRVS should now build again (broke in r613).
  • Removed the NO_ATAID_CORRECTION define from the Tiny build.
  • Added a new configuration option to skip detection of slave drives.
  • Made FLASH_SIGNATURE 2 bytes shorter to free up ROM space.
  • "Auto Configure" in XTIDECFG should now detect if running on an Olivetti M24, AT&T PC6300, Xerox 6060 or Logabax Persona 1600 and automatically select the fastest compatible transfer mode/device type for any IDE controllers found in the system.
  • Cleaned out some duplicate/unused definitions.
File size: 9.2 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   Functions for accessing file and flash buffers.
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; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Buffers_Clear
25;   Parameters:
26;       Nothing
27;   Returns:
28;       Nothing
29;   Corrupts registers:
30;       AX, CX, DI, ES
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33Buffers_Clear:
34    call    Buffers_GetFileBufferToESDI
35    mov     cx, ROMVARS_size
36    jmp     Memory_ZeroESDIwithSizeInCX
37
38
39;--------------------------------------------------------------------
40; Buffers_IsXtideUniversalBiosLoaded
41;   Parameters:
42;       Nothing
43;   Returns:
44;       ZF:     Set if supported version of XTIDE Universal BIOS is loaded
45;               Cleared if no file or some other file is loaded
46;   Corrupts registers:
47;       CX, SI, DI, ES
48;--------------------------------------------------------------------
49ALIGN JUMP_ALIGN
50Buffers_IsXtideUniversalBiosLoaded:
51    test    BYTE [cs:g_cfgVars+CFGVARS.wFlags], FLG_CFGVARS_FILELOADED | FLG_CFGVARS_ROMLOADED
52    jnz     SHORT .FileOrBiosLoaded
53    test    sp, sp      ; Clear ZF
54    ret
55
56.FileOrBiosLoaded:
57    call    Buffers_GetFileBufferToESDI
58    ; Fall to Buffers_IsXtideUniversalBiosSignatureInESDI
59
60
61;--------------------------------------------------------------------
62; Buffers_IsXtideUniversalBiosSignatureInESDI
63;   Parameters:
64;       ES:DI:  Ptr to possible XTIDE Universal BIOS location
65;   Returns:
66;       ZF:     Set if supported version of XTIDE Universal BIOS is loaded
67;               Cleared if no file or some other file is loaded
68;   Corrupts registers:
69;       CX, SI
70;--------------------------------------------------------------------
71ALIGN JUMP_ALIGN
72Buffers_IsXtideUniversalBiosSignatureInESDI:
73    push    di
74
75    mov     si, g_sXtideUniversalBiosSignature
76    add     di, BYTE ROMVARS.rgbSign
77    mov     cx, XTIDE_SIGNATURE_LENGTH / 2
78%ifdef CLD_NEEDED
79    cld
80%endif
81    eSEG_STR repe, cs, cmpsw
82
83    pop     di
84    ret
85
86
87;--------------------------------------------------------------------
88; Buffers_IsXTbuildLoaded
89;   Parameters:
90;       Nothing
91;   Returns:
92;       ZF:     Set if XT or XT+ build is loaded
93;               Cleared if some other (AT, 386) build is loaded
94;   Corrupts registers:
95;       Nothing
96;--------------------------------------------------------------------
97ALIGN JUMP_ALIGN
98Buffers_IsXTbuildLoaded:
99%strlen BUILD_TYPE_OFFSET   TITLE_STRING_START
100    push    es
101    push    di
102    call    Buffers_GetFileBufferToESDI
103    cmp     WORD [es:di+ROMVARS.szTitle+BUILD_TYPE_OFFSET+1], 'XT'  ; +1 is for '('
104    pop     di
105    pop     es
106    ret
107%undef BUILD_TYPE_OFFSET
108
109
110;--------------------------------------------------------------------
111; Buffers_NewBiosWithSizeInDXCXandSourceInALhasBeenLoadedForConfiguration
112;   Parameters:
113;       AL:     EEPROM source (FLG_CFGVARS_FILELOADED or FLG_CFGVARS_ROMLOADED)
114;       DX:CX:  EEPROM size in bytes
115;   Returns:
116;       Nothing
117;   Corrupts registers:
118;       CX, DX
119;--------------------------------------------------------------------
120ALIGN JUMP_ALIGN
121Buffers_NewBiosWithSizeInDXCXandSourceInALhasBeenLoadedForConfiguration:
122    and     BYTE [cs:g_cfgVars+CFGVARS.wFlags], ~(FLG_CFGVARS_FILELOADED | FLG_CFGVARS_ROMLOADED | FLG_CFGVARS_UNSAVED)
123    or      [cs:g_cfgVars+CFGVARS.wFlags], al
124    shr     dx, 1
125    rcr     cx, 1
126    adc     cx, BYTE 0      ; Round up to next WORD
127    mov     [cs:g_cfgVars+CFGVARS.wImageSizeInWords], cx
128    ret
129
130
131;--------------------------------------------------------------------
132; Buffers_SetUnsavedChanges
133; Buffers_ClearUnsavedChanges
134;   Parameters:
135;       SS:BP:  Menu handle
136;   Returns:
137;       Nothing
138;   Corrupts registers:
139;       Nothing
140;--------------------------------------------------------------------
141ALIGN JUMP_ALIGN
142Buffers_SetUnsavedChanges:
143    or      BYTE [cs:g_cfgVars+CFGVARS.wFlags], FLG_CFGVARS_UNSAVED
144    ret
145
146ALIGN JUMP_ALIGN
147Buffers_ClearUnsavedChanges:
148    and     BYTE [cs:g_cfgVars+CFGVARS.wFlags], ~FLG_CFGVARS_UNSAVED
149    ret
150
151
152;--------------------------------------------------------------------
153; Buffers_SaveChangesIfFileLoaded
154;   Parameters:
155;       Nothing
156;   Returns:
157;       Nothing
158;   Corrupts registers:
159;       AX, BX, CX, SI, DI
160;--------------------------------------------------------------------
161ALIGN JUMP_ALIGN
162Buffers_SaveChangesIfFileLoaded:
163    mov     al, [cs:g_cfgVars+CFGVARS.wFlags]
164    and     al, FLG_CFGVARS_FILELOADED | FLG_CFGVARS_UNSAVED
165    jz      SHORT .NothingToSave
166    jpo     SHORT .NothingToSave
167    mov     bx, g_szDlgSaveChanges
168    call    Dialogs_DisplayYesNoResponseDialogWithTitleStringInBX
169    jnz     SHORT .NothingToSave
170    jmp     BiosFile_SaveUnsavedChanges
171ALIGN JUMP_ALIGN
172.NothingToSave:
173    ret
174
175
176;--------------------------------------------------------------------
177; Buffers_AppendZeroesIfNeeded
178;   Parameters:
179;       Nothing
180;   Returns:
181;       Nothing
182;   Corrupts registers:
183;       AX, CX, DI
184;--------------------------------------------------------------------
185ALIGN JUMP_ALIGN
186Buffers_AppendZeroesIfNeeded:
187    push    es
188
189    eMOVZX  di, [cs:g_cfgVars+CFGVARS.bEepromType]
190    mov     cx, [cs:di+g_rgwEepromTypeToSizeInWords]
191    sub     cx, [cs:g_cfgVars+CFGVARS.wImageSizeInWords]    ; CX = WORDs to append
192    jbe     SHORT .NoNeedToAppendZeroes
193
194    call    Buffers_GetFileBufferToESDI
195    mov     ax, [cs:g_cfgVars+CFGVARS.wImageSizeInWords]
196    eSHL_IM ax, 1
197    add     di, ax          ; ES:DI now point first unused image byte
198    xor     ax, ax
199%ifdef CLD_NEEDED
200    cld
201%endif
202    rep stosw
203ALIGN JUMP_ALIGN
204.NoNeedToAppendZeroes:
205    pop     es
206    ret
207
208
209;--------------------------------------------------------------------
210; Buffers_GenerateChecksum
211;   Parameters:
212;       Nothing
213;   Returns:
214;       Nothing
215;   Corrupts registers:
216;       AX, BX, CX, DI
217;--------------------------------------------------------------------
218ALIGN JUMP_ALIGN
219Buffers_GenerateChecksum:
220    push    es
221    push    dx
222
223    call    Buffers_GetFileBufferToESDI
224    call    EEPROM_GetXtideUniversalBiosSizeFromESDItoDXCX
225%ifdef CLD_NEEDED
226    cld
227%endif
228
229; Compatibility fix for 3Com 3C503 cards where the ASIC returns 8080h as the last two bytes of the ROM.
230
231    ; Assume the BIOS size is not 8K, ie generate a normal checksum.
232    dec     cx
233    mov     ax, 100h
234    cmp     cx, 8192 - 1
235    jne     SHORT .BiosSizeIsNot8K
236    ; The BIOS size is 8K and therefore a potential candidate for a 3Com 3C503 card.
237    mov     cl, (8192 - 3) & 0FFh
238    mov     ah, 3
239ALIGN JUMP_ALIGN
240.BiosSizeIsNot8K:
241.SumNextByte:
242    add     al, [es:di]
243    inc     di
244    loop    .SumNextByte
245.NextChecksumByte:
246    neg     al
247    stosb
248    dec     ah
249    jnz     SHORT .NextChecksumByte
250
251    pop     dx
252    pop     es
253    ret
254
255
256;--------------------------------------------------------------------
257; Buffers_GetRomvarsFlagsToAX
258;   Parameters:
259;       Nothing
260;   Returns:
261;       AX:     ROMVARS.wFlags
262;   Corrupts registers:
263;       BX
264;--------------------------------------------------------------------
265ALIGN JUMP_ALIGN
266Buffers_GetRomvarsFlagsToAX:
267    mov     bx, ROMVARS.wFlags
268    ; Fall to Buffers_GetRomvarsValueToAXfromOffsetInBX
269
270;--------------------------------------------------------------------
271; Buffers_GetRomvarsValueToAXfromOffsetInBX
272;   Parameters:
273;       BX:     ROMVARS offset
274;   Returns:
275;       AX:     Value
276;   Corrupts registers:
277;       Nothing
278;--------------------------------------------------------------------
279ALIGN JUMP_ALIGN
280Buffers_GetRomvarsValueToAXfromOffsetInBX:
281    push    es
282    push    di
283    call    Buffers_GetFileBufferToESDI
284    mov     ax, [es:bx+di]
285    pop     di
286    pop     es
287    ret
288
289
290;--------------------------------------------------------------------
291; Buffers_GetIdeControllerCountToCX
292;   Parameters:
293;       SS:BP:  Menu handle
294;   Returns:
295;       CX:     Number of IDE controllers to configure
296;       ES:DI:  Ptr to file buffer
297;   Corrupts registers:
298;       Nothing
299;--------------------------------------------------------------------
300ALIGN JUMP_ALIGN
301Buffers_GetIdeControllerCountToCX:
302    xor     cx, cx
303    call    Buffers_GetFileBufferToESDI
304    or      cl, [es:di+ROMVARS.bIdeCnt]
305    jnz     SHORT .LimitControllerCountForLiteMode
306    inc     cx              ; Make sure there is at least one controller
307
308.LimitControllerCountForLiteMode:
309    test    BYTE [es:di+ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
310    jnz     SHORT .ReturnControllerCountInCX
311    MIN_U   cl, MAX_LITE_MODE_CONTROLLERS
312
313.ReturnControllerCountInCX:
314    ret
315
316
317;--------------------------------------------------------------------
318; Buffers_GetFlashComparisonBufferToESDI
319; Buffers_GetFileDialogItemBufferToESDI
320; Buffers_GetFileBufferToESDI
321;   Parameters:
322;       Nothing
323;   Returns:
324;       ES:DI:  Ptr to file buffer
325;   Corrupts registers:
326;       Nothing
327;--------------------------------------------------------------------
328ALIGN JUMP_ALIGN
329Buffers_GetFlashComparisonBufferToESDI:
330Buffers_GetFileDialogItemBufferToESDI:
331    call    Buffers_GetFileBufferToESDI
332    mov     di, es
333    SKIP2B  f
334Buffers_GetFileBufferToESDI:
335    mov     di, cs
336    add     di, 1000h       ; Change to next 64k page
337    mov     es, di
338    xor     di, di          ; Ptr now in ES:DI
339    ret
Note: See TracBrowser for help on using the repository browser.