source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta/AdvAtaInit.asm @ 568

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

Changes:

  • SerDrive: Using named pipe mode (serdrive -p) now works under Windows XP/2000/Server 2003.
  • checksum.pl: Added a compatibility fix for 3Com 3C503 cards.
  • XTIDECFG will now scan every possible segment address to find and load the BIOS and/or its settings from EEPROM. This should simplify things for people using combined option ROMs.
  • Fixed a bug from r521 in BootSector.asm where the BIOS would not display a timeout error if it failed to load the boot sector from harddrive.
  • Fixed a bug from r541 in CompatibleDPT.asm where CompatibleDPT_CreateDeviceParameterTableExtensionToESBXfromDPTinDSSI would generate an invalid checksum in the DPTE.
  • Optimizations and other fixes.
File size: 4.8 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Common functions for initializing different
3;                   VLB and PCI IDE Controllers.
4
5;
6; XTIDE Universal BIOS and Associated Tools
7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 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; AdvAtaInit_DetectControllerForIdeBaseInBX
26;   Parameters:
27;       BX:     IDE Controller base port
28;   Returns:
29;       AX:     ID WORD specific for detected controller
30;               Zero if no controller detected
31;       DX:     Controller base port (not IDE)
32;       CF:     Set if controller detected
33;               Cleared if no controller
34;   Corrupts registers:
35;       BX
36;--------------------------------------------------------------------
37AdvAtaInit_DetectControllerForIdeBaseInBX:
38    call    Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent
39    jne     SHORT .NoAdvancedControllerForPortBX
40    call    Vision_DoesIdePortInBXbelongToControllerWithIDinAX
41    jne     SHORT .NoAdvancedControllerForPortBX
42
43    stc     ; Advanced Controller found for port BX
44    ret
45
46.NoAdvancedControllerForPortBX:
47    xor     ax, ax
48    ret
49
50
51;--------------------------------------------------------------------
52; AdvAtaInit_GetControllerMaxPioModeToALandMinPioCycleTimeToBX
53;   Parameters:
54;       AX:     ID WORD specific for detected controller
55;   Returns:
56;       AL:     Max supported PIO mode
57;       AH:     FLGH_DPT_IORDY if IORDY supported, zero otherwise
58;       BX:     Min PIO cycle time (only if CF set)
59;       CF:     Set if PIO limit necessary
60;               Cleared if no need to limit timings
61;   Corrupts registers:
62;       (AX if CF cleared)
63;--------------------------------------------------------------------
64AdvAtaInit_GetControllerMaxPioModeToALandMinPioCycleTimeToBX    equ Vision_GetMaxPioModeToALandMinCycleTimeToBX
65
66
67;--------------------------------------------------------------------
68; AdvAtaInit_InitializeControllerForDPTinDSDI
69;   Parameters:
70;       DS:DI:  Ptr to DPT for Single or Slave Drive
71;   Returns:
72;       AH:     Int 13h return status
73;       CF:     Cleared if success or no controller to initialize
74;               Set if error
75;   Corrupts registers:
76;       AL, BX, CX, DX
77;--------------------------------------------------------------------
78AdvAtaInit_InitializeControllerForDPTinDSDI:
79    ; Call Controller Specific initialization function
80    mov     ax, [di+DPT_ADVANCED_ATA.wControllerID]
81    test    ax, ax
82    jz      SHORT .NoAdvancedController ; Return with CF cleared
83
84    push    bp
85    push    si
86
87    ; We only support Vision at the moment so no need to identify ID
88    call    AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI
89    call    Vision_InitializeWithIDinAHandConfigInAL
90    xor     ax, ax                      ; Success
91
92    pop     si
93    pop     bp
94
95.NoAdvancedController:
96    ret
97
98
99;--------------------------------------------------------------------
100; AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI
101;   Parameters:
102;       DS:DI:  Ptr to DPT for Single or Slave Drive
103;   Returns:
104;       SI:     Offset to Master DPT if Slave Drive present
105;               Zero if Slave Drive not present
106;   Corrupts registers:
107;       AX
108;--------------------------------------------------------------------
109AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI:
110    ; Must be Slave Drive if previous DPT has same IDEVARS offset
111    lea     si, [di-LARGEST_DPT_SIZE]   ; DS:SI points to previous DPT
112    mov     al, [di+DPT.bIdevarsOffset]
113    cmp     al, [si+DPT.bIdevarsOffset]
114    je      SHORT .MasterAndSlaveDrivePresent
115
116    ; We only have single drive so zero SI
117    xor     si, si
118.MasterAndSlaveDrivePresent:
119    ret
120
121
122;--------------------------------------------------------------------
123; AdvAtaInit_SelectSlowestCommonPioTimingsToBXandCXfromDSSIandDSDI
124;   Parameters:
125;       DS:DI:  Ptr to DPT for Single or Slave Drive
126;       SI:     Offset to Master DPT if Slave Drive present
127;               Zero if Slave Drive not present
128;   Returns:
129;       BX:     Best common PIO mode
130;       CX:     Slowest common PIO Cycle Time in nanosecs
131;   Corrupts registers:
132;       Nothing
133;--------------------------------------------------------------------
134AdvAtaInit_SelectSlowestCommonPioTimingsToBXandCXfromDSSIandDSDI:
135    eMOVZX  bx, [di+DPT_ADVANCED_ATA.bPioMode]
136    mov     cx, [di+DPT_ADVANCED_ATA.wMinPioCycleTime]
137    test    si, si
138    jz      SHORT .PioTimingsLoadedToBXandCX
139    MIN_U   bl, [si+DPT_ADVANCED_ATA.bPioMode]
140    MAX_U   cx, [si+DPT_ADVANCED_ATA.wMinPioCycleTime]
141.PioTimingsLoadedToBXandCX:
142    ret
Note: See TracBrowser for help on using the repository browser.