source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/Device.asm@ 320

Last change on this file since 320 was 294, checked in by krille_n_@…, 13 years ago

Commit 2/2 (BIOS):

  • Fixed a bug in AH1h_HStatus.asm.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 7.3 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Command and port direction functions for different device types.
3
4; Section containing code
5SECTION .text
6
7
8%macro TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE 1
9 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
10 jnz SHORT %1
11%endmacro
12
13%macro CMP_USING_DPT_AND_JUMP_IF_JRIDE_DEVICE 1
14 xchg ax, bx
15 eMOVZX bx, [di+DPT.bIdevarsOffset]
16 cmp BYTE [cs:bx+IDEVARS.bDevice], DEVICE_JRIDE_ISA
17 xchg bx, ax ; Restore BX
18 je SHORT %1
19%endmacro
20
21%macro CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF 2
22 cmp BYTE [cs:bp+IDEVARS.bDevice], %1
23 je SHORT %2
24%endmacro
25
26
27
28;--------------------------------------------------------------------
29; Device_FinalizeDPT
30; Parameters:
31; DS:DI: Ptr to Disk Parameter Table
32; ES:SI: Ptr to 512-byte ATA information read from the drive
33; CS:BP: Ptr to IDEVARS for the controller
34; Returns:
35; Nothing
36; Corrupts registers:
37; AX, BX, CX, DX
38;--------------------------------------------------------------------
39%ifdef MODULE_SERIAL
40Device_FinalizeDPT:
41 ; needs to check IDEVARS vs. checking the DPT as the serial bit in the DPT is set in the Finalize routine
42 CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF DEVICE_SERIAL_PORT, .FinalizeDptForSerialPortDevice
43 jmp IdeDPT_Finalize
44.FinalizeDptForSerialPortDevice:
45 jmp SerialDPT_Finalize
46
47%else ; IDE or JR-IDE/ISA
48 Device_FinalizeDPT EQU IdeDPT_Finalize
49%endif
50
51
52;--------------------------------------------------------------------
53; Device_ResetMasterAndSlaveController
54; Parameters:
55; DS:DI: Ptr to DPT (in RAMVARS segment)
56; Returns:
57; AH: INT 13h Error Code
58; CF: Cleared if success, Set if error
59; Corrupts registers:
60; AL, BX, CX, DX
61;--------------------------------------------------------------------
62%ifdef MODULE_JRIDE
63 %ifdef MODULE_SERIAL ; IDE + JR-IDE/ISA + Serial
64 Device_ResetMasterAndSlaveController:
65 TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE ReturnSuccessForSerialPort
66 CMP_USING_DPT_AND_JUMP_IF_JRIDE_DEVICE .ResetJrIDE
67 jmp IdeCommand_ResetMasterAndSlaveController
68
69 %else ; IDE + JR-IDE/ISA
70 Device_ResetMasterAndSlaveController:
71 CMP_USING_DPT_AND_JUMP_IF_JRIDE_DEVICE .ResetJrIDE
72 jmp IdeCommand_ResetMasterAndSlaveController
73 %endif
74
75%elifdef MODULE_SERIAL ; IDE + Serial
76Device_ResetMasterAndSlaveController:
77 TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE ReturnSuccessForSerialPort
78 jmp IdeCommand_ResetMasterAndSlaveController
79
80%else ; IDE
81 Device_ResetMasterAndSlaveController EQU IdeCommand_ResetMasterAndSlaveController
82%endif
83
84%ifdef MODULE_JRIDE
85.ResetJrIDE:
86 jmp MemIdeCommand_ResetMasterAndSlaveController
87%endif
88
89
90;--------------------------------------------------------------------
91; Device_IdentifyToBufferInESSIwithDriveSelectByteInBH
92; Parameters:
93; BH: Drive Select byte for Drive and Head Select Register
94; DS: Segment to RAMVARS
95; ES:SI: Ptr to normalized buffer to receive 512-byte IDE Information
96; CS:BP: Ptr to IDEVARS
97; Returns:
98; AH: INT 13h Error Code
99; CF: Cleared if success, Set if error
100; Corrupts registers:
101; AL, BL, CX, DX, SI, DI, ES
102;--------------------------------------------------------------------
103%ifdef MODULE_JRIDE
104 %ifdef MODULE_SERIAL ; IDE + JR-IDE/ISA + Serial
105 Device_IdentifyToBufferInESSIwithDriveSelectByteInBH:
106 CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF DEVICE_SERIAL_PORT, .IdentifyDriveFromSerialPort
107 CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF DEVICE_JRIDE_ISA, .IdentifyDriveFromJrIde
108 jmp IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
109
110 %else ; IDE + JR-IDE/ISA
111 Device_IdentifyToBufferInESSIwithDriveSelectByteInBH:
112 CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF DEVICE_JRIDE_ISA, .IdentifyDriveFromJrIde
113 jmp IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
114 %endif
115
116%elifdef MODULE_SERIAL ; IDE + Serial
117Device_IdentifyToBufferInESSIwithDriveSelectByteInBH:
118 CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF DEVICE_SERIAL_PORT, .IdentifyDriveFromSerialPort
119 jmp IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
120
121%else ; IDE
122 Device_IdentifyToBufferInESSIwithDriveSelectByteInBH EQU IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
123%endif
124
125%ifdef MODULE_JRIDE
126.IdentifyDriveFromJrIde:
127 jmp MemIdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
128%endif
129
130%ifdef MODULE_SERIAL
131.IdentifyDriveFromSerialPort:
132 jmp SerialCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
133%endif
134
135
136;--------------------------------------------------------------------
137; Device_OutputCommandWithParameters
138; Parameters:
139; BH: Default system timer ticks for timeout (can be ignored)
140; BL: IDE Status Register bit to poll after command
141; ES:SI: Ptr to normalized buffer (for data transfer commands)
142; DS:DI: Ptr to DPT (in RAMVARS segment)
143; SS:BP: Ptr to IDEPACK
144; Returns:
145; AH: INT 13h Error Code
146; CX: Number of successfully transferred sectors (for transfer commands)
147; CF: Cleared if success, Set if error
148; Corrupts registers:
149; AL, BX, (CX), DX, (ES:SI for data transfer commands)
150;--------------------------------------------------------------------
151%ifdef MODULE_JRIDE
152 %ifdef MODULE_SERIAL ; IDE + JR-IDE/ISA + Serial
153 Device_OutputCommandWithParameters:
154 TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE .OutputCommandToSerialPort
155 CMP_USING_DPT_AND_JUMP_IF_JRIDE_DEVICE .OutputCommandToJrIDE
156 jmp IdeCommand_OutputWithParameters
157
158 %else ; IDE + JR-IDE/ISA
159 Device_OutputCommandWithParameters:
160 CMP_USING_DPT_AND_JUMP_IF_JRIDE_DEVICE .OutputCommandToJrIDE
161 jmp IdeCommand_OutputWithParameters
162 %endif
163
164%elifdef MODULE_SERIAL ; IDE + Serial
165Device_OutputCommandWithParameters:
166 TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE .OutputCommandToSerialPort
167 jmp IdeCommand_OutputWithParameters
168
169%else ; IDE
170 Device_OutputCommandWithParameters EQU IdeCommand_OutputWithParameters
171%endif
172
173%ifdef MODULE_JRIDE
174ALIGN JUMP_ALIGN
175.OutputCommandToJrIDE:
176 jmp MemIdeCommand_OutputWithParameters
177%endif
178
179%ifdef MODULE_SERIAL
180ALIGN JUMP_ALIGN
181.OutputCommandToSerialPort:
182 jmp SerialCommand_OutputWithParameters
183%endif
184
185
186;--------------------------------------------------------------------
187; Device_SelectDrive
188; Parameters:
189; DS:DI: Ptr to DPT (in RAMVARS segment)
190; SS:BP: Ptr to IDEPACK
191; Returns:
192; AH: INT 13h Error Code
193; CF: Cleared if success, Set if error
194; Corrupts registers:
195; AL, BX, CX, DX
196;--------------------------------------------------------------------
197%ifdef MODULE_JRIDE
198 %ifdef MODULE_SERIAL ; IDE + JR-IDE/ISA + Serial
199 Device_SelectDrive:
200 TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE ReturnSuccessForSerialPort
201 CMP_USING_DPT_AND_JUMP_IF_JRIDE_DEVICE .SelectJrIdeDrive
202 jmp IdeCommand_SelectDrive
203
204 %else ; IDE + JR-IDE/ISA
205 Device_SelectDrive:
206 CMP_USING_DPT_AND_JUMP_IF_JRIDE_DEVICE .SelectJrIdeDrive
207 jmp IdeCommand_SelectDrive
208 %endif
209
210%elifdef MODULE_SERIAL ; IDE + Serial
211Device_SelectDrive:
212 TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE ReturnSuccessForSerialPort
213 jmp IdeCommand_SelectDrive
214
215%else ; IDE
216 Device_SelectDrive EQU IdeCommand_SelectDrive
217%endif
218
219%ifdef MODULE_JRIDE
220ALIGN JUMP_ALIGN
221.SelectJrIdeDrive:
222 jmp MemIdeCommand_SelectDrive
223%endif
224
225%ifdef MODULE_SERIAL
226ALIGN JUMP_ALIGN
227ReturnSuccessForSerialPort:
228 xor ax, ax
229 ret
230%endif
Note: See TracBrowser for help on using the repository browser.