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

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

Changes to XTIDE Universal BIOS:

  • Large changes to prepare full XT-CF support (DMA not yet implemented and memory mapped transfers are not working).
File size: 5.6 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-2012 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
56    mov     al, [di+DPT_ATA.bDevice]
57    cmp     al, DEVICE_8BIT_XTIDE_REV2
58    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
59    jb      SHORT .InputToALfromRegisterInDX    ; Standard IDE controllers and XTIDE rev 1
60    cmp     al, DEVICE_8BIT_JRIDE_ISA
61    jne     SHORT .ShlRegisterIndexInDX         ; All XT-CF modes
62    ; Fall to .InputToALfromMemoryMappedRegisterInDX
63
64.InputToALfromMemoryMappedRegisterInDX:
65    mov     bx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET
66    add     bx, dx
67    push    ds
68    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA
69    mov     al, [bx]
70    pop     ds
71    ret
72
73.ReverseA0andA3fromRegisterIndexInDX:
74    mov     bx, dx
75    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
76    SKIP2B  bx  ; Skip shl dx, 1
77
78.ShlRegisterIndexInDX:
79    shl     dx, 1
80    ; Fall to .InputToALfromRegisterInDX
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    ; Note! We do not need to reverse A0 and A3 for XTIDE rev 2 since
101    ; the only Control Block Register we access is DEVICE_CONTROL_REGISTER_out
102    ; at offset 6 (0110b).
103    xor     dh, dh  ; IDE Register index now in DX
104
105    mov     bl, [di+DPT_ATA.bDevice]
106    cmp     bl, DEVICE_8BIT_XTIDE_REV2
107    jbe     SHORT .OutputALtoControlBlockRegisterInDX   ; Standard IDE controllers and XTIDE rev 1
108    cmp     bl, DEVICE_8BIT_JRIDE_ISA
109    jne     SHORT .ShlRegisterIndexInDX     ; All XT-CF modes
110    ; Fall to .OutputALtoMemoryMappedRegisterInDX
111
112.OutputALtoMemoryMappedRegisterInDX:
113    mov     bx, JRIDE_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET
114    jmp     SHORT IdeIO_OutputALtoIdeRegisterInDL.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
115
116.ShlRegisterIndexInDX:
117    add     dl, OFFSET_TO_CONTROL_BLOCK_REGISTERS
118    shl     dx, 1
119    jmp     SHORT OutputALtoRegisterInDX
120
121.OutputALtoControlBlockRegisterInDX:
122    call    AccessDPT_GetIdevarsToCSBX
123    add     dx, [cs:bx+IDEVARS.wControlBlockPort]
124    jmp     SHORT OutputALtoPortInDX
125
126
127;--------------------------------------------------------------------
128; IdeIO_OutputALtoIdeRegisterInDL
129;   Parameters:
130;       AL:     Byte to output
131;       DL:     IDE Command Block Register
132;       DS:DI:  Ptr to DPT (in RAMVARS segment)
133;   Returns:
134;       Nothing
135;   Corrupts registers:
136;       BX, DX
137;--------------------------------------------------------------------
138ALIGN JUMP_ALIGN
139IdeIO_OutputALtoIdeRegisterInDL:
140    xor     dh, dh  ; IDE Register index now in DX
141
142    mov     bl, [di+DPT_ATA.bDevice]
143    cmp     bl, DEVICE_8BIT_XTIDE_REV2
144    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
145    jb      SHORT OutputALtoRegisterInDX    ; Standard IDE controllers and XTIDE rev 1
146    cmp     bl, DEVICE_8BIT_JRIDE_ISA
147    jne     SHORT .ShlRegisterIndexInDX     ; All XT-CF modes
148    ; Fall to .OutputALtoMemoryMappedRegisterInDX
149
150.OutputALtoMemoryMappedRegisterInDX:
151    mov     bx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET
152.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX:
153    add     bx, dx
154    push    ds
155    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA
156    mov     [bx], al
157    pop     ds
158    ret
159
160.ReverseA0andA3fromRegisterIndexInDX:
161    mov     bx, dx
162    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
163    SKIP2B  bx  ; Skip shl dx, 1
164
165.ShlRegisterIndexInDX:
166    shl     dx, 1
167    ; Fall to OutputALtoRegisterInDX
168
169ALIGN JUMP_ALIGN
170OutputALtoRegisterInDX:
171    add     dx, [di+DPT.wBasePort]
172OutputALtoPortInDX:
173    out     dx, al
174    ret
175
176
177
178; A0 <-> A3 lookup table
179g_rgbSwapA0andA3fromIdeRegisterIndex:
180    db  0000b   ; <-> 0000b, 0
181    db  1000b   ; <-> 0001b, 1
182    db  0010b   ; <-> 0010b, 2
183    db  1010b   ; <-> 0011b, 3
184    db  0100b   ; <-> 0100b, 4
185    db  1100b   ; <-> 0101b, 5
186    db  0110b   ; <-> 0110b, 6
187    db  1110b   ; <-> 0111b, 7
188
189%endif ; MODULE_8BIT_IDE
Note: See TracBrowser for help on using the repository browser.