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

Last change on this file since 603 was 603, checked in by krille_n_, 3 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.