source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/MenuitemPrint.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: 7.9 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, BYTE [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 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
260FinishPrintingUnsignedOrHexValue:
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.