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

Last change on this file since 493 was 493, checked in by gregli@…, 11 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.