source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Menus/BootMenu/BootMenuPrint.asm @ 621

Last change on this file since 621 was 621, checked in by krille_n_, 2 years ago

Changes:

  • Fixed three different bugs all causing the boot menu to show drives using IRQs even though the BIOS had been built without MODULE_IRQ.
  • Fixed two bugs in XTIDECFG where loading a BIOS from file and then loading the old settings from EEPROM would
    • overwrite ROMVARS.wFlags in the loaded BIOS file (in RAM). The possibly resulting mismatch of module flags could make it impossible to change settings for modules included in the BIOS or allow changing settings for modules not included in the BIOS.
    • not copy the color theme over to the loaded BIOS.
  • Also fixed two very minor bugs in XTIDECFG in BiosFile_LoadFileFromDSSItoRamBuffer and BiosFile_SaveRamBufferToFileInDSSI where the error handling in these routines would close whatever file handle that happened to match the error code returned by DOS in AX.
  • Made significant changes to the new flash ROM programming routines to reduce the size. Also fixed a minor bug that would cause the second verification to be skipped and return success when programming a 64 KB block of data.
  • Changed the custom BIOS build file names to the 8.3 format.
  • Changed some help strings in XTIDECFG to clarify things.
  • Other minor optimizations and fixes.
File size: 7.7 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for printing boot menu strings.
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; BootMenuPrint_RefreshItem
25;
26;   Parameters:
27;       CX:     Index of highlighted item
28;       DS:     RAMVARS segment
29;   Returns:
30;       Nothing
31;   Corrupts registers:
32;       Does not matter
33;--------------------------------------------------------------------
34BootMenuPrint_RefreshItem:
35    push    bp
36    mov     bp, sp
37
38    call    BootMenu_GetDriveToDXforMenuitemInCX
39    mov     si, g_szRomBootDash                     ; Standard "Rom Boot" but with a "-" at the front
40    mov     al, 20h                                 ; The space between "Rom" and "Boot"
41    jnc     SHORT .ROMBoot                          ; display "Rom Boot" option for last entry
42
43    call    FindDPT_ForDriveNumberInDL
44    jc      SHORT .notOurs
45
46    call    DriveDetectInfo_ConvertDPTtoBX
47    mov     si, g_szDriveNumBOOTNFO                 ; special g_szDriveNum that prints from BDA
48    jmp     SHORT .go
49
50.notOurs:
51    mov     si, g_szDriveNum
52    mov     bx, g_szForeignHD                       ; assume a hard disk for the moment
53
54    test    dl, dl
55    js      SHORT .go
56    mov     bl, (g_szFloppyDrv - $$) & 0xff         ; and revisit the earlier assumption...
57
58.go:
59    mov     ax, dx                                  ; preserve DL for the floppy drive letter addition
60    call    DriveXlate_ToOrBack
61
62    cmp     dl, 10h                                 ; Check if there is a character in the upper nibble
63    sbb     si, 0                                   ; If not, backup a character to a leading space
64
65    push    dx                                      ; translated drive number
66    push    bx                                      ; sub string
67    add     al, 'A'                                 ; floppy drive letter (we always push this although
68                                                    ; the hard disks don't ever use it, but it does no harm)
69.ROMBoot:
70    push    ax
71
72    jmp     SHORT BootMenuPrint_RefreshInformation.FormatRelay
73
74;--------------------------------------------------------------------
75; Prints Boot Menu title strings.
76;
77; BootMenuPrint_TitleStrings
78;   Parameters:
79;       Nothing
80;   Returns:
81;       CF:     Set since menu event handled
82;   Corrupts registers:
83;       AX, SI, DI
84;--------------------------------------------------------------------
85BootMenuPrint_TitleStrings:
86    xor     di, di                      ; Null character will be eaten
87    mov     si, g_szBootMenuTitle
88    jmp     DetectPrint_RomFoundAtSegment.BootMenuEntry
89
90
91;--------------------------------------------------------------------
92; BootMenuPrint_RefreshInformation
93;   Parameters:
94;       CX:     Index of highlighted item
95;       DS:     RAMVARS segment
96;   Returns:
97;       CF:     Set since menu event was handled successfully
98;   Corrupts registers:
99;       Does not matter
100;--------------------------------------------------------------------
101BootMenuPrint_RefreshInformation:
102    CALL_MENU_LIBRARY ClearInformationArea
103
104    call    BootMenu_GetDriveToDXforMenuitemInCX
105    jnc     SHORT BootMenuEvent_Completed               ; nothing to display if "Rom Boot" option
106
107    push    bp
108    mov     bp, sp
109
110    mov     si, g_szCapacity                            ; Setup print string now, carries through to print call
111
112    call    FindDPT_ForDriveNumberInDL
113
114    inc     dl                                          ; are we a hard disk?
115    dec     dl                                          ; inc/dec will set SF, without modifying CF or DL
116    js      SHORT .HardDiskRefreshInformation
117
118    jnc     SHORT .ours                                 ; Based on CF from FindDPT_ForDriveNumberInDL above
119    call    FloppyDrive_GetType                         ; Get Floppy Drive type to BX
120    jmp     SHORT .around
121.ours:
122    call    AH8h_GetDriveParameters
123.around:
124
125    mov     ax, g_szFddSizeOr
126    test    bl, bl                                      ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD)
127    jz      SHORT .PushAXAndOutput
128
129    mov     al, (g_szFddUnknown - $$) & 0xff
130    cmp     bl, FLOPPY_TYPE_35_ED
131    ja      SHORT .PushAXAndOutput
132    ; Fall to .PrintKnownFloppyType
133
134;--------------------------------------------------------------------
135; .PrintKnownFloppyType
136;   Parameters:
137;       BX:     Floppy drive type
138;   Returns:
139;       CF:     Set since menu event was handled successfully
140;   Corrupts registers:
141;       AX, BX, SI, DI
142;
143; Floppy Drive Types:
144;
145;   0  Handled above
146;   1  FLOPPY_TYPE_525_DD          5 1/4   360K
147;   2  FLOPPY_TYPE_525_HD          5 1/4   1.2M
148;   3  FLOPPY_TYPE_35_DD           3 1/2   720K
149;   4  FLOPPY_TYPE_35_HD           3 1/2   1.44M
150;   5  3.5" ED on some BIOSes      3 1/2   2.88M
151;   6  FLOPPY_TYPE_35_ED           3 1/2   2.88M
152;   >6 Unknown, handled above
153;
154;--------------------------------------------------------------------
155.PrintKnownFloppyType:
156    mov     al, (g_szFddSize - $$) & 0xff
157    push    ax
158
159    mov     al, (g_szFddThreeHalf - $$) & 0xff
160    cmp     bl, FLOPPY_TYPE_525_HD
161    ja      SHORT .ThreeHalf
162    mov     al, (g_szFddFiveQuarter - $$) & 0xff
163.ThreeHalf:
164    push    ax                                          ; "5 1/4" or "3 1/2"
165
166    xor     bh, bh
167    mov     al, FloppyTypes.rgbCapacityMultiplier
168    mul     BYTE [cs:bx+FloppyTypes.rgbCapacity - 1]    ; -1 since 0 is handled above and not in the table
169
170.PushAXAndOutput:
171    push    ax
172
173.FormatRelay:
174    jmp     DetectPrint_FormatCSSIfromParamsInSSBP
175
176
177;--------------------------------------------------------------------
178; Prints Hard Disk Menuitem information strings.
179;
180; BootMenuPrint_HardDiskMenuitemInformation
181;   Parameters:
182;       DS:     RAMVARS segment
183;       DI:     Zero if foreign drive
184;               Offset to DPT if our drive
185;       CF:     Set if foreign drive
186;               Clear if our drive
187;   Returns:
188;       CF:     Set since menu event was handled successfully
189;   Corrupts registers:
190;       AX, BX, CX, DX, SI, DI, ES
191;--------------------------------------------------------------------
192.HardDiskRefreshInformation:
193    jc      SHORT .HardDiskMenuitemInfoForForeignDrive  ; Based on CF from FindDPT_ForDriveNumberInDL (way) above
194
195.HardDiskMenuitemInfoForOurDrive:
196    ePUSH_T ax, g_szInformation                         ; Add substring for our hard disk information
197
198%ifdef MODULE_EBIOS
199    ePUSH_T ax, .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
200    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_LBA
201%ifdef USE_386
202    jnz     AccessDPT_GetLbaSectorCountToBXDXAX
203    jmp     AH15h_GetSectorCountToBXDXAX
204%else ; ~USE_386
205    jz      SHORT .NoLBA
206    jmp     AccessDPT_GetLbaSectorCountToBXDXAX
207.NoLBA:
208    jmp     AH15h_GetSectorCountToBXDXAX
209%endif
210%else ; ~MODULE_EBIOS
211    call    AH15h_GetSectorCountToBXDXAX
212    jmp     SHORT .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
213%endif ; MODULE_EBIOS
214
215.HardDiskMenuitemInfoForForeignDrive:
216    call    DriveXlate_ToOrBack
217    call    AH15h_GetSectorCountFromForeignDriveToBXDXAX
218
219.ConvertSectorCountInBXDXAXtoSizeAndPushForFormat:
220    call    Size_ConvertSectorCountInBXDXAXtoKiB
221    ePUSH_T cx, g_szCapacityNum     ; Push format substring
222    mov     cx, BYTE_MULTIPLES.kiB
223    call    Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
224    push    ax                      ; Size in magnitude
225    push    cx                      ; Tenths
226    push    dx                      ; Magnitude character
227
228    test    di, di                  ; Zero if foreign drive
229    jz      SHORT BootMenuPrint_RefreshInformation.FormatRelay
230
231%include "BootMenuPrintCfg.asm"     ; Inline of code to fill out remainder of information string
232    jmp     DetectPrint_FormatCSSIfromParamsInSSBP
233
234
235FloppyTypes:
236.rgbCapacityMultiplier equ 120      ; Multiplier to reduce word sized values to byte size
237.rgbCapacity:
238    db      360   / FloppyTypes.rgbCapacityMultiplier    ;  type 1
239    db      1200  / FloppyTypes.rgbCapacityMultiplier    ;  type 2
240    db      720   / FloppyTypes.rgbCapacityMultiplier    ;  type 3
241    db      1440  / FloppyTypes.rgbCapacityMultiplier    ;  type 4
242    db      2880  / FloppyTypes.rgbCapacityMultiplier    ;  type 5
243    db      2880  / FloppyTypes.rgbCapacityMultiplier    ;  type 6
Note: See TracBrowser for help on using the repository browser.