source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/AutoConfigure.asm @ 605

Last change on this file since 605 was 605, checked in by krille_n_, 6 months ago

Changes:

  • The "Remove other hard drives" option in the Boot settings menu in XTIDECFG is now exposed in all BIOS builds. This is needed because the system BIOS in at least two Zenith computer models (Z-161 and Z-171) does not clear the BDA HD count which causes it to increment on warm boot. Running "Auto Configure" in XTIDECFG now also tries to identify these machines by doing a CRC check on the system BIOS and sets the option to YES if a match is found.
  • WORD_ALIGN is now 2 for XT builds. This should benefit XT class machines with 8086 and NEC V30 CPU:s and the cost is negligible (1 byte for the XT BIOS builds and 12 bytes for XTIDECFG.COM).
  • Other minor optimizations.
File size: 8.2 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   Functions to automatically configure XTIDE
3;                   Universal BIOS for current system.
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;--------------------------------------------------------------------
26; AutoConfigure_ForThisSystem
27; MENUITEM activation function (.fnActivate)
28;   Parameters:
29;       SS:BP:  Ptr to MENU
30;   Returns:
31;       Nothing
32;   Corrupts registers:
33;       All, except segments
34;--------------------------------------------------------------------
35ALIGN JUMP_ALIGN
36AutoConfigure_ForThisSystem:
37    push    es
38    push    ds
39
40    call    Buffers_GetFileBufferToESDI     ; ROMVARS now in ES:DI
41    push    es
42    pop     ds                              ; ROMVARS now in DS:DI
43    call    ChecksumSystemBios
44    call    ResetIdevarsToDefaultValues
45    call    DetectIdePortsAndDevices
46    call    EnableInterruptsForAllStandardControllers
47    call    StoreAndDisplayNumberOfControllers
48
49    pop     ds
50    pop     es
51.Return:
52    ret
53
54
55;--------------------------------------------------------------------
56; ChecksumSystemBios
57;   Parameters:
58;       DS:DI:  Ptr to ROMVARS
59;   Returns:
60;       Nothing
61;   Corrupts registers:
62;       AX, BX, CX, DX, SI
63;--------------------------------------------------------------------
64ALIGN JUMP_ALIGN
65ChecksumSystemBios:
66    push    ds
67    mov     si, 0F000h
68    mov     ds, si
69    mov     si, 0FFFFh
70    ; DS:SI now points to the end of the System BIOS.
71    std
72    mov     cx, 32768   ; The smallest known problematic BIOS so far.
73    mov     dx, si      ; Initialize the checksum
74    call    CalculateCRC_CCITTfromDSSIwithSizeInCX
75    pop     ds
76    mov     bx, .Checksums
77    cld
78.NextChecksum:
79    mov     ax, [cs:bx]
80    test    ax, ax
81    jz      SHORT AutoConfigure_ForThisSystem.Return
82    inc     bx
83    inc     bx
84    cmp     ax, dx
85    jne     SHORT .NextChecksum
86    or      BYTE [di+ROMVARS.wFlags], FLG_ROMVARS_CLEAR_BDA_HD_COUNT
87    mov     dx, g_szDlgBadBiosFound
88    jmp     Dialogs_DisplayNotificationFromCSDX
89
90ALIGN WORD_ALIGN
91.Checksums:
92    dw      0D192h                      ; 32 KB Zenith Z-161 (071784)
93    dw      02F69h                      ; 32 KB Zenith Z-171 (031485)
94    dw      0
95
96
97;--------------------------------------------------------------------
98; CalculateCRC_CCITTfromDSSIwithSizeInCX
99;   Parameters:
100;       DS:SI:  Pointer to string to checksum
101;       CX:     Length of string to checksum
102;       DX:     Checksum (initially 0FFFFh)
103;       DF:     Set/Clear depending on direction wanted
104;   Returns:
105;       DX:     Checksum
106;       DS:SI:  Pointer to byte after the end of checksummed string
107;   Corrupts registers:
108;       AX, BX, CX
109;--------------------------------------------------------------------
110ALIGN JUMP_ALIGN
111CalculateCRC_CCITTfromDSSIwithSizeInCX:
112;   jcxz    .Return
113    xor     bh, bh
114    mov     ah, 0E0h
115.NextByte:
116    lodsb
117    xor     dh, al
118    mov     bl, dh
119    rol     bx, 1
120    rol     bx, 1
121    rol     bx, 1
122    rol     bx, 1
123    xor     dx, bx
124    rol     bx, 1
125    xchg    dh, dl
126    xor     dx, bx
127    ror     bx, 1
128    ror     bx, 1
129    ror     bx, 1
130    ror     bx, 1
131    and     bl, ah
132    xor     dx, bx
133    ror     bx, 1
134    xor     dh, bl
135    loop    .NextByte
136;.Return:
137    ret
138
139
140;--------------------------------------------------------------------
141; ResetIdevarsToDefaultValues
142;   Parameters:
143;       DS:DI:  Ptr to ROMVARS
144;       ES:DI:  Ptr to ROMVARS
145;   Returns:
146;       Nothing
147;   Corrupts registers:
148;       AX, CX
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151ResetIdevarsToDefaultValues:
152    push    di
153    add     di, BYTE ROMVARS.ideVarsBegin
154    mov     cx, ROMVARS.ideVarsEnd - ROMVARS.ideVarsBegin
155    call    Memory_ZeroESDIwithSizeInCX ; Never clears ROMVARS.ideVarsSerialAuto
156    pop     di
157
158    ; Set default values (other than zero)
159    mov     ax, DISABLE_WRITE_CACHE | (TRANSLATEMODE_AUTO<<TRANSLATEMODE_FIELD_POSITION) | FLG_DRVPARAMS_BLOCKMODE
160    mov     [di+ROMVARS.ideVars0+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags], ax
161    mov     [di+ROMVARS.ideVars0+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags], ax
162
163    mov     [di+ROMVARS.ideVars1+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags], ax
164    mov     [di+ROMVARS.ideVars1+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags], ax
165
166    mov     [di+ROMVARS.ideVars2+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags], ax
167    mov     [di+ROMVARS.ideVars2+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags], ax
168
169    mov     [di+ROMVARS.ideVars3+IDEVARS.drvParamsMaster+DRVPARAMS.wFlags], ax
170    mov     [di+ROMVARS.ideVars3+IDEVARS.drvParamsSlave+DRVPARAMS.wFlags], ax
171    ret
172
173
174;--------------------------------------------------------------------
175; DetectIdePortsAndDevices
176;   Parameters:
177;       DS:DI:  Ptr to ROMVARS
178;   Returns:
179;       CX:     Number of controllers detected
180;   Corrupts registers:
181;       AX, BX, DX, SI
182;--------------------------------------------------------------------
183ALIGN JUMP_ALIGN
184DetectIdePortsAndDevices:
185    xor     cx, cx                          ; Number of devices found
186    xor     dx, dx                          ; IDE_PORT_TO_START_DETECTION
187    lea     si, [di+ROMVARS.ideVarsBegin]   ; DS:SI points to first IDEVARS
188
189.DetectFromNextPort:
190    call    IdeAutodetect_IncrementDXtoNextIdeBasePort
191    jz      SHORT .AllPortsAlreadyDetected
192    push    si
193    call    IdeAutodetect_DetectIdeDeviceFromPortDXAndReturnControlBlockInSI
194    mov     bx, si
195    pop     si
196    jc      SHORT .DetectFromNextPort
197
198    ; Device found from port DX, Device Type returned in AL
199    inc     cx  ; Increment number of controllers found
200    mov     [si+IDEVARS.wBasePort], dx
201    mov     [si+IDEVARS.wControlBlockPort], bx
202    mov     [si+IDEVARS.bDevice], al
203
204    ; Point to next IDEVARS
205    add     si, IDEVARS_size
206    cmp     si, ROMVARS.ideVars3
207    jbe     SHORT .DetectFromNextPort
208.AllPortsAlreadyDetected:
209    ret
210
211
212;--------------------------------------------------------------------
213; EnableInterruptsForAllStandardControllers
214;   Parameters:
215;       DS:DI:  Ptr to ROMVARS
216;       CX:     Number of controllers detected
217;   Returns:
218;       Nothing
219;   Corrupts registers:
220;       AX
221;--------------------------------------------------------------------
222ALIGN JUMP_ALIGN
223EnableInterruptsForAllStandardControllers:
224    jcxz    .NoControllersDetected
225    call    Buffers_IsXTbuildLoaded
226    je      SHORT .DoNotEnableIRQforXTbuilds
227    push    di
228    push    cx
229
230    add     di, BYTE ROMVARS.ideVars0   ; DS:DI now points first IDEVARS
231.CheckNextController:
232    mov     al, 14
233    cmp     WORD [di+IDEVARS.wBasePort], DEVICE_ATA_PRIMARY_PORT
234    je      SHORT .EnableIrqAL
235
236    inc     ax  ; 15
237    cmp     WORD [di+IDEVARS.wBasePort], DEVICE_ATA_SECONDARY_PORT
238
239%if 0
240    je      SHORT .EnableIrqAL
241
242    ; Defaults on the GSI Inc. Model 2C EIDE controller
243    mov     al, 11
244    cmp     WORD [di+IDEVARS.wBasePort], DEVICE_ATA_TERTIARY_PORT
245    je      SHORT .EnableIrqAL
246
247    dec     ax  ; 10
248    cmp     WORD [di+IDEVARS.wBasePort], DEVICE_ATA_QUATERNARY_PORT
249%endif
250
251    jne     SHORT .DoNotEnableIRQ
252
253.EnableIrqAL:
254    mov     [di+IDEVARS.bIRQ], al
255.DoNotEnableIRQ:
256    add     di, IDEVARS_size
257    loop    .CheckNextController
258    pop     cx
259    pop     di
260.DoNotEnableIRQforXTbuilds:
261.NoControllersDetected:
262    ret
263
264
265;--------------------------------------------------------------------
266; StoreAndDisplayNumberOfControllers
267;   Parameters:
268;       CX:     Number of controllers detected
269;       DS:DI:  Ptr to ROMVARS
270;       SS:BP:  Ptr to MENU
271;   Returns:
272;       Nothing
273;   Corrupts registers:
274;       AX, BX, DX, DI, SI, DS, ES
275;--------------------------------------------------------------------
276ALIGN JUMP_ALIGN
277StoreAndDisplayNumberOfControllers:
278    xor     ax, ax
279    or      al, cl
280    jnz     SHORT .AtLeastOneController
281    inc     ax                          ; Cannot store zero
282.AtLeastOneController:
283    test    BYTE [di+ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
284    jnz     SHORT .FullModeSoNoNeedToLimit
285    MIN_U   al, MAX_LITE_MODE_CONTROLLERS
286.FullModeSoNoNeedToLimit:
287
288    ; Store number of IDE Controllers. This will also modify
289    ; menu and set unsaved changes flag.
290    push    cs
291    pop     ds
292    mov     si, g_MenuitemConfigurationIdeControllers
293    call    Menuitem_StoreValueFromAXtoMenuitemInDSSI
294
295    ; Display results (should be changed to proper string formatting)
296    add     cl, '0'
297    mov     [cs:g_bControllersDetected], cl
298    mov     dx, g_szDlgAutoConfigure
299    jmp     Dialogs_DisplayNotificationFromCSDX
Note: See TracBrowser for help on using the repository browser.