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
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.