source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeIO.asm@ 611

Last change on this file since 611 was 601, checked in by Krister Nordvall, 6 years ago

Changes:

  • Building the BIOS now works again.
  • Added a new IDE device type/transfer mode for use only with XT-IDE rev 2+ (or Chuck(G)-modded rev 1) cards installed in any of the following machines: Olivetti M24, AT&T PC6300, Xerox 6060 and Logabax Persona 1600. This new transfer mode is slightly faster than the regular XT-IDE rev 1 device type and requires that the card is configured for High Speed mode (or, in case of the card being a rev 1 card, has the Chuck(G) mod done). The new device type is called "XTIDE rev 2 (Olivetti M24)" in XTIDECFG.
  • Made some minor improvements to the library code that handles 'Drive Not Ready' errors in XTIDECFG.
  • Optimizations.
File size: 6.9 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : IDE Register I/O functions when supporting 8-bit
3; devices that need address translations.
4
5;
6; XTIDE Universal BIOS and Associated Tools
7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
8;
9; This program is free software; you can redistribute it and/or modify
10; it under the terms of the GNU General Public License as published by
11; the Free Software Foundation; either version 2 of the License, or
12; (at your option) any later version.
13;
14; This program is distributed in the hope that it will be useful,
15; but WITHOUT ANY WARRANTY; without even the implied warranty of
16; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17; GNU General Public License for more details.
18; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19;
20
21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
25; IdeIO_InputStatusRegisterToAL
26; Parameters:
27; DS:DI: Ptr to DPT (in RAMVARS segment)
28; Returns:
29; AL: IDE Status Register contents
30; Corrupts registers:
31; BX, DX
32;--------------------------------------------------------------------
33ALIGN JUMP_ALIGN
34IdeIO_InputStatusRegisterToAL:
35%ifndef MODULE_8BIT_IDE
36 INPUT_TO_AL_FROM_IDE_REGISTER STATUS_REGISTER_in
37 ret
38
39%else
40 mov dl, STATUS_REGISTER_in
41 ; Fall to IdeIO_InputToALfromIdeRegisterInDL
42
43;--------------------------------------------------------------------
44; IdeIO_InputToALfromIdeRegisterInDL
45; Parameters:
46; DL: IDE Register
47; DS:DI: Ptr to DPT (in RAMVARS segment)
48; Returns:
49; AL: Inputted byte
50; Corrupts registers:
51; BX, DX
52;--------------------------------------------------------------------
53IdeIO_InputToALfromIdeRegisterInDL:
54 xor dh, dh ; IDE Register index now in DX...
55 mov al, [di+DPT_ATA.bDevice]
56 cmp al, DEVICE_8BIT_XTIDE_REV2
57 jb SHORT .InputToALfromRegisterInDX ; Standard IDE controllers and XTIDE rev 1
58 mov bx, dx ; ...and BX for A0<->A3 swap and for memory mapped I/O
59
60%ifdef MODULE_8BIT_IDE_ADVANCED
61 cmp al, DEVICE_8BIT_XTIDE_REV2_OLIVETTI
62 jbe SHORT .ReverseA0andA3fromRegisterIndexInDX
63
64 eSHL_IM dx, 1 ; ADP50L and XT-CF
65 cmp al, DEVICE_8BIT_JRIDE_ISA
66 jb SHORT .InputToALfromRegisterInDX ; All XT-CF modes
67 mov bh, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET >> 8
68 je SHORT .InputToALfromMemoryMappedRegisterInBX
69 mov bl, dl
70 mov bh, ADP50L_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET >> 8
71
72.InputToALfromMemoryMappedRegisterInBX:
73 push ds
74 mov ds, [di+DPT.wBasePort] ; Segment for JR-IDE/ISA and ADP50L
75 mov al, [bx]
76 pop ds
77 ret
78%endif
79
80.ReverseA0andA3fromRegisterIndexInDX:
81 mov dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
82
83.InputToALfromRegisterInDX:
84 add dx, [di+DPT.wBasePort]
85 in al, dx
86 ret
87
88
89;--------------------------------------------------------------------
90; IdeIO_OutputALtoIdeControlBlockRegisterInDL
91; Parameters:
92; AL: Byte to output
93; DL: IDE Control Block Register
94; DS:DI: Ptr to DPT (in RAMVARS segment)
95; Returns:
96; Nothing
97; Corrupts registers:
98; BX, DX
99;--------------------------------------------------------------------
100IdeIO_OutputALtoIdeControlBlockRegisterInDL:
101 xor dh, dh ; IDE Register index now in DX
102 mov bl, [di+DPT_ATA.bDevice]
103 cmp bl, DEVICE_8BIT_XTIDE_REV2
104 jb SHORT .OutputALtoControlBlockRegisterInDX ; Standard IDE controllers and XTIDE rev 1
105
106%ifdef MODULE_8BIT_IDE_ADVANCED
107 cmp bl, DEVICE_8BIT_XTIDE_REV2_OLIVETTI
108 jbe SHORT .ReverseA0andA3fromRegisterIndexInDX
109
110 ; At this point remaining controllers (JRIDE, XTCF and ADP50L) all have a control
111 ; block offset of 8 or (8<<1) so we add 8 here and do the SHL 1 later if needed.
112 add dx, BYTE 8
113 cmp bl, DEVICE_8BIT_JRIDE_ISA
114 jb SHORT IdeIO_OutputALtoIdeRegisterInDL.ShlRegisterIndexInDXandOutputAL ; All XT-CF modes
115 mov bx, JRIDE_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET - 8 ; Zeroes BL. -8 compensates for the ADD
116 je SHORT IdeIO_OutputALtoIdeRegisterInDL.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
117 ; The commented instructions below shows what happens next (saved for clarity) but as an optimization
118 ; we can accomplish the same thing with this jump.
119 jmp SHORT IdeIO_OutputALtoIdeRegisterInDL.ShlDXandMovHighByteOfADP50LoffsetsToBH
120; eSHL_IM dx, 1
121; mov bh, (ADP50L_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET - 16) >> 8 ; -16 compensates for the ADD and SHL
122; jmp SHORT IdeIO_OutputALtoIdeRegisterInDL.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
123%endif
124
125.ReverseA0andA3fromRegisterIndexInDX:
126 ; We cannot use lookup table since A3 will be always set because
127 ; Control Block Registers start from Command Block + 8h. We can do
128 ; a small trick since we only access Device Control Register at
129 ; offset 6h: Always clear A3 and set A0.
130 call AccessDPT_GetIdevarsToCSBX
131 add dx, [cs:bx+IDEVARS.wControlBlockPort]
132 xor dl, 1001b ; Clear A3, Set A0
133 out dx, al
134 ret
135
136.OutputALtoControlBlockRegisterInDX:
137 call AccessDPT_GetIdevarsToCSBX
138 add dx, [cs:bx+IDEVARS.wControlBlockPort]
139 out dx, al
140 ret
141
142
143;--------------------------------------------------------------------
144; IdeIO_OutputALtoIdeRegisterInDL
145; Parameters:
146; AL: Byte to output
147; DL: IDE Command Block Register
148; DS:DI: Ptr to DPT (in RAMVARS segment)
149; Returns:
150; Nothing
151; Corrupts registers:
152; BX, DX
153;--------------------------------------------------------------------
154ALIGN JUMP_ALIGN
155IdeIO_OutputALtoIdeRegisterInDL:
156 xor dh, dh ; IDE Register index now in DX
157 mov bl, [di+DPT_ATA.bDevice]
158 cmp bl, DEVICE_8BIT_XTIDE_REV2
159 jb SHORT OutputALtoRegisterInDX ; Standard IDE controllers and XTIDE rev 1
160
161%ifdef MODULE_8BIT_IDE_ADVANCED
162 cmp bl, DEVICE_8BIT_XTIDE_REV2_OLIVETTI
163 jbe SHORT .ReverseA0andA3fromRegisterIndexInDX
164
165 cmp bl, DEVICE_8BIT_JRIDE_ISA
166 jb SHORT .ShlRegisterIndexInDXandOutputAL ; All XT-CF modes
167 mov bx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET ; Zeroes BL
168 je SHORT .OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
169.ShlDXandMovHighByteOfADP50LoffsetsToBH:
170 eSHL_IM dx, 1
171 mov bh, ADP50L_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET >> 8 ; BL is zero so we only need to change BH
172
173.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX:
174 add bx, dx
175 push ds
176 mov ds, [di+DPT.wBasePort] ; Segment for JR-IDE/ISA and ADP50L
177 mov [bx], al
178 pop ds
179 ret
180%endif
181
182.ReverseA0andA3fromRegisterIndexInDX:
183 mov bx, dx
184 mov dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
185 SKIP2B bx ; Skip eSHL_IM dx, 1
186
187.ShlRegisterIndexInDXandOutputAL:
188 eSHL_IM dx, 1
189 ; Fall to OutputALtoRegisterInDX
190
191ALIGN JUMP_ALIGN
192OutputALtoRegisterInDX:
193 add dx, [di+DPT.wBasePort]
194 out dx, al
195 ret
196
197
198
199; A0 <-> A3 lookup table
200g_rgbSwapA0andA3fromIdeRegisterIndex:
201 db 0000b ; <-> 0000b, 0
202 db 1000b ; <-> 0001b, 1
203 db 0010b ; <-> 0010b, 2
204 db 1010b ; <-> 0011b, 3
205 db 0100b ; <-> 0100b, 4
206 db 1100b ; <-> 0101b, 5
207 db 0110b ; <-> 0110b, 6
208 db 1110b ; <-> 0111b, 7
209
210%endif ; MODULE_8BIT_IDE
Note: See TracBrowser for help on using the repository browser.