source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Initialization/FloppyDrive.asm @ 86

Last change on this file since 86 was 86, checked in by krille_n_@…, 13 years ago

Size optimizations in various files in the XTIDE BIOS.
Also added a new include file for generic macros (macros.inc).

File size: 5.4 KB
Line 
1; Project name  :   IDE BIOS
2; Description   :   Various floppy drive related functions that
3;                   Boot Menu uses.
4
5; Section containing code
6SECTION .text
7
8;--------------------------------------------------------------------
9; Checks is floppy drive handler installed to interrupt vector 40h.
10;
11; FloppyDrive_IsInt40hInstalled
12;   Parameters:
13;       ES:     BDA and Interrupt Vector segment (zero)
14;   Returns:
15;       CF:     Set if INT 40h is installed
16;               Cleared if INT 40h is not installed
17;   Corrupts registers:
18;       BX, CX, DI
19;--------------------------------------------------------------------
20;ALIGN JUMP_ALIGN
21FloppyDrive_IsInt40hInstalled:
22    cmp     WORD [es:INTV_FLOPPY_FUNC*4+2], 0C000h  ; Any ROM segment?
23    jb      SHORT .Int40hHandlerIsNotInstalled
24    call    .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
25.Int40hHandlerIsNotInstalled:
26    cmc
27    ret
28
29;--------------------------------------------------------------------
30; .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
31;   Parameters:
32;       Nothing
33;   Returns:
34;       CF:     Cleared if INT 40h is installed
35;               Set if INT 40h is not installed
36;   Corrupts registers:
37;       BX, CX, DI
38;--------------------------------------------------------------------
39;ALIGN JUMP_ALIGN
40.VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h:
41    push    es
42    push    dx
43    push    ax
44
45    call    .LoadInt40hVerifyParameters
46    int     INTV_DISK_FUNC
47    jc      SHORT .AH08hNotSupported    ; AH=08h not supported on XTs but that doesn't
48    push    es                          ; matter since INT 40h does not need to be verified
49    push    di                          ; on XTs
50
51    call    .LoadInt40hVerifyParameters
52    int     INTV_FLOPPY_FUNC
53
54    pop     dx
55    pop     cx
56    cmp     dx, di                      ; Difference in offsets?
57    jne     SHORT .Int40hNotInstalled
58    mov     dx, es
59    cmp     cx, dx                      ; Difference in segments?
60    jne     SHORT .Int40hNotInstalled
61.AH08hNotSupported:
62    clc
63    jmp     SHORT .Int40hIsInstalled
64.Int40hNotInstalled:
65    stc
66.Int40hIsInstalled:
67    pop     ax
68    pop     dx
69    pop     es
70    ret
71
72;--------------------------------------------------------------------
73; .LoadInt40hVerifyParameters
74;   Parameters:
75;       Nothing
76;   Returns:
77;       AH:     08h (Get Drive Parameters)
78;       DL:     00h (floppy drive)
79;       ES:DI:  0:0h (to guard against BIOS bugs)
80;   Corrupts registers:
81;       DH
82;--------------------------------------------------------------------
83;ALIGN JUMP_ALIGN
84.LoadInt40hVerifyParameters:
85    mov     ah, 08h             ; Get Drive Parameters
86    cwd                         ; Floppy drive 0
87    mov     di, dx
88    mov     es, dx              ; ES:DI = 0000:0000h to guard against BIOS bugs
89    ret
90
91
92;--------------------------------------------------------------------
93; Returns floppy drive type.
94; PC/XT system do not support AH=08h but FLOPPY_TYPE_525_OR_35_DD
95; is still returned for them.
96;
97; FloppyDrive_GetType
98;   Parameters:
99;       DL:     Floppy Drive number
100;   Returns:
101;       BX:     Floppy Drive Type:
102;                   FLOPPY_TYPE_525_OR_35_DD
103;                   FLOPPY_TYPE_525_DD
104;                   FLOPPY_TYPE_525_HD
105;                   FLOPPY_TYPE_35_DD
106;                   FLOPPY_TYPE_35_HD
107;                   FLOPPY_TYPE_35_ED
108;       CF:     Set if AH=08h not supported (XT systems) or error
109;               Cleared if type read correctly (AT systems)
110;   Corrupts registers:
111;       AX, CX, DX, DI, ES
112;--------------------------------------------------------------------
113ALIGN JUMP_ALIGN
114FloppyDrive_GetType:
115    mov     ah, 08h         ; Get Drive Parameters
116    xor     bx, bx          ; FLOPPY_TYPE_525_OR_35_DD when function not supported
117    int     INTV_FLOPPY_FUNC
118    ret
119
120
121;--------------------------------------------------------------------
122; Returns number of Floppy Drives in system.
123;
124; FloppyDrive_GetCount
125;   Parameters:
126;       Nothing
127;   Returns:
128;       CX:     Number of Floppy Drives
129;   Corrupts registers:
130;       Nothing
131;--------------------------------------------------------------------
132ALIGN JUMP_ALIGN
133FloppyDrive_GetCount:
134    push    es
135    call    FloppyDrive_GetCountFromBIOS
136    jnc     SHORT .CompareToUserMinimum
137    call    FloppyDrive_GetCountFromBDA
138ALIGN JUMP_ALIGN
139.CompareToUserMinimum:
140    MAX_U   cl, [cs:ROMVARS.bMinFddCnt]
141    xor     ch, ch
142    pop     es
143    ret
144
145
146;--------------------------------------------------------------------
147; Reads Floppy Drive Count from BIOS.
148; Does not work on most XT systems. Call FloppyDrive_GetCountFromBDA
149; if this function fails.
150;
151; FloppyDrive_GetCountFromBIOS
152;   Parameters:
153;       Nothing
154;   Returns:
155;       CL:     Number of Floppy Drives
156;       CF:     Cleared if successfull
157;               Set if BIOS function not supported
158;   Corrupts registers:
159;       CH, ES
160;--------------------------------------------------------------------
161ALIGN JUMP_ALIGN
162FloppyDrive_GetCountFromBIOS:
163    push    di
164    push    dx
165    push    bx
166    push    ax
167
168    mov     ah, 08h                 ; Get Drive Parameters
169    cwd                             ; Floppy Drive 00h
170    int     INTV_FLOPPY_FUNC
171    mov     cl, dl                  ; Number of Floppy Drives to CL
172
173    pop     ax
174    pop     bx
175    pop     dx
176    pop     di
177    ret
178
179
180;--------------------------------------------------------------------
181; Reads Floppy Drive Count (0...4) from BIOS Data Area.
182; This function should be used only if FloppyDrive_GetCountFromBIOS fails.
183;
184; FloppyDrive_GetCountFromBDA
185;   Parameters:
186;       Nothing
187;   Returns:
188;       CL:     Number of Floppy Drives
189;   Corrupts registers:
190;       CH, ES
191;--------------------------------------------------------------------
192ALIGN JUMP_ALIGN
193FloppyDrive_GetCountFromBDA:
194    LOAD_BDA_SEGMENT_TO es, cx
195    mov     cl, [es:BDA.wEquipment]         ; Load Equipment WORD low byte
196    mov     ch, cl                          ; Copy it to CH
197    and     cx, 0C001h                      ; Leave bits 15..14 and 0
198    eROL_IM ch, 2                           ; EW low byte bits 7..6 to 1..0
199    add     cl, ch                          ; CL = Floppy Drive count
200    ret
Note: See TracBrowser for help on using the repository browser.