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

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

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 5.5 KB
Line 
1; Project name  :   XTIDE Universal 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;--------------------------------------------------------------------
20FloppyDrive_IsInt40hInstalled:
21    cmp     WORD [es:BIOS_DISKETTE_INTERRUPT_40h*4+2], 0C000h   ; Any ROM segment?
22%ifdef USE_AT   ; No need to verify on XT systems.
23    jb      SHORT .Int40hHandlerIsNotInstalled
24    call    .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
25.Int40hHandlerIsNotInstalled:
26%endif
27    cmc
28    ret
29
30;--------------------------------------------------------------------
31; .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
32;   Parameters:
33;       Nothing
34;   Returns:
35;       CF:     Cleared if INT 40h is installed
36;               Set if INT 40h is not installed
37;   Corrupts registers:
38;       BX, CX, DI
39;--------------------------------------------------------------------
40%ifdef USE_AT
41.VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h:
42    push    es
43    push    dx
44    push    ax
45
46    call    .LoadInt40hVerifyParameters
47    int     BIOS_DISK_INTERRUPT_13h
48    jc      SHORT .Int40hIsInstalled    ; Maybe there are not any floppy drives at all
49    push    es
50    push    di
51
52    call    .LoadInt40hVerifyParameters
53    int     BIOS_DISKETTE_INTERRUPT_40h
54
55    pop     dx
56    pop     cx
57    cmp     dx, di                      ; Difference in offsets?
58    jne     SHORT .Int40hNotInstalled
59    mov     dx, es
60    cmp     cx, dx                      ; Difference in segments?
61    je      SHORT .Int40hIsInstalled
62.Int40hNotInstalled:
63    stc
64.Int40hIsInstalled:
65    pop     ax
66    pop     dx
67    pop     es
68    ret
69
70;--------------------------------------------------------------------
71; .LoadInt40hVerifyParameters
72;   Parameters:
73;       Nothing
74;   Returns:
75;       AH:     08h (Get Drive Parameters)
76;       DL:     00h (floppy drive)
77;       ES:DI:  0:0h (to guard against BIOS bugs)
78;   Corrupts registers:
79;       DH
80;--------------------------------------------------------------------
81.LoadInt40hVerifyParameters:
82    mov     ah, 08h             ; Get Drive Parameters
83    cwd                         ; Floppy drive 0
84    mov     di, dx
85    mov     es, dx              ; ES:DI = 0000:0000h to guard against BIOS bugs
86    ret
87%endif
88
89
90;--------------------------------------------------------------------
91; Returns floppy drive type.
92; PC/XT system do not support AH=08h but FLOPPY_TYPE_525_OR_35_DD
93; is still returned for them.
94;
95; FloppyDrive_GetType
96;   Parameters:
97;       DL:     Floppy Drive number
98;   Returns:
99;       BX:     Floppy Drive Type:
100;                   FLOPPY_TYPE_525_OR_35_DD
101;                   FLOPPY_TYPE_525_DD
102;                   FLOPPY_TYPE_525_HD
103;                   FLOPPY_TYPE_35_DD
104;                   FLOPPY_TYPE_35_HD
105;                   FLOPPY_TYPE_35_ED
106;       CF:     Set if AH=08h not supported (XT systems) or error
107;               Cleared if type read correctly (AT systems)
108;   Corrupts registers:
109;       AX, CX, DX, DI, ES
110;--------------------------------------------------------------------
111FloppyDrive_GetType:
112    mov     ah, 08h         ; Get Drive Parameters
113    xor     bx, bx          ; FLOPPY_TYPE_525_OR_35_DD when function not supported
114    int     BIOS_DISKETTE_INTERRUPT_40h
115    ret
116
117
118;--------------------------------------------------------------------
119; Returns number of Floppy Drives in system.
120;
121; FloppyDrive_GetCountToAX
122;   Parameters:
123;       DS:     RAMVARS Segment
124;   Returns:
125;       AX:     Number of Floppy Drives
126;--------------------------------------------------------------------
127FloppyDrive_GetCountToAX:
128%ifdef MODULE_SERIAL_FLOPPY
129    call    RamVars_UnpackFlopCntAndFirstToAL
130    js      .UseBIOSorBDA               ; We didn't add in any drives, counts here are not valid
131
132    adc     al,1                        ; adds in the drive count bit, and adds 1 for count vs. 0-index,
133    jmp     .FinishCalc                 ; need to clear AH on the way out, and add in minimum drive numbers
134
135.UseBIOSorBDA:
136%endif
137    call    FloppyDrive_GetCountFromBIOS_or_BDA
138
139.FinishCalc:
140    mov     ah, [cs:ROMVARS.bMinFddCnt]
141    MAX_U   al, ah
142    cbw
143
144    ret
145
146FloppyDrive_GetCountFromBIOS_or_BDA:
147    push    es
148
149;--------------------------------------------------------------------
150; Reads Floppy Drive Count from BIOS.
151; Does not work on most XT systems. Call .GetCountFromBDA
152; if this function fails.
153;
154; .GetCountFromBIOS
155;   Parameters:
156;       Nothing
157;   Returns:
158;       AL:     Number of Floppy Drives
159;       CF:     Cleared if successful
160;               Set if BIOS function not supported
161;   Corrupts registers:
162;       ES
163;--------------------------------------------------------------------
164%ifdef USE_AT
165.GetCountFromBIOS:
166    push    di
167    push    bx
168    push    cx
169    push    dx
170
171    mov     ah, 08h                 ; Get Drive Parameters
172    cwd                             ; Floppy Drive 00h
173    int     BIOS_DISKETTE_INTERRUPT_40h
174    mov     al, dl                  ; Number of Floppy Drives to AL
175
176    pop     dx
177    pop     cx
178    pop     bx
179    pop     di
180%endif
181
182;--------------------------------------------------------------------
183; Reads Floppy Drive Count (0...4) from BIOS Data Area.
184; This function should be used only if .GetCountFromBIOS fails.
185;
186; .GetCountFromBDA
187;   Parameters:
188;       Nothing
189;   Returns:
190;       AL:     Number of Floppy Drives
191;   Corrupts registers:
192;       AH, ES
193;--------------------------------------------------------------------
194%ifndef USE_AT
195.GetCountFromBDA:
196    LOAD_BDA_SEGMENT_TO es, ax
197    mov     al, [es:BDA.wEquipment]         ; Load Equipment WORD low byte
198    mov     ah, al                          ; Copy it to AH
199    and     ax, 0C001h                      ; Leave bits 15..14 and 0
200    eROL_IM ah, 2                           ; EW low byte bits 7..6 to 1..0
201    add     al, ah                          ; AL = Floppy Drive count
202%endif
203
204    pop     es
205    ret
Note: See TracBrowser for help on using the repository browser.