source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/Menuitem.asm @ 625

Last change on this file since 625 was 625, checked in by krille_n_, 14 months ago

Changes:

  • Added a configuration option to let the BIOS store RamVars to an UMB when Full operating mode is enabled. This is primarily for XT class machines with RAM in the UMA (which apparently is a common thing these days).
  • Added two new builds specifically for IBM PS/2 machines. This is for support of the new McIDE adapter from the guys at zzxio.com. Note that the additional hardware specific code (under the USE_PS2 define) is for the PS/2 machines themselves and not for the McIDE adapters, so any controller in an IBM PS/2 machine can be used with the USE_PS2 define.
  • Moved pColorTheme out of the range of ROMVARS being copied over when doing "Load old settings from EEPROM" in XTIDECFG. This fixed a serious bug from r592 where loading a BIOS from file and then loading the old settings from ROM would corrupt 7 bytes of code somewhere in the loaded BIOS.
  • Optimizations (speed and size) to the library. Browsing the menus in XTIDECFG should now feel a little less sluggish.
  • Hopefully fixed a problem with the PostCommitHook script where it sometimes wouldn't find the CommitInProgress file. I say hopefully because testing this is a nightmare.
File size: 11.8 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   Functions for accessing MENUITEM structs.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2023 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; Menuitem_DisplayHelpMessageFromDSSI
25;   Parameters:
26;       DS:SI:  Ptr to MENUITEM
27;   Returns:
28;       Nothing
29;   Corrupts registers:
30;       AX, DX, DI
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33Menuitem_DisplayHelpMessageFromDSSI:
34    mov     di, [si+MENUITEM.szName]
35    mov     dx, [si+MENUITEM.szHelp]
36    jmp     Dialogs_DisplayHelpFromCSDXwithTitleInCSDI
37
38
39;--------------------------------------------------------------------
40; Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
41;   Parameters:
42;       DS:SI:  Ptr to MENUITEM
43;   Returns:
44;       Nothing
45;   Corrupts registers:
46;       AX, BX, CX, SI, DI, ES
47;--------------------------------------------------------------------
48ALIGN JUMP_ALIGN
49Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI:
50    call    Registers_CopyDSSItoESDI
51
52    mov     cl, DIALOG_INPUT_size
53    call    Memory_ReserveCLbytesFromStackToDSSI
54    call    InitializeDialogInputInDSSIfromMenuitemInESDI
55    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.szMultichoice]
56    mov     [si+DIALOG_INPUT.fszItems], ax
57    push    di
58    CALL_MENU_LIBRARY GetSelectionToAXwithInputInDSSI
59    pop     di
60
61    inc     ax              ; NO_ITEM_SELECTED ?
62    jz      SHORT .NothingToChange
63    dec     ax
64    call    Registers_CopyESDItoDSSI
65    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
66.NothingToChange:
67    add     sp, BYTE DIALOG_INPUT_size
68    ret
69
70
71;--------------------------------------------------------------------
72; Menuitem_ActivateHexInputForMenuitemInDSSI
73; Menuitem_ActivateUnsignedInputForMenuitemInDSSI
74;   Parameters:
75;       DS:SI:  Ptr to MENUITEM
76;   Returns:
77;       CF:     Cleared if value inputted
78;               Set if user cancellation
79;   Corrupts registers:
80;       AX, BX, CX, SI, DI, ES
81;--------------------------------------------------------------------
82Menuitem_ActivateHexInputForMenuitemInDSSI:
83    mov     bl, 16
84    SKIP2B  ax
85Menuitem_ActivateUnsignedInputForMenuitemInDSSI:
86    mov     bl, 10
87
88    call    Registers_CopyDSSItoESDI
89    mov     cl, WORD_DIALOG_IO_size
90    call    Memory_ReserveCLbytesFromStackToDSSI
91    call    InitializeDialogInputInDSSIfromMenuitemInESDI
92    mov     [si+WORD_DIALOG_IO.bNumericBase], bl
93    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.wMinValue]
94    mov     [si+WORD_DIALOG_IO.wMin], ax
95    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.wMaxValue]
96    mov     [si+WORD_DIALOG_IO.wMax], ax
97    push    di
98    CALL_MENU_LIBRARY GetWordWithIoInDSSI
99    pop     di
100
101    mov     cl, [si+WORD_DIALOG_IO.bUserCancellation]
102    cmp     cl, TRUE
103    je      SHORT .NothingToChange
104    mov     ax, [si+WORD_DIALOG_IO.wReturnWord]
105    call    Registers_CopyESDItoDSSI
106    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
107.NothingToChange:
108    add     sp, BYTE WORD_DIALOG_IO_size
109    shr     cl, 1
110    ret
111
112
113;--------------------------------------------------------------------
114; InitializeDialogInputInDSSIfromMenuitemInESDI
115;   Parameters:
116;       DS:SI:  Ptr to DIALOG_INPUT
117;       ES:DI:  Ptr to MENUITEM
118;   Returns:
119;       Nothing
120;   Corrupts registers:
121;       AX
122;--------------------------------------------------------------------
123ALIGN JUMP_ALIGN
124InitializeDialogInputInDSSIfromMenuitemInESDI:
125    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.szDialogTitle]
126    mov     [si+DIALOG_INPUT.fszTitle], ax
127    mov     [si+DIALOG_INPUT.fszTitle+2], cs
128
129    mov     [si+DIALOG_INPUT.fszItems+2], cs
130
131    mov     ax, [es:di+MENUITEM.szQuickInfo]
132    mov     [si+DIALOG_INPUT.fszInfo], ax
133    mov     [si+DIALOG_INPUT.fszInfo+2], cs
134    ret
135
136;--------------------------------------------------------------------
137; Menuitem_StoreValueFromAXtoMenuitemInDSSI
138;   Parameters:
139;       AX:     Value or multichoice selection to store
140;       DS:SI:  Ptr to MENUITEM
141;       SS:BP:  Menu handle
142;   Returns:
143;       Nothing
144;   Corrupts registers:
145;       AX, BX, DI, ES
146;--------------------------------------------------------------------
147ALIGN JUMP_ALIGN
148Menuitem_StoreValueFromAXtoMenuitemInDSSI:
149%if 0
150    ; 3 bytes more but this will always invoke the Writer, even if it's an invalid item type (which might be useful).
151    eMOVZX  bx, [si+MENUITEM.bType]
152    cmp     bl, TYPE_MENUITEM_HEX
153%else
154    ; This will only invoke the Writer for valid item types.
155    mov     bx, -TYPE_MENUITEM_MULTICHOICE & 0FFh
156    add     bl, [si+MENUITEM.bType]
157    jnc     SHORT .InvalidItemType
158    cmp     bl, TYPE_MENUITEM_HEX - TYPE_MENUITEM_MULTICHOICE
159%endif
160    ja      SHORT .InvalidItemType
161
162    call    GetConfigurationBufferToESDIforMenuitemInDSSI
163    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
164
165    push    WORD [cs:bx+.rgfnJumpToStoreValueBasedOnItemType]
166    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.fnValueWriter]
167    test    bx, bx
168    jnz     SHORT .InvokeWriter
169.InvalidItemType:
170    pop     bx
171.InvokeWriter:
172    jmp     bx              ; The Writer can freely corrupt BX
173
174ALIGN WORD_ALIGN
175.rgfnJumpToStoreValueBasedOnItemType:
176;   dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGEBACK
177;   dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGENEXT
178;   dw      .InvalidItemType                                    ; TYPE_MENUITEM_ACTION
179    dw      .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI    ; TYPE_MENUITEM_MULTICHOICE
180    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_UNSIGNED
181    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_HEX
182
183;--------------------------------------------------------------------
184; .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI
185;   Parameters:
186;       AX:     Multichoice selection (index)
187;       DS:SI:  Ptr to MENUITEM
188;       ES:DI:  Ptr to value variable
189;       SS:BP:  Menu handle
190;   Returns:
191;       Nothing
192;   Corrupts registers:
193;       AX, BX, DI
194;--------------------------------------------------------------------
195ALIGN JUMP_ALIGN
196.StoreMultichoiceValueFromAXtoESDIwithItemInDSSI:
197    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
198    jnz     SHORT .ClearBitsUsingMask
199    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
200    jz      SHORT .TranslateChoiceToValueUsingLookupTable
201
202    test    ax, ax          ; Setting item flag?
203    mov     ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
204    jnz     SHORT .SetFlagFromAX
205    not     ax
206    and     [es:di], ax     ; Clear flag
207    jmp     SHORT .SetUnsavedChanges
208ALIGN JUMP_ALIGN
209.SetFlagFromAX:
210    or      [es:di], ax
211    jmp     SHORT .SetUnsavedChanges
212
213ALIGN JUMP_ALIGN
214.ClearBitsUsingMask:
215    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
216    not     bx
217    and     [es:di], bx
218    ; Fall to .TranslateChoiceToValueUsingLookupTable
219
220
221ALIGN JUMP_ALIGN
222.TranslateChoiceToValueUsingLookupTable:
223;
224; if the lookup pointer is NULL, no translation is needed
225;
226    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.rgwChoiceToValueLookup]
227    test    bx, bx
228    jz      SHORT .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
229
230    eSHL_IM ax, 1           ; Shift for WORD lookup
231    add     bx, ax
232    mov     ax, [bx]        ; Lookup complete
233    ; Fall to .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
234
235;--------------------------------------------------------------------
236; .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
237;   Parameters:
238;       AX:     Value to store
239;       DS:SI:  Ptr to MENUITEM
240;       ES:DI:  Ptr to value variable
241;       SS:BP:  Menu handle
242;   Returns:
243;       Nothing
244;   Corrupts registers:
245;       AX, DI
246;--------------------------------------------------------------------
247ALIGN JUMP_ALIGN
248.StoreByteOrWordValueFromAXtoESDIwithItemInDSSI:
249    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
250    jz      SHORT .StoreByteOrWord
251    push    cx
252    mov     cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
253    shl     ax, cl
254    pop     cx
255    or      [es:di], ax
256    jmp     SHORT .SetUnsavedChanges
257
258.StoreByteOrWord:
259    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
260    jnz     SHORT .StoreByteFromAL
261
262    mov     [es:di+1], ah
263ALIGN JUMP_ALIGN
264.StoreByteFromAL:
265    mov     [es:di], al
266    ; Fall to .SetUnsavedChanges
267
268;--------------------------------------------------------------------
269; .SetUnsavedChanges
270;   Parameters:
271;       DS:SI:  Ptr to MENUITEM
272;       SS:BP:  Menu handle
273;   Returns:
274;       Nothing
275;   Corrupts registers:
276;       AX, DI
277;--------------------------------------------------------------------
278ALIGN JUMP_ALIGN
279.SetUnsavedChanges:
280    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
281    jnz     SHORT .NoUnsavedChangesForProgramVariables
282    call    Buffers_SetUnsavedChanges
283.NoUnsavedChangesForProgramVariables:
284    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MODIFY_MENU
285    jnz     SHORT .ModifyItemVisibility
286    CALL_MENU_LIBRARY RefreshTitle
287    CALL_MENU_LIBRARY GetHighlightedItemToAX
288    JMP_MENU_LIBRARY RefreshItemFromAX
289
290ALIGN JUMP_ALIGN
291.ModifyItemVisibility:
292    push    es
293    push    ds
294    ePUSHA
295    call    Menupage_GetActiveMenupageToDSDI
296    call    [di+MENUPAGE.fnEnter]
297    ePOPA
298    pop     ds
299    pop     es
300    ret
301
302
303;--------------------------------------------------------------------
304; Menuitem_GetValueToAXfromMenuitemInDSSI
305;   Parameters:
306;       DS:SI:  Ptr to MENUITEM
307;   Returns:
308;       AX:     Menuitem value
309;   Corrupts registers:
310;       Nothing
311;--------------------------------------------------------------------
312ALIGN JUMP_ALIGN
313Menuitem_GetValueToAXfromMenuitemInDSSI:
314; Note! Changes to this procedure might require changes to
315; ReadRamVars in ConfigurationMenu.asm as well!
316    push    es
317    push    di
318    push    bx
319    call    GetConfigurationBufferToESDIforMenuitemInDSSI
320    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
321    mov     ax, [es:di]
322
323    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
324    jz      SHORT .NoConvertWordToByteValue
325    xor     ah, ah          ; conversion needs to happen before call to the reader,
326                            ; in case the reader unpacks the byte to a word
327
328.NoConvertWordToByteValue:
329    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.fnValueReader]
330    test    bx,bx
331    jz      SHORT .NoReader
332
333    call    bx              ; The Reader can freely corrupt BX, DI and ES
334
335.NoReader:
336    pop     bx
337    pop     di
338    pop     es
339
340    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
341    jz      SHORT .TestIfFlagValue
342
343    and     ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
344    push    cx
345    mov     cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
346    shr     ax, cl
347    pop     cx
348    ret
349
350.TestIfFlagValue:
351    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
352    jz      SHORT .Return
353
354    test    ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
355    mov     ax, TRUE<<1     ; Shift for lookup
356    jnz     SHORT .Return
357    xor     ax, ax
358
359ALIGN JUMP_ALIGN, ret
360.Return:
361    ret
362
363
364;--------------------------------------------------------------------
365; GetConfigurationBufferToESDIforMenuitemInDSSI
366;   Parameters:
367;       DS:SI:  Ptr to MENUITEM
368;   Returns:
369;       ES:DI:  Ptr to configuration buffer
370;   Corrupts registers:
371;       Nothing
372;--------------------------------------------------------------------
373ALIGN JUMP_ALIGN
374GetConfigurationBufferToESDIforMenuitemInDSSI:
375    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
376    jnz     SHORT .ReturnCfgvarsInESDI
377    jmp     Buffers_GetFileBufferToESDI
378ALIGN JUMP_ALIGN
379.ReturnCfgvarsInESDI:
380    push    cs
381    pop     es
382    mov     di, g_cfgVars
383    ret
384
385
386;--------------------------------------------------------------------
387; EnableMenuitemFromCSBX
388; DisableMenuitemFromCSBX
389;   Parameters:
390;       CS:BX:  Ptr to MENUITEM
391;   Returns:
392;       Nothing
393;   Corrupts registers:
394;       Nothing
395;--------------------------------------------------------------------
396ALIGN JUMP_ALIGN
397EnableMenuitemFromCSBX:
398    or      BYTE [cs:bx+MENUITEM.bFlags], FLG_MENUITEM_VISIBLE
399    ret
400
401ALIGN JUMP_ALIGN
402DisableMenuitemFromCSBX:
403    and     BYTE [cs:bx+MENUITEM.bFlags], ~FLG_MENUITEM_VISIBLE
404    ret
Note: See TracBrowser for help on using the repository browser.