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

Last change on this file since 589 was 589, checked in by krille_n_, 8 years ago

Changes:

  • BIOS: Fixed a purely cosmetic bug from r542 where, in builds containing MODULE_EBIOS, the boot menu would display an incorrect drive size (0.4 kB with MODULE_STRINGS_COMPRESSED or 0.5 kB without) for old drives with no support for LBA.
  • Fixed a bug from r392 where Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent would return the ID in AL instead of AH (if DANGEROUS_DETECTION had been defined).
  • Fixed a bug from r587 in AdvAtaInit.asm that would prevent detection of QDI Vision controllers.
  • Also changed how the QDI Vision IDs are defined (removed the need for shifting) to avoid confusion. This fixed a potential bug from r587 in AdvAtaInit.asm where some IDs were not being shifted.
  • Fixed a bug in PDC20x30.asm from r587 where GetPdcIDtoAX would not return with the IDE base port in DX so DisablePdcProgrammingMode would fail.
  • Made some changes to ModuleDependency.inc and other files so that MODULE_ADVANCED_ATA now requires USE_386. Consequently it is no longer included in the regular AT-builds, only in the 386_8k-build.
  • Moved the UNROLL_SECTORS_IN_CX_TO_xWORDS macros from IDE_8bit.inc to IdeIO.inc which means it's now possible to build a BIOS without MODULE_8BIT_IDE.
  • XTIDECFG: Added a minimum DOS version check (since it needs DOS version 2+) to allow the program to quit gracefully in the unlikely scenario where someone tries to run it under DOS version 1.
  • Made some changes to Drive.asm to improve drive enumeration. The old method using GET_DOS_DRIVE_PARAMETER_BLOCK_FOR_SPECIFIC_DRIVE worked well in Windows XP but not in Windows 98 SE (in Windows or in DOS mode). The two problems were; 1) The function call would access the drives which on single floppy drive systems would cause Windows to swap between A: and B: (throwing a blue screen asking the user to insert a disk etc). 2) Only floppy drives and FAT16 drives would be available in the list of drives, no FAT32/optical/network drives.
  • Improved code in IdeControllerMenu.asm so that the default port addresses for all IDE interfaces are now restored when (re-)selecting the (same) type of IDE device.
  • Also made it impossible to select a device type unless the required module is included in the loaded BIOS.
  • The version check done when loading a BIOS now uses the FLASH_SIGNATURE definition from Version.inc. Any changes affecting RomVars now only requires updating that definition. This means that changes to RomVars must be implemented in both the BIOS and XTIDECFG before being committed to the repository.
  • Added a compatibility fix for 3Com 3C503 cards to the ROM checksumming code in Buffers.asm (Buffers_GenerateChecksum).
  • SerDrive: Made some minor changes to file names and paths to improve compatibility with case sensitive environments.
  • BIOSDRVS: Made a minor size optimization which as a side effect also makes it compatible with all DOS versions including DOS version 1.
  • Library: Renamed the WAIT_RETRACE_IF_NECESSARY_THEN macro to CALL_WAIT_FOR_RETRACE_IF_NECESSARY_THEN and made a tail-call-optimized version of it (JMP_WAIT_FOR_RETRACE_IF_NECESSARY_THEN).
  • A speed optimization to the eRCL_IM macro for 386 and higher. This change breaks emulation in the sense that the macro will fail when given a memory operand as the first parameter.
  • Other minor optimizations and fixes.
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    shl     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     bx, 10
251    CALL_DISPLAY_LIBRARY PrintWordFromAXwithBaseInBX
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     bx, 16
273    CALL_DISPLAY_LIBRARY PrintWordFromAXwithBaseInBX
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.