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

Last change on this file since 505 was 425, checked in by aitotat, 12 years ago

Changes to Configurator v2:

  • User defined LBA minimum is restored to 16 million sectors.
  • P-CHS to L-CHS translation method can now be chosen.
File size: 11.2 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-2012 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    cmp     ax, BYTE NO_ITEM_SELECTED
62    je      SHORT .NothingToChange
63    call    Registers_CopyESDItoDSSI
64    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
65.NothingToChange:
66    add     sp, BYTE DIALOG_INPUT_size
67    ret
68
69
70;--------------------------------------------------------------------
71; Menuitem_ActivateHexInputForMenuitemInDSSI
72;   Parameters:
73;       DS:SI:  Ptr to MENUITEM
74;   Returns:
75;       Nothing
76;   Corrupts registers:
77;       AX, BX, CX, SI, DI, ES
78;--------------------------------------------------------------------
79ALIGN JUMP_ALIGN
80Menuitem_ActivateHexInputForMenuitemInDSSI:
81    call    Registers_CopyDSSItoESDI
82
83    mov     cx, WORD_DIALOG_IO_size
84    call    Memory_ReserveCXbytesFromStackToDSSI
85    call    InitializeDialogInputInDSSIfromMenuitemInESDI
86    mov     BYTE [si+WORD_DIALOG_IO.bNumericBase], 16
87    jmp     SHORT ContinueWordInput
88
89;--------------------------------------------------------------------
90; Menuitem_ActivateUnsignedInputForMenuitemInDSSI
91;   Parameters:
92;       DS:SI:  Ptr to MENUITEM
93;   Returns:
94;       CF:     Cleared if value inputted
95;               Set if user cancellation
96;   Corrupts registers:
97;       AX, BX, CX, SI, DI, ES
98;--------------------------------------------------------------------
99ALIGN JUMP_ALIGN
100Menuitem_ActivateUnsignedInputForMenuitemInDSSI:
101    call    Registers_CopyDSSItoESDI
102
103    mov     cx, WORD_DIALOG_IO_size
104    call    Memory_ReserveCXbytesFromStackToDSSI
105    call    InitializeDialogInputInDSSIfromMenuitemInESDI
106    mov     BYTE [si+WORD_DIALOG_IO.bNumericBase], 10
107ContinueWordInput:
108    mov     ax, [es:di+MENUITEM.itemValue + ITEM_VALUE.wMinValue]
109    mov     [si+WORD_DIALOG_IO.wMin], ax
110    mov     ax, [es:di+MENUITEM.itemValue + ITEM_VALUE.wMaxValue]
111    mov     [si+WORD_DIALOG_IO.wMax], ax
112    push    di
113    CALL_MENU_LIBRARY GetWordWithIoInDSSI
114    pop     di
115
116    mov     cl, [si+WORD_DIALOG_IO.bUserCancellation]
117    cmp     cl, TRUE
118    je      SHORT .NothingToChange
119    mov     ax, [si+WORD_DIALOG_IO.wReturnWord]
120    call    Registers_CopyESDItoDSSI
121    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
122.NothingToChange:
123    add     sp, BYTE WORD_DIALOG_IO_size
124    shr     cl, 1
125    ret
126
127
128;--------------------------------------------------------------------
129; InitializeDialogInputInDSSIfromMenuitemInESDI
130;   Parameters:
131;       DS:SI:  Ptr to DIALOG_INPUT
132;       ES:DI:  Ptr to MENUITEM
133;   Returns:
134;       Nothing
135;   Corrupts registers:
136;       AX
137;--------------------------------------------------------------------
138ALIGN JUMP_ALIGN
139InitializeDialogInputInDSSIfromMenuitemInESDI:
140    mov     ax, [es:di+MENUITEM.itemValue + ITEM_VALUE.szDialogTitle]
141    mov     [si+DIALOG_INPUT.fszTitle], ax
142    mov     [si+DIALOG_INPUT.fszTitle+2], cs
143
144    mov     [si+DIALOG_INPUT.fszItems+2], cs
145
146    mov     ax, [es:di+MENUITEM.szQuickInfo]
147    mov     [si+DIALOG_INPUT.fszInfo], ax
148    mov     [si+DIALOG_INPUT.fszInfo+2], cs
149    ret
150
151;--------------------------------------------------------------------
152; Menuitem_StoreValueFromAXtoMenuitemInDSSI
153;   Parameters:
154;       AX:     Value or multichoice selection to store
155;       DS:SI:  Ptr to MENUITEM
156;       SS:BP:  Menu handle
157;   Returns:
158;       Nothing
159;   Corrupts registers:
160;       AX, BX, DI, ES
161;--------------------------------------------------------------------
162ALIGN JUMP_ALIGN
163Menuitem_StoreValueFromAXtoMenuitemInDSSI:
164    eMOVZX  bx, [si+MENUITEM.bType]
165    cmp     bl, TYPE_MENUITEM_HEX
166    ja      SHORT .InvalidItemType
167
168    call    GetConfigurationBufferToESDIforMenuitemInDSSI
169    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
170       
171    push    bx
172    mov     bx,[si+MENUITEM.itemValue+ITEM_VALUE.fnValueWriter]
173    test    bx,bx
174    jz      SHORT .NoWriter
175    call    bx
176.NoWriter:
177    pop     bx
178       
179    jmp     [cs:bx+.rgfnJumpToStoreValueBasedOnItemType]
180.InvalidItemType:
181    ret
182
183ALIGN WORD_ALIGN
184.rgfnJumpToStoreValueBasedOnItemType:
185    dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGEBACK
186    dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGENEXT
187    dw      .InvalidItemType                                    ; TYPE_MENUITEM_ACTION
188    dw      .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI    ; TYPE_MENUITEM_MULTICHOICE
189    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_UNSIGNED
190    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_HEX
191
192;--------------------------------------------------------------------
193; .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI
194;   Parameters:
195;       AX:     Multichoice selection (index)
196;       DS:SI:  Ptr to MENUITEM
197;       ES:DI:  Ptr to value variable
198;       SS:BP:  Menu handle
199;   Returns:
200;       Nothing
201;   Corrupts registers:
202;       AX, BX, DI
203;--------------------------------------------------------------------
204ALIGN JUMP_ALIGN
205.StoreMultichoiceValueFromAXtoESDIwithItemInDSSI:
206    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
207    jnz     SHORT .ClearBitsUsingMask
208    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
209    jz      SHORT .TranslateChoiceToValueUsingLookupTable
210
211    test    ax, ax          ; Setting item flag?
212    mov     ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
213    jnz     SHORT .SetFlagFromAX
214    not     ax
215    and     [es:di], ax     ; Clear flag
216    jmp     SHORT .SetUnsavedChanges
217ALIGN JUMP_ALIGN
218.SetFlagFromAX:
219    or      [es:di], ax
220    jmp     SHORT .SetUnsavedChanges
221
222ALIGN JUMP_ALIGN
223.ClearBitsUsingMask:
224    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
225    not     bx
226    and     [es:di], bx
227    ; Fall to .TranslateChoiceToValueUsingLookupTable
228
229
230ALIGN JUMP_ALIGN
231.TranslateChoiceToValueUsingLookupTable:
232;
233; if the lookup pointer is NULL, no translation is needed
234;
235    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.rgwChoiceToValueLookup]
236    test    bx, bx
237    jz      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
238
239    shl     ax, 1           ; Shift for WORD lookup
240    add     bx, ax
241    mov     ax, [bx]        ; Lookup complete
242    ; Fall to .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
243
244;--------------------------------------------------------------------
245; .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
246;   Parameters:
247;       AX:     Value to store
248;       DS:SI:  Ptr to MENUITEM
249;       ES:DI:  Ptr to value variable
250;       SS:BP:  Menu handle
251;   Returns:
252;       Nothing
253;   Corrupts registers:
254;       AX, DI
255;--------------------------------------------------------------------
256ALIGN JUMP_ALIGN
257.StoreByteOrWordValueFromAXtoESDIwithItemInDSSI:
258    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
259    jz      SHORT .StoreByteOrWord
260    push    cx
261    mov     cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
262    shl     ax, cl
263    pop     cx
264    or      [es:di], ax
265    jmp     SHORT .SetUnsavedChanges
266
267.StoreByteOrWord:
268    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
269    jnz     SHORT .StoreByteFromAL
270
271    mov     [es:di+1], ah
272ALIGN JUMP_ALIGN
273.StoreByteFromAL:
274    mov     [es:di], al
275    ; Fall to .SetUnsavedChanges
276
277;--------------------------------------------------------------------
278; .SetUnsavedChanges
279;   Parameters:
280;       DS:SI:  Ptr to MENUITEM
281;       SS:BP:  Menu handle
282;   Returns:
283;       Nothing
284;   Corrupts registers:
285;       AX, DI
286;--------------------------------------------------------------------
287ALIGN JUMP_ALIGN
288.SetUnsavedChanges:
289    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
290    jnz     SHORT .NoUnsavedChangesForProgramVariables
291    call    Buffers_SetUnsavedChanges
292.NoUnsavedChangesForProgramVariables:
293    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MODIFY_MENU
294    jnz     SHORT .ModifyItemVisibility
295    CALL_MENU_LIBRARY RefreshTitle
296    CALL_MENU_LIBRARY GetHighlightedItemToAX
297    CALL_MENU_LIBRARY RefreshItemFromAX
298    ret
299
300ALIGN JUMP_ALIGN
301.ModifyItemVisibility:
302    push    es
303    push    ds
304    ePUSHA
305    call    Menupage_GetActiveMenupageToDSDI
306    call    [di+MENUPAGE.fnEnter]
307    ePOPA
308    pop     ds
309    pop     es
310    ret
311
312
313;--------------------------------------------------------------------
314; Menuitem_GetValueToAXfromMenuitemInDSSI
315;   Parameters:
316;       DS:SI:  Ptr to MENUITEM
317;   Returns:
318;       AX:     Menuitem value
319;   Corrupts registers:
320;       BX
321;--------------------------------------------------------------------
322ALIGN JUMP_ALIGN
323Menuitem_GetValueToAXfromMenuitemInDSSI:
324    push    es
325    push    di
326    push    bx
327    call    GetConfigurationBufferToESDIforMenuitemInDSSI
328    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
329    mov     ax, [es:di]
330
331    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
332    jz      SHORT .NoConvertWordToByteValue
333    xor     ah, ah              ; conversion needs to happen before call to the reader,
334                                ; in case the reader unpacks the byte to a word
335
336.NoConvertWordToByteValue:
337    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.fnValueReader]
338    test    bx,bx
339    jz      SHORT .NoReader
340
341    call    bx
342
343.NoReader:
344    pop     bx
345    pop     di
346    pop     es
347
348    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MASKVALUE
349    jz      SHORT .TestIfFlagValue
350
351    and     ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
352    push    cx
353    mov     cl, [si+MENUITEM.itemValue+ITEM_VALUE.bFieldPosition]
354    shr     ax, cl
355    pop     cx
356    ret
357
358.TestIfFlagValue:
359    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
360    jz      SHORT .Return
361
362    test    ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
363    mov     ax, TRUE<<1     ; Shift for lookup
364    jnz     SHORT .Return
365    xor     ax, ax
366
367ALIGN JUMP_ALIGN, ret
368.Return:
369    ret
370
371
372;--------------------------------------------------------------------
373; GetConfigurationBufferToESDIforMenuitemInDSSI
374;   Parameters:
375;       DS:SI:  Ptr to MENUITEM
376;   Returns:
377;       ES:DI:  Ptr to configuration buffer
378;   Corrupts registers:
379;       Nothing
380;--------------------------------------------------------------------
381ALIGN JUMP_ALIGN
382GetConfigurationBufferToESDIforMenuitemInDSSI:
383    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
384    jnz     SHORT .ReturnCfgvarsInESDI
385    jmp     Buffers_GetFileBufferToESDI
386ALIGN JUMP_ALIGN
387.ReturnCfgvarsInESDI:
388    push    cs
389    pop     es
390    mov     di, g_cfgVars
391    ret
Note: See TracBrowser for help on using the repository browser.