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

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

Changes to XTIDE Universal BIOS:

  • L-CHS parameters are now generated differently for LBA enabled drives.
  • Booting to EBIOS partitions now seems to work (at least on one drive).
File size: 4.8 KB
RevLine 
[99]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for accessing DPT data.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
[150]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
[158]36 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_ENABLE_IRQ
[150]37 jnz SHORT .EnableDeviceIrq
38 or al, FLG_DEVCONTROL_nIEN ; Disable IRQ
39.EnableDeviceIrq:
40 ret
41
42
43;--------------------------------------------------------------------
44; AccessDPT_GetAddressingModeForWordLookToBX
45; Parameters:
46; DS:DI: Ptr to Disk Parameter Table
47; Returns:
48; BX: Addressing Mode (L-CHS, P-CHS, LBA28, LBA48) shifted for WORD lookup
49; Corrupts registers:
50; Nothing
51;--------------------------------------------------------------------
52ALIGN JUMP_ALIGN
53AccessDPT_GetAddressingModeForWordLookToBX:
[158]54 mov bl, [di+DPT.bFlagsLow]
55 and bx, BYTE MASKL_DPT_ADDRESSING_MODE
[150]56 eSHR_IM bx, ADDRESSING_MODE_FIELD_POSITION-1
57 ret
58
59
60;--------------------------------------------------------------------
[173]61; AccessDPT_GetLCHS
[3]62; Parameters:
63; DS:DI: Ptr to Disk Parameter Table
64; Returns:
65; AX: Number of L-CHS sectors per track
66; BX: Number of L-CHS cylinders
67; DX: Number of L-CHS heads
68; Corrupts registers:
[173]69; CX
[3]70;--------------------------------------------------------------------
[173]71AccessDPT_GetLCHS:
72 ; Load CHS from DPT
73 eMOVZX ax, BYTE [di+DPT.bSectors]
74 mov bx, [di+DPT.dwCylinders]
[161]75 cwd
[173]76 mov dl, [di+DPT.bHeads]
77
78 ; Only need to limit sectors for LBA assist
79 test BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA
80 jnz SHORT .ReturnLbaAssistedLCHS
81
82 ; P-CHS to L-CHS translation when necessary
83 jmp SHORT AccessDPT_ShiftPCHinBXDXtoLCH
84
85.ReturnLbaAssistedLCHS:
86 cmp WORD [di+DPT.dwCylinders+2], BYTE 0
87 jz SHORT .LimitCylindersTo1024
88 mov bx, MAX_LCHS_CYLINDERS
89.LimitCylindersTo1024:
90 MIN_U bx, MAX_LCHS_CYLINDERS
[3]91 ret
92
93
94;--------------------------------------------------------------------
[173]95; AccessDPT_ShiftPCHinBXDXtoLCH
96; Parameters:
97; BX: P-CHS cylinders (1...16383)
98; DX: P-CHS heads (1...16)
99; Returns:
100; BX: Number of L-CHS cylinders (1...1024)
101; DX: Number of L-CHS heads (1...255)
102; CX: Number of bits shifted
103; Corrupts registers:
104; Nothing
105;--------------------------------------------------------------------
106AccessDPT_ShiftPCHinBXDXtoLCH:
107 xor cx, cx
108.ShiftLoop:
109 cmp bx, MAX_LCHS_CYLINDERS ; Need to shift?
110 jbe SHORT .LimitHeadsTo255 ; If not, return
111 inc cx ; Increment shift count
112 shr bx, 1 ; Halve cylinders
113 shl dx, 1 ; Double heads
114 jmp SHORT .ShiftLoop
115.LimitHeadsTo255: ; DOS does not support drives with 256 heads
116 sub dl, dh ; BH set only when 256 logical heads
117 xor dh, dh
118 ret
119
120
121;--------------------------------------------------------------------
[3]122; AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive
123; Parameters:
124; AX: Bitmask to test DRVPARAMS.wFlags
125; DS:DI: Ptr to Disk Parameter Table
126; Returns:
127; ZF: Set if tested bit was zero
128; Cleared if tested bit was non-zero
129; CF: 0
130; Corrupts registers:
131; BX
132;--------------------------------------------------------------------
133ALIGN JUMP_ALIGN
134AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive:
135 call AccessDPT_GetPointerToDRVPARAMStoCSBX
136 test [cs:bx+DRVPARAMS.wFlags], ax
137 ret
138
139;--------------------------------------------------------------------
140; Returns pointer to DRVPARAMS for master or slave drive.
141;
142; AccessDPT_GetPointerToDRVPARAMStoCSBX
143; Parameters:
144; DS:DI: Ptr to Disk Parameter Table
145; Returns:
146; CS:BX: Ptr to DRVPARAMS
147; Corrupts registers:
148; Nothing
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151AccessDPT_GetPointerToDRVPARAMStoCSBX:
[150]152 eMOVZX bx, [di+DPT.bIdevarsOffset] ; CS:BX points to IDEVARS
153 add bx, BYTE IDEVARS.drvParamsMaster ; CS:BX points to Master Drive DRVPARAMS
[158]154 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
[150]155 jz SHORT .ReturnPointerToDRVPARAMS
156 add bx, BYTE DRVPARAMS_size ; CS:BX points to Slave Drive DRVPARAMS
157.ReturnPointerToDRVPARAMS:
[3]158 ret
Note: See TracBrowser for help on using the repository browser.