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

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

Added floppy drive emulation over the serial connection (MODULE_SERIAL_FLOPPY). Along the way, various optimizations were made to stay within the 8K ROM size target. Also, serial code now returns the number of sectors transferred.

File size: 6.5 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;
[243]10; BootMenu_DisplayAndReturnSelectionInDX
[3]11;   Parameters:
12;       DS:     RAMVARS segment
13;   Returns:
[95]14;       DX:     Untranslated drive number to be used for booting
[3]15;   Corrupts registers:
16;       All General Purpose Registers
17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
[243]19BootMenu_DisplayAndReturnSelectionInDX:
[3]20    call    DriveXlate_Reset
21    call    BootMenuPrint_TheBottomOfScreen
22    call    BootMenu_Enter          ; Get selected menuitem index to CX
23    call    BootMenuPrint_ClearScreen
[241]24    call    BootMenu_GetDriveToDXforMenuitemInCX
[243]25    jnc     BootMenu_DisplayAndReturnSelectionInDX
[241]26    ret
[88]27
[128]28;--------------------------------------------------------------------
[248]29; BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS
[130]30; BootMenu_GetDriveToDXforMenuitemInCX
[128]31;   Parameters:
32;       CX:     Index of menuitem selected from Boot Menu
33;   Returns:
34;       DX:     Drive number to be used for booting
[241]35;       DS:     RAMVARS segment
36;       CF:     Set: There is a selected menu item, DL is valid
37;               Clear: There is no selected menu item, DL is not valid
[128]38;   Corrupts registers:
[258]39;       AX, DI
[128]40;--------------------------------------------------------------------
41ALIGN JUMP_ALIGN
[241]42BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS:
43    call    RamVars_GetSegmentToDS
44;;; fall-through
45                       
46ALIGN JUMP_ALIGN
[130]47BootMenu_GetDriveToDXforMenuitemInCX:
[241]48    cmp     cl, NO_ITEM_HIGHLIGHTED
49    je      SHORT .ReturnFloppyDriveInDX    ; Clear CF if branch taken
50
51    mov     dl, cl                          ; Copy menuitem index to DX
[258]52    call    FloppyDrive_GetCountToAX
53    cmp     dl, al                          ; Floppy drive?
[241]54    jb      SHORT .ReturnFloppyDriveInDX    ; Set CF if branch taken
[258]55    or      al, 80h                         ; Or 80h into AL before the sub
[241]56                                            ; to cause CF to be set after
57                                            ; and result has high order bit set
[258]58    sub     dl, al                          ; Remove floppy drives from index
[241]59
[128]60.ReturnFloppyDriveInDX:
61    ret
[88]62
[128]63
[88]64;--------------------------------------------------------------------
65; Enters Boot Menu or submenu.
66;
67; BootMenu_Enter
68;   Parameters:
69;       Nothing
70;   Returns:
71;       CX:     Index of selected item or NO_ITEM_SELECTED
72;   Corrupts registers:
[127]73;       AX, BX, DI
[88]74;--------------------------------------------------------------------
[3]75ALIGN JUMP_ALIGN
[88]76BootMenu_Enter:
77    mov     bx, BootMenuEvent_Handler
78    CALL_MENU_LIBRARY DisplayWithHandlerInBXandUserDataInDXAX
79    xchg    cx, ax
[3]80    ret
81
82
83;--------------------------------------------------------------------
84; Returns number of menuitems in Boot Menu.
85;
[124]86; BootMenu_GetMenuitemCountToAX
[3]87;   Parameters:
88;       DS:     RAMVARS segment
89;   Returns:
[124]90;       AX:     Number of boot menu items
[3]91;   Corrupts registers:
[124]92;       CX
[3]93;--------------------------------------------------------------------
94ALIGN JUMP_ALIGN
[124]95BootMenu_GetMenuitemCountToAX:
[258]96    call    RamVars_GetHardDiskCountFromBDAtoAX
[32]97    xchg    ax, cx
[258]98    call    FloppyDrive_GetCountToAX
[3]99    add     ax, cx
100    ret
101
102
103;--------------------------------------------------------------------
[124]104; BootMenu_GetHeightToAHwithItemCountInAL
[3]105;   Parameters:
[124]106;       AL:     Number of menuitems
[3]107;   Returns:
[88]108;       AH:     Boot menu height
[3]109;   Corrupts registers:
[124]110;       AL, CX, DI
[3]111;--------------------------------------------------------------------
112ALIGN JUMP_ALIGN
[124]113BootMenu_GetHeightToAHwithItemCountInAL:
[128]114    add     al, BOOT_MENU_HEIGHT_WITHOUT_ITEMS
[124]115    xchg    cx, ax
[88]116    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
[124]117    sub     ah, MENU_SCREEN_BOTTOM_LINES*2  ; Leave space for bottom info
[181]118    cmp     ah, cl
119    jb      SHORT .Return
120    mov     ah, cl
121ALIGN JUMP_ALIGN, ret
122.Return:
[3]123    ret
124
125
126;--------------------------------------------------------------------
[130]127; BootMenu_GetMenuitemToAXforAsciiHotkeyInAL
[3]128;   Parameters:
[130]129;       AL:     ASCII hotkey
[3]130;   Returns:
[130]131;       AX:     Menuitem index
[3]132;   Corrupts registers:
[130]133;       CX
[3]134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
[130]136BootMenu_GetMenuitemToAXforAsciiHotkeyInAL:
137    call    Char_ALtoUpperCaseLetter
138    xor     ah, ah
[258]139    xchg    ax, cx
140    call    BootMenu_GetLetterForFirstHardDiskToAL
141    cmp     cl, al                      ; Letter is for Hard Disk?
[3]142    jae     SHORT .StartFromHardDiskLetter
[258]143    xchg    ax, cx
[3]144    sub     al, 'A'                     ; Letter to Floppy Drive menuitem
145    ret
146ALIGN JUMP_ALIGN
147.StartFromHardDiskLetter:
[258]148    sub     cl, al                      ; Hard Disk index
149    call    FloppyDrive_GetCountToAX
[130]150    add     ax, cx                      ; Menuitem index
[258]151                                        ; Note: no need to xchg ax, cx as above, since adding with result to ax
[3]152    ret
153
[128]154
[3]155;--------------------------------------------------------------------
156; Returns letter for first hard disk. Usually it will be 'c' but it
157; can be higher if more than two floppy drives are found.
158;
[92]159; BootMenu_GetLetterForFirstHardDiskToCL
[3]160;   Parameters:
161;       Nothing
162;   Returns:
163;       CL:     Upper case letter for first hard disk
164;   Corrupts registers:
[258]165;       AX
[3]166;--------------------------------------------------------------------
167ALIGN JUMP_ALIGN
[258]168BootMenu_GetLetterForFirstHardDiskToAL:
169    call    FloppyDrive_GetCountToAX
170    add     al, 'A'
171    cmp     al, 'C'
[181]172    ja      .Return
[258]173    mov     al, 'C'
[181]174ALIGN JUMP_ALIGN, ret
175.Return:
[3]176    ret
177
178
179;--------------------------------------------------------------------
[124]180; BootMenu_GetMenuitemToDXforDriveInDL
[3]181;   Parameters:
182;       DL:     Drive number
183;   Returns:
[124]184;       DX:     Menuitem index (assuming drive is available)
[3]185;   Corrupts registers:
[258]186;       AX
[3]187;--------------------------------------------------------------------
188ALIGN JUMP_ALIGN
[124]189BootMenu_GetMenuitemToDXforDriveInDL:
190    xor     dh, dh                      ; Drive number now in DX
[128]191    test    dl, dl
192    jns     SHORT .ReturnItemIndexInDX  ; Return if floppy drive (HD bit not set)
[258]193    call    FloppyDrive_GetCountToAX
[127]194    and     dl, ~80h                    ; Clear HD bit
[258]195    add     dx, ax
[124]196.ReturnItemIndexInDX:
[3]197    ret
198
199
200;--------------------------------------------------------------------
201; Checks is drive number valid for this system.
202;
203; BootMenu_IsDriveInSystem
204;   Parameters:
205;       DL:     Drive number
206;       DS:     RAMVARS segment
207;   Returns:
[28]208;       CF:     Set if drive number is valid
[3]209;               Clear if drive is not present in system
210;   Corrupts registers:
[28]211;       AX, CX
[3]212;--------------------------------------------------------------------
213ALIGN JUMP_ALIGN
214BootMenu_IsDriveInSystem:
[128]215    test    dl, dl                              ; Floppy drive?
[130]216    jns     SHORT .IsFloppyDriveInSystem
[258]217    call    RamVars_GetHardDiskCountFromBDAtoAX ; Hard Disk count to AX
218    or      al, 80h                             ; Set Hard Disk bit to AX
[28]219    jmp     SHORT .CompareDriveNumberToDriveCount
[130]220.IsFloppyDriveInSystem:
[258]221    call    FloppyDrive_GetCountToAX
[28]222.CompareDriveNumberToDriveCount:
[258]223    cmp     dl, al                              ; Set CF when DL is smaller
[3]224    ret
Note: See TracBrowser for help on using the repository browser.