source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenu.asm @ 93

Last change on this file since 93 was 93, checked in by aitotat, 13 years ago

Changes to XTIDE Universal BIOS:

  • Diagnostic cylinder can no longer be reserved.
File size: 6.0 KB
RevLine 
[88]1; Project name  :   XTIDE Universal BIOS
[3]2; Description   :   Displays Boot Menu.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Displays Boot Menu and returns Drive or Function number.
9;
10; BootMenu_DisplayAndReturnSelection
11;   Parameters:
12;       DS:     RAMVARS segment
13;   Returns:
14;       DX:     Untranslated drive number to be used for booting (if CF cleared)
15;               Function number (if CF set)
16;       CF:     Cleared if drive selected
17;               Set if function selected
18;   Corrupts registers:
19;       All General Purpose Registers
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22BootMenu_DisplayAndReturnSelection:
23    call    DriveXlate_Reset
24    call    BootMenuPrint_TheBottomOfScreen
25    call    BootMenu_Enter          ; Get selected menuitem index to CX
26    call    BootMenuPrint_ClearScreen
[88]27    cmp     cx, BYTE NO_ITEM_SELECTED
28    je      SHORT BootMenu_DisplayAndReturnSelection
[92]29    jmp     SHORT BootMenu_ConvertMenuitemFromCXtoDriveInDX
[88]30
31
32;--------------------------------------------------------------------
33; Enters Boot Menu or submenu.
34;
35; BootMenu_Enter
36;   Parameters:
37;       Nothing
38;   Returns:
39;       CX:     Index of selected item or NO_ITEM_SELECTED
40;   Corrupts registers:
41;       BX, DI
42;--------------------------------------------------------------------
[3]43ALIGN JUMP_ALIGN
[88]44BootMenu_Enter:
45    mov     bx, BootMenuEvent_Handler
46    CALL_MENU_LIBRARY DisplayWithHandlerInBXandUserDataInDXAX
47    xchg    cx, ax
[3]48    ret
49
50
51;--------------------------------------------------------------------
52; Returns number of menuitems in Boot Menu.
53;
[88]54; BootMenu_GetMenuitemCountToCX
[3]55;   Parameters:
56;       DS:     RAMVARS segment
57;   Returns:
58;       CX:     Number of boot menu items
59;   Corrupts registers:
60;       AX
61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
[88]63BootMenu_GetMenuitemCountToCX:
[32]64    call    RamVars_GetHardDiskCountFromBDAtoCX
65    xchg    ax, cx
[3]66    call    FloppyDrive_GetCount
67    add     ax, cx
68    ret
69
70
71;--------------------------------------------------------------------
[88]72; BootMenu_GetHeightToALwithItemCountInCL
[3]73;   Parameters:
[88]74;       CL:     Number of menuitems
[3]75;   Returns:
[88]76;       AH:     Boot menu height
[3]77;   Corrupts registers:
[88]78;       AL, CL, DI
[3]79;--------------------------------------------------------------------
80ALIGN JUMP_ALIGN
[88]81BootMenu_GetHeightToAHwithItemCountInCL:
82    add     cl, BOOT_MENU_HEIGHT_WITHOUT_ITEMS
83    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
[93]84    sub     ah, MENU_SCREEN_BOTTOM_LINES*2
[88]85    MIN_U   ah, cl
[3]86    ret
87
88
89;--------------------------------------------------------------------
[92]90; BootMenu_ConvertAsciiHotkeyFromALtoMenuitemInCX
[3]91;   Parameters:
[92]92;       AL:     ASCII hotkey starting from upper case 'A'
[3]93;   Returns:
94;       CX:     Menuitem index
95;   Corrupts registers:
96;       AX
97;--------------------------------------------------------------------
98ALIGN JUMP_ALIGN
[92]99BootMenu_ConvertAsciiHotkeyFromALtoMenuitemInCX:
100    call    BootMenu_GetLetterForFirstHardDiskToCL
[3]101    cmp     al, cl                      ; Letter is for Hard Disk?
102    jae     SHORT .StartFromHardDiskLetter
103    sub     al, 'A'                     ; Letter to Floppy Drive menuitem
104    xchg    ax, cx                      ; Menuitem index to CX
105    ret
106ALIGN JUMP_ALIGN
107.StartFromHardDiskLetter:
108    sub     al, cl                      ; Hard Disk index
109    call    FloppyDrive_GetCount
110    add     cx, ax                      ; Menuitem index
111    ret
112
113;--------------------------------------------------------------------
114; Returns letter for first hard disk. Usually it will be 'c' but it
115; can be higher if more than two floppy drives are found.
116;
[92]117; BootMenu_GetLetterForFirstHardDiskToCL
[3]118;   Parameters:
119;       Nothing
120;   Returns:
121;       CL:     Upper case letter for first hard disk
122;   Corrupts registers:
123;       CH
124;--------------------------------------------------------------------
125ALIGN JUMP_ALIGN
[92]126BootMenu_GetLetterForFirstHardDiskToCL:
[3]127    call    FloppyDrive_GetCount
128    add     cl, 'A'
129    MAX_U   cl, 'C'
130    ret
131
132
133;--------------------------------------------------------------------
[92]134; BootMenu_ConvertMenuitemFromCXtoDriveInDX
[3]135;   Parameters:
136;       CX:     Index of menuitem selected from Boot Menu
137;       DS:     RAMVARS segment
138;   Returns:
[92]139;       DX:     Drive number to be used for booting
[3]140;   Corrupts registers:
[92]141;       CX
[3]142;--------------------------------------------------------------------
143ALIGN JUMP_ALIGN
[92]144BootMenu_ConvertMenuitemFromCXtoDriveInDX:
[3]145    mov     dx, cx                  ; Copy menuitem index to DX
146    call    FloppyDrive_GetCount
147    cmp     dx, cx                  ; Floppy drive?
148    jb      SHORT .ReturnFloppyDriveInDX
149    sub     dx, cx                  ; Remove floppy drives from index
150    or      dl, 80h
151.ReturnFloppyDriveInDX:
152    ret
153
154
155;--------------------------------------------------------------------
156; Converts Floppy or Hard Disk Drive number to menuitem index.
157; This function does not check does the drive really exists.
158;
159; BootMenu_ConvertDriveToMenuitem
160;   Parameters:
161;       DL:     Drive number
162;   Returns:
163;       CX:     Menuitem index (assuming drive is available)
164;   Corrupts registers:
165;       AX
166;--------------------------------------------------------------------
167ALIGN JUMP_ALIGN
168BootMenu_ConvertDriveToMenuitem:
169    test    dl, 80h                 ; Floppy drive?
170    jz      SHORT .ReturnFloppyMenuitem
171    call    FloppyDrive_GetCount
172    mov     ax, 7Fh                 ; Load mask to clear floppy bit
173    and     ax, dx                  ; AX = Hard Disk index
174    add     cx, ax                  ; Add hard disk index to floppy drive count
175    ret
176ALIGN JUMP_ALIGN
177.ReturnFloppyMenuitem:
178    eMOVZX  cx, dl                  ; Drive number and item index are equal
179    ret
180
181
182;--------------------------------------------------------------------
183; Checks is drive number valid for this system.
184;
185; BootMenu_IsDriveInSystem
186;   Parameters:
187;       DL:     Drive number
188;       DS:     RAMVARS segment
189;   Returns:
[28]190;       CF:     Set if drive number is valid
[3]191;               Clear if drive is not present in system
192;   Corrupts registers:
[28]193;       AX, CX
[3]194;--------------------------------------------------------------------
195ALIGN JUMP_ALIGN
196BootMenu_IsDriveInSystem:
[32]197    test    dl, 80h                             ; Floppy drive?
[3]198    jz      SHORT .IsFloppyDriveIsInSystem
[32]199    call    RamVars_GetHardDiskCountFromBDAtoCX ; Hard Disk count to CX
200    or      cl, 80h                             ; Set Hard Disk bit to CX
[28]201    jmp     SHORT .CompareDriveNumberToDriveCount
[3]202.IsFloppyDriveIsInSystem:
[32]203    call    FloppyDrive_GetCount                ; Floppy Drive count to CX
[28]204.CompareDriveNumberToDriveCount:
[3]205    cmp     dl, cl
206    ret
Note: See TracBrowser for help on using the repository browser.