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

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

Changes:

  • Renamed MODULE_FEATURE_SETS to MODULE_POWER_MANAGEMENT.
  • Renamed MODULE_VERY_LATE_INITIALIZATION to MODULE_VERY_LATE_INIT and removed it from the official builds.
  • Removed the code that skips detection of slave drives on XT-CF controllers since slave drives can be used with Lo-tech ISA CompactFlash boards.
  • Added autodetection of the SVC ADP50L controller to XTIDECFG.
  • The autodetection of XT-CF controllers now requires MODULE_8BIT_IDE_ADVANCED in the loaded BIOS.
  • Fixed a bug in XTIDECFG from r502 where the "Base (cmd block) address" menu option would be displayed when a serial device was selected as the IDE controller.
  • XTIDECFG would display the "Enable interrupt" menu option for the XTIDE r1 but not for the XTIDE r2. It's now displayed for both controller types.
  • Disabled the "Internal Write Cache" menu option in the Master/Slave Drive menus for serial device type drives.
  • Optimizations and other fixes.
File size: 7.3 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; Section containing code
22SECTION .text
23
24
25; --------------------------------------------------------------------------------------------------
26;
27; READ routines follow
28;
29; --------------------------------------------------------------------------------------------------
30
31
32%ifdef MODULE_8BIT_IDE
33
34;--------------------------------------------------------------------
35; IdePioBlock_ReadFromXtideRev1
36; Parameters:
37; CX: Block size in 512 byte sectors
38; DX: IDE Data port address
39; ES:DI: Normalized ptr to buffer to receive data
40; Returns:
41; Nothing
42; Corrupts registers:
43; AX, BX, CX
44;--------------------------------------------------------------------
45ALIGN JUMP_ALIGN
46IdePioBlock_ReadFromXtideRev1:
47 UNROLL_SECTORS_IN_CX_TO_OWORDS
48 mov bl, 8 ; Bit mask for toggling data low/high reg
49ALIGN JUMP_ALIGN
50.InswLoop:
51 %rep 8 ; WORDs
52 XTIDE_INSW
53 %endrep
54 loop .InswLoop
55 ret
56
57
58;--------------------------------------------------------------------
59; IdePioBlock_ReadFrom8bitDataPort
60;
61; 8-bit PIO from a single data port.
62;
63; Parameters:
64; CX: Block size in 512 byte sectors
65; DX: IDE Data port address
66; ES:DI: Normalized ptr to buffer to receive data
67; Returns:
68; Nothing
69; Corrupts registers:
70; AX, BX, CX
71;--------------------------------------------------------------------
72ALIGN JUMP_ALIGN
73IdePioBlock_ReadFrom8bitDataPort:
74%ifdef USE_186
75 shl cx, 9 ; Sectors to BYTEs
76 rep insb
77 ret
78%else ; If 8088/8086
79 UNROLL_SECTORS_IN_CX_TO_OWORDS
80ALIGN JUMP_ALIGN
81.ReadNextOword:
82 %rep 16 ; BYTEs
83 in al, dx ; Read BYTE
84 stosb ; Store BYTE to [ES:DI]
85 %endrep
86 loop .ReadNextOword
87 ret
88%endif
89
90%endif ; MODULE_8BIT_IDE
91
92
93;--------------------------------------------------------------------
94; IdePioBlock_ReadFrom16bitDataPort
95;
96; 16-bit PIO from a single data port.
97;
98; Parameters:
99; CX: Block size in 512 byte sectors
100; DX: IDE Data port address
101; ES:DI: Normalized ptr to buffer to receive data
102; Returns:
103; Nothing
104; Corrupts registers:
105; AX, BX, CX
106;--------------------------------------------------------------------
107ALIGN JUMP_ALIGN
108IdePioBlock_ReadFrom16bitDataPort:
109%ifdef USE_186
110 xchg cl, ch ; Sectors to WORDs
111 rep insw
112 ret
113
114%else ; If 8088/8086
115 UNROLL_SECTORS_IN_CX_TO_OWORDS
116ALIGN JUMP_ALIGN
117.ReadNextOword:
118 %rep 8 ; WORDs
119 in ax, dx ; Read WORD
120 stosw ; Store WORD to [ES:DI]
121 %endrep
122 loop .ReadNextOword
123 ret
124%endif
125
126
127;--------------------------------------------------------------------
128ALIGN JUMP_ALIGN
129IdePioBlock_ReadFrom32bitDataPort:
130 db 0C1h ; SHL
131 db 0E1h ; CX
132 db 7 ; 7 (Sectors to DWORDs)
133 rep
134 db 66h ; Override operand size to 32-bit
135 db 6Dh ; INSW/INSD
136 ret
137
138
139
140; --------------------------------------------------------------------------------------------------
141;
142; WRITE routines follow
143;
144; --------------------------------------------------------------------------------------------------
145
146%ifdef MODULE_8BIT_IDE
147
148;--------------------------------------------------------------------
149; IdePioBlock_WriteToXtideRev1
150; Parameters:
151; CX: Block size in 512-byte sectors
152; DX: IDE Data port address
153; ES:SI: Normalized ptr to buffer containing data
154; Returns:
155; Nothing
156; Corrupts registers:
157; AX, BX, CX, DX
158;--------------------------------------------------------------------
159ALIGN JUMP_ALIGN
160IdePioBlock_WriteToXtideRev1:
161 push ds
162 UNROLL_SECTORS_IN_CX_TO_QWORDS
163 mov bl, 8 ; Bit mask for toggling data low/high reg
164 push es ; Copy ES...
165 pop ds ; ...to DS
166ALIGN JUMP_ALIGN
167.OutswLoop:
168 %rep 4 ; WORDs
169 XTIDE_OUTSW
170 %endrep
171 loop .OutswLoop
172 pop ds
173 ret
174
175
176;--------------------------------------------------------------------
177; IdePioBlock_WriteToXtideRev2 or rev 1 with swapped A0 and A3 (chuck-mod)
178; Parameters:
179; CX: Block size in 512-byte sectors
180; DX: IDE Data port address
181; ES:SI: Normalized ptr to buffer containing data
182; Returns:
183; Nothing
184; Corrupts registers:
185; AX, BX, CX, DX
186;--------------------------------------------------------------------
187ALIGN JUMP_ALIGN
188IdePioBlock_WriteToXtideRev2:
189 UNROLL_SECTORS_IN_CX_TO_QWORDS
190 push ds
191 push es ; Copy ES...
192 pop ds ; ...to DS
193ALIGN JUMP_ALIGN
194.WriteNextQword:
195 %rep 4 ; WORDs
196 XTIDE_MOD_OUTSW ; special macro
197 %endrep
198 loop .WriteNextQword
199 pop ds
200 ret
201
202
203;--------------------------------------------------------------------
204; IdePioBlock_WriteTo8bitDataPort
205; Parameters:
206; CX: Block size in 512-byte sectors
207; DX: IDE Data port address
208; ES:SI: Normalized ptr to buffer containing data
209; Returns:
210; Nothing
211; Corrupts registers:
212; AX, BX, CX, DX
213;--------------------------------------------------------------------
214ALIGN JUMP_ALIGN
215IdePioBlock_WriteTo8bitDataPort:
216%ifdef USE_186
217 shl cx, 9 ; Sectors to BYTEs
218 es ; Source is ES segment
219 rep outsb
220 ret
221
222%else ; If 8088/8086
223 UNROLL_SECTORS_IN_CX_TO_QWORDS
224 push ds
225 ;mov ax, es
226 ;mov ds, ax ; move es to ds via ax (does this run faster on 8088?)
227 push es
228 pop ds
229ALIGN JUMP_ALIGN
230.WriteNextQword:
231 %rep 8 ; BYTEs
232 lodsb ; Load BYTE from [DS:SI]
233 out dx, al ; Write BYTE
234 %endrep
235 loop .WriteNextQword
236 pop ds
237 ret
238%endif
239
240%endif ; MODULE_8BIT_IDE
241
242
243;--------------------------------------------------------------------
244; IdePioBlock_WriteTo16bitDataPort Normal 16-bit IDE, XT-CFv3 in BIU Mode
245; IdePioBlock_WriteTo32bitDataPort VLB/PCI 32-bit IDE
246; Parameters:
247; CX: Block size in 512-byte sectors
248; DX: IDE Data port address
249; ES:SI: Normalized ptr to buffer containing data
250; Returns:
251; Nothing
252; Corrupts registers:
253; AX, BX, CX, DX
254;--------------------------------------------------------------------
255ALIGN JUMP_ALIGN
256IdePioBlock_WriteTo16bitDataPort:
257%ifdef USE_186
258 xchg cl, ch ; Sectors to WORDs
259 es ; Source is ES segment
260 rep outsw
261 ret
262
263%else ; If 8088/8086
264 UNROLL_SECTORS_IN_CX_TO_QWORDS
265 push ds
266 ;mov ax, es
267 ;mov ds, ax ; move es to ds via ax (does this run faster on 8088?)
268 push es
269 pop ds
270ALIGN JUMP_ALIGN
271.WriteNextQword:
272 %rep 4 ; WORDs
273 lodsw ; Load WORD from [DS:SI]
274 out dx, ax ; Write WORD
275 %endrep
276 loop .WriteNextQword
277 pop ds
278 ret
279%endif ; if/else USE_186
280
281;--------------------------------------------------------------------
282ALIGN JUMP_ALIGN
283IdePioBlock_WriteTo32bitDataPort:
284 db 0C1h ; SHL
285 db 0E1h ; CX
286 db 7 ; 7 (Sectors to DWORDs)
287 es ; Source is ES segment
288 rep
289 db 66h ; Override operand size to 32-bit
290 db 6Fh ; OUTSW/OUTSD
291 ret
Note: See TracBrowser for help on using the repository browser.