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

Last change on this file since 628 was 625, checked in by Krister Nordvall, 17 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.