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

Last change on this file since 592 was 592, checked in by krille_n_, 6 years ago

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
File size: 11.7 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-2013 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     cx, DIALOG_INPUT_size
53    call    Memory_ReserveCXbytesFromStackToDSSI
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     cx, WORD_DIALOG_IO_size
90    call    Memory_ReserveCXbytesFromStackToDSSI
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      .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    push    es
315    push    di
316    push    bx
317    call    GetConfigurationBufferToESDIforMenuitemInDSSI
318    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
319    mov     ax, [es:di]
320
321    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
322    jz      SHORT .NoConvertWordToByteValue
323    xor     ah, ah          ; conversion needs to happen before call to the reader,
324                            ; in case the reader unpacks the byte to a word
325
326.NoConvertWordToByteValue:
327    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.fnValueReader]
328    test    bx,bx
329    jz      SHORT .NoReader
330
331    call    bx              ; The Reader can freely corrupt BX, DI and ES
332
333.NoReader:
334    pop     bx
335    pop     di
336    pop     es
337
338    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
339    jz      SHORT .TestIfFlagValue
340
341    and     ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
342    push    cx
343    mov     cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
344    shr     ax, cl
345    pop     cx
346    ret
347
348.TestIfFlagValue:
349    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
350    jz      SHORT .Return
351
352    test    ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
353    mov     ax, TRUE<<1     ; Shift for lookup
354    jnz     SHORT .Return
355    xor     ax, ax
356
357ALIGN JUMP_ALIGN, ret
358.Return:
359    ret
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
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.