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

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

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

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