source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/IdeAutodetect.asm @ 497

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

Changes to Configurator v2:

  • Added Auto Configure.
File size: 6.8 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   Functions to detect ports and devices.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; IdeAutodetect_DetectIdeDeviceFromPortDX
25;   Parameters:
26;       DX:     IDE Base Port
27;       DS:DI:  Ptr to ROMVARS
28;   Returns:
29;       AL:     Device Type
30;       CF:     Clear if IDE Device found
31;               Set if IDE Device not found
32;   Corrupts registers:
33;       AH, BX, CX
34;--------------------------------------------------------------------
35IdeAutodetect_DetectIdeDeviceFromPortDX:
36    cmp     dx, FIRST_MEMORY_SEGMENT_ADDRESS
37    jb      SHORT .DetectPortMappedDevices
38
39    ; Try to detect JR-IDE/ISA (only if MODULE_8BIT_IDE_ADVANCED is present)
40    test    WORD [di+ROMVARS.wFlags], FLG_ROMVARS_MODULE_8BIT_IDE_ADVANCED
41    jz      SHORT .SkipRestOfDetection
42
43    push    ds
44    mov     ds, dx
45    cli                         ; Disable Interrupts
46    mov     ah, [JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET + STATUS_REGISTER_in]
47    mov     al, [JRIDE_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET + ALTERNATE_STATUS_REGISTER_in]
48    sti                         ; Enable Interrupts
49    pop     ds
50    call    CompareIdeStatusRegistersFromALandAH
51    mov     al, DEVICE_8BIT_JRIDE_ISA
52    ret
53.DetectPortMappedDevices:
54
55
56    ; Try to detect Standard 16- and 32-bit IDE Devices
57    mov     bh, DEVICE_16BIT_ATA        ; Assume 16-bit ISA slot for AT builds
58    call    Buffers_IsXTbuildLoaded
59    eCMOVE  bh, DEVICE_8BIT_ATA         ; Assume 8-bit ISA slot for XT builds
60    mov     bl, STATUS_REGISTER_in
61    mov     cx, STANDARD_CONTROL_BLOCK_OFFSET + ALTERNATE_STATUS_REGISTER_in
62    call    DetectIdeDeviceFromPortDXwithStatusRegOffsetsInBLandCX
63    mov     al, bh
64    jnc     SHORT .IdeDeviceFound
65
66
67    ; Detect 8-bit devices only if MODULE_8BIT_IDE is available
68    test    BYTE [di+ROMVARS.wFlags], FLG_ROMVARS_MODULE_8BIT_IDE
69    jz      SHORT .SkipRestOfDetection
70
71    ; Try to detect XT-CF
72    mov     bl, STATUS_REGISTER_in << 1
73    mov     cx, (XTIDE_CONTROL_BLOCK_OFFSET + ALTERNATE_STATUS_REGISTER_in) << 1
74    call    DetectIdeDeviceFromPortDXwithStatusRegOffsetsInBLandCX
75    mov     al, DEVICE_8BIT_XTCF_PIO8
76    jnc     SHORT .IdeDeviceFound
77
78    ; Try to detect 8-bit XT-IDE rev 1
79    shr     cx, 1
80    call    DetectIdeDeviceFromPortDXwithStatusRegOffsetsInBLandCX
81    mov     al, DEVICE_8BIT_XTIDE_REV1
82    jnc     SHORT .IdeDeviceFound
83
84    ; Try to detect 8-bit XT-IDE rev 2 or modded rev 1
85    ; This doesn't actually work since Status Register and Alternative
86    ; Status Register swap place!!!
87    mov     bl, 1110b   ; STATUS_REGISTER_in with A0 and A3 swapped
88    mov     cl, 0111b
89    call    DetectIdeDeviceFromPortDXwithStatusRegOffsetsInBLandCX
90    mov     al, DEVICE_8BIT_XTIDE_REV2
91.IdeDeviceFound:
92    ret
93.SkipRestOfDetection:
94    stc
95    ret
96
97
98;--------------------------------------------------------------------
99; DetectIdeDeviceFromPortDXwithStatusRegOffsetsInBLandCX
100;   Parameters:
101;       BL:     Offset to IDE Status Register
102;       CX:     Offset to Alternative Status Register
103;       DX:     IDE Base Port
104;   Returns:
105;       CF:     Clear if IDE Device found
106;               Set if IDE Device not found
107;   Corrupts registers:
108;       AX
109;--------------------------------------------------------------------
110DetectIdeDeviceFromPortDXwithStatusRegOffsetsInBLandCX:
111    ; Read Status and Alternative Status Registers
112    push    cx
113    push    dx
114
115    add     cx, dx              ; CX = Address to Alternative Status Register
116    add     dl, bl              ; DX = Address to Status Register
117    cli                         ; Disable Interrupts
118    in      al, dx              ; Read Status Register
119    mov     ah, al
120    mov     dx, cx
121    in      al, dx              ; Read Alternative Status Register
122    sti                         ; Enable Interrupts
123
124    pop     dx
125    pop     cx
126    ; Fall to CompareIdeStatusRegistersFromALandAH
127
128
129;--------------------------------------------------------------------
130; CompareIdeStatusRegistersFromALandAH
131;   Parameters:
132;       AL:     Possible IDE Status Register contents
133;       AH:     Possible IDE Alternative Status Register contents
134;   Returns:
135;       CF:     Clear if valid Status Register Contents
136;               Set if not possible IDE Status Registers
137;   Corrupts registers:
138;       Nothing
139;--------------------------------------------------------------------
140CompareIdeStatusRegistersFromALandAH:
141    ; Status Register now in AH and Alternative Status Register in AL.
142    ; They must be the same if base port was in use by IDE device.
143    cmp     al, ah
144    jne     SHORT .InvalidStatusRegister
145
146    ; Bytes were the same but it is possible they were both FFh, for 
147    ; example. We must make sure bit are what is expected from valid
148    ; IDE Status Register.
149    test    al, FLG_STATUS_BSY | FLG_STATUS_DF | FLG_STATUS_DRQ | FLG_STATUS_ERR
150    jnz     SHORT .InvalidStatusRegister    ; Busy or Errors cannot be set
151    test    al, FLG_STATUS_DRDY
152    jz      SHORT .InvalidStatusRegister    ; Device needs to be ready
153    ret                                     ; Return with CF cleared
154
155.InvalidStatusRegister:
156AllPortsAlreadyDetected:
157    stc
158    ret
159
160
161;--------------------------------------------------------------------
162; IdeAutodetect_IncrementDXtoNextIdeBasePort
163;   Parameters:
164;       DX:     Previous IDE Base Port
165;   Returns:
166;       DX:     Next IDE Base Port
167;       ZF:     Set if no more Base Ports (DX was last base port on entry)
168;               Clear if new base port returned in DX
169;   Corrupts registers:
170;       AX
171;--------------------------------------------------------------------
172ALIGN JUMP_ALIGN
173IdeAutodetect_IncrementDXtoNextIdeBasePort:
174    cmp     dx, [cs:.wLastIdePort]
175    je      SHORT .AllPortsAlreadyDetected
176
177    push    si
178    mov     si, .rgwIdeBasePorts
179.CompareNextIdeBasePort:
180    cmp     [cs:si], dx
181    lea     si, [si+2]  ; Increment SI and preserve FLAGS
182    jne     SHORT .CompareNextIdeBasePort
183
184    mov     dx, [cs:si]         ; Get next port
185    test    dx, dx              ; Clear ZF
186    pop     si
187.AllPortsAlreadyDetected:
188    ret
189
190
191    ; All ports used in autodetection. Ports can be in any order.
192ALIGN WORD_ALIGN
193.rgwIdeBasePorts:
194    dw      IDE_PORT_TO_START_DETECTION     ; Must be first
195    ; JR-IDE/ISA (Memory Segment Addresses)
196    dw      0C000h
197    dw      0C400h
198    dw      0C800h
199    dw      0CC00h
200    dw      0D000h
201    dw      0D400h
202    dw      0D800h
203    dw      0DC00h
204    ; 8-bit Devices
205    dw      200h
206    dw      220h
207    dw      240h
208    dw      260h
209    dw      280h
210    dw      2A0h
211    dw      2C0h
212    dw      2E0h
213    dw      300h
214    dw      320h
215    dw      340h
216    dw      360h
217    dw      380h
218    dw      3A0h
219    dw      3C0h
220    dw      3E0h
221    ; Standard IDE
222    dw      DEVICE_ATA_PRIMARY_PORT
223    dw      DEVICE_ATA_SECONDARY_PORT
224    dw      DEVICE_ATA_TERTIARY_PORT
225.wLastIdePort:
226    dw      DEVICE_ATA_QUATERNARY_PORT
Note: See TracBrowser for help on using the repository browser.