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

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

Changes:

  • Added support for the Silicon Valley Computer ADP50L controller (and possibly other IDE controllers from SVC using memory mapped I/O). Please note that this has not been tested in any way since I don't have any of these cards myself (make backups before trying this on drives with important data). Also, *if* it works, make sure it works reliably (stress test the disk system). Some things you should know: 1) Autodetection for this controller has not been added to XTIDECFG, you need to manually select the "SVC ADP50L" controller (and possibly change the BIOS segment address if not using the default of C800h). 2) The memory mapped I/O window is inside the ROM address space of the controller. The XTIDE Universal BIOS currently do not support this so that means you need to use another ROM (for example, an XTIDE or XTCF card or the BOOT ROM of a NIC). This presents another problem, the original ADP50L BIOS needs to be disabled somehow to avoid conflicts. Either pull the ROM chip or disable the BIOS by removing jumper J3. Note, I have no idea if any of this will actually work. It's basically a shot in the dark.
File size: 6.8 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     bx, dx  ; and BX
56    mov     al, [di+DPT_ATA.bDevice]
57    cmp     al, DEVICE_8BIT_XTIDE_REV2
58    jb      SHORT .InputToALfromRegisterInDX    ; Standard IDE controllers and XTIDE rev 1
59
60%ifdef MODULE_8BIT_IDE_ADVANCED
61    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
62
63    eSHL_IM dx, 1   ; ADP50L and XT-CF
64    cmp     al, DEVICE_8BIT_JRIDE_ISA
65    jb      SHORT .InputToALfromRegisterInDX    ; All XT-CF modes
66    mov     bh, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET >> 8
67    je      SHORT .InputToALfromMemoryMappedRegisterInBX
68    mov     bl, dl
69    mov     bh, ADP50L_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET >> 8
70
71.InputToALfromMemoryMappedRegisterInBX:
72    push    ds
73    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA and ADP50L
74    mov     al, [bx]
75    pop     ds
76    ret
77%endif
78
79.ReverseA0andA3fromRegisterIndexInDX:
80    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
81
82.InputToALfromRegisterInDX:
83    add     dx, [di+DPT.wBasePort]
84    in      al, dx
85    ret
86
87
88;--------------------------------------------------------------------
89; IdeIO_OutputALtoIdeControlBlockRegisterInDL
90;   Parameters:
91;       AL:     Byte to output
92;       DL:     IDE Control Block Register
93;       DS:DI:  Ptr to DPT (in RAMVARS segment)
94;   Returns:
95;       Nothing
96;   Corrupts registers:
97;       BX, DX
98;--------------------------------------------------------------------
99IdeIO_OutputALtoIdeControlBlockRegisterInDL:
100    xor     dh, dh  ; IDE Register index now in DX
101
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    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
108
109    ; At this point remaining controllers (JRIDE, XTCF and ADP50L) all have a control
110    ; block offset of 8 or (8<<1) so we add 8 here and do the SHL 1 later if needed.
111    add     dx, 8
112    cmp     bl, DEVICE_8BIT_JRIDE_ISA
113    jb      SHORT IdeIO_OutputALtoIdeRegisterInDL.ShlRegisterIndexInDXandOutputAL   ; All XT-CF modes
114    mov     bx, JRIDE_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET - 8          ; Zeroes BL. -8 compensates for the ADD
115    je      SHORT IdeIO_OutputALtoIdeRegisterInDL.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
116    ; The commented instructions below shows what happens next (saved for clarity) but as an optimization
117    ; we can accomplish the same thing with this jump.
118    jmp     SHORT IdeIO_OutputALtoIdeRegisterInDL.ShlDXandMovHighByteOfADP50LoffsetsToBH
119;   eSHL_IM dx, 1
120;   mov     bh, (ADP50L_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET - 16) >> 8 ; -16 compensates for the ADD and SHL
121;   jmp     SHORT IdeIO_OutputALtoIdeRegisterInDL.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
122%endif
123
124.ReverseA0andA3fromRegisterIndexInDX:
125    ; We cannot use lookup table since A3 will be always set because
126    ; Control Block Registers start from Command Block + 8h. We can do
127    ; a small trick since we only access Device Control Register at
128    ; offset 6h: Always clear A3 and set A0.
129    mov     bh, dh  ; Zero BH
130    add     dx, [cs:bx+IDEVARS.wControlBlockPort]
131    xor     dl, 1001b                       ; Clear A3, Set A0
132    out     dx, al
133    ret
134
135.OutputALtoControlBlockRegisterInDX:
136    call    AccessDPT_GetIdevarsToCSBX      ; *FIXME* Why is this call here but not in the above block?
137    add     dx, [cs:bx+IDEVARS.wControlBlockPort]
138    out     dx, al
139    ret
140
141
142;--------------------------------------------------------------------
143; IdeIO_OutputALtoIdeRegisterInDL
144;   Parameters:
145;       AL:     Byte to output
146;       DL:     IDE Command Block Register
147;       DS:DI:  Ptr to DPT (in RAMVARS segment)
148;   Returns:
149;       Nothing
150;   Corrupts registers:
151;       BX, DX
152;--------------------------------------------------------------------
153ALIGN JUMP_ALIGN
154IdeIO_OutputALtoIdeRegisterInDL:
155    xor     dh, dh  ; IDE Register index now in DX
156
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    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
163
164    cmp     bl, DEVICE_8BIT_JRIDE_ISA
165    jb      SHORT .ShlRegisterIndexInDXandOutputAL  ; All XT-CF modes
166    mov     bx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET  ; Zeroes BL
167    je      SHORT .OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
168.ShlDXandMovHighByteOfADP50LoffsetsToBH:
169    eSHL_IM dx, 1
170    mov     bh, ADP50L_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET >> 8    ; BL is zero so we only need to change BH
171
172.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX:
173    add     bx, dx
174    push    ds
175    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA and ADP50L
176    mov     [bx], al
177    pop     ds
178    ret
179%endif
180
181.ReverseA0andA3fromRegisterIndexInDX:
182    mov     bx, dx
183    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
184    SKIP2B  bx  ; Skip eSHL_IM dx, 1
185
186.ShlRegisterIndexInDXandOutputAL:
187    eSHL_IM dx, 1
188    ; Fall to OutputALtoRegisterInDX
189
190ALIGN JUMP_ALIGN
191OutputALtoRegisterInDX:
192    add     dx, [di+DPT.wBasePort]
193    out     dx, al
194    ret
195
196
197
198; A0 <-> A3 lookup table
199g_rgbSwapA0andA3fromIdeRegisterIndex:
200    db  0000b   ; <-> 0000b, 0
201    db  1000b   ; <-> 0001b, 1
202    db  0010b   ; <-> 0010b, 2
203    db  1010b   ; <-> 0011b, 3
204    db  0100b   ; <-> 0100b, 4
205    db  1100b   ; <-> 0101b, 5
206    db  0110b   ; <-> 0110b, 6
207    db  1110b   ; <-> 0111b, 7
208
209%endif ; MODULE_8BIT_IDE
Note: See TracBrowser for help on using the repository browser.