source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm @ 230

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

Changes to XTIDE Universal BIOS:

  • Some small optimizations
File size: 4.9 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for accessing DPT data.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; AccessDPT_GetDriveSelectByteToAL
9;   Parameters:
10;       DS:DI:  Ptr to Disk Parameter Table
11;   Returns:
12;       AL:     Drive Select Byte
13;   Corrupts registers:
14;       Nothing
15;--------------------------------------------------------------------
16ALIGN JUMP_ALIGN
17AccessDPT_GetDriveSelectByteToAL:
18    mov     al, [di+DPT.wFlags]
19    and     al, FLG_DRVNHEAD_LBA | FLG_DRVNHEAD_DRV
20    or      al, MASK_DRVNHEAD_SET   ; Bits set to 1 for old drives
21    ret
22
23
24;--------------------------------------------------------------------
25; AccessDPT_GetDeviceControlByteToAL
26;   Parameters:
27;       DS:DI:  Ptr to Disk Parameter Table
28;   Returns:
29;       AL:     Device Control Byte
30;   Corrupts registers:
31;       Nothing
32;--------------------------------------------------------------------
33ALIGN JUMP_ALIGN
34AccessDPT_GetDeviceControlByteToAL:
35    xor     al, al
36    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_ENABLE_IRQ
37    jnz     SHORT .EnableDeviceIrq
38    or      al, FLG_DEVCONTROL_nIEN ; Disable IRQ
39.EnableDeviceIrq:
40    ret
41
42
43;--------------------------------------------------------------------
44; AccessDPT_GetLCHStoAXBLBH
45;   Parameters:
46;       DS:DI:  Ptr to Disk Parameter Table
47;   Returns:
48;       AX:     Number of L-CHS cylinders
49;       BL:     Number of L-CHS heads
50;       BH:     Number of L-CHS sectors per track
51;   Corrupts registers:
52;       CX, DX
53;--------------------------------------------------------------------
54AccessDPT_GetLCHStoAXBLBH:
55    ; Return LBA-assisted CHS if LBA addressing used
56    test    BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA
57    jz      SHORT .ConvertPchsToLchs
58
59    call    AccessDPT_GetLbaSectorCountToBXDXAX
60    call    AtaID_GetLbaAssistedCHStoDXAXBLBH
61    test    dx, dx
62    jnz     SHORT .LimitAXtoMaxLCHScylinders
63    cmp     ax, MAX_LCHS_CYLINDERS
64    jb      SHORT .returnLCHS
65.LimitAXtoMaxLCHScylinders:
66    mov     ax, MAX_LCHS_CYLINDERS
67.returnLCHS:
68    ret
69
70.ConvertPchsToLchs:
71    mov     ax, [di+DPT.wPchsCylinders]
72    mov     bx, [di+DPT.wPchsHeadsAndSectors]
73    ; Fall to AccessDPT_ShiftPCHinAXBLtoLCH
74
75
76;--------------------------------------------------------------------
77; AccessDPT_ShiftPCHinAXBLtoLCH
78;   Parameters:
79;       AX:     P-CHS cylinders (1...16383)
80;       BL:     P-CHS heads (1...16)
81;   Returns:
82;       AX:     Number of L-CHS cylinders (1...1024)
83;       BL:     Number of L-CHS heads (1...255)
84;       CX:     Number of bits shifted (4 at most)
85;   Corrupts registers:
86;       Nothing
87;--------------------------------------------------------------------
88AccessDPT_ShiftPCHinAXBLtoLCH:
89    xor     cx, cx
90.ShiftLoop:
91    cmp     ax, MAX_LCHS_CYLINDERS      ; Need to shift?
92    jbe     SHORT .LimitHeadsTo255      ;  If not, return
93    inc     cx                          ; Increment shift count
94    shr     ax, 1                       ; Halve cylinders
95    shl     bl, 1                       ; Double heads
96    jnz     SHORT .ShiftLoop
97.LimitHeadsTo255:                       ; DOS does not support drives with 256 heads
98    cmp     bl, cl                      ; Set CF if BL is zero
99    sbb     bl, ch                      ; If BL=0 then BL=255
100    ret
101
102
103;--------------------------------------------------------------------
104; AccessDPT_GetLbaSectorCountToBXDXAX
105;   Parameters:
106;       DS:DI:  Ptr to Disk Parameter Table
107;   Returns:
108;       BX:DX:AX:   48-bit sector count
109;   Corrupts registers:
110;       Nothing
111;--------------------------------------------------------------------
112AccessDPT_GetLbaSectorCountToBXDXAX:
113    mov     ax, [di+DPT.twLbaSectors]
114    mov     dx, [di+DPT.twLbaSectors+2]
115    mov     bx, [di+DPT.twLbaSectors+4]
116    ret
117
118
119;--------------------------------------------------------------------
120; Returns pointer to DRVPARAMS for master or slave drive.
121;
122; AccessDPT_GetPointerToDRVPARAMStoCSBX
123;   Parameters:
124;       DS:DI:  Ptr to Disk Parameter Table
125;   Returns:
126;       CS:BX:  Ptr to DRVPARAMS
127;   Corrupts registers:
128;       Nothing
129;--------------------------------------------------------------------
130ALIGN JUMP_ALIGN
131AccessDPT_GetPointerToDRVPARAMStoCSBX:
132    eMOVZX  bx, [di+DPT.bIdevarsOffset]         ; CS:BX points to IDEVARS
133    add     bx, BYTE IDEVARS.drvParamsMaster    ; CS:BX points to Master Drive DRVPARAMS
134    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
135    jz      SHORT .ReturnPointerToDRVPARAMS
136    add     bx, BYTE DRVPARAMS_size             ; CS:BX points to Slave Drive DRVPARAMS
137.ReturnPointerToDRVPARAMS:
138    ret
139
140;--------------------------------------------------------------------
141; AccessDPT_GetUnshiftedAddressModeToALZF
142;   Parameters:
143;       DS:DI:  Ptr to Disk Parameter Table
144;   Returns:
145;       AL:     Addressing Mode (L-CHS, P-CHS, LBA28, LBA48)
146;               unshifted (still shifted where it is in bFlagsLow)
147;       ZF:     Set based on value in AL
148;   Corrupts registers:
149;       AL
150;--------------------------------------------------------------------
151;
152; Converted to a macro since only called in two places, and the call/ret overhead
153; is not worth it for these two instructions (4 bytes total)
154;
155%macro AccessDPT_GetUnshiftedAddressModeToALZF 0
156    mov     al, [di+DPT.bFlagsLow]
157    and     al, MASKL_DPT_ADDRESSING_MODE
158%endmacro
Note: See TracBrowser for help on using the repository browser.