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

Last change on this file since 551 was 545, checked in by aitotat@…, 12 years ago

Changes to XTIDE Universal BIOS:

  • Integrated XT-CFv3 support by James Pearce.
  • XT-CFv2 memory mapped I/O and DMA modes are no longer supported (but PIO mode is).
File size: 5.7 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Functions for accessing DPT data.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; AccessDPT_GetDriveSelectByteToAL
25; Parameters:
26; DS:DI: Ptr to Disk Parameter Table
27; Returns:
28; AL: Drive Select Byte
29; Corrupts registers:
30; Nothing
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33AccessDPT_GetDriveSelectByteToAL:
34 mov al, [di+DPT.bFlagsLow]
35 and al, FLGL_DPT_SLAVE | FLGL_DPT_LBA
36 or al, MASK_DRVNHEAD_SET ; Bits set to 1 for old drives
37 ret
38
39
40;--------------------------------------------------------------------
41; AccessDPT_GetDeviceControlByteToAL
42; Parameters:
43; DS:DI: Ptr to Disk Parameter Table
44; Returns:
45; AL: Device Control Byte
46; Corrupts registers:
47; Nothing
48;--------------------------------------------------------------------
49ALIGN JUMP_ALIGN
50AccessDPT_GetDeviceControlByteToAL:
51%ifdef MODULE_IRQ
52
53%ifndef USE_UNDOC_INTEL
54 xor al, al
55%endif
56
57 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_ENABLE_IRQ ; Clears CF
58
59%ifdef USE_UNDOC_INTEL
60 eSALC ; Clears AL using CF while preserving flags
61%endif
62
63 jnz SHORT .EnableDeviceIrq
64 or al, FLG_DEVCONTROL_nIEN ; Disable IRQ
65.EnableDeviceIrq:
66%else
67 mov al, FLG_DEVCONTROL_nIEN ; Disable IRQ
68%endif ; MODULE_IRQ
69 ret
70
71
72;--------------------------------------------------------------------
73; AccessDPT_GetLCHStoAXBLBH
74; Parameters:
75; DS:DI: Ptr to Disk Parameter Table
76; Returns:
77; AX: Number of L-CHS cylinders
78; BL: Number of L-CHS heads
79; BH: Number of L-CHS sectors per track
80; Corrupts registers:
81; Nothing
82;--------------------------------------------------------------------
83AccessDPT_GetLCHStoAXBLBH:
84 mov ax, [di+DPT.wLchsCylinders]
85 mov bx, [di+DPT.wLchsHeadsAndSectors]
86 ret
87
88
89%ifdef MODULE_8BIT_IDE_ADVANCED
90;--------------------------------------------------------------------
91; AccessDPT_IsThisDeviceXTCF
92; Parameters:
93; DS:DI: Ptr to Disk Parameter Table
94; Returns:
95; AH: Device Type
96; ZF: Set if XTCF
97; Cleared if some other device
98; Corrupts registers:
99; Nothing
100;--------------------------------------------------------------------
101AccessDPT_IsThisDeviceXTCF:
102 mov ah, [di+DPT_ATA.bDevice]
103 cmp ah, DEVICE_8BIT_XTCF_PIO8
104 je SHORT .DeviceIsXTCF
105 cmp ah, DEVICE_8BIT_XTCF_PIO8_WITH_BIU_OFFLOAD
106 je SHORT .DeviceIsXTCF
107 cmp ah, DEVICE_8BIT_XTCF_DMA
108.DeviceIsXTCF:
109 ret
110%endif ; MODULE_8BIT_IDE_ADVANCED
111
112
113%ifdef MODULE_EBIOS
114;--------------------------------------------------------------------
115; AccessDPT_GetLbaSectorCountToBXDXAX
116; Parameters:
117; DS:DI: Ptr to Disk Parameter Table
118; Returns:
119; BX:DX:AX: 48-bit sector count
120; Corrupts registers:
121; Nothing
122;--------------------------------------------------------------------
123AccessDPT_GetLbaSectorCountToBXDXAX:
124 mov ax, [di+DPT.twLbaSectors]
125 mov dx, [di+DPT.twLbaSectors+2]
126 mov bx, [di+DPT.twLbaSectors+4]
127 ret
128%endif ; MODULE_EBIOS
129
130
131;--------------------------------------------------------------------
132; Returns pointer to DRVPARAMS for master or slave drive.
133;
134; AccessDPT_GetPointerToDRVPARAMStoCSBX
135; Parameters:
136; DS:DI: Ptr to Disk Parameter Table
137; Returns:
138; CS:BX: Ptr to DRVPARAMS
139; Corrupts registers:
140; Nothing
141;--------------------------------------------------------------------
142AccessDPT_GetPointerToDRVPARAMStoCSBX:
143 call AccessDPT_GetIdevarsToCSBX
144 add bx, BYTE IDEVARS.drvParamsMaster ; CS:BX points to Master Drive DRVPARAMS
145 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
146 jz SHORT .ReturnPointerToDRVPARAMS
147 add bx, BYTE DRVPARAMS_size ; CS:BX points to Slave Drive DRVPARAMS
148.ReturnPointerToDRVPARAMS:
149 ret
150
151
152;--------------------------------------------------------------------
153; Needed many times during initialization so it is better to
154; make it as a function to save bytes.
155;
156; AccessDPT_GetIdevarsToCSBX
157; Parameters:
158; DS:DI: Ptr to Disk Parameter Table
159; Returns:
160; CS:BX: Ptr to IDEVARS for the drive
161; Corrupts registers:
162; Nothing
163;--------------------------------------------------------------------
164AccessDPT_GetIdevarsToCSBX:
165 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset]
166 ret
167
168
169;--------------------------------------------------------------------
170; ACCESSDPT__GET_UNSHIFTED_TRANSLATE_MODE_TO_AXZF
171; Parameters:
172; DS:DI: Ptr to Disk Parameter Table
173; Returns:
174; AX: Translate Mode (TRANSLATEMODE_NORMAL, TRANSLATEMODE_LARGE or TRANSLATEMODE_ASSISTED_LBA)
175; unshifted (still shifted where it is in bFlagsLow)
176; ZF: Set based on value in AL
177; Corrupts registers:
178; Nothing
179;--------------------------------------------------------------------
180;
181; Converted to a macro since only called in two places, and the call/ret overhead
182; is not worth it for these two instructions (4 bytes total)
183;
184%macro ACCESSDPT__GET_UNSHIFTED_TRANSLATE_MODE_TO_AXZF 0
185 mov al, [di+DPT.bFlagsLow]
186 and ax, BYTE MASKL_DPT_TRANSLATEMODE
187%endmacro
Note: See TracBrowser for help on using the repository browser.