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

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

Changes:

  • Added a new define (USE_UNDOC_INTEL) that enables optimizations possible by using undocumented instructions available on all Intel processors and truly compatible clones. AFAIK the only exceptions are the NEC V-series and the Sony CXQ70108 processors so this option should be safe for use on the AT builds.
  • Building BIOSDRVS or the BIOS without MODULE_STRINGS_COMPRESSED would fail due to the recent code exclusions so I changed them a bit. Also fixed the mistaken change to Main.asm
  • Changed the Tandy specific info in Configuration_FullMode.txt so it matches the info in the Wiki.
  • Optimizations and fixes in general.
File size: 5.6 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
60    cmp     al, DEVICE_8BIT_JRIDE_ISA
61    jne     SHORT .ShlRegisterIndexInDX         ; All XT-CF modes
62    ; Fall to .InputToALfromMemoryMappedRegisterInDX
63
64.InputToALfromMemoryMappedRegisterInDX:
65    push    ds
66    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA
[491]67    mov     al, [bx+JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET]
[473]68    pop     ds
[150]69    ret
70
[473]71.ReverseA0andA3fromRegisterIndexInDX:
72    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
73    SKIP2B  bx  ; Skip shl dx, 1
[150]74
[473]75.ShlRegisterIndexInDX:
[491]76    eSHL_IM dx, 1
[473]77    ; Fall to .InputToALfromRegisterInDX
[400]78
[473]79.InputToALfromRegisterInDX:
80    add     dx, [di+DPT.wBasePort]
81    in      al, dx
82    ret
83
84
[400]85;--------------------------------------------------------------------
[473]86; IdeIO_OutputALtoIdeControlBlockRegisterInDL
[150]87;   Parameters:
[473]88;       AL:     Byte to output
89;       DL:     IDE Control Block Register
[160]90;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[150]91;   Returns:
[473]92;       Nothing
[150]93;   Corrupts registers:
[160]94;       BX, DX
[150]95;--------------------------------------------------------------------
[473]96IdeIO_OutputALtoIdeControlBlockRegisterInDL:
97    ; Note! We do not need to reverse A0 and A3 for XTIDE rev 2 since
98    ; the only Control Block Register we access is DEVICE_CONTROL_REGISTER_out
99    ; at offset 6 (0110b).
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
104    jbe     SHORT .OutputALtoControlBlockRegisterInDX   ; Standard IDE controllers and XTIDE rev 1
105    cmp     bl, DEVICE_8BIT_JRIDE_ISA
106    jne     SHORT .ShlRegisterIndexInDX     ; All XT-CF modes
107    ; Fall to .OutputALtoMemoryMappedRegisterInDX
[160]108
[473]109.OutputALtoMemoryMappedRegisterInDX:
110    mov     bx, JRIDE_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET
111    jmp     SHORT IdeIO_OutputALtoIdeRegisterInDL.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX
112
113.ShlRegisterIndexInDX:
114    add     dl, OFFSET_TO_CONTROL_BLOCK_REGISTERS
[491]115    eSHL_IM dx, 1
[473]116    jmp     SHORT OutputALtoRegisterInDX
117
118.OutputALtoControlBlockRegisterInDX:
119    call    AccessDPT_GetIdevarsToCSBX
120    add     dx, [cs:bx+IDEVARS.wControlBlockPort]
121    jmp     SHORT OutputALtoPortInDX
122
123
[160]124;--------------------------------------------------------------------
[473]125; IdeIO_OutputALtoIdeRegisterInDL
[160]126;   Parameters:
[473]127;       AL:     Byte to output
128;       DL:     IDE Command Block Register
[160]129;       DS:DI:  Ptr to DPT (in RAMVARS segment)
130;   Returns:
[473]131;       Nothing
[160]132;   Corrupts registers:
[473]133;       BX, DX
[160]134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
[473]136IdeIO_OutputALtoIdeRegisterInDL:
137    xor     dh, dh  ; IDE Register index now in DX
[160]138
[473]139    mov     bl, [di+DPT_ATA.bDevice]
140    cmp     bl, DEVICE_8BIT_XTIDE_REV2
141    je      SHORT .ReverseA0andA3fromRegisterIndexInDX
142    jb      SHORT OutputALtoRegisterInDX    ; Standard IDE controllers and XTIDE rev 1
143    cmp     bl, DEVICE_8BIT_JRIDE_ISA
144    jne     SHORT .ShlRegisterIndexInDX     ; All XT-CF modes
145    ; Fall to .OutputALtoMemoryMappedRegisterInDX
[400]146
[473]147.OutputALtoMemoryMappedRegisterInDX:
148    mov     bx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET
149.OutputALtoMemoryMappedRegisterInDXwithWindowOffsetInBX:
150    add     bx, dx
151    push    ds
152    mov     ds, [di+DPT.wBasePort]  ; Segment for JR-IDE/ISA
153    mov     [bx], al
154    pop     ds
[160]155    ret
[400]156
[473]157.ReverseA0andA3fromRegisterIndexInDX:
158    mov     bx, dx
159    mov     dl, [cs:bx+g_rgbSwapA0andA3fromIdeRegisterIndex]
160    SKIP2B  bx  ; Skip shl dx, 1
161
162.ShlRegisterIndexInDX:
[491]163    eSHL_IM dx, 1
[473]164    ; Fall to OutputALtoRegisterInDX
165
166ALIGN JUMP_ALIGN
167OutputALtoRegisterInDX:
168    add     dx, [di+DPT.wBasePort]
169OutputALtoPortInDX:
170    out     dx, al
[400]171    ret
172
[473]173
174
175; A0 <-> A3 lookup table
176g_rgbSwapA0andA3fromIdeRegisterIndex:
177    db  0000b   ; <-> 0000b, 0
178    db  1000b   ; <-> 0001b, 1
179    db  0010b   ; <-> 0010b, 2
180    db  1010b   ; <-> 0011b, 3
181    db  0100b   ; <-> 0100b, 4
182    db  1100b   ; <-> 0101b, 5
183    db  0110b   ; <-> 0110b, 6
184    db  1110b   ; <-> 0111b, 7
185
186%endif ; MODULE_8BIT_IDE
Note: See TracBrowser for help on using the repository browser.