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

Last change on this file since 363 was 363, checked in by aitotat@…, 12 years ago

Changes to XTIDE Universal BIOS:

  • Added Advanced ATA Module (MODULE_ADVANCED_ATA) with native support for QDI Vision QD6500 and QD6580 VLB IDE Controllers.
  • Hopefully optimized IDE transfer functions for 8088 (replaced some memory accesses from WORD to BYTE).
  • XT build does not fit in 8k at the moment!!!
File size: 4.5 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Common functions for initializing different
3;                   VLB and PCI IDE Controllers.
4
5; Section containing code
6SECTION .text
7
8;--------------------------------------------------------------------
9; AdvAtaInit_DetectControllerForIdeBaseInDX
10;   Parameters:
11;       DX:     IDE Controller base port
12;   Returns:
13;       AX:     ID WORD specific for detected controller
14;               Zero if no controller detected
15;       CX:     Controller base port (not IDE)
16;       CF:     Set if controller detected
17;               Cleared if no controller
18;   Corrupts registers:
19;       BX
20;--------------------------------------------------------------------
21AdvAtaInit_DetectControllerForIdeBaseInDX:
22    call    Vision_DetectAndReturnIDinAXandPortInCXifControllerPresent
23    jne     SHORT .NoAdvancedControllerForPortDX
24    call    Vision_DoesIdePortInDXbelongToControllerWithIDinAX
25    jne     SHORT .NoAdvancedControllerForPortDX
26
27    stc     ; Advanced Controller found for port DX
28    ret
29
30.NoAdvancedControllerForPortDX:
31    xor     ax, ax
32    ret
33
34
35;--------------------------------------------------------------------
36; AdvAtaInit_GetControllerMaxPioModeToAL
37;   Parameters:
38;       AX:     ID WORD specific for detected controller
39;   Returns:
40;       AL:     Max supported PIO mode (if CF set)
41;       CF:     Set if PIO limit necessary
42;               Cleared if no need to limit timings
43;   Corrupts registers:
44;       Nothing
45;--------------------------------------------------------------------
46AdvAtaInit_GetControllerMaxPioModeToAL  equ Vision_GetMaxPioModeToAL
47
48
49;--------------------------------------------------------------------
50; AdvAtaInit_InitializeControllerForDPTinDSDI
51;   Parameters:
52;       DS:DI:  Ptr to DPT for Single or Slave Drive
53;   Returns:
54;       CF:     Cleared if success or no controller to initialize
55;               Set if error
56;   Corrupts registers:
57;       AX, BX, CX, DX
58;--------------------------------------------------------------------
59AdvAtaInit_InitializeControllerForDPTinDSDI:
60    push    ds
61    push    si
62    push    di
63
64    ; PIO and Advanced Controller variables are stored to BOOTMENUINFO
65    ; to keep the DPTs as small as possible.
66    call    GetMasterAndSlaveBootMenuInfosToSIandDI
67    cmp     WORD [BOOTVARS.wMagicWord], BOOTVARS_MAGIC_WORD
68    clc
69    jne     SHORT .BootMenuInfosAreNoLongerAvailable
70
71    ; Call Controller Specific initialization function
72    mov     ax, [si+BOOTMENUINFO.wControllerID]
73    test    ax, ax
74    jz      SHORT .NoAdvancedController
75    call    Vision_InitializeWithIDinAHandConfigInAL    ; The only we support at the moment
76
77.BootMenuInfosAreNoLongerAvailable:
78.NoAdvancedController:
79    pop     di
80    pop     si
81    pop     ds
82    ret
83
84
85;--------------------------------------------------------------------
86; AdvAtaInit_GetMasterAndSlaveBootMenuInfosToSIandDI
87;   Parameters:
88;       DS:DI:  Ptr to DPT for Single or Slave Drive
89;   Returns:
90;       DS:SI:  Ptr to Single or Master Drive BOOTMENUINFO
91;       DI:     Offset to Slave Drive BOOTMENUINFO
92;               Zero if Slave Drive not present
93;   Corrupts registers:
94;       BX, DX, (DS will change!)
95;--------------------------------------------------------------------
96GetMasterAndSlaveBootMenuInfosToSIandDI:
97    call    BootMenuInfo_ConvertDPTtoBX
98    LOAD_BDA_SEGMENT_TO ds, di, !               ; Zero DI to assume no Slave Drive present
99
100    mov     dx, [bx+BOOTMENUINFO.wIdeBasePort]  ; Load IDE Port from Single or Slave Drive
101    lea     si, [bx+BOOTMENUINFO_size]          ; SI points to Slave Drive if present
102    cmp     dx, [si+BOOTMENUINFO.wIdeBasePort]
103    jne     SHORT .BootMenuInfoForSingleDriveInDSBX
104
105    mov     di, si                              ; Slave Drive detected, copy pointer to DS:DI
106.BootMenuInfoForSingleDriveInDSBX:
107    mov     si, bx
108    ret
109
110
111;--------------------------------------------------------------------
112; AdvAtaInit_SelectSlowestTimingsToBXandCX
113;   Parameters:
114;       DS:SI:  Ptr to BOOTMENUINFO for Master or Single Drive
115;       DI:     Offset to BOOTMENUINFO for Slave Drive
116;               Zero if Slave Drive not present
117;   Returns:
118;       BX:     Min Active Time in nanosecs
119;       CX:     Min Recovery Time in nanosecs
120;   Corrupts registers:
121;       Nothing
122;--------------------------------------------------------------------
123AdvAtaInit_SelectSlowestTimingsToBXandCX:
124    mov     bx, [si+BOOTMENUINFO.wMinPioActiveTimeNs]
125    mov     cx, [si+BOOTMENUINFO.wMinPioRecoveryTimeNs]
126    test    di, di
127    jz      SHORT .ReturnSlowestTimingInBXandCX ; No Slave Drive
128
129    ; If Active Time is greater, then must be the Recovery Time as well
130    cmp     bx, [di+BOOTMENUINFO.wMinPioActiveTimeNs]
131    jbe     SHORT .ReturnSlowestTimingInBXandCX
132    mov     bx, [di+BOOTMENUINFO.wMinPioActiveTimeNs]
133    mov     cx, [di+BOOTMENUINFO.wMinPioRecoveryTimeNs]
134.ReturnSlowestTimingInBXandCX:
135    ret
Note: See TracBrowser for help on using the repository browser.