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

Last change on this file since 541 was 536, checked in by krille_n_@…, 12 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
RevLine 
[150]1; Project name : XTIDE Universal BIOS
[473]2; Description : IDE Register I/O functions when supporting 8-bit
3; devices that need address translations.
[150]4
[376]5;
[412]6; XTIDE Universal BIOS and Associated Tools
[526]7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[412]13;
[376]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
[412]17; GNU General Public License for more details.
[376]18; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[412]19;
[376]20
[150]21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
[473]25; IdeIO_InputStatusRegisterToAL
[150]26; Parameters:
[160]27; DS:DI: Ptr to DPT (in RAMVARS segment)
[150]28; Returns:
[473]29; AL: IDE Status Register contents
[150]30; Corrupts registers:
[160]31; BX, DX
[150]32;--------------------------------------------------------------------
[473]33ALIGN JUMP_ALIGN
34IdeIO_InputStatusRegisterToAL:
35%ifndef MODULE_8BIT_IDE
36 INPUT_TO_AL_FROM_IDE_REGISTER STATUS_REGISTER_in
37 ret
[400]38
[473]39%else
40 mov dl, STATUS_REGISTER_in
41 ; Fall to IdeIO_InputToALfromIdeRegisterInDL
[332]42
[400]43;--------------------------------------------------------------------
[473]44; IdeIO_InputToALfromIdeRegisterInDL
[400]45; Parameters:
[473]46; DL: IDE Register
[400]47; DS:DI: Ptr to DPT (in RAMVARS segment)
48; Returns:
[473]49; AL: Inputted byte
[400]50; Corrupts registers:
51; BX, DX
52;--------------------------------------------------------------------
[473]53IdeIO_InputToALfromIdeRegisterInDL:
54 xor dh, dh ; IDE Register index now in DX
[491]55 mov bx, dx ; and BX
[473]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
[505]59
[493]60%ifdef MODULE_8BIT_IDE_ADVANCED
[505]61 je SHORT .ReverseA0andA3fromRegisterIndexInDX
62
[536]63 eSHL_IM dx, 1 ; ADP50L and XT-CF
[473]64 cmp al, DEVICE_8BIT_JRIDE_ISA
[536]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
[473]70
[536]71.InputToALfromMemoryMappedRegisterInBX:
[473]72 push ds
[536]73 mov ds, [di+DPT.wBasePort] ; Segment for JR-IDE/ISA and ADP50L
74 mov al, [bx]
[473]75 pop ds
[150]76 ret
[493]77%endif
[505]78
[473]79.ReverseA0andA3fromRegisterIndexInDX:
80 mov dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
[150]81
[473]82.InputToALfromRegisterInDX:
83 add dx, [di+DPT.wBasePort]
84 in al, dx
85 ret
86
87
[400]88;--------------------------------------------------------------------
[473]89; IdeIO_OutputALtoIdeControlBlockRegisterInDL
[150]90; Parameters:
[473]91; AL: Byte to output
92; DL: IDE Control Block Register
[160]93; DS:DI: Ptr to DPT (in RAMVARS segment)
[150]94; Returns:
[473]95; Nothing
[150]96; Corrupts registers:
[160]97; BX, DX
[150]98;--------------------------------------------------------------------
[473]99IdeIO_OutputALtoIdeControlBlockRegisterInDL:
100 xor dh, dh ; IDE Register index now in DX
[160]101
[473]102 mov bl, [di+DPT_ATA.bDevice]
103 cmp bl, DEVICE_8BIT_XTIDE_REV2
[501]104 jb SHORT .OutputALtoControlBlockRegisterInDX ; Standard IDE controllers and XTIDE rev 1
[496]105
[493]106%ifdef MODULE_8BIT_IDE_ADVANCED
[505]107 je SHORT .ReverseA0andA3fromRegisterIndexInDX
108
[536]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
[473]112 cmp bl, DEVICE_8BIT_JRIDE_ISA
[536]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
[496]122%endif
[473]123
[501]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.
[536]129 mov bh, dh ; Zero BH
[501]130 add dx, [cs:bx+IDEVARS.wControlBlockPort]
131 xor dl, 1001b ; Clear A3, Set A0
[536]132 out dx, al
133 ret
[501]134
[473]135.OutputALtoControlBlockRegisterInDX:
[536]136 call AccessDPT_GetIdevarsToCSBX ; *FIXME* Why is this call here but not in the above block?
[473]137 add dx, [cs:bx+IDEVARS.wControlBlockPort]
[536]138 out dx, al
139 ret
[473]140
141
[160]142;--------------------------------------------------------------------
[473]143; IdeIO_OutputALtoIdeRegisterInDL
[160]144; Parameters:
[473]145; AL: Byte to output
146; DL: IDE Command Block Register
[160]147; DS:DI: Ptr to DPT (in RAMVARS segment)
148; Returns:
[473]149; Nothing
[160]150; Corrupts registers:
[473]151; BX, DX
[160]152;--------------------------------------------------------------------
153ALIGN JUMP_ALIGN
[473]154IdeIO_OutputALtoIdeRegisterInDL:
155 xor dh, dh ; IDE Register index now in DX
[160]156
[473]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
[493]160
161%ifdef MODULE_8BIT_IDE_ADVANCED
[505]162 je SHORT .ReverseA0andA3fromRegisterIndexInDX
163
[473]164 cmp bl, DEVICE_8BIT_JRIDE_ISA
[536]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
[400]171
[473]172.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX:
173 add bx, dx
174 push ds
[536]175 mov ds, [di+DPT.wBasePort] ; Segment for JR-IDE/ISA and ADP50L
[473]176 mov [bx], al
177 pop ds
[160]178 ret
[493]179%endif
[501]180
[473]181.ReverseA0andA3fromRegisterIndexInDX:
182 mov bx, dx
183 mov dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
[536]184 SKIP2B bx ; Skip eSHL_IM dx, 1
[473]185
[536]186.ShlRegisterIndexInDXandOutputAL:
[505]187 eSHL_IM dx, 1
[473]188 ; Fall to OutputALtoRegisterInDX
189
190ALIGN JUMP_ALIGN
191OutputALtoRegisterInDX:
192 add dx, [di+DPT.wBasePort]
193 out dx, al
[400]194 ret
195
[473]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.