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
RevLine 
[102]1; Project name  :   XTIDE Universal BIOS
[3]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
[86]19;--------------------------------------------------------------------
[3]20FloppyDrive_IsInt40hInstalled:
[152]21    cmp     WORD [es:BIOS_DISKETTE_INTERRUPT_40h*4+2], 0C000h   ; Any ROM segment?
[102]22%ifdef USE_AT   ; No need to verify on XT systems.
[39]23    jb      SHORT .Int40hHandlerIsNotInstalled
24    call    .VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h
[102]25.Int40hHandlerIsNotInstalled:
[99]26%endif
[27]27    cmc
[3]28    ret
29
[39]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
[86]39;--------------------------------------------------------------------
[99]40%ifdef USE_AT
[39]41.VerifyInt40hHandlerSinceSomeBiosesSimplyReturnFromInt40h:
42    push    es
43    push    dx
44    push    ax
[3]45
[39]46    call    .LoadInt40hVerifyParameters
[152]47    int     BIOS_DISK_INTERRUPT_13h
[99]48    jc      SHORT .Int40hIsInstalled    ; Maybe there are not any floppy drives at all
49    push    es
50    push    di
[39]51
52    call    .LoadInt40hVerifyParameters
[152]53    int     BIOS_DISKETTE_INTERRUPT_40h
[39]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?
[99]61    je      SHORT .Int40hIsInstalled
[39]62.Int40hNotInstalled:
63    stc
64.Int40hIsInstalled:
65    pop     ax
66    pop     dx
67    pop     es
68    ret
69
[3]70;--------------------------------------------------------------------
[39]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
[86]80;--------------------------------------------------------------------
[39]81.LoadInt40hVerifyParameters:
[86]82    mov     ah, 08h             ; Get Drive Parameters
83    cwd                         ; Floppy drive 0
[39]84    mov     di, dx
85    mov     es, dx              ; ES:DI = 0000:0000h to guard against BIOS bugs
86    ret
[99]87%endif
[39]88
89
90;--------------------------------------------------------------------
[3]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
[152]114    int     BIOS_DISKETTE_INTERRUPT_40h
[3]115    ret
116
117
118;--------------------------------------------------------------------
119; Returns number of Floppy Drives in system.
120;
[258]121; FloppyDrive_GetCountToAX
[3]122;   Parameters:
[258]123;       DS:     RAMVARS Segment
[3]124;   Returns:
[258]125;       AX:     Number of Floppy Drives
[3]126;--------------------------------------------------------------------
[294]127FloppyDrive_GetCountToAX:
[258]128%ifdef MODULE_SERIAL_FLOPPY
129    call    RamVars_UnpackFlopCntAndFirstToAL
[270]130    js      .UseBIOSorBDA               ; We didn't add in any drives, counts here are not valid
[294]131
132    adc     al,1                        ; adds in the drive count bit, and adds 1 for count vs. 0-index,
[270]133    jmp     .FinishCalc                 ; need to clear AH on the way out, and add in minimum drive numbers
[258]134
[294]135.UseBIOSorBDA:
[99]136%endif
[258]137    call    FloppyDrive_GetCountFromBIOS_or_BDA
[270]138
[294]139.FinishCalc:
[258]140    mov     ah, [cs:ROMVARS.bMinFddCnt]
141    MAX_U   al, ah
142    cbw
[294]143
[3]144    ret
145
[258]146FloppyDrive_GetCountFromBIOS_or_BDA:
147    push    es
[3]148
149;--------------------------------------------------------------------
150; Reads Floppy Drive Count from BIOS.
[294]151; Does not work on most XT systems. Call .GetCountFromBDA
[3]152; if this function fails.
153;
[294]154; .GetCountFromBIOS
[3]155;   Parameters:
156;       Nothing
157;   Returns:
[274]158;       AL:     Number of Floppy Drives
[294]159;       CF:     Cleared if successful
[3]160;               Set if BIOS function not supported
161;   Corrupts registers:
[274]162;       ES
[3]163;--------------------------------------------------------------------
[99]164%ifdef USE_AT
[258]165.GetCountFromBIOS:
[3]166    push    di
[274]167    push    bx
168    push    cx
[3]169    push    dx
170
171    mov     ah, 08h                 ; Get Drive Parameters
[86]172    cwd                             ; Floppy Drive 00h
[152]173    int     BIOS_DISKETTE_INTERRUPT_40h
[258]174    mov     al, dl                  ; Number of Floppy Drives to AL
[3]175
[274]176    pop     dx
177    pop     cx
[3]178    pop     bx
179    pop     di
[99]180%endif
[3]181
182;--------------------------------------------------------------------
183; Reads Floppy Drive Count (0...4) from BIOS Data Area.
[294]184; This function should be used only if .GetCountFromBIOS fails.
[3]185;
[294]186; .GetCountFromBDA
[3]187;   Parameters:
188;       Nothing
189;   Returns:
[294]190;       AL:     Number of Floppy Drives
[3]191;   Corrupts registers:
[294]192;       AH, ES
[3]193;--------------------------------------------------------------------
[99]194%ifndef USE_AT
[258]195.GetCountFromBDA:
196    LOAD_BDA_SEGMENT_TO es, ax
197    mov     al, [es:BDA.wEquipment]         ; Load Equipment WORD low byte
[294]198    mov     ah, al                          ; Copy it to AH
[258]199    and     ax, 0C001h                      ; Leave bits 15..14 and 0
200    eROL_IM ah, 2                           ; EW low byte bits 7..6 to 1..0
[294]201    add     al, ah                          ; AL = Floppy Drive count
[258]202%endif
203
204    pop     es
[3]205    ret
Note: See TracBrowser for help on using the repository browser.