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

Last change on this file since 334 was 294, checked in by krille_n_@…, 12 years ago

Commit 2/2 (BIOS):

  • Fixed a bug in AH1h_HStatus.asm.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 5.6 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;--------------------------------------------------------------------
111ALIGN JUMP_ALIGN
112FloppyDrive_GetType:
113    mov     ah, 08h         ; Get Drive Parameters
114    xor     bx, bx          ; FLOPPY_TYPE_525_OR_35_DD when function not supported
[152]115    int     BIOS_DISKETTE_INTERRUPT_40h
[3]116    ret
117
118
119;--------------------------------------------------------------------
120; Returns number of Floppy Drives in system.
121;
[258]122; FloppyDrive_GetCountToAX
[3]123;   Parameters:
[258]124;       DS:     RAMVARS Segment
[3]125;   Returns:
[258]126;       AX:     Number of Floppy Drives
[3]127;--------------------------------------------------------------------
128ALIGN JUMP_ALIGN
[294]129FloppyDrive_GetCountToAX:
[258]130%ifdef MODULE_SERIAL_FLOPPY
131    call    RamVars_UnpackFlopCntAndFirstToAL
[270]132    js      .UseBIOSorBDA               ; We didn't add in any drives, counts here are not valid
[294]133
134    adc     al,1                        ; adds in the drive count bit, and adds 1 for count vs. 0-index,
[270]135    jmp     .FinishCalc                 ; need to clear AH on the way out, and add in minimum drive numbers
[258]136
[294]137.UseBIOSorBDA:
[99]138%endif
[258]139    call    FloppyDrive_GetCountFromBIOS_or_BDA
[270]140
[294]141.FinishCalc:
[258]142    mov     ah, [cs:ROMVARS.bMinFddCnt]
143    MAX_U   al, ah
144    cbw
[294]145
[3]146    ret
147
[294]148ALIGN JUMP_ALIGN
[258]149FloppyDrive_GetCountFromBIOS_or_BDA:
150    push    es
[3]151
152;--------------------------------------------------------------------
153; Reads Floppy Drive Count from BIOS.
[294]154; Does not work on most XT systems. Call .GetCountFromBDA
[3]155; if this function fails.
156;
[294]157; .GetCountFromBIOS
[3]158;   Parameters:
159;       Nothing
160;   Returns:
[274]161;       AL:     Number of Floppy Drives
[294]162;       CF:     Cleared if successful
[3]163;               Set if BIOS function not supported
164;   Corrupts registers:
[274]165;       ES
[3]166;--------------------------------------------------------------------
[99]167%ifdef USE_AT
[3]168ALIGN JUMP_ALIGN
[258]169.GetCountFromBIOS:
[3]170    push    di
[274]171    push    bx
172    push    cx
[3]173    push    dx
174
175    mov     ah, 08h                 ; Get Drive Parameters
[86]176    cwd                             ; Floppy Drive 00h
[152]177    int     BIOS_DISKETTE_INTERRUPT_40h
[258]178    mov     al, dl                  ; Number of Floppy Drives to AL
[3]179
[274]180    pop     dx
181    pop     cx
[3]182    pop     bx
183    pop     di
[99]184%endif
[3]185
186;--------------------------------------------------------------------
187; Reads Floppy Drive Count (0...4) from BIOS Data Area.
[294]188; This function should be used only if .GetCountFromBIOS fails.
[3]189;
[294]190; .GetCountFromBDA
[3]191;   Parameters:
192;       Nothing
193;   Returns:
[294]194;       AL:     Number of Floppy Drives
[3]195;   Corrupts registers:
[294]196;       AH, ES
[3]197;--------------------------------------------------------------------
[99]198%ifndef USE_AT
[3]199ALIGN JUMP_ALIGN
[258]200.GetCountFromBDA:
201    LOAD_BDA_SEGMENT_TO es, ax
202    mov     al, [es:BDA.wEquipment]         ; Load Equipment WORD low byte
[294]203    mov     ah, al                          ; Copy it to AH
[258]204    and     ax, 0C001h                      ; Leave bits 15..14 and 0
205    eROL_IM ah, 2                           ; EW low byte bits 7..6 to 1..0
[294]206    add     al, ah                          ; AL = Floppy Drive count
[258]207%endif
208
209    pop     es
[3]210    ret
Note: See TracBrowser for help on using the repository browser.