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

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

Changes to XTIDE Universal BIOS:

  • Brought back optional "A then C" boot loader.
  • Now there is only one INT 19h handler that remains unchanged.
File size: 12.9 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
Note: See TracBrowser for help on using the repository browser.