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

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

Changes:

  • Reverted the changes to MenuEvents.inc done in r492 since they broke the F1 key function in XTIDECFG.
  • Added a tail-call optimized variant of the CALL_DISPLAY_LIBRARY macro (JMP_DISPLAY_LIBRARY).
  • Put a block size limit in AH1Eh_ChangeXTCFmodeBasedOnControlRegisterInAL. I think it's needed but if not, it's easy to remove.
  • Other optimizations and fixes.
File size: 6.0 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    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    cmp     al, DEVICE_8BIT_JRIDE_ISA
64    jne     SHORT .ShlRegisterIndexInDX         ; All XT-CF modes
65    ; Fall to .InputToALfromMemoryMappedRegisterInDX
66
67.InputToALfromMemoryMappedRegisterInDX:
68    push    ds
69    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA
70    mov     al, [bx+JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET]
71    pop     ds
72    ret
73%endif
74
75.ReverseA0andA3fromRegisterIndexInDX:
76    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
77    SKIP2B  bx  ; Skip shl dx, 1
78
79.ShlRegisterIndexInDX:
80    eSHL_IM dx, 1
81    ; Fall to .InputToALfromRegisterInDX
82
83.InputToALfromRegisterInDX:
84    add     dx, [di+DPT.wBasePort]
85    in      al, dx
86    ret
87
88
89;--------------------------------------------------------------------
90; IdeIO_OutputALtoIdeControlBlockRegisterInDL
91;   Parameters:
92;       AL:     Byte to output
93;       DL:     IDE Control Block Register
94;       DS:DI:  Ptr to DPT (in RAMVARS segment)
95;   Returns:
96;       Nothing
97;   Corrupts registers:
98;       BX, DX
99;--------------------------------------------------------------------
100IdeIO_OutputALtoIdeControlBlockRegisterInDL:
101    xor     dh, dh  ; IDE Register index now in DX
102
103    mov     bl, [di+DPT_ATA.bDevice]
104    cmp     bl, DEVICE_8BIT_XTIDE_REV2
105    jb      SHORT .OutputALtoControlBlockRegisterInDX   ; Standard IDE controllers and XTIDE rev 1
106
107%ifdef MODULE_8BIT_IDE_ADVANCED
108    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
109
110    cmp     bl, DEVICE_8BIT_JRIDE_ISA
111    jne     SHORT .ShlRegisterIndexInDX     ; All XT-CF modes
112    ; Fall to .OutputALtoMemoryMappedRegisterInDX
113
114.OutputALtoMemoryMappedRegisterInDX:
115    mov     bx, JRIDE_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET
116    jmp     SHORT IdeIO_OutputALtoIdeRegisterInDL.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
117%endif
118
119.ReverseA0andA3fromRegisterIndexInDX:
120    ; We cannot use lookup table since A3 will be always set because
121    ; Control Block Registers start from Command Block + 8h. We can do
122    ; a small trick since we only access Device Control Register at
123    ; offset 6h: Always clear A3 and set A0.
124    add     dx, [cs:bx+IDEVARS.wControlBlockPort]
125    xor     dl, 1001b                       ; Clear A3, Set A0
126    jmp     SHORT OutputALtoPortInDX
127
128.ShlRegisterIndexInDX:
129    eSHL_IM dx, 1
130    add     dx, BYTE XTCF_CONTROL_BLOCK_OFFSET
131    jmp     SHORT OutputALtoRegisterInDX
132
133.OutputALtoControlBlockRegisterInDX:
134    call    AccessDPT_GetIdevarsToCSBX
135    add     dx, [cs:bx+IDEVARS.wControlBlockPort]
136    jmp     SHORT OutputALtoPortInDX
137
138
139;--------------------------------------------------------------------
140; IdeIO_OutputALtoIdeRegisterInDL
141;   Parameters:
142;       AL:     Byte to output
143;       DL:     IDE Command Block Register
144;       DS:DI:  Ptr to DPT (in RAMVARS segment)
145;   Returns:
146;       Nothing
147;   Corrupts registers:
148;       BX, DX
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151IdeIO_OutputALtoIdeRegisterInDL:
152    xor     dh, dh  ; IDE Register index now in DX
153
154    mov     bl, [di+DPT_ATA.bDevice]
155    cmp     bl, DEVICE_8BIT_XTIDE_REV2
156    jb      SHORT OutputALtoRegisterInDX    ; Standard IDE controllers and XTIDE rev 1
157
158%ifdef MODULE_8BIT_IDE_ADVANCED
159    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
160
161    cmp     bl, DEVICE_8BIT_JRIDE_ISA
162    jne     SHORT .ShlRegisterIndexInDX     ; All XT-CF modes
163    ; Fall to .OutputALtoMemoryMappedRegisterInDX
164
165.OutputALtoMemoryMappedRegisterInDX:
166    mov     bx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET
167.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX:
168    add     bx, dx
169    push    ds
170    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA
171    mov     [bx], al
172    pop     ds
173    ret
174%endif
175
176.ReverseA0andA3fromRegisterIndexInDX:
177    mov     bx, dx
178    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
179    SKIP2B  bx  ; Skip shl dx, 1
180
181.ShlRegisterIndexInDX:
182    eSHL_IM dx, 1
183    ; Fall to OutputALtoRegisterInDX
184
185ALIGN JUMP_ALIGN
186OutputALtoRegisterInDX:
187    add     dx, [di+DPT.wBasePort]
188OutputALtoPortInDX:
189    out     dx, al
190    ret
191
192
193
194; A0 <-> A3 lookup table
195g_rgbSwapA0andA3fromIdeRegisterIndex:
196    db  0000b   ; <-> 0000b, 0
197    db  1000b   ; <-> 0001b, 1
198    db  0010b   ; <-> 0010b, 2
199    db  1010b   ; <-> 0011b, 3
200    db  0100b   ; <-> 0100b, 4
201    db  1100b   ; <-> 0101b, 5
202    db  0110b   ; <-> 0110b, 6
203    db  1110b   ; <-> 0111b, 7
204
205%endif ; MODULE_8BIT_IDE
Note: See TracBrowser for help on using the repository browser.