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

Last change on this file since 596 was 596, checked in by krille_n_, 6 years ago

Changes:

  • Made changes to HotkeyBar.asm to give the Boot Menu and Hotkey Bar a more consistent look. It will probably seem a bit strange at first to people used to the classic theme.
  • Added the missing parts of USE_NEC_V that should have been committed with the rest in r593.
  • Removed DEFINES_ALL_FEATURES from the BIOS makefile. It didn't work anymore and never really made sense anyway. Added all the official builds to 'make unused' instead which actually uncovered some unused code in the Tiny build.
  • XTIDECFG will no longer load color themes from unrecognized versions of the BIOS.
  • Other fixes in comments and some minor optimizations.
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_szXtideUniversalBiosSignature
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.