source: xtideuniversalbios/tags/Configurator_for_v2.0.0_beta1/Src/MenuitemPrint.asm@ 502

Last change on this file since 502 was 293, checked in by krille_n_@…, 12 years ago

Commit 1/2 (Library, Configurators and Serial Server):

  • Changed Emulate.inc so that making 286 and 386 versions now works. Additionally, only one processor type define is needed in the makefile.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 8.0 KB
Line 
1; Project name : XTIDE Universal BIOS Configurator v2
2; Description : Functions for printing MENUITEM name and value.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; MenuitemPrint_PrintQuickInfoFromDSSI
9; Parameters:
10; DS:SI: Ptr to MENUITEM
11; Returns:
12; Nothing
13; Corrupts registers:
14; AX, DI
15;--------------------------------------------------------------------
16ALIGN JUMP_ALIGN
17MenuitemPrint_PrintQuickInfoFromDSSI:
18 push si
19
20 mov si, [si+MENUITEM.szQuickInfo]
21 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
22
23 pop si
24 ret
25
26
27;--------------------------------------------------------------------
28; MenuitemPrint_NameWithPossibleValueFromDSSI
29; Parameters:
30; DS:SI: Ptr to MENUITEM
31; Returns:
32; Nothing
33; Corrupts registers:
34; AX, BX, DX, DI
35;--------------------------------------------------------------------
36ALIGN JUMP_ALIGN
37MenuitemPrint_NameWithPossibleValueFromDSSI:
38 eMOVZX bx, [si+MENUITEM.bType]
39 cmp bl, TYPE_MENUITEM_ACTION
40 ja SHORT .PrintNameAndValueFromDSSI
41 ; Fall to .PrintNameWithoutValueFromDSSI
42
43;--------------------------------------------------------------------
44; .PrintNameWithoutValueFromDSSI
45; Parameters:
46; BX: Menuitem type (MENUITEM.bType)
47; DS:SI: Ptr to MENUITEM
48; Returns:
49; Nothing
50; Corrupts registers:
51; AX, DI
52;--------------------------------------------------------------------
53.PrintNameWithoutValueFromDSSI:
54 push bp
55 push si
56
57 mov bp, sp ; BP = SP before pushing parameters
58 push WORD [cs:bx+.rgwMenuitemTypeCharacter]
59 push WORD [si+MENUITEM.szName]
60 mov si, g_szFormatItemWithoutValue
61 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
62
63 pop si
64 pop bp
65 ret
66.rgwMenuitemTypeCharacter:
67 dw '-' ; TYPE_MENUITEM_PAGEBACK
68 dw '+' ; TYPE_MENUITEM_PAGENEXT
69 dw '*' ; TYPE_MENUITEM_ACTION
70
71
72;--------------------------------------------------------------------
73; .PrintNameAndValueFromDSSI
74; Parameters:
75; DS:SI: Ptr to MENUITEM
76; SS:BP: Ptr to buffer for item value
77; Returns:
78; Nothing
79; Corrupts registers:
80; AX, BX, DX, DI
81;--------------------------------------------------------------------
82ALIGN JUMP_ALIGN
83.PrintNameAndValueFromDSSI:
84 eENTER_STRUCT MAX_VALUE_STRING_LENGTH+2 ; +2 for NULL and alignment
85 call .FormatValueStringFromItemInDSSItoBufferInSSBP
86 call .FormatNameFromItemInDSSIandValueFromSSBP
87 eLEAVE_STRUCT MAX_VALUE_STRING_LENGTH+2
88 ret
89
90;--------------------------------------------------------------------
91; .FormatValueStringFromItemInDSSItoBufferInSSBP
92; Parameters:
93; DS:SI: Ptr to MENUITEM
94; SS:BP: Ptr to buffer for item value
95; Returns:
96; Nothing
97; Corrupts registers:
98; AX, BX, DX, DI
99;--------------------------------------------------------------------
100ALIGN JUMP_ALIGN
101.FormatValueStringFromItemInDSSItoBufferInSSBP:
102 push es
103 call Registers_CopySSBPtoESDI
104 mov al, '['
105 stosb
106 call [si+MENUITEM.fnFormatValue]
107 mov ax, ']'
108 stosw ; Also terminate with NULL
109 pop es
110 ret
111
112;--------------------------------------------------------------------
113; .FormatNameFromItemInDSSIandValueFromSSBP
114; Parameters:
115; DS:SI: Ptr to MENUITEM
116; SS:BP: Ptr to value string
117; Returns:
118; Nothing
119; Corrupts registers:
120; AX, BX, DX
121;--------------------------------------------------------------------
122ALIGN JUMP_ALIGN
123.FormatNameFromItemInDSSIandValueFromSSBP:
124 push si
125
126 mov bx, bp
127 mov bp, sp ; BP = SP before pushing parameters
128 push WORD [si+MENUITEM.szName]
129 push bx
130 push ss
131 mov si, g_szFormatItemNameWithValue
132 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
133
134 mov bp, bx
135 pop si
136 ret
137
138
139;--------------------------------------------------------------------
140; MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI
141; MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
142; Parameters:
143; DS:SI: Ptr to MENUITEM
144; ES:DI: Ptr to destination buffer
145; Returns:
146; DI: Updated
147; Corrupts registers:
148; AX, BX, CX
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI:
152 call Menuitem_GetValueToAXfromMenuitemInDSSI
153 shl ax, 1
154 jmp SHORT PrintLookupValueFromAXtoBufferInESDI
155
156ALIGN JUMP_ALIGN
157MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI:
158MenuitemPrint_WriteLookupValueStringToBufferInESDIfromRawItemInDSSI:
159 call Menuitem_GetValueToAXfromMenuitemInDSSI
160 ; Fall to PrintLookupValueFromAXtoBufferInESDI
161
162;--------------------------------------------------------------------
163; MenuitemPrint_WriteLookupValueStringToBufferInESDIfromItemInDSSI
164; Parameters:
165; AX: Value to print
166; DS:SI: Ptr to MENUITEM
167; ES:DI: Ptr to destination buffer
168; Returns:
169; DI: Updated
170; Corrupts registers:
171; AX, BX, CX
172;--------------------------------------------------------------------
173ALIGN JUMP_ALIGN
174PrintLookupValueFromAXtoBufferInESDI:
175 push si
176 test byte [si+MENUITEM.bFlags], FLG_MENUITEM_CHOICESTRINGS
177 jnz .lookupChoice
178
179 add ax, [si+MENUITEM.itemValue+ITEM_VALUE.rgszValueToStringLookup]
180 xchg bx, ax
181.found:
182 mov si, [bx]
183.errorReturn:
184 call String_CopyDSSItoESDIandGetLengthToCX
185 pop si
186 ret
187
188;
189; With FLG_MENUITEM_CHOICESTRINGS, the array at .rgszChoiceToStringLookup is based on the
190; Choice number (offset within .rgwChoiceToValueLookup) instead of the value stored.
191; Here, we scan the .rgwChoiceToValueLookup array until we find the value there, and then
192; use the same offset in .rgszChoiceToStringLookup. If we don't find the value, we
193; return an "Error!" string instead.
194;
195; Note that the pointer array at .rgszChoiceToStringLookup must be NULL terminated. Since the
196; value could be zero, we don't use the .rgwChoiceToValueLookup array to find the end.
197;
198.lookupChoice:
199 mov bx,[si+MENUITEM.itemValue+ITEM_VALUE.rgszChoiceToStringLookup]
200 mov si,[si+MENUITEM.itemValue+ITEM_VALUE.rgwChoiceToValueLookup]
201
202.wordLoop:
203 cmp ax,[si]
204 jz .found
205 inc si
206 inc si
207 inc bx
208 inc bx
209 cmp word [bx],0
210 jnz .wordLoop
211
212 mov si,g_szValueUnknownError
213 jmp .errorReturn
214
215;--------------------------------------------------------------------
216; MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
217; Parameters:
218; DS:SI: Ptr to MENUITEM
219; ES:DI: Ptr to destination buffer
220; Returns:
221; DI: Updated
222; Corrupts registers:
223; AX, BX, CX
224;--------------------------------------------------------------------
225ALIGN JUMP_ALIGN
226MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI:
227 mov bx, di
228 mov cx, MAX_VALUE_STRING_LENGTH
229 CALL_DISPLAY_LIBRARY PushDisplayContext
230 CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXwithLengthInCX
231
232 call Menuitem_GetValueToAXfromMenuitemInDSSI
233 mov bx, 10
234 CALL_DISPLAY_LIBRARY PrintWordFromAXwithBaseInBX
235 jmp SHORT MenuitemPrint_FinishPrintingUnsignedOrHexValue
236
237;--------------------------------------------------------------------
238; MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI
239; Parameters:
240; DS:SI: Ptr to MENUITEM
241; ES:DI: Ptr to destination buffer
242; Returns:
243; DI: Updated
244; Corrupts registers:
245; AX, BX, CX
246;--------------------------------------------------------------------
247ALIGN JUMP_ALIGN
248MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI:
249 mov bx, di
250 mov cx, MAX_VALUE_STRING_LENGTH
251 CALL_DISPLAY_LIBRARY PushDisplayContext
252 CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXwithLengthInCX
253
254 call Menuitem_GetValueToAXfromMenuitemInDSSI
255 mov bx, 16
256 CALL_DISPLAY_LIBRARY PrintWordFromAXwithBaseInBX
257 mov al, 'h'
258 CALL_DISPLAY_LIBRARY PrintCharacterFromAL
259ALIGN JUMP_ALIGN
260MenuitemPrint_FinishPrintingUnsignedOrHexValue:
261 CALL_DISPLAY_LIBRARY GetCharacterPointerToBXAX
262 xchg bx, ax
263
264 CALL_DISPLAY_LIBRARY PopDisplayContext
265 mov di, bx
266 ret
267
268
269; Section containing initialized data
270SECTION .data
271
272ALIGN WORD_ALIGN
273g_rgszValueToStringLookupForFlagBooleans:
274 dw g_szNo
275 dw g_szYes
Note: See TracBrowser for help on using the repository browser.