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_, 15 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
RevLine 
[57]1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   Functions for accessing MENUITEM structs.
3
[376]4;
[525]5; XTIDE Universal BIOS and Associated Tools
[625]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2023 by XTIDE Universal BIOS Team.
[376]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.
[525]12;
[376]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
[525]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[525]18;
[376]19
[57]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;--------------------------------------------------------------------
[108]40; Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
[57]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
[108]49Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI:
[107]50    call    Registers_CopyDSSItoESDI
[57]51
[602]52    mov     cl, DIALOG_INPUT_size
53    call    Memory_ReserveCLbytesFromStackToDSSI
[57]54    call    InitializeDialogInputInDSSIfromMenuitemInESDI
[592]55    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.szMultichoice]
[57]56    mov     [si+DIALOG_INPUT.fszItems], ax
57    push    di
58    CALL_MENU_LIBRARY GetSelectionToAXwithInputInDSSI
59    pop     di
60
[592]61    inc     ax              ; NO_ITEM_SELECTED ?
62    jz      SHORT .NothingToChange
63    dec     ax
[107]64    call    Registers_CopyESDItoDSSI
[57]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:
[286]77;       CF:     Cleared if value inputted
78;               Set if user cancellation
[57]79;   Corrupts registers:
80;       AX, BX, CX, SI, DI, ES
81;--------------------------------------------------------------------
[592]82Menuitem_ActivateHexInputForMenuitemInDSSI:
83    mov     bl, 16
84    SKIP2B  ax
[57]85Menuitem_ActivateUnsignedInputForMenuitemInDSSI:
[592]86    mov     bl, 10
87
[107]88    call    Registers_CopyDSSItoESDI
[602]89    mov     cl, WORD_DIALOG_IO_size
90    call    Memory_ReserveCLbytesFromStackToDSSI
[57]91    call    InitializeDialogInputInDSSIfromMenuitemInESDI
[592]92    mov     [si+WORD_DIALOG_IO.bNumericBase], bl
93    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.wMinValue]
[57]94    mov     [si+WORD_DIALOG_IO.wMin], ax
[592]95    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.wMaxValue]
[57]96    mov     [si+WORD_DIALOG_IO.wMax], ax
97    push    di
98    CALL_MENU_LIBRARY GetWordWithIoInDSSI
99    pop     di
100
[286]101    mov     cl, [si+WORD_DIALOG_IO.bUserCancellation]
102    cmp     cl, TRUE
[57]103    je      SHORT .NothingToChange
104    mov     ax, [si+WORD_DIALOG_IO.wReturnWord]
[107]105    call    Registers_CopyESDItoDSSI
[57]106    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
107.NothingToChange:
108    add     sp, BYTE WORD_DIALOG_IO_size
[286]109    shr     cl, 1
[57]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:
[592]125    mov     ax, [es:di+MENUITEM.itemValue+ITEM_VALUE.szDialogTitle]
[57]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:
[108]139;       AX:     Value or multichoice selection to store
[57]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:
[592]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).
[293]151    eMOVZX  bx, [si+MENUITEM.bType]
[57]152    cmp     bl, TYPE_MENUITEM_HEX
[592]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
[57]160    ja      SHORT .InvalidItemType
161
[59]162    call    GetConfigurationBufferToESDIforMenuitemInDSSI
[57]163    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
[525]164
[592]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:
[369]170    pop     bx
[592]171.InvokeWriter:
172    jmp     bx              ; The Writer can freely corrupt BX
[525]173
[57]174ALIGN WORD_ALIGN
175.rgfnJumpToStoreValueBasedOnItemType:
[592]176;   dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGEBACK
177;   dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGENEXT
178;   dw      .InvalidItemType                                    ; TYPE_MENUITEM_ACTION
[108]179    dw      .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI    ; TYPE_MENUITEM_MULTICHOICE
[57]180    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_UNSIGNED
181    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_HEX
182
183;--------------------------------------------------------------------
[108]184; .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI
[57]185;   Parameters:
[108]186;       AX:     Multichoice selection (index)
[57]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
[108]196.StoreMultichoiceValueFromAXtoESDIwithItemInDSSI:
[286]197    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
198    jnz     SHORT .ClearBitsUsingMask
[57]199    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
[108]200    jz      SHORT .TranslateChoiceToValueUsingLookupTable
[57]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
[286]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
[108]222.TranslateChoiceToValueUsingLookupTable:
[199]223;
224; if the lookup pointer is NULL, no translation is needed
[293]225;
[199]226    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.rgwChoiceToValueLookup]
227    test    bx, bx
[603]228    jz      SHORT .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
[293]229
[592]230    eSHL_IM ax, 1           ; Shift for WORD lookup
[199]231    add     bx, ax
[57]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:
[286]249    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
250    jz      SHORT .StoreByteOrWord
[425]251    push    cx
252    mov     cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
253    shl     ax, cl
254    pop     cx
[286]255    or      [es:di], ax
256    jmp     SHORT .SetUnsavedChanges
257
258.StoreByteOrWord:
[57]259    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
260    jnz     SHORT .StoreByteFromAL
[286]261
[57]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:
[59]280    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
281    jnz     SHORT .NoUnsavedChangesForProgramVariables
[57]282    call    Buffers_SetUnsavedChanges
[59]283.NoUnsavedChangesForProgramVariables:
[57]284    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MODIFY_MENU
285    jnz     SHORT .ModifyItemVisibility
286    CALL_MENU_LIBRARY RefreshTitle
287    CALL_MENU_LIBRARY GetHighlightedItemToAX
[525]288    JMP_MENU_LIBRARY RefreshItemFromAX
[57]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:
[592]310;       Nothing
[57]311;--------------------------------------------------------------------
312ALIGN JUMP_ALIGN
313Menuitem_GetValueToAXfromMenuitemInDSSI:
[625]314; Note! Changes to this procedure might require changes to
315; ReadRamVars in ConfigurationMenu.asm as well!
[59]316    push    es
317    push    di
[199]318    push    bx
[59]319    call    GetConfigurationBufferToESDIforMenuitemInDSSI
320    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
321    mov     ax, [es:di]
[199]322
[233]323    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
324    jz      SHORT .NoConvertWordToByteValue
[592]325    xor     ah, ah          ; conversion needs to happen before call to the reader,
326                            ; in case the reader unpacks the byte to a word
[293]327
[233]328.NoConvertWordToByteValue:
[199]329    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.fnValueReader]
330    test    bx,bx
331    jz      SHORT .NoReader
332
[592]333    call    bx              ; The Reader can freely corrupt BX, DI and ES
[199]334
[293]335.NoReader:
[199]336    pop     bx
[59]337    pop     di
338    pop     es
339
[286]340    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
341    jz      SHORT .TestIfFlagValue
[425]342
[286]343    and     ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
[425]344    push    cx
345    mov     cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
346    shr     ax, cl
347    pop     cx
[286]348    ret
349
350.TestIfFlagValue:
[181]351    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
352    jz      SHORT .Return
[57]353
354    test    ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
[181]355    mov     ax, TRUE<<1     ; Shift for lookup
356    jnz     SHORT .Return
[57]357    xor     ax, ax
[233]358
[181]359ALIGN JUMP_ALIGN, ret
360.Return:
[57]361    ret
[59]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
[567]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.