source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/MenuitemPrint.asm@ 600

Last change on this file since 600 was 592, checked in by Krister Nordvall, 6 years ago

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
File size: 8.7 KB
Line 
1; Project name : XTIDE Universal BIOS Configurator v2
2; Description : Functions for printing MENUITEM name and value.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 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; MenuitemPrint_PrintQuickInfoFromDSSI
25; Parameters:
26; DS:SI: Ptr to MENUITEM
27; Returns:
28; Nothing
29; Corrupts registers:
30; AX, DI
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33MenuitemPrint_PrintQuickInfoFromDSSI:
34 push si
35
36 mov si, [si+MENUITEM.szQuickInfo]
37 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
38
39 pop si
40 ret
41
42
43;--------------------------------------------------------------------
44; MenuitemPrint_NameWithPossibleValueFromDSSI
45; Parameters:
46; DS:SI: Ptr to MENUITEM
47; Returns:
48; Nothing
49; Corrupts registers:
50; AX, BX, DX, DI
51;--------------------------------------------------------------------
52ALIGN JUMP_ALIGN
53MenuitemPrint_NameWithPossibleValueFromDSSI:
54 eMOVZX bx, [si+MENUITEM.bType]
55 cmp bl, TYPE_MENUITEM_ACTION
56 ja SHORT .PrintNameAndValueFromDSSI
57 ; Fall to .PrintNameWithoutValueFromDSSI
58
59;--------------------------------------------------------------------
60; .PrintNameWithoutValueFromDSSI
61; Parameters:
62; BX: Menuitem type (MENUITEM.bType)
63; DS:SI: Ptr to MENUITEM
64; Returns:
65; Nothing
66; Corrupts registers:
67; AX, DI
68;--------------------------------------------------------------------
69.PrintNameWithoutValueFromDSSI:
70 push bp
71 push si
72
73 mov bp, sp ; BP = SP before pushing parameters
74 push WORD [cs:bx+.rgwMenuitemTypeCharacter]
75 push WORD [si+MENUITEM.szName]
76 mov si, g_szFormatItemWithoutValue
77 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
78
79 pop si
80 pop bp
81 ret
82.rgwMenuitemTypeCharacter:
83 dw '-' ; TYPE_MENUITEM_PAGEBACK
84 dw '+' ; TYPE_MENUITEM_PAGENEXT
85 dw '*' ; TYPE_MENUITEM_ACTION
86
87
88;--------------------------------------------------------------------
89; .PrintNameAndValueFromDSSI
90; Parameters:
91; DS:SI: Ptr to MENUITEM
92; SS:BP: Ptr to buffer for item value
93; Returns:
94; Nothing
95; Corrupts registers:
96; AX, BX, DX, DI
97;--------------------------------------------------------------------
98ALIGN JUMP_ALIGN
99.PrintNameAndValueFromDSSI:
100 eENTER_STRUCT MAX_VALUE_STRING_LENGTH+2 ; +2 for NULL and alignment
101 call .FormatValueStringFromItemInDSSItoBufferInSSBP
102 call .FormatNameFromItemInDSSIandValueFromSSBP
103 eLEAVE_STRUCT MAX_VALUE_STRING_LENGTH+2
104 ret
105
106;--------------------------------------------------------------------
107; .FormatValueStringFromItemInDSSItoBufferInSSBP
108; Parameters:
109; DS:SI: Ptr to MENUITEM
110; SS:BP: Ptr to buffer for item value
111; Returns:
112; Nothing
113; Corrupts registers:
114; AX, BX, DX, DI
115;--------------------------------------------------------------------
116ALIGN JUMP_ALIGN
117.FormatValueStringFromItemInDSSItoBufferInSSBP:
118 push es
119 call Registers_CopySSBPtoESDI
120 mov al, '['
121 stosb
122 call [si+MENUITEM.fnFormatValue]
123 mov ax, ']'
124 stosw ; Also terminate with NULL
125 pop es
126 ret
127
128;--------------------------------------------------------------------
129; .FormatNameFromItemInDSSIandValueFromSSBP
130; Parameters:
131; DS:SI: Ptr to MENUITEM
132; SS:BP: Ptr to value string
133; Returns:
134; Nothing
135; Corrupts registers:
136; AX, BX, DX
137;--------------------------------------------------------------------
138ALIGN JUMP_ALIGN
139.FormatNameFromItemInDSSIandValueFromSSBP:
140 push si
141
142 mov bx, bp
143 mov bp, sp ; BP = SP before pushing parameters
144 push WORD [si+MENUITEM.szName]
145 push bx
146 push ss
147 mov si, g_szFormatItemNameWithValue
148 CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
149
150 mov bp, bx
151 pop si
152 ret
153
154
155;--------------------------------------------------------------------
156; MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI
157; MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
158; MenuitemPrint_WriteLookupValueStringToBufferInESDIfromRawItemInDSSI
159; Parameters:
160; DS:SI: Ptr to MENUITEM
161; ES:DI: Ptr to destination buffer
162; Returns:
163; DI: Updated
164; Corrupts registers:
165; AX, BX, CX
166;--------------------------------------------------------------------
167ALIGN JUMP_ALIGN
168MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI:
169 call Menuitem_GetValueToAXfromMenuitemInDSSI
170 eSHL_IM ax, 1
171 jmp SHORT PrintLookupValueFromAXtoBufferInESDI
172
173ALIGN JUMP_ALIGN
174MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI:
175MenuitemPrint_WriteLookupValueStringToBufferInESDIfromRawItemInDSSI:
176 call Menuitem_GetValueToAXfromMenuitemInDSSI
177 ; Fall to PrintLookupValueFromAXtoBufferInESDI
178
179;--------------------------------------------------------------------
180; PrintLookupValueFromAXtoBufferInESDI
181; Parameters:
182; AX: Value to print
183; DS:SI: Ptr to MENUITEM
184; ES:DI: Ptr to destination buffer
185; Returns:
186; DI: Updated
187; Corrupts registers:
188; AX, BX, CX
189;--------------------------------------------------------------------
190ALIGN JUMP_ALIGN
191PrintLookupValueFromAXtoBufferInESDI:
192 push si
193 test BYTE [si+MENUITEM.bFlags], FLG_MENUITEM_CHOICESTRINGS
194 jnz SHORT .LookupChoice
195
196 add ax, [si+MENUITEM.itemValue+ITEM_VALUE.rgszValueToStringLookup]
197 xchg bx, ax
198.Found:
199 mov si, [bx]
200.ErrorReturn:
201 call String_CopyDSSItoESDIandGetLengthToCX
202 pop si
203 ret
204
205;
206; With FLG_MENUITEM_CHOICESTRINGS, the array at .rgszChoiceToStringLookup is based on the
207; Choice number (offset within .rgwChoiceToValueLookup) instead of the value stored.
208; Here, we scan the .rgwChoiceToValueLookup array until we find the value there, and then
209; use the same offset in .rgszChoiceToStringLookup. If we don't find the value, we
210; return an "Error!" string instead.
211;
212; Note that the pointer array at .rgszChoiceToStringLookup must be NULL terminated. Since the
213; value could be zero, we don't use the .rgwChoiceToValueLookup array to find the end.
214;
215.LookupChoice:
216 mov bx, [si+MENUITEM.itemValue+ITEM_VALUE.rgszChoiceToStringLookup]
217 mov si, [si+MENUITEM.itemValue+ITEM_VALUE.rgwChoiceToValueLookup]
218
219.WordLoop:
220 cmp ax, [si]
221 je SHORT .Found
222 inc bx
223 inc bx
224 inc si
225 inc si
226 cmp WORD [bx], 0
227 jne SHORT .WordLoop
228
229 mov si, g_szValueUnknownError
230 jmp SHORT .ErrorReturn
231
232;--------------------------------------------------------------------
233; MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI
234; Parameters:
235; DS:SI: Ptr to MENUITEM
236; ES:DI: Ptr to destination buffer
237; Returns:
238; DI: Updated
239; Corrupts registers:
240; AX, BX, CX
241;--------------------------------------------------------------------
242ALIGN JUMP_ALIGN
243MenuitemPrint_WriteUnsignedValueStringToBufferInESDIfromItemInDSSI:
244 mov bx, di
245 mov cx, MAX_VALUE_STRING_LENGTH
246 CALL_DISPLAY_LIBRARY PushDisplayContext
247 CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXwithLengthInCX
248
249 call Menuitem_GetValueToAXfromMenuitemInDSSI
250 mov bl, 10
251 CALL_DISPLAY_LIBRARY PrintWordFromAXWithBaseInBL
252 jmp SHORT MenuitemPrint_FinishPrintingUnsignedOrHexValue
253
254;--------------------------------------------------------------------
255; MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI
256; Parameters:
257; DS:SI: Ptr to MENUITEM
258; ES:DI: Ptr to destination buffer
259; Returns:
260; DI: Updated
261; Corrupts registers:
262; AX, BX, CX
263;--------------------------------------------------------------------
264ALIGN JUMP_ALIGN
265MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI:
266 mov bx, di
267 mov cx, MAX_VALUE_STRING_LENGTH
268 CALL_DISPLAY_LIBRARY PushDisplayContext
269 CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXwithLengthInCX
270
271 call Menuitem_GetValueToAXfromMenuitemInDSSI
272 mov bl, 16
273 CALL_DISPLAY_LIBRARY PrintWordFromAXWithBaseInBL
274 mov al, 'h'
275 CALL_DISPLAY_LIBRARY PrintCharacterFromAL
276ALIGN JUMP_ALIGN
277MenuitemPrint_FinishPrintingUnsignedOrHexValue:
278 CALL_DISPLAY_LIBRARY GetCharacterPointerToBXAX
279 xchg bx, ax
280
281 CALL_DISPLAY_LIBRARY PopDisplayContext
282 mov di, bx
283 ret
284
285
286; Section containing initialized data
287SECTION .data
288
289ALIGN WORD_ALIGN
290g_rgszValueToStringLookupForFlagBooleans:
291 dw g_szNo
292 dw g_szYes
Note: See TracBrowser for help on using the repository browser.