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

Last change on this file since 596 was 596, checked in by krille_n_, 6 years ago

Changes:

  • Made changes to HotkeyBar.asm to give the Boot Menu and Hotkey Bar a more consistent look. It will probably seem a bit strange at first to people used to the classic theme.
  • Added the missing parts of USE_NEC_V that should have been committed with the rest in r593.
  • Removed DEFINES_ALL_FEATURES from the BIOS makefile. It didn't work anymore and never really made sense anyway. Added all the official builds to 'make unused' instead which actually uncovered some unused code in the Tiny build.
  • XTIDECFG will no longer load color themes from unrecognized versions of the BIOS.
  • Other fixes in comments and some minor optimizations.
File size: 6.0 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, CX
36;--------------------------------------------------------------------
37AdvAtaInit_DetectControllerForIdeBaseInBX:
38    ; Detect if system has PCI bus. If it does, we can skip VLB detection. This is
39    ; good thing since detecting Vision QD6580 is dangerous since Intel PIIX4 south bridge
40    ; mirrors Interrupt Controller registers from Axh to Bxh. This can lead to faulty
41    ; detection of QD6580 that will eventually crash the system when ports are written.
42
43    ; We should save the 32-bit registers but we don't since system BIOS has stored
44    ; them already and we don't use the 32-bit registers ourselves anywhere at the moment.
45    push    bx
46    push    di
47    xor     edi, edi        ; Some BIOSes require this to be set to zero
48    mov     ax, PCI_INSTALLATION_CHECK
49    int     BIOS_TIME_PCI_PNP_1Ah
50    pop     di
51    pop     bx
52    test    ah, ah
53    jz      SHORT .ThisSystemHasPCIbus
54
55    ; Detect VLB controllers
56    call    Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent
57    jnz     SHORT .NoVisionControllerFound
58
59    call    Vision_DoesIdePortInBXbelongToControllerWithIDinAX
60    jz      SHORT .AdvancedControllerFoundForPortBX
61
62.NoVisionControllerFound:
63    call    PDC20x30_DetectControllerForIdeBaseInBX
64    jnc     SHORT .NoAdvancedControllerForPortBX
65
66.AdvancedControllerFoundForPortBX:
67    stc
68    ret
69
70.NoAdvancedControllerForPortBX:
71.ThisSystemHasPCIbus:
72    xor     ax, ax      ; Clear ID in AX and CF
73    ret
74
75
76;--------------------------------------------------------------------
77; AdvAtaInit_GetControllerMaxPioModeToALandMinPioCycleTimeToBX
78;   Parameters:
79;       AX:     ID WORD specific for detected controller
80;   Returns:
81;       AL:     Max supported PIO mode (only if ZF set)
82;       AH:     ~FLGH_DPT_IORDY if IORDY not supported, -1 otherwise (only if ZF set)
83;       BX:     Min PIO cycle time (only if ZF set)
84;       ZF:     Set if PIO limit necessary
85;               Cleared if no need to limit timings
86;   Corrupts registers:
87;       Nothing
88;--------------------------------------------------------------------
89AdvAtaInit_GetControllerMaxPioModeToALandMinPioCycleTimeToBX:
90    cmp     ah, ID_QD6580_ALTERNATE
91%ifdef USE_386
92    jae     Vision_GetMaxPioModeToALandMinCycleTimeToBX
93    jmp     PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX
94%else
95    jae     SHORT .Vision
96    jmp     PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX
97.Vision:
98    jmp     Vision_GetMaxPioModeToALandMinCycleTimeToBX
99%endif
100
101
102;--------------------------------------------------------------------
103; AdvAtaInit_InitializeControllerForDPTinDSDI
104;   Parameters:
105;       DS:DI:  Ptr to DPT for Single or Slave Drive
106;   Returns:
107;       AH:     Int 13h return status
108;       CF:     Cleared if success or no controller to initialize
109;               Set if error
110;   Corrupts registers:
111;       AL, BX, CX, DX
112;--------------------------------------------------------------------
113AdvAtaInit_InitializeControllerForDPTinDSDI:
114    ; Call Controller Specific initialization function
115    mov     ax, [di+DPT_ADVANCED_ATA.wControllerID]
116    test    ax, ax
117    jz      SHORT .NoAdvancedController ; Return with CF cleared
118
119    cmp     ah, ID_QD6580_ALTERNATE
120    jae     SHORT .Vision
121    jmp     PDC20x30_InitializeForDPTinDSDI
122
123.Vision:
124    push    bp
125    push    si
126
127    call    AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI
128    call    Vision_InitializeWithIDinAH
129    xor     ax, ax                      ; Success
130
131    pop     si
132    pop     bp
133
134.NoAdvancedController:
135    ret
136
137
138;--------------------------------------------------------------------
139; AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI
140;   Parameters:
141;       DS:DI:  Ptr to DPT for Single or Slave Drive
142;   Returns:
143;       SI:     Offset to Master DPT if Slave Drive present
144;               Zero if Slave Drive not present
145;   Corrupts registers:
146;       AL
147;--------------------------------------------------------------------
148AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI:
149    ; Must be Slave Drive if previous DPT has same IDEVARS offset
150    lea     si, [di-LARGEST_DPT_SIZE]   ; DS:SI points to previous DPT
151    mov     al, [di+DPT.bIdevarsOffset]
152    cmp     al, [si+DPT.bIdevarsOffset]
153    je      SHORT .MasterAndSlaveDrivePresent
154
155    ; We only have single drive so zero SI
156    xor     si, si
157.MasterAndSlaveDrivePresent:
158    ret
159
160
161;--------------------------------------------------------------------
162; AdvAtaInit_SelectSlowestCommonPioTimingsToBXandCXfromDSSIandDSDI
163;   Parameters:
164;       DS:DI:  Ptr to DPT for Single or Slave Drive
165;       SI:     Offset to Master DPT if Slave Drive present
166;               Zero if Slave Drive not present
167;   Returns:
168;       BX:     Best common PIO mode
169;       CX:     Slowest common PIO Cycle Time in nanosecs
170;   Corrupts registers:
171;       Nothing
172;--------------------------------------------------------------------
173AdvAtaInit_SelectSlowestCommonPioTimingsToBXandCXfromDSSIandDSDI:
174    eMOVZX  bx, [di+DPT_ADVANCED_ATA.bPioMode]
175    mov     cx, [di+DPT_ADVANCED_ATA.wMinPioCycleTime]
176    test    si, si
177    jz      SHORT .PioTimingsLoadedToBXandCX
178    MIN_U   bl, [si+DPT_ADVANCED_ATA.bPioMode]
179    MAX_U   cx, [si+DPT_ADVANCED_ATA.wMinPioCycleTime]
180.PioTimingsLoadedToBXandCX:
181    ret
Note: See TracBrowser for help on using the repository browser.