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

Last change on this file since 619 was 603, checked in by Krister Nordvall, 4 years ago

Changes:

  • Fixed a bug in Strings.asm from r589 where building the BIOS without MODULE_STRINGS_COMPRESSED would fail. Also removed a redundant CR to save a byte when building without MODULE_STRINGS_COMPRESSED.
  • Optimized the code in MODULE_HOTKEYS to reduce ROM space usage, stack usage and time spent in the user timer tick interrupt handler (1Ch). I hope this will fix the problem with hangs introduced in r599.
File size: 11.7 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
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 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:
[59]314 push es
315 push di
[199]316 push bx
[59]317 call GetConfigurationBufferToESDIforMenuitemInDSSI
318 add di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
319 mov ax, [es:di]
[199]320
[233]321 test BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
322 jz SHORT .NoConvertWordToByteValue
[592]323 xor ah, ah ; conversion needs to happen before call to the reader,
324 ; in case the reader unpacks the byte to a word
[293]325
[233]326.NoConvertWordToByteValue:
[199]327 mov bx, [si+MENUITEM.itemValue+ITEM_VALUE.fnValueReader]
328 test bx,bx
329 jz SHORT .NoReader
330
[592]331 call bx ; The Reader can freely corrupt BX, DI and ES
[199]332
[293]333.NoReader:
[199]334 pop bx
[59]335 pop di
336 pop es
337
[286]338 test BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
339 jz SHORT .TestIfFlagValue
[425]340
[286]341 and ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
[425]342 push cx
343 mov cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
344 shr ax, cl
345 pop cx
[286]346 ret
347
348.TestIfFlagValue:
[181]349 test BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
350 jz SHORT .Return
[57]351
352 test ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
[181]353 mov ax, TRUE<<1 ; Shift for lookup
354 jnz SHORT .Return
[57]355 xor ax, ax
[233]356
[181]357ALIGN JUMP_ALIGN, ret
358.Return:
[57]359 ret
[59]360
361
362;--------------------------------------------------------------------
363; GetConfigurationBufferToESDIforMenuitemInDSSI
364; Parameters:
365; DS:SI: Ptr to MENUITEM
366; Returns:
367; ES:DI: Ptr to configuration buffer
368; Corrupts registers:
369; Nothing
370;--------------------------------------------------------------------
371ALIGN JUMP_ALIGN
372GetConfigurationBufferToESDIforMenuitemInDSSI:
373 test BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
374 jnz SHORT .ReturnCfgvarsInESDI
375 jmp Buffers_GetFileBufferToESDI
376ALIGN JUMP_ALIGN
377.ReturnCfgvarsInESDI:
378 push cs
379 pop es
380 mov di, g_cfgVars
381 ret
[567]382
383
384;--------------------------------------------------------------------
385; EnableMenuitemFromCSBX
386; DisableMenuitemFromCSBX
387; Parameters:
388; CS:BX: Ptr to MENUITEM
389; Returns:
390; Nothing
391; Corrupts registers:
392; Nothing
393;--------------------------------------------------------------------
394ALIGN JUMP_ALIGN
395EnableMenuitemFromCSBX:
396 or BYTE [cs:bx+MENUITEM.bFlags], FLG_MENUITEM_VISIBLE
397 ret
398
399ALIGN JUMP_ALIGN
400DisableMenuitemFromCSBX:
401 and BYTE [cs:bx+MENUITEM.bFlags], ~FLG_MENUITEM_VISIBLE
402 ret
Note: See TracBrowser for help on using the repository browser.