source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdePioBlock.asm@ 566

Last change on this file since 566 was 558, checked in by krille_n_@…, 11 years ago

Changes:

  • Building the BIOS Drive Information Tool now works again.
  • Moved all XT-CF related code to MODULE_8BIT_IDE_ADVANCED. I don't see how an XT-CF card could work without *_ADVANCED anyway but if I'm wrong, feel free to undo this. Note! The autodetection code in XTIDECFG has NOT been changed to reflect this (still relies on MODULE_8BIT_IDE).
  • Optimizations and fixes in general.
File size: 7.4 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : IDE Read/Write functions for transferring block using PIO modes.
3; These functions should only be called from IdeTransfer.asm.
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; Modified by JJP for XT-CFv3 support, Mar-13
22
23; Section containing code
24SECTION .text
25
26
27; --------------------------------------------------------------------------------------------------
28;
29; READ routines follow
30;
31; --------------------------------------------------------------------------------------------------
32
33
34%ifdef MODULE_8BIT_IDE
35
36;--------------------------------------------------------------------
37; IdePioBlock_ReadFromXtideRev1
38; Parameters:
39; CX: Block size in 512 byte sectors
40; DX: IDE Data port address
41; ES:DI: Normalized ptr to buffer to receive data
42; Returns:
43; Nothing
44; Corrupts registers:
45; AX, BX, CX
46;--------------------------------------------------------------------
47ALIGN JUMP_ALIGN
48IdePioBlock_ReadFromXtideRev1:
49 UNROLL_SECTORS_IN_CX_TO_OWORDS
50 mov bl, 8 ; Bit mask for toggling data low/high reg
51ALIGN JUMP_ALIGN
52.InswLoop:
53 %rep 8 ; WORDs
54 XTIDE_INSW
55 %endrep
56 loop .InswLoop
57 ret
58
59
60;--------------------------------------------------------------------
61; IdePioBlock_ReadFrom8bitDataPort
62;
63; 8-bit PIO from a single data port.
64;
65; Parameters:
66; CX: Block size in 512 byte sectors
67; DX: IDE Data port address
68; ES:DI: Normalized ptr to buffer to receive data
69; Returns:
70; Nothing
71; Corrupts registers:
72; AX, BX, CX
73;--------------------------------------------------------------------
74ALIGN JUMP_ALIGN
75IdePioBlock_ReadFrom8bitDataPort:
76%ifdef USE_186
77 shl cx, 9 ; Sectors to BYTEs
78 rep insb
79 ret
80%else ; If 8088/8086
81 UNROLL_SECTORS_IN_CX_TO_OWORDS
82ALIGN JUMP_ALIGN
83.ReadNextOword:
84 %rep 16 ; BYTEs
85 in al, dx ; Read BYTE
86 stosb ; Store BYTE to [ES:DI]
87 %endrep
88 loop .ReadNextOword
89 ret
90%endif
91
92%endif ; MODULE_8BIT_IDE
93
94
95;--------------------------------------------------------------------
96; IdePioBlock_ReadFrom16bitDataPort
97;
98; 16-bit PIO from a single data port.
99;
100; Parameters:
101; CX: Block size in 512 byte sectors
102; DX: IDE Data port address
103; ES:DI: Normalized ptr to buffer to receive data
104; Returns:
105; Nothing
106; Corrupts registers:
107; AX, BX, CX
108;--------------------------------------------------------------------
109ALIGN JUMP_ALIGN
110IdePioBlock_ReadFrom16bitDataPort:
111%ifdef USE_186
112 xchg cl, ch ; Sectors to WORDs
113 rep insw
114 ret
115
116%else ; If 8088/8086
117 UNROLL_SECTORS_IN_CX_TO_OWORDS
118ALIGN JUMP_ALIGN
119.ReadNextOword:
120 %rep 8 ; WORDs
121 in ax, dx ; Read WORD
122 stosw ; Store WORD to [ES:DI]
123 %endrep
124 loop .ReadNextOword
125 ret
126%endif
127
128
129;--------------------------------------------------------------------
130ALIGN JUMP_ALIGN
131IdePioBlock_ReadFrom32bitDataPort:
132 db 0C1h ; SHL
133 db 0E1h ; CX
134 db 7 ; 7 (Sectors to DWORDs)
135 rep
136 db 66h ; Override operand size to 32-bit
137 db 6Dh ; INSW/INSD
138 ret
139
140
141
142; --------------------------------------------------------------------------------------------------
143;
144; WRITE routines follow
145;
146; --------------------------------------------------------------------------------------------------
147
148%ifdef MODULE_8BIT_IDE
149
150;--------------------------------------------------------------------
151; IdePioBlock_WriteToXtideRev1
152; Parameters:
153; CX: Block size in 512-byte sectors
154; DX: IDE Data port address
155; ES:SI: Normalized ptr to buffer containing data
156; Returns:
157; Nothing
158; Corrupts registers:
159; AX, BX, CX, DX
160;--------------------------------------------------------------------
161ALIGN JUMP_ALIGN
162IdePioBlock_WriteToXtideRev1:
163 push ds
164 UNROLL_SECTORS_IN_CX_TO_QWORDS
165 mov bl, 8 ; Bit mask for toggling data low/high reg
166 push es ; Copy ES...
167 pop ds ; ...to DS
168ALIGN JUMP_ALIGN
169.OutswLoop:
170 %rep 4 ; WORDs
171 XTIDE_OUTSW
172 %endrep
173 loop .OutswLoop
174 pop ds
175 ret
176
177
178;--------------------------------------------------------------------
179; IdePioBlock_WriteToXtideRev2 or rev 1 with swapped A0 and A3 (chuck-mod)
180; Parameters:
181; CX: Block size in 512-byte sectors
182; DX: IDE Data port address
183; ES:SI: Normalized ptr to buffer containing data
184; Returns:
185; Nothing
186; Corrupts registers:
187; AX, BX, CX, DX
188;--------------------------------------------------------------------
189ALIGN JUMP_ALIGN
190IdePioBlock_WriteToXtideRev2:
191 UNROLL_SECTORS_IN_CX_TO_QWORDS
192 push ds
193 push es ; Copy ES...
194 pop ds ; ...to DS
195ALIGN JUMP_ALIGN
196.WriteNextQword:
197 %rep 4 ; WORDs
198 XTIDE_MOD_OUTSW ; special macro
199 %endrep
200 loop .WriteNextQword
201 pop ds
202 ret
203
204
205;--------------------------------------------------------------------
206; IdePioBlock_WriteTo8bitDataPort
207; Parameters:
208; CX: Block size in 512-byte sectors
209; DX: IDE Data port address
210; ES:SI: Normalized ptr to buffer containing data
211; Returns:
212; Nothing
213; Corrupts registers:
214; AX, BX, CX, DX
215;--------------------------------------------------------------------
216ALIGN JUMP_ALIGN
217IdePioBlock_WriteTo8bitDataPort:
218%ifdef USE_186
219 shl cx, 9 ; Sectors to BYTEs
220 es ; Source is ES segment
221 rep outsb
222 ret
223
224%else ; If 8088/8086
225 UNROLL_SECTORS_IN_CX_TO_QWORDS
226 push ds
227 ;mov ax, es
228 ;mov ds, ax ; move es to ds via ax (does this run faster on 8088?)
229 push es
230 pop ds
231ALIGN JUMP_ALIGN
232.WriteNextQword:
233 %rep 8 ; BYTEs
234 lodsb ; Load BYTE from [DS:SI]
235 out dx, al ; Write BYTE
236 %endrep
237 loop .WriteNextQword
238 pop ds
239 ret
240%endif
241
242%endif ; MODULE_8BIT_IDE
243
244
245;--------------------------------------------------------------------
246; IdePioBlock_WriteTo16bitDataPort Normal 16-bit IDE, XT-CFv3 in BIU Mode
247; IdePioBlock_WriteTo32bitDataPort VLB/PCI 32-bit IDE
248; Parameters:
249; CX: Block size in 512-byte sectors
250; DX: IDE Data port address
251; ES:SI: Normalized ptr to buffer containing data
252; Returns:
253; Nothing
254; Corrupts registers:
255; AX, BX, CX, DX
256;--------------------------------------------------------------------
257ALIGN JUMP_ALIGN
258IdePioBlock_WriteTo16bitDataPort:
259%ifdef USE_186
260 xchg cl, ch ; Sectors to WORDs
261 es ; Source is ES segment
262 rep outsw
263 ret
264
265%else ; If 8088/8086
266 UNROLL_SECTORS_IN_CX_TO_QWORDS
267 push ds
268 ;mov ax, es
269 ;mov ds, ax ; move es to ds via ax (does this run faster on 8088?)
270 push es
271 pop ds
272ALIGN JUMP_ALIGN
273.WriteNextQword:
274 %rep 4 ; WORDs
275 lodsw ; Load WORD from [DS:SI]
276 out dx, ax ; Write WORD
277 %endrep
278 loop .WriteNextQword
279 pop ds
280 ret
281%endif ; if/else USE_186
282
283;--------------------------------------------------------------------
284ALIGN JUMP_ALIGN
285IdePioBlock_WriteTo32bitDataPort:
286 db 0C1h ; SHL
287 db 0E1h ; CX
288 db 7 ; 7 (Sectors to DWORDs)
289 es ; Source is ES segment
290 rep
291 db 66h ; Override operand size to 32-bit
292 db 6Fh ; OUTSW/OUTSD
293 ret
Note: See TracBrowser for help on using the repository browser.