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

Last change on this file since 494 was 493, checked in by gregli@…, 12 years ago

Separated MODULE_8BIT_IDE into the basic part used by XTIDE rev 1 and rev 2 which is PIO based, and MODULE_8BIT_IDE_ADVANCED for JRIDE and XTCF support which requires memory mapping and/or DMA. This allows for creating an 8KB image with boot menu support (but no hotkeys) for the XTIDE rev 1. Cleaned up how we reset the drive translation information, ensuring it is properly set between boot attempt on a primary and secondary drive - as a result we clean it when needed, rather than trying to always keep it clean. Also fixed translation bugs in int13h.asm where I had previously missed converting some MODULE_HOTKEYS into MODULE_DRIVEXLATE.

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