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

Last change on this file since 229 was 227, checked in by aitotat@…, 13 years ago

Changes to XTIDE Universal BIOS:

  • EBIOS functions now work in lite mode.
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 jbe 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 jmp SHORT AccessDPT_ShiftPCHinAXBLtoLCH
74
75
76;--------------------------------------------------------------------
77; AccessDPT_GetLbaSectorCountToBXDXAX
78; Parameters:
79; DS:DI: Ptr to Disk Parameter Table
80; Returns:
81; BX:DX:AX: 48-bit sector count
82; Corrupts registers:
83; Nothing
84;--------------------------------------------------------------------
85AccessDPT_GetLbaSectorCountToBXDXAX:
86 mov ax, [di+DPT.twLbaSectors]
87 mov dx, [di+DPT.twLbaSectors+2]
88 mov bx, [di+DPT.twLbaSectors+4]
89 ret
90
91
92;--------------------------------------------------------------------
93; AccessDPT_ShiftPCHinAXBLtoLCH
94; Parameters:
95; AX: P-CHS cylinders (1...16383)
96; BL: P-CHS heads (1...16)
97; Returns:
98; AX: Number of L-CHS cylinders (1...1024)
99; BL: Number of L-CHS heads (1...255)
100; CX: Number of bits shifted
101; Corrupts registers:
102; Nothing
103;--------------------------------------------------------------------
104AccessDPT_ShiftPCHinAXBLtoLCH:
105 xor cx, cx
106.ShiftLoop:
107 cmp ax, MAX_LCHS_CYLINDERS ; Need to shift?
108 jbe SHORT .LimitHeadsTo255 ; If not, return
109 inc cx ; Increment shift count
110 shr ax, 1 ; Halve cylinders
111 shl bl, 1 ; Double heads
112 jmp SHORT .ShiftLoop
113.LimitHeadsTo255: ; DOS does not support drives with 256 heads
114 cmp bl, cl ; Set CF if BL is zero
115 sbb bl, ch ; If BL=0 then BL=255
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.