source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm @ 32

Last change on this file since 32 was 32, checked in by aitotat, 12 years ago

Correct number of drives is now returned from AH=08h even when it is redirected to foreign BIOS.

File size: 3.9 KB
Line 
1; File name     :   AH8h_HParams.asm
2; Project name  :   IDE BIOS
3; Created date  :   27.9.2007
4; Last update   :   3.8.2010
5; Author        :   Tomi Tilli
6; Description   :   Int 13h function AH=8h, Read Disk Drive Parameters.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Int 13h function AH=8h, Read Disk Drive Parameters.
13;
14; AH8h_HandlerForReadDiskDriveParameters
15;   Parameters:
16;       AH:     Bios function 8h
17;       DL:     Drive number
18;   Parameters loaded by Int13h_Jump:
19;       DS:     RAMVARS segment
20;   Returns:
21;       CH:     Maximum cylinder number, bits 7...0
22;       CL:     Bits 7...6: Cylinder number bits 9...8
23;               Bits 5...0: Maximum sector number (1...63)
24;       DH:     Maximum head number (0...255)
25;       DL:     Number of drives
26;       AH:     Int 13h/40h floppy return status
27;       CF:     0 if successfull, 1 if error
28;       IF:     1
29;   Corrupts registers:
30;       Flags
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33AH8h_HandlerForReadDiskDriveParameters:
34    call    RamVars_IsDriveHandledByThisBIOS
35    jnc     SHORT .GetDriveParametersForForeignHardDiskInDL
36
37    push    bx
38    call    AH8h_GetDriveParameters
39    pop     bx
40    jmp     Int13h_ReturnWithoutSwappingDrives
41
42ALIGN JUMP_ALIGN
43.GetDriveParametersForForeignHardDiskInDL:
44    call    Int13h_CallPreviousInt13hHandler
45    call    RamVars_GetCountOfKnownDrivesToDL
46    jmp     Int13h_ReturnWithoutSwappingDrives
47
48
49;--------------------------------------------------------------------
50; Returns L-CHS parameters for drive and total hard disk count.
51;
52; AH8h_GetDriveParameters
53;   Parameters:
54;       DL:     Drive number
55;       DS:     RAMVARS segment
56;   Returns:
57;       CH:     Maximum cylinder number, bits 7...0
58;       CL:     Bits 7...6: Cylinder number bits 9...8
59;               Bits 5...0: Maximum sector number (1...63)
60;       DH:     Maximum head number (0...255)
61;       DL:     Number of drives
62;       DS:DI:  Ptr to DPT
63;       AH:     Int 13h/40h floppy return status
64;       CF:     0 if successfull, 1 if error
65;   Corrupts registers:
66;       AL, BX
67;--------------------------------------------------------------------
68ALIGN JUMP_ALIGN
69AH8h_GetDriveParameters:
70    call    FindDPT_ForDriveNumber
71    call    AccessDPT_GetLCHSfromPCHS   ; AX=sectors, BX=cylinders, DX=heads
72    call    AH8h_ReserveCylinders
73    call    AH8h_PackReturnValues
74    xor     ax, ax                      ; Clear AH and CF
75    ret
76
77
78;--------------------------------------------------------------------
79; Reserves diagnostic cylinder if so configured.
80;
81; AH8h_ReserveCylinders
82;   Parameters:
83;       BX:     Total number of L-CHS cylinders available
84;       DS:DI:  Ptr to DPT
85;   Returns:
86;       BX:     Number of L-CHS cylinders available after reserving
87;   Corrupts registers:
88;       CX
89;--------------------------------------------------------------------
90ALIGN JUMP_ALIGN
91AH8h_ReserveCylinders:
92    test    BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_MAXSIZE
93    jnz     SHORT .Return
94    dec     bx                          ; Reserve diagnostic cylinder
95ALIGN JUMP_ALIGN
96.Return:
97    ret
98
99
100;--------------------------------------------------------------------
101; Packs L-CHS values to INT 13h, AH=08h return values.
102;
103; AH8h_PackReturnValues
104;   Parameters:
105;       AX:     Number of L-CHS sectors per track (1...63)
106;       BX:     Number of L-CHS cylinders available (1...1024)
107;       DX:     Number of L-CHS heads (1...256)
108;       DS:     RAMVARS segment
109;   Returns:
110;       CH:     Maximum cylinder number, bits 7...0
111;       CL:     Bits 7...6: Cylinder number bits 9...8
112;               Bits 5...0: Maximum sector number (1...63)
113;       DH:     Maximum head number (0...255)
114;       DL:     Number of drives
115;   Corrupts registers:
116;       AX, BX
117;--------------------------------------------------------------------
118ALIGN JUMP_ALIGN
119AH8h_PackReturnValues:
120    dec     bx                      ; Cylinder count to last cylinder
121    dec     dx                      ; Head count to max head number
122    mov     dh, dl                  ; Max head number to DH
123    mov     ch, bl                  ; Cylinder bits 7...0 to CH
124    mov     cl, bh                  ; Cylinder bits 9...8 to CL
125    eROR_IM cl, 2                   ; Cylinder bits 9...8 to CL bits 7...6
126    or      cl, al                  ; Sectors per track to CL bits 5...0
127    jmp     RamVars_GetCountOfKnownDrivesToDL
Note: See TracBrowser for help on using the repository browser.