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

Last change on this file since 545 was 545, checked in by aitotat@…, 11 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: 7.4 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   IDE Read/Write functions for transferring
3;                   block using PIO modes.
4;                   These functions should only be called from IdeTransfer.asm.
5
6;
7; XTIDE Universal BIOS and Associated Tools
8; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
9;
10; This program is free software; you can redistribute it and/or modify
11; it under the terms of the GNU General Public License as published by
12; the Free Software Foundation; either version 2 of the License, or
13; (at your option) any later version.
14;
15; This program is distributed in the hope that it will be useful,
16; but WITHOUT ANY WARRANTY; without even the implied warranty of
17; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18; GNU General Public License for more details.
19; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20;
21
22; Modified by JJP for XT-CFv3 support, Mar-13
23
24; Section containing code
25SECTION .text
26
27
28; --------------------------------------------------------------------------------------------------
29;
30; READ routines follow
31;
32; --------------------------------------------------------------------------------------------------
33
34
35%ifdef MODULE_8BIT_IDE
36
37;--------------------------------------------------------------------
38; IdePioBlock_ReadFromXtideRev1
39;   Parameters:
40;       CX:     Block size in 512 byte sectors
41;       DX:     IDE Data port address
42;       ES:DI:  Normalized ptr to buffer to receive data
43;   Returns:
44;       Nothing
45;   Corrupts registers:
46;       AX, BX, CX
47;--------------------------------------------------------------------
48ALIGN JUMP_ALIGN
49IdePioBlock_ReadFromXtideRev1:
50    UNROLL_SECTORS_IN_CX_TO_OWORDS
51    mov     bl, 8       ; Bit mask for toggling data low/high reg
52ALIGN JUMP_ALIGN
53.InswLoop:
54    %rep 8 ; WORDs
55        XTIDE_INSW
56    %endrep
57    loop    .InswLoop
58    ret
59
60
61;--------------------------------------------------------------------
62; IdePioBlock_ReadFrom8bitDataPort
63;
64; 8-bit PIO from a single data port.
65;
66;   Parameters:
67;       CX: Block size in 512 byte sectors
68;       DX: IDE Data port address
69;       ES:DI:  Normalized ptr to buffer to receive data
70;   Returns:
71;       Nothing
72;   Corrupts registers:
73;       AX, BX, CX
74;--------------------------------------------------------------------
75ALIGN JUMP_ALIGN
76IdePioBlock_ReadFrom8bitDataPort:
77%ifdef USE_186
78    shl     cx, 9       ; Sectors to BYTEs
79    rep insb
80    ret
81%else ; If 8088/8086
82    UNROLL_SECTORS_IN_CX_TO_OWORDS
83ALIGN JUMP_ALIGN
84.ReadNextOword:
85    %rep 16 ; BYTEs
86        in      al, dx  ; Read BYTE
87        stosb           ; Store BYTE to [ES:DI]
88    %endrep
89    loop    .ReadNextOword
90    ret
91%endif
92
93%endif  ; MODULE_8BIT_IDE
94
95
96;--------------------------------------------------------------------
97; IdePioBlock_ReadFrom16bitDataPort
98;
99; 16-bit PIO from a single data port.
100;
101;   Parameters:
102;       CX: Block size in 512 byte sectors
103;       DX: IDE Data port address
104;       ES:DI:  Normalized ptr to buffer to receive data
105;   Returns:
106;       Nothing
107;   Corrupts registers:
108;       AX, BX, CX
109;--------------------------------------------------------------------
110ALIGN JUMP_ALIGN
111IdePioBlock_ReadFrom16bitDataPort:
112%ifdef USE_186
113    xchg        cl, ch  ; Sectors to WORDs
114    rep insw
115    ret
116
117%else ; If 8088/8086
118    UNROLL_SECTORS_IN_CX_TO_OWORDS
119ALIGN JUMP_ALIGN
120.ReadNextOword:
121    %rep 8  ; WORDs
122        in      ax, dx  ; Read BYTE
123        stosw           ; Store BYTE to [ES:DI]
124    %endrep
125    loop    .ReadNextOword
126    ret
127%endif
128
129
130;--------------------------------------------------------------------
131ALIGN JUMP_ALIGN
132IdePioBlock_ReadFrom32bitDataPort:
133    db      0C1h        ; SHL
134    db      0E1h        ; CX
135    db      7           ; 7 (Sectors to DWORDs)
136    rep
137    db      66h         ; Override operand size to 32-bit
138    db      6Dh         ; INSW/INSD
139    ret
140
141
142
143; --------------------------------------------------------------------------------------------------
144;
145; WRITE routines follow
146;
147; --------------------------------------------------------------------------------------------------
148
149%ifdef MODULE_8BIT_IDE
150
151;--------------------------------------------------------------------
152; IdePioBlock_WriteToXtideRev1
153;   Parameters:
154;       CX: Block size in 512-byte sectors
155;       DX: IDE Data port address
156;       ES:SI:  Normalized ptr to buffer containing data
157;   Returns:
158;       Nothing
159;   Corrupts registers:
160;       AX, BX, CX, DX
161;--------------------------------------------------------------------
162ALIGN JUMP_ALIGN
163IdePioBlock_WriteToXtideRev1:
164    push    ds
165    UNROLL_SECTORS_IN_CX_TO_QWORDS
166    mov     bl, 8       ; Bit mask for toggling data low/high reg
167    push    es          ; Copy ES...
168    pop     ds          ; ...to DS
169ALIGN JUMP_ALIGN
170.OutswLoop:
171    %rep 4  ; WORDs
172        XTIDE_OUTSW
173    %endrep
174    loop    .OutswLoop
175    pop     ds
176    ret
177
178
179;--------------------------------------------------------------------
180; IdePioBlock_WriteToXtideRev2  or rev 1 with swapped A0 and A3 (chuck-mod)
181;   Parameters:
182;       CX: Block size in 512-byte sectors
183;       DX: IDE Data port address
184;       ES:SI:  Normalized ptr to buffer containing data
185;   Returns:
186;       Nothing
187;   Corrupts registers:
188;       AX, BX, CX, DX
189;--------------------------------------------------------------------
190ALIGN JUMP_ALIGN
191IdePioBlock_WriteToXtideRev2:
192    UNROLL_SECTORS_IN_CX_TO_QWORDS
193    push        ds
194    push        es      ; Copy ES...
195    pop         ds      ; ...to DS
196ALIGN JUMP_ALIGN
197.WriteNextQword:
198    %rep 4  ; WORDs
199        XTIDE_MOD_OUTSW ; special macro
200    %endrep
201    loop    .WriteNextQword
202    pop     ds
203    ret
204
205
206;--------------------------------------------------------------------
207; IdePioBlock_WriteTo8bitDataPort
208;   Parameters:
209;       CX: Block size in 512-byte sectors
210;       DX: IDE Data port address
211;       ES:SI:  Normalized ptr to buffer containing data
212;   Returns:
213;       Nothing
214;   Corrupts registers:
215;       AX, BX, CX, DX
216;--------------------------------------------------------------------
217ALIGN JUMP_ALIGN
218IdePioBlock_WriteTo8bitDataPort:
219%ifdef USE_186
220    shl     cx, 9       ; Sectors to BYTEs
221    es                  ; Source is ES segment
222    rep outsb
223    ret
224
225%else ; If 8088/8086
226    UNROLL_SECTORS_IN_CX_TO_QWORDS
227    push        ds
228    ;mov        ax, es
229    ;mov        ds, ax  ; move es to ds via ax (does this run faster on 8088?)
230    push        es
231    pop         ds
232ALIGN JUMP_ALIGN
233.WriteNextQword:
234    %rep 8  ; BYTEs
235        lodsb           ; Load BYTE from [DS:SI]
236        out dx, al      ; Write BYTE
237    %endrep
238    loop    .WriteNextQword
239    pop     ds
240    ret
241%endif
242
243%endif ; MODULE_8BIT_IDE
244
245
246;--------------------------------------------------------------------
247; IdePioBlock_WriteTo16bitDataPort      Normal 16-bit IDE, XT-CFv3 in BIU Mode
248; IdePioBlock_WriteTo32bitDataPort      VLB/PCI 32-bit IDE
249;   Parameters:
250;       CX: Block size in 512-byte sectors
251;       DX: IDE Data port address
252;       ES:SI:  Normalized ptr to buffer containing data
253;   Returns:
254;       Nothing
255;   Corrupts registers:
256;       AX, BX, CX, DX
257;--------------------------------------------------------------------
258ALIGN JUMP_ALIGN
259IdePioBlock_WriteTo16bitDataPort:
260%ifdef USE_186
261    xchg    cl, ch      ; Sectors to WORDs
262    es                  ; Source is ES segment
263    rep outsw
264    ret
265
266%else ; If 8088/8086
267    UNROLL_SECTORS_IN_CX_TO_QWORDS
268    push    ds
269    ;mov    ax, es
270    ;mov    ds, ax      ; move es to ds via ax (does this run faster on 8088?)
271    push    es
272    pop     ds
273ALIGN JUMP_ALIGN
274.WriteNextQword:
275    %rep 4  ; WORDs
276        lodsw           ; Load BYTE from [DS:SI]
277        out dx, ax      ; Write BYTE
278    %endrep
279    loop    .WriteNextQword
280    pop     ds
281    ret
282%endif  ; if/else USE_186
283
284;--------------------------------------------------------------------
285ALIGN JUMP_ALIGN
286IdePioBlock_WriteTo32bitDataPort:
287    db      0C1h        ; SHL
288    db      0E1h        ; CX
289    db      7           ; 7 (Sectors to DWORDs)
290    es                  ; Source is ES segment
291    rep
292    db      66h         ; Override operand size to 32-bit
293    db      6Fh         ; OUTSW/OUTSD
294    ret
Note: See TracBrowser for help on using the repository browser.