source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuPrint.asm @ 241

Last change on this file since 241 was 241, checked in by gregli@…, 12 years ago

Space optimizations in the Boot Menu and BootInfo routines, taking advantage of nested %s. Optimization in the init of RamVars to avoid writing the signature twice. Preparing for addition of serial floppy support, starting to break the assumption that our drives are always 80h or higher.

File size: 13.0 KB
RevLine 
[88]1; Project name  :   XTIDE Universal BIOS
[3]2; Description   :   Functions for printing boot menu strings.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
[241]8; BootMenuPrint_RefreshItem
9; 
[189]10;   Parameters:
11;       DL:     Untranslated Floppy Drive number
12;   Returns:
13;       Nothing
14;   Corrupts registers:
[241]15;       AX, BX, DX, SI, DI
[189]16;--------------------------------------------------------------------
17ALIGN JUMP_ALIGN
[241]18BootMenuPrint_RefreshItem:
19    call    BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
20    jnc     BootMenuEvent_EventCompleted            ; if no menu item selected, out we go
21       
[189]22    push    bp
23    mov     bp, sp
24
[241]25    call    RamVars_IsDriveHandledByThisBIOS               
26    jnc     .notOurs
27
28    call    FindDPT_ForDriveNumber                  ; if it is one of ours, print the string in bootnfo
29    call    BootInfo_ConvertDPTtoBX
30    mov     si, g_szDriveNumBOOTNFO                 ; special g_szDriveNum that prints from BDA
31    jmp     .go
[189]32       
[241]33.notOurs:
34    mov     si,g_szDriveNum                                 
35    mov     bx,g_szForeignHD                        ; assume a hard disk for the moment
36       
37    test    dl,80h                                         
38    js      .go
39    mov     bl,((g_szFloppyDrv)-$$ & 0xff)          ; and revisit the earlier assumption...
40       
41.go:
42    mov     ax, dx                                  ; preserve DL for the floppy drive letter addition
43    call    DriveXlate_ToOrBack
44    push    dx                                      ; translated drive number
45    push    bx                                      ; sub string
46    add     al, 'A'                                 ; floppy drive letter (we always push this although
47    push    ax                                      ; the hard disks don't ever use it, but it does no harm)
48       
49    jmp     short BootMenuPrint_FormatCSSIfromParamsInSSBP
[130]50
51;--------------------------------------------------------------------
[88]52; Prints Boot Menu title strings.
[3]53;
[88]54; BootMenuPrint_TitleStrings
[3]55;   Parameters:
[88]56;       Nothing
[3]57;   Returns:
[88]58;       CF:     Set since menu event handled
[3]59;   Corrupts registers:
[88]60;       AX, SI, DI
[3]61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
[88]63BootMenuPrint_TitleStrings:
64    mov     si, ROMVARS.szTitle
[96]65    call    BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
66    CALL_DISPLAY_LIBRARY PrintNewlineCharacters
[88]67    mov     si, ROMVARS.szVersion
[161]68    ; Fall to BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
[3]69
70;--------------------------------------------------------------------
[128]71; BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
72;   Parameters:
73;       CS:SI:  Ptr to NULL terminated string to print
74;   Returns:
75;       CF:     Set since menu event was handled successfully
76;   Corrupts registers:
[186]77;       AX, DI
[128]78;--------------------------------------------------------------------
79ALIGN JUMP_ALIGN
80BootMenuPrint_NullTerminatedStringFromCSSIandSetCF:
[186]81;
82; We send all CSSI strings through the Format routine for the case of
83; compressed strings, but this doesn't hurt in the non-compressed case either
84; (perhaps a little slower, but shouldn't be noticeable to the user)
85; and results in smaller code size.
86;
87    push    bp
88    mov     bp,sp
[192]89    jmp     short BootMenuPrint_FormatCSSIfromParamsInSSBP
[128]90
[192]91       
[128]92;--------------------------------------------------------------------
[3]93; BootMenuPrint_FloppyMenuitemInformation
94;   Parameters:
95;       DL:     Untranslated Floppy Drive number
96;       DS:     RAMVARS segment
97;   Returns:
[88]98;       CF:     Set since menu event was handled successfully
[3]99;   Corrupts registers:
[88]100;       AX, BX, CX, DX, SI, DI, ES
[3]101;--------------------------------------------------------------------
[192]102
[241]103ALIGN JUMP_ALIGN
104BootMenuPrint_RefreshInformation:
105    CALL_MENU_LIBRARY ClearInformationArea     
[192]106       
[241]107    call    BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
108    jnc     BootMenuEvent_EventCompleted                ; if no menu selection, abort
[182]109
[161]110    push    bp
111    mov     bp, sp
[241]112
113    test    dl, dl                                      ; are we a hard disk?
114    js      BootMenuPrint_HardDiskRefreshInformation       
[182]115       
[241]116    call    FloppyDrive_GetType                         ; Get Floppy Drive type to BX
[182]117
[241]118    mov     cx, g_szFddSizeOr                           ; .PrintXTFloppyType
119    test    bx, bx                                      ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD)     
120    jz      SHORT BootMenuPrint_HardDiskRefreshInformation.output
121
122    mov     cl, (g_szFddUnknown - $$) & 0xff            ; .PrintUnknownFloppyType
[3]123    cmp     bl, FLOPPY_TYPE_35_ED
[241]124    ja      SHORT BootMenuPrint_HardDiskRefreshInformation.output
[182]125       
[161]126    ; Fall to .PrintKnownFloppyType
[3]127
128;--------------------------------------------------------------------
[161]129; .PrintKnownFloppyType
[3]130;   Parameters:
[161]131;       BX:     Floppy drive type
[3]132;   Returns:
[88]133;       CF:     Set since menu event was handled successfully
[3]134;   Corrupts registers:
[161]135;       AX, BX, SI, DI
[182]136; 
137; Floppy Drive Types:
138;
139;   0  Handled above 
140;   1  FLOPPY_TYPE_525_DD          5 1/4   360K
141;   2  FLOPPY_TYPE_525_HD          5 1/4   1.2M
142;   3  FLOPPY_TYPE_35_DD           3 1/2   720K
143;   4  FLOPPY_TYPE_35_HD           3 1/2   1.44M
144;   5  3.5" ED on some BIOSes      3 1/2   2.88M
145;   6  FLOPPY_TYPE_35_ED           3 1/2   2.88M
146;   >6 Unknwon, handled above
147; 
[3]148;--------------------------------------------------------------------
[161]149.PrintKnownFloppyType:
[241]150    mov     cl, (g_szFddSize - $$) & 0xff
151    push    cx
[182]152       
[241]153    mov     cl, (g_szFddThreeHalf - $$) & 0xff
[182]154    cmp     bl, FLOPPY_TYPE_525_HD
155    ja      .ThreeHalf
[241]156    mov     cl, (g_szFddFiveQuarter - $$) & 0xff
[182]157.ThreeHalf:     
[241]158    push    cx                                          ; "5 1/4" or "3 1/2"
[3]159
[182]160    mov     al,FloppyTypes.rgbCapacityMultiplier
161    mul     byte [cs:bx+FloppyTypes.rgbCapacity - 1]    ; -1 since 0 is handled above and not in the table
162    push    ax
[161]163
[241]164    jmp     short BootMenuPrint_HardDiskRefreshInformation.output
[88]165
[192]166
167;--------------------------------------------------------------------
[3]168; Prints Hard Disk Menuitem information strings.
169;
170; BootMenuPrint_HardDiskMenuitemInformation
171;   Parameters:
172;       DL:     Untranslated Hard Disk number
173;       DS:     RAMVARS segment
174;   Returns:
[88]175;       CF:     Set since menu event was handled successfully
[3]176;   Corrupts registers:
177;       BX, CX, DX, SI, DI, ES
178;--------------------------------------------------------------------
179ALIGN JUMP_ALIGN
[241]180BootMenuPrint_HardDiskRefreshInformation:       
[150]181    call    RamVars_IsDriveHandledByThisBIOS
182    jnc     SHORT .HardDiskMenuitemInfoForForeignDrive
[241]183    call    FindDPT_ForDriveNumber                      ; DS:DI to point DPT
[127]184    ; Fall to .HardDiskMenuitemInfoForOurDrive
[3]185
186;--------------------------------------------------------------------
[127]187; .HardDiskMenuitemInfoForOurDrive
[3]188;   Parameters:
189;       DL:     Untranslated Hard Disk number
[127]190;       DS:DI:  Ptr to DPT
[3]191;   Returns:
[127]192;       Nothing
[3]193;   Corrupts registers:
[127]194;       AX, BX, CX, DX, SI, DI, ES
[3]195;--------------------------------------------------------------------
[127]196.HardDiskMenuitemInfoForOurDrive:
[241]197    ePUSH_T ax, g_szSizeDual
198       
[127]199    ; Get and push L-CHS size
[150]200    call    AH15h_GetSectorCountToDXAX
[88]201    call    ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
202
[127]203    ; Get and push total LBA size
204    call    BootInfo_GetTotalSectorCount
[241]205    call    ConvertSectorCountInBXDXAXtoSizeAndPushForFormat       
206    jmp     BootMenuPrintCfg_ForOurDrive
207               
[3]208;--------------------------------------------------------------------
[127]209; .HardDiskMenuitemInfoForForeignDrive
[3]210;   Parameters:
211;       DL:     Untranslated Hard Disk number
[127]212;       DS:     RAMVARS segment
[3]213;   Returns:
[127]214;       CF:     Set since menu event was handled successfully
[3]215;   Corrupts registers:
[127]216;       AX, BX, CX, DX, SI, DI
[3]217;--------------------------------------------------------------------
218ALIGN JUMP_ALIGN
[127]219.HardDiskMenuitemInfoForForeignDrive:
220    call    DriveXlate_ToOrBack
[150]221    call    AH15h_GetSectorCountFromForeignDriveToDXAX
[88]222    call    ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
223
[241]224ALIGN JUMP_ALIGN       
225.output:
226    mov     si, g_szCapacity
227;;; fall-through
[3]228
229;--------------------------------------------------------------------
[241]230; BootMenuPrint_FormatCSSIfromParamsInSSBP
[88]231;   Parameters:
[241]232;       CS:SI:  Ptr to string to format
233;       BP:     SP before pushing parameters
[88]234;   Returns:
[241]235;       BP:     Popped from stack
236;       CF:     Set since menu event was handled successfully       
[88]237;   Corrupts registers:
[120]238;       AX, DI
[88]239;--------------------------------------------------------------------
240ALIGN JUMP_ALIGN
[241]241BootMenuPrint_FormatCSSIfromParamsInSSBP:
242    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
243    stc             ; Successfull return from menu event
244    pop     bp
[88]245    ret
[192]246       
[241]247       
[88]248;--------------------------------------------------------------------
[192]249; BootMenuPrint_ClearScreen
[88]250;   Parameters:
[192]251;       Nothing
[88]252;   Returns:
[192]253;       Nothing
[88]254;   Corrupts registers:
[192]255;       AX, DI
[88]256;--------------------------------------------------------------------
257ALIGN JUMP_ALIGN
[192]258BootMenuPrint_ClearScreen:
259    call    BootMenuPrint_InitializeDisplayContext
260    xor     ax, ax
261    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
262    mov     ax, ' ' | (MONO_NORMAL<<8)
263    CALL_DISPLAY_LIBRARY ClearScreenWithCharInALandAttrInAH
264    ret
[88]265
266
267;--------------------------------------------------------------------
268; BootMenuPrint_TheBottomOfScreen
[3]269;   Parameters:
270;       DS:     RAMVARS segment
271;   Returns:
[88]272;       Nothing
[3]273;   Corrupts registers:
[92]274;       AX, BX, CX, DX, SI, DI
[3]275;--------------------------------------------------------------------
276ALIGN JUMP_ALIGN
[88]277BootMenuPrint_TheBottomOfScreen:
[124]278    call    FloppyDrive_GetCountToCX
[88]279    mov     bl, cl                  ; Floppy Drive count to BL
280    call    RamVars_GetHardDiskCountFromBDAtoCX
281    mov     bh, cl                  ; Hard Disk count to BH
[92]282    ; Fall to .MoveCursorToHotkeyStrings
[3]283
[92]284;--------------------------------------------------------------------
285; .MoveCursorToHotkeyStrings
286;   Parameters:
287;       Nothing
288;   Returns:
289;       Nothing
290;   Corrupts registers:
291;       AX, DI
292;--------------------------------------------------------------------
293.MoveCursorToHotkeyStrings:
294    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
295    xor     al, al
296    dec     ah
297    CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
298    ; Fall to .PrintHotkeyString
[3]299
300;--------------------------------------------------------------------
[92]301; .PrintHotkeyString
[3]302;   Parameters:
[92]303;       BL:     Floppy Drives
304;       BH:     Hard Drives
[88]305;   Returns:
[92]306;       Nothing
[88]307;   Corrupts registers:
[120]308;       AX, CX, DX, SI, DI
[88]309;--------------------------------------------------------------------
[92]310.PrintHotkeyString:
311    ; Display Library should not be called like this
312    mov     si, ATTRIBUTE_CHARS.cHighlightedItem
313    call    MenuAttribute_GetToAXfromTypeInSI
314    xchg    dx, ax
[122]315    mov     cx, MONO_BRIGHT
[88]316
[92]317    test    bl, bl      ; Any Floppy Drives?
318    jz      SHORT .SkipFloppyDriveHotkeys
319    mov     ax, 'A' | (ANGLE_QUOTE_RIGHT<<8)
320    mov     si, g_szFDD
321    call    PushHotkeyParamsAndFormat
[88]322
[92]323.SkipFloppyDriveHotkeys:
324    test    bh, bh      ; Any Hard Drives?
325    jz      SHORT .SkipHardDriveHotkeys
[122]326    xchg    ax, cx      ; Store Key Attribute
[92]327    call    BootMenu_GetLetterForFirstHardDiskToCL
328    mov     ch, ANGLE_QUOTE_RIGHT
329    xchg    ax, cx
330    mov     si, g_szHDD
331    call    PushHotkeyParamsAndFormat
332
333.SkipHardDriveHotkeys:
334    ; Fall to .PrintRomBootHotkey
335
[88]336;--------------------------------------------------------------------
[92]337; .PrintRomBootHotkey
[88]338;   Parameters:
[92]339;       CX:     Key Attribute
340;       DX:     Description Attribute
[3]341;   Returns:
[88]342;       Nothing
[3]343;   Corrupts registers:
[120]344;       AX, SI, DI
[3]345;--------------------------------------------------------------------
[92]346.PrintRomBootHotkey:
347    mov     ax, 'F' | ('8'<<8)      ; F8
348    mov     si, g_szRomBoot
349    ; Fall to PushHotkeyParamsAndFormat
350
351;--------------------------------------------------------------------
352; PushHotkeyParamsAndFormat
353;   Parameters:
354;       AL:     First character
355;       AH:     Second character
356;       CX:     Key Attribute
357;       DX:     Description Attribute
358;       CS:SI:  Description string
359;   Returns:
360;       Nothing
361;   Corrupts registers:
[120]362;       AX, SI, DI
[92]363;--------------------------------------------------------------------
[3]364ALIGN JUMP_ALIGN
[92]365PushHotkeyParamsAndFormat:
366    push    bp
367    mov     bp, sp
368
369    push    cx          ; Key attribute
370    push    ax          ; First character
371    xchg    al, ah
372    push    ax          ; Second character
373    push    dx          ; Description attribute
374    push    si          ; Description string
375    push    cx          ; Key attribute for last space
376    mov     si, g_szHotkey
[241]377       
378BootMenuPrint_FormatCSSIfromParamsInSSBP_Relay: 
379    jmp     SHORT BootMenuPrint_FormatCSSIfromParamsInSSBP
[161]380
[182]381
[192]382;--------------------------------------------------------------------
383; BootMenuPrint_InitializeDisplayContext
384;   Parameters:
385;       Nothing
386;   Returns:
387;       Nothing
388;   Corrupts registers:
389;       AX, DI
390;--------------------------------------------------------------------
391ALIGN JUMP_ALIGN
392BootMenuPrint_InitializeDisplayContext:
393    CALL_DISPLAY_LIBRARY InitializeDisplayContext
394    ret
395
396
[241]397;--------------------------------------------------------------------
398; ConvertSectorCountInBXDXAXtoSizeAndPushForFormat
399;   Parameters:
400;       BX:DX:AX:   Sector count
401;   Returns:
402;       Size in stack
403;   Corrupts registers:
404;       AX, BX, CX, DX, SI
405;--------------------------------------------------------------------
406ALIGN JUMP_ALIGN
407ConvertSectorCountInBXDXAXtoSizeAndPushForFormat:
408    pop     si                      ; Pop return address
409    ePUSH_T cx, g_szCapacityNum     ; Push format substring
410    call    Size_ConvertSectorCountInBXDXAXtoKiB
411    mov     cx, BYTE_MULTIPLES.kiB
412    call    Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
413    push    ax                      ; Size in magnitude
414    push    cx                      ; Tenths
415    push    dx                      ; Magnitude character
416    jmp     si
417
418
419FloppyTypes:
420.rgbCapacityMultiplier equ 20           ; Multiplier to reduce word sized values to byte size
421.rgbCapacity:
422    db      360   / FloppyTypes.rgbCapacityMultiplier    ;  type 1
423    db      1200  / FloppyTypes.rgbCapacityMultiplier    ;  type 2
424    db      720   / FloppyTypes.rgbCapacityMultiplier    ;  type 3
425    db      1440  / FloppyTypes.rgbCapacityMultiplier    ;  type 4
426    db      2880  / FloppyTypes.rgbCapacityMultiplier    ;  type 5
427    db      2880  / FloppyTypes.rgbCapacityMultiplier    ;  type 6
428
429
430
431
[192]432       
433
434
435       
Note: See TracBrowser for help on using the repository browser.