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

Last change on this file since 242 was 233, checked in by gregli@…, 12 years ago

Serial Port: split single byte port and baud into two bytes, taking advantage of the two bytes in DPT_SERIAL, which supports more serial baud rates and in particular fixed a bug where a 4x client machine couldn't talk to a 115.2K server machine. This is a wide change, touching lots of files, but most are shallow changes. DetectPrint.asm took the most significant changes, now it calculates the baud rate to display instead of using characters provided by the Configurator. The Configurator now has a new menu flag, FLG_MENUITEM_CHOICESTRINGS, for specifying that values are not linear and they should be lookedup rather than indexed. Finally, another important bug fixed here is that in some error cases, the serial port code could get into an infinite loop waiting ont the hardware; now it has a timeout.

File size: 9.7 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   Functions for accessing MENUITEM structs.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Menuitem_DisplayHelpMessageFromDSSI
9;   Parameters:
10;       DS:SI:  Ptr to MENUITEM
11;   Returns:
12;       Nothing
13;   Corrupts registers:
14;       AX, DX, DI
15;--------------------------------------------------------------------
16ALIGN JUMP_ALIGN
17Menuitem_DisplayHelpMessageFromDSSI:
18    mov     di, [si+MENUITEM.szName]
19    mov     dx, [si+MENUITEM.szHelp]
20    jmp     Dialogs_DisplayHelpFromCSDXwithTitleInCSDI
21
22
23;--------------------------------------------------------------------
24; Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
25;   Parameters:
26;       DS:SI:  Ptr to MENUITEM
27;   Returns:
28;       Nothing
29;   Corrupts registers:
30;       AX, BX, CX, SI, DI, ES
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI:
34    call    Registers_CopyDSSItoESDI
35
36    mov     cx, DIALOG_INPUT_size
37    call    Memory_ReserveCXbytesFromStackToDSSI
38    call    InitializeDialogInputInDSSIfromMenuitemInESDI
39    mov     ax, [es:di+MENUITEM.itemValue + ITEM_VALUE.szMultichoice]
40    mov     [si+DIALOG_INPUT.fszItems], ax
41    push    di
42    CALL_MENU_LIBRARY GetSelectionToAXwithInputInDSSI
43    pop     di
44
45    cmp     ax, BYTE NO_ITEM_SELECTED
46    je      SHORT .NothingToChange
47    call    Registers_CopyESDItoDSSI
48    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
49.NothingToChange:
50    add     sp, BYTE DIALOG_INPUT_size
51    ret
52
53
54;--------------------------------------------------------------------
55; Menuitem_ActivateHexInputForMenuitemInDSSI
56;   Parameters:
57;       DS:SI:  Ptr to MENUITEM
58;   Returns:
59;       Nothing
60;   Corrupts registers:
61;       AX, BX, CX, SI, DI, ES
62;--------------------------------------------------------------------
63ALIGN JUMP_ALIGN
64Menuitem_ActivateHexInputForMenuitemInDSSI:
65    call    Registers_CopyDSSItoESDI
66
67    mov     cx, WORD_DIALOG_IO_size
68    call    Memory_ReserveCXbytesFromStackToDSSI
69    call    InitializeDialogInputInDSSIfromMenuitemInESDI
70    mov     BYTE [si+WORD_DIALOG_IO.bNumericBase], 16
71    jmp     SHORT ContinueWordInput
72
73;--------------------------------------------------------------------
74; Menuitem_ActivateUnsignedInputForMenuitemInDSSI
75;   Parameters:
76;       DS:SI:  Ptr to MENUITEM
77;   Returns:
78;       Nothing
79;   Corrupts registers:
80;       AX, BX, CX, SI, DI, ES
81;--------------------------------------------------------------------
82ALIGN JUMP_ALIGN
83Menuitem_ActivateUnsignedInputForMenuitemInDSSI:
84    call    Registers_CopyDSSItoESDI
85
86    mov     cx, WORD_DIALOG_IO_size
87    call    Memory_ReserveCXbytesFromStackToDSSI
88    call    InitializeDialogInputInDSSIfromMenuitemInESDI
89    mov     BYTE [si+WORD_DIALOG_IO.bNumericBase], 10
90ContinueWordInput:
91    mov     ax, [es:di+MENUITEM.itemValue + ITEM_VALUE.wMinValue]
92    mov     [si+WORD_DIALOG_IO.wMin], ax
93    mov     ax, [es:di+MENUITEM.itemValue + ITEM_VALUE.wMaxValue]
94    mov     [si+WORD_DIALOG_IO.wMax], ax
95    push    di
96    CALL_MENU_LIBRARY GetWordWithIoInDSSI
97    pop     di
98
99    cmp     BYTE [si+WORD_DIALOG_IO.bUserCancellation], TRUE
100    je      SHORT .NothingToChange
101    mov     ax, [si+WORD_DIALOG_IO.wReturnWord]
102    call    Registers_CopyESDItoDSSI
103    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
104.NothingToChange:
105    add     sp, BYTE WORD_DIALOG_IO_size
106    ret
107
108
109;--------------------------------------------------------------------
110; InitializeDialogInputInDSSIfromMenuitemInESDI
111;   Parameters:
112;       DS:SI:  Ptr to DIALOG_INPUT
113;       ES:DI:  Ptr to MENUITEM
114;   Returns:
115;       Nothing
116;   Corrupts registers:
117;       AX
118;--------------------------------------------------------------------
119ALIGN JUMP_ALIGN
120InitializeDialogInputInDSSIfromMenuitemInESDI:
121    mov     ax, [es:di+MENUITEM.itemValue + ITEM_VALUE.szDialogTitle]
122    mov     [si+DIALOG_INPUT.fszTitle], ax
123    mov     [si+DIALOG_INPUT.fszTitle+2], cs
124
125    mov     [si+DIALOG_INPUT.fszItems+2], cs
126
127    mov     ax, [es:di+MENUITEM.szQuickInfo]
128    mov     [si+DIALOG_INPUT.fszInfo], ax
129    mov     [si+DIALOG_INPUT.fszInfo+2], cs
130    ret
131
132;--------------------------------------------------------------------
133; Menuitem_StoreValueFromAXtoMenuitemInDSSI
134;   Parameters:
135;       AX:     Value or multichoice selection to store
136;       DS:SI:  Ptr to MENUITEM
137;       SS:BP:  Menu handle
138;   Returns:
139;       Nothing
140;   Corrupts registers:
141;       AX, BX, DI, ES
142;--------------------------------------------------------------------
143ALIGN JUMP_ALIGN
144Menuitem_StoreValueFromAXtoMenuitemInDSSI:
145    eMOVZX  bx, BYTE [si+MENUITEM.bType]
146    cmp     bl, TYPE_MENUITEM_HEX
147    ja      SHORT .InvalidItemType
148
149    call    GetConfigurationBufferToESDIforMenuitemInDSSI
150    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
151    jmp     [cs:bx+.rgfnJumpToStoreValueBasedOnItemType]
152
153ALIGN WORD_ALIGN
154.rgfnJumpToStoreValueBasedOnItemType:
155    dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGEBACK
156    dw      .InvalidItemType                                    ; TYPE_MENUITEM_PAGENEXT
157    dw      .InvalidItemType                                    ; TYPE_MENUITEM_ACTION
158    dw      .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI    ; TYPE_MENUITEM_MULTICHOICE
159    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_UNSIGNED
160    dw      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI     ; TYPE_MENUITEM_HEX
161
162;--------------------------------------------------------------------
163; .StoreMultichoiceValueFromAXtoESDIwithItemInDSSI
164;   Parameters:
165;       AX:     Multichoice selection (index)
166;       DS:SI:  Ptr to MENUITEM
167;       ES:DI:  Ptr to value variable
168;       SS:BP:  Menu handle
169;   Returns:
170;       Nothing
171;   Corrupts registers:
172;       AX, BX, DI
173;--------------------------------------------------------------------
174ALIGN JUMP_ALIGN
175.StoreMultichoiceValueFromAXtoESDIwithItemInDSSI:
176    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
177    jz      SHORT .TranslateChoiceToValueUsingLookupTable
178
179    test    ax, ax          ; Setting item flag?
180    mov     ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
181    jnz     SHORT .SetFlagFromAX
182    not     ax
183    and     [es:di], ax     ; Clear flag
184    jmp     SHORT .SetUnsavedChanges
185ALIGN JUMP_ALIGN
186.SetFlagFromAX:
187    or      [es:di], ax
188    jmp     SHORT .SetUnsavedChanges
189
190ALIGN JUMP_ALIGN
191.TranslateChoiceToValueUsingLookupTable:
192;
193; if the lookup pointer is NULL, no translation is needed
194; 
195    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.rgwChoiceToValueLookup]
196    test    bx, bx
197    jz      .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
198       
199    shl     ax, 1           ; Shift for WORD lookup
200    add     bx, ax
201    mov     ax, [bx]        ; Lookup complete
202    ; Fall to .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
203
204;--------------------------------------------------------------------
205; .StoreByteOrWordValueFromAXtoESDIwithItemInDSSI
206;   Parameters:
207;       AX:     Value to store
208;       DS:SI:  Ptr to MENUITEM
209;       ES:DI:  Ptr to value variable
210;       SS:BP:  Menu handle
211;   Returns:
212;       Nothing
213;   Corrupts registers:
214;       AX, DI
215;--------------------------------------------------------------------
216ALIGN JUMP_ALIGN
217.StoreByteOrWordValueFromAXtoESDIwithItemInDSSI:
218    push    bx
219    mov     bx,[si+MENUITEM.itemValue+ITEM_VALUE.fnValueWriter]
220    test    bx,bx
221    jz      SHORT .NoWriter 
222
223    call    bx     
224
225.NoWriter:
226    pop     bx
227    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
228    jnz     SHORT .StoreByteFromAL
229       
230    mov     [es:di+1], ah
231ALIGN JUMP_ALIGN
232.StoreByteFromAL:
233    mov     [es:di], al
234    ; Fall to .SetUnsavedChanges
235
236;--------------------------------------------------------------------
237; .SetUnsavedChanges
238;   Parameters:
239;       DS:SI:  Ptr to MENUITEM
240;       SS:BP:  Menu handle
241;   Returns:
242;       Nothing
243;   Corrupts registers:
244;       AX, DI
245;--------------------------------------------------------------------
246ALIGN JUMP_ALIGN
247.SetUnsavedChanges:
248    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
249    jnz     SHORT .NoUnsavedChangesForProgramVariables
250    call    Buffers_SetUnsavedChanges
251.NoUnsavedChangesForProgramVariables:
252    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_MODIFY_MENU
253    jnz     SHORT .ModifyItemVisibility
254    CALL_MENU_LIBRARY RefreshTitle
255    CALL_MENU_LIBRARY GetHighlightedItemToAX
256    CALL_MENU_LIBRARY RefreshItemFromAX
257.InvalidItemType:
258    ret
259
260ALIGN JUMP_ALIGN
261.ModifyItemVisibility:
262    push    es
263    push    ds
264    ePUSHA
265    call    Menupage_GetActiveMenupageToDSDI
266    call    [di+MENUPAGE.fnEnter]
267    ePOPA
268    pop     ds
269    pop     es
270    ret
271
272
273;--------------------------------------------------------------------
274; Menuitem_GetValueToAXfromMenuitemInDSSI
275;   Parameters:
276;       DS:SI:  Ptr to MENUITEM
277;   Returns:
278;       AX:     Menuitem value
279;   Corrupts registers:
280;       BX
281;--------------------------------------------------------------------
282ALIGN JUMP_ALIGN
283Menuitem_GetValueToAXfromMenuitemInDSSI:
284    push    es
285    push    di
286    push    bx
287    call    GetConfigurationBufferToESDIforMenuitemInDSSI
288    add     di, [si+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]
289    mov     ax, [es:di]
290
291    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_BYTEVALUE
292    jz      SHORT .NoConvertWordToByteValue
293    xor     ah, ah              ; conversion needs to happen before call to the reader,
294                                ; in case the reader unpacks the byte to a word
295       
296.NoConvertWordToByteValue:
297    mov     bx, [si+MENUITEM.itemValue+ITEM_VALUE.fnValueReader]
298    test    bx,bx
299    jz      SHORT .NoReader
300
301    call    bx
302
303.NoReader:     
304    pop     bx
305    pop     di
306    pop     es
307
308    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_FLAGVALUE
309    jz      SHORT .Return
310
311    test    ax, [si+MENUITEM.itemValue+ITEM_VALUE.wValueBitmask]
312    mov     ax, TRUE<<1     ; Shift for lookup
313    jnz     SHORT .Return
314    xor     ax, ax
315
316ALIGN JUMP_ALIGN, ret
317.Return:
318    ret
319
320
321;--------------------------------------------------------------------
322; GetConfigurationBufferToESDIforMenuitemInDSSI
323;   Parameters:
324;       DS:SI:  Ptr to MENUITEM
325;   Returns:
326;       ES:DI:  Ptr to configuration buffer
327;   Corrupts registers:
328;       Nothing
329;--------------------------------------------------------------------
330ALIGN JUMP_ALIGN
331GetConfigurationBufferToESDIforMenuitemInDSSI:
332    test    BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_PROGRAMVAR
333    jnz     SHORT .ReturnCfgvarsInESDI
334    jmp     Buffers_GetFileBufferToESDI
335ALIGN JUMP_ALIGN
336.ReturnCfgvarsInESDI:
337    push    cs
338    pop     es
339    mov     di, g_cfgVars
340    ret
Note: See TracBrowser for help on using the repository browser.