source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH1Eh_XTCF.asm @ 567

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

Changes:

  • Renamed MODULE_FEATURE_SETS to MODULE_POWER_MANAGEMENT.
  • Renamed MODULE_VERY_LATE_INITIALIZATION to MODULE_VERY_LATE_INIT and removed it from the official builds.
  • Removed the code that skips detection of slave drives on XT-CF controllers since slave drives can be used with Lo-tech ISA CompactFlash boards.
  • Added autodetection of the SVC ADP50L controller to XTIDECFG.
  • The autodetection of XT-CF controllers now requires MODULE_8BIT_IDE_ADVANCED in the loaded BIOS.
  • Fixed a bug in XTIDECFG from r502 where the "Base (cmd block) address" menu option would be displayed when a serial device was selected as the IDE controller.
  • XTIDECFG would display the "Enable interrupt" menu option for the XTIDE r1 but not for the XTIDE r2. It's now displayed for both controller types.
  • Disabled the "Internal Write Cache" menu option in the Master/Slave Drive menus for serial device type drives.
  • Optimizations and other fixes.
File size: 6.2 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Int 13h function AH=1Eh, Lo-tech XT-CF features
3;
4; More information at http://www.lo-tech.co.uk/XT-CF
5
6;
7; XTIDE Universal BIOS and Associated Tools
8; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
9;
10; This program is free software; you can redistribute it and/or modify
11; it under the terms of the GNU General Public License as published by
12; the Free Software Foundation; either version 2 of the License, or
13; (at your option) any later version.
14;
15; This program is distributed in the hope that it will be useful,
16; but WITHOUT ANY WARRANTY; without even the implied warranty of
17; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18; GNU General Public License for more details.
19; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20;
21
22; Section containing code
23SECTION .text
24
25;--------------------------------------------------------------------
26; Int 13h function AH=1Eh, Lo-tech XT-CF features.
27; This function is supported only by XTIDE Universal BIOS.
28;
29; AH1Eh_HandlerForXTCFfeatures
30;   Parameters:
31;       AL, CX: Same as in INTPACK
32;       DL:     Translated Drive number
33;       DS:DI:  Ptr to DPT (in RAMVARS segment)
34;       SS:BP:  Ptr to IDEPACK
35;   Parameters on INTPACK:
36;       AL:     XT-CF subcommand (see XTCF.inc for more info)
37;   Returns with INTPACK:
38;       AH:     Int 13h return status
39;       CF:     0 if successful, 1 if error
40;       DX:     Command return values (see XTCF.inc)
41;--------------------------------------------------------------------
42AH1Eh_HandlerForXTCFfeatures:
43%ifndef USE_186
44    call    ProcessXTCFsubcommandFromAL
45    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
46%else
47    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
48    ; Fall to ProcessXTCFsubcommandFromAL
49%endif
50
51
52;--------------------------------------------------------------------
53; ProcessXTCFsubcommandFromAL
54;   Parameters:
55;       AL:     XT-CF subcommand (see XTCF.inc for more info)
56;       DS:DI:  Ptr to DPT (in RAMVARS segment)
57;       SS:BP:  Ptr to IDEPACK
58;   Returns:
59;       AH:     Int 13h return status
60;       CF:     0 if successful, 1 if error
61;   Corrupts registers:
62;       AL, BX, CX, DX, SI
63;--------------------------------------------------------------------
64ProcessXTCFsubcommandFromAL:
65    ; IS_THIS_DRIVE_XTCF. We check this for all commands.
66    call    AccessDPT_IsThisDeviceXTCF
67    jne     SHORT .XTCFnotFound
68    and     ax, 0FFh                    ; Subcommand now in AX (clears AH and CF)
69    jz      SHORT .XTCFfound            ; Sub-function IS_THIS_DRIVE_XTCF (=0)
70
71    dec     ax                          ; Test subcommand...
72    jz      SHORT .SetXTCFtransferMode  ; ...for value 1 (SET_XTCF_TRANSFER_MODE)
73
74    dec     ax                          ; Test subcommand for value 2 (GET_XTCF_TRANSFER_MODE)
75    jnz     SHORT .AH1Eh_LoadInvalidCommandToAHandSetCF
76
77    ; GET_XTCF_TRANSFER_MODE
78    call    AH1Eh_GetCurrentXTCFmodeToAX
79    mov     dh, al
80    mov     dl, [di+DPT_ATA.bBlockSize]
81    mov     [bp+IDEPACK.intpack+INTPACK.dx], dx ; Return mode value (DH) and block size (DL) via INTPACK
82.XTCFfound:
83    ret     ; With AH and CF cleared
84
85.XTCFnotFound:
86.AH1Eh_LoadInvalidCommandToAHandSetCF:
87    stc     ; Set carry flag since XT-CF not found or invalid subcommand
88    mov     ah, RET_HD_INVALID
89    ret
90
91.SetXTCFtransferMode:
92    mov     al, [bp+IDEPACK.intpack+INTPACK.dh] ; Get specified mode (eg XTCF_DMA_MODE)
93    ; Fall to AH1Eh_ChangeXTCFmodeBasedOnModeInAL
94
95
96;--------------------------------------------------------------------
97; AH1Eh_ChangeXTCFmodeBasedOnModeInAL
98;   Parameters:
99;       AL:     XT-CF Mode (see XTCF.inc)
100;       DS:DI:  Ptr to DPT (in RAMVARS segment)
101;       SS:BP:  Ptr to IDEPACK
102;   Returns:
103;       AH:     Int 13h return status
104;       CF:     0 if successful, 1 if error
105;   Corrupts registers:
106;       AL, BX, CX, DX, SI
107;--------------------------------------------------------------------
108AH1Eh_ChangeXTCFmodeBasedOnModeInAL:
109    ; Note: Control register (as of XT-CFv3) is now a write-only register,
110    ;       whose purpose is *only* to raise DRQ.  The register cannot be read.
111    ;       Selected transfer mode is stored in BIOS variable (DPT_ATA.bDevice).
112
113    ; Note that when selecting 'DEVICE_8BIT_PIO_MODE_WITH_BIU_OFFLOAD' mode,
114    ; the ATA device (i.e. CompactFlash card) will operate in 8-bit mode, but
115    ; data will be transferred from its data register using 16-bit CPU instructions
116    ; like REP INSW.  This works because XT-CF adapters are 8-bit cards, and
117    ; the BIU in the machine splits each WORD requested by the CPU into two 8-bit
118    ; ISA cycles at base+0h and base+1h.  The XT-CF cards do not decode A0, hence
119    ; both accesses appear the same to the card and the BIU then re-constructs
120    ; the data for presentation to the CPU.
121    ;
122    ; Also note that some machines, noteably the Olivetti M24 (also known as
123    ; the AT&T PC6300 and Xerox 6060), have hardware errors in the BIU logic,
124    ; resulting in reversed byte ordering.  Therefore, mode DEVICE_8BIT_PIO is
125    ; the default transfer mode for best system compatibility.
126
127    ; We always need to enable 8-bit mode since 16-bit mode is restored
128    ; when controller is reset (AH=00h or 0Dh)
129    ePUSH_T bx, AH23h_Enable8bitPioMode
130
131    ; Convert mode to device type (see XTCF.inc for full details)
132    and     ax, 3
133    jz      SHORT .Set8bitPioMode   ; XTCF_8BIT_PIO_MODE = 0
134    dec     ax                      ; XTCF_8BIT_PIO_MODE_WITH_BIU_OFFLOAD = 1
135    jz      SHORT .Set8bitPioModeWithBIUOffload
136
137    ; XTCF_DMA_MODE = 2 (allow 3 as well for more optimized code)
138    mov     BYTE [di+DPT_ATA.bDevice], DEVICE_8BIT_XTCF_DMA
139
140    ; DMA transfers have limited block size
141    mov     al, [di+DPT_ATA.bBlockSize]
142    cmp     al, XTCF_DMA_MODE_MAX_BLOCK_SIZE
143    jbe     SHORT AH24h_SetBlockSize
144    mov     al, XTCF_DMA_MODE_MAX_BLOCK_SIZE
145    jmp     SHORT AH24h_SetBlockSize
146
147.Set8bitPioMode:
148    mov     al, DEVICE_8BIT_XTCF_PIO8
149    SKIP2B  bx
150
151.Set8bitPioModeWithBIUOffload:
152    mov     al, DEVICE_8BIT_XTCF_PIO8_WITH_BIU_OFFLOAD
153    mov     [di+DPT_ATA.bDevice], al
154    ret
155
156
157;--------------------------------------------------------------------
158; AH1Eh_GetCurrentXTCFmodeToAX
159;   Parameters:
160;       DS:DI:  Ptr to DPT (in RAMVARS segment)
161;   Returns:
162;       AX:     XT-CF mode (XTCF_8BIT_PIO_MODE, XTCF_8BIT_PIO_MODE_WITH_BIU_OFFLOAD or XTCF_DMA_MODE)
163;       CF:     Clear
164;   Corrupts registers:
165;       Nothing
166;--------------------------------------------------------------------
167AH1Eh_GetCurrentXTCFmodeToAX:
168    mov     al, [di+DPT_ATA.bDevice]
169    shr     al, 1
170    cbw
171    sub     al, DEVICE_8BIT_XTCF_PIO8 >> 1
172    ret
Note: See TracBrowser for help on using the repository browser.