source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/Device.asm @ 621

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

Changes:

  • Fixed three different bugs all causing the boot menu to show drives using IRQs even though the BIOS had been built without MODULE_IRQ.
  • Fixed two bugs in XTIDECFG where loading a BIOS from file and then loading the old settings from EEPROM would
    • overwrite ROMVARS.wFlags in the loaded BIOS file (in RAM). The possibly resulting mismatch of module flags could make it impossible to change settings for modules included in the BIOS or allow changing settings for modules not included in the BIOS.
    • not copy the color theme over to the loaded BIOS.
  • Also fixed two very minor bugs in XTIDECFG in BiosFile_LoadFileFromDSSItoRamBuffer and BiosFile_SaveRamBufferToFileInDSSI where the error handling in these routines would close whatever file handle that happened to match the error code returned by DOS in AX.
  • Made significant changes to the new flash ROM programming routines to reduce the size. Also fixed a minor bug that would cause the second verification to be skipped and return success when programming a 64 KB block of data.
  • Changed the custom BIOS build file names to the 8.3 format.
  • Changed some help strings in XTIDECFG to clarify things.
  • Other minor optimizations and fixes.
File size: 8.1 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Command and port direction functions for different device types.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 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%macro TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE 1
25    test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
26    jnz     SHORT %1
27%endmacro
28
29%macro CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF 2
30    cmp     BYTE [cs:bp+IDEVARS.bDevice], %1
31    je      SHORT %2
32%endmacro
33
34
35
36;--------------------------------------------------------------------
37; Device_FinalizeDPT
38;   Parameters:
39;       DS:DI:  Ptr to Disk Parameter Table
40;       ES:SI:  Ptr to 512-byte ATA information read from the drive
41;       CS:BP:  Ptr to IDEVARS for the controller
42;   Returns:
43;       Nothing
44;   Corrupts registers:
45;       AX, BX, CX, DX
46;--------------------------------------------------------------------
47%ifdef MODULE_SERIAL    ; IDE + Serial
48Device_FinalizeDPT:
49    ; Needs to check IDEVARS vs. checking the DPT as the serial bit in the DPT is set in the Finalize routine
50    cmp     BYTE [cs:bp+IDEVARS.bDevice], DEVICE_SERIAL_PORT
51%ifdef USE_386
52    jne     IdeDPT_Finalize
53    jmp     SerialDPT_Finalize
54%else ; ~USE_386
55    je      SHORT .FinalizeDptForSerialPortDevice
56    jmp     IdeDPT_Finalize
57.FinalizeDptForSerialPortDevice:
58    jmp     SerialDPT_Finalize
59%endif
60
61%else                   ; IDE
62    Device_FinalizeDPT      EQU     IdeDPT_Finalize
63%endif
64
65
66;--------------------------------------------------------------------
67; Device_ResetMasterAndSlaveController
68;   Parameters:
69;       DS:DI:  Ptr to DPT (in RAMVARS segment)
70;   Returns:
71;       AH:     INT 13h Error Code
72;       CF:     Cleared if success, Set if error
73;   Corrupts registers:
74;       AL, BX, CX, DX
75;--------------------------------------------------------------------
76%ifdef MODULE_SERIAL    ; IDE + Serial
77Device_ResetMasterAndSlaveController:
78    TEST_USING_DPT_AND_JUMP_IF_SERIAL_DEVICE    ReturnSuccessForSerialPort
79    jmp     IdeCommand_ResetMasterAndSlaveController
80
81%else                   ; IDE
82    Device_ResetMasterAndSlaveController    EQU     IdeCommand_ResetMasterAndSlaveController
83%endif
84
85
86;--------------------------------------------------------------------
87; Device_IdentifyToBufferInESSIwithDriveSelectByteInBH
88;   Parameters:
89;       BH:     Drive Select byte for Drive and Head Select Register
90;       CX:     XUB_INT13h_SIGNATURE to ignore illegal ATA-ID values, otherwise
91;               correct them (only used if NOT build with NO_ATAID_CORRECTION)
92;       DX:     Autodetected port (for devices that support autodetection)
93;       DS:     Segment to RAMVARS
94;       ES:SI:  Ptr to buffer to receive 512-byte IDE Information
95;       CS:BP:  Ptr to IDEVARS
96;   Returns:
97;       AH:     INT 13h Error Code
98;       CF:     Cleared if success, Set if error
99;   Corrupts registers:
100;       AL, BX, CX, DX, SI, DI, ES
101;--------------------------------------------------------------------
102%ifndef NO_ATAID_CORRECTION
103Device_IdentifyToBufferInESSIwithDriveSelectByteInBH:
104    cmp     cx, XUB_INT13h_SIGNATURE
105    je      SHORT .DoNotFixAtaInformation
106    push    es
107    push    si
108    ePUSH_T cx, AtaID_PopESSIandFixIllegalValuesFromESSI    ; Here we modify ATA information if necessary
109.DoNotFixAtaInformation:
110
111%ifdef MODULE_SERIAL    ; IDE + Serial
112    cmp     BYTE [cs:bp+IDEVARS.bDevice], DEVICE_SERIAL_PORT
113%ifdef USE_386
114    jne     IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
115    jmp     SerialCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
116%else ; ~USE_386
117    je      SHORT .IdentifyDriveFromSerialPort
118    jmp     IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
119.IdentifyDriveFromSerialPort:
120    jmp     SerialCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
121%endif
122
123%else                   ; IDE
124    jmp     IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
125%endif
126
127%else ; NO_ATAID_CORRECTION
128%ifdef MODULE_SERIAL    ; IDE + Serial
129    cmp     BYTE [cs:bp+IDEVARS.bDevice], DEVICE_SERIAL_PORT
130%ifdef USE_386
131    jne     IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
132    jmp     SerialCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
133%else ; ~USE_386
134    je      SHORT .IdentifyDriveFromSerialPort
135    jmp     IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
136.IdentifyDriveFromSerialPort:
137    jmp     SerialCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
138%endif
139
140%else                   ; IDE
141    Device_IdentifyToBufferInESSIwithDriveSelectByteInBH    EQU     IdeCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
142%endif
143%endif ; NO_ATAID_CORRECTION
144
145
146;--------------------------------------------------------------------
147; Device_OutputCommandWithParameters
148;   Parameters:
149;       BH:     Default system timer ticks for timeout (can be ignored)
150;       BL:     IDE Status Register bit to poll after command
151;       ES:SI:  Ptr to buffer (for data transfer commands)
152;       DS:DI:  Ptr to DPT (in RAMVARS segment)
153;       SS:BP:  Ptr to IDEPACK
154;   Returns:
155;       AH:     INT 13h Error Code
156;       CX:     Number of successfully transferred sectors (for transfer commands)
157;       CF:     Cleared if success, Set if error
158;   Corrupts registers:
159;       AL, BX, (CX), DX, (ES:SI for data transfer commands)
160;--------------------------------------------------------------------
161%ifdef MODULE_SERIAL    ; IDE + Serial
162ALIGN JUMP_ALIGN
163Device_OutputCommandWithParameters:
164    test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
165%ifdef USE_386
166    jz      IdeCommand_OutputWithParameters
167    jmp     SerialCommand_OutputWithParameters
168%else ; ~USE_386
169    jnz     SHORT .OutputCommandToSerialPort
170    jmp     IdeCommand_OutputWithParameters
171
172ALIGN JUMP_ALIGN
173.OutputCommandToSerialPort:
174    jmp     SerialCommand_OutputWithParameters
175%endif
176
177%else                   ; IDE
178    Device_OutputCommandWithParameters      EQU     IdeCommand_OutputWithParameters
179%endif
180
181
182;--------------------------------------------------------------------
183; Device_ReadLBAlowRegisterToAL
184; Returns LBA low register / Sector number register contents.
185; Note that this returns valid value only after transfer command (read/write/verify)
186; has stopped to an error. Do not call this otherwise.
187;   Parameters:
188;       DS:DI:  Ptr to DPT (in RAMVARS segment)
189;   Returns:
190;       AL:     Byte read from the device register
191;   Corrupts registers:
192;       BX, DX
193;--------------------------------------------------------------------
194;%ifdef MODULE_SERIAL   ; IDE + Serial
195;ALIGN JUMP_ALIGN
196;Device_ReadLBAlowRegisterToAL:
197;   test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
198;%ifdef USE_386
199;   jz      IdeCommand_ReadLBAlowRegisterToAL
200;   jmp     SerialCommand_ReadLBAlowRegisterToAL
201;%else ; ~USE_386
202;   jnz     SHORT .ReadFromSerialPort
203;   jmp     IdeCommand_ReadLBAlowRegisterToAL
204
205;ALIGN JUMP_ALIGN
206;.ReadFromSerialPort:
207;   jmp     SerialCommand_ReadLBAlowRegisterToAL
208;%endif
209
210;%else                  ; IDE only
211    Device_ReadLBAlowRegisterToAL       EQU     IdeCommand_ReadLBAlowRegisterToAL
212;%endif
213; TODO: For now we simply assume serial device do not produce verify errors
214
215
216;--------------------------------------------------------------------
217; Device_SelectDrive
218;   Parameters:
219;       DS:DI:  Ptr to DPT (in RAMVARS segment)
220;       SS:BP:  Ptr to IDEPACK
221;   Returns:
222;       AH:     INT 13h Error Code
223;       CF:     Cleared if success, Set if error
224;   Corrupts registers:
225;       AL, BX, CX, DX
226;--------------------------------------------------------------------
227%ifdef MODULE_SERIAL    ; IDE + Serial
228Device_SelectDrive:
229    test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
230%ifndef USE_386
231    jnz     SHORT ReturnSuccessForSerialPort
232    jmp     IdeCommand_SelectDrive
233%else ; USE_386
234    jz      IdeCommand_SelectDrive
235    ; Fall to ReturnSuccessForSerialPort
236%endif
237
238%else                   ; IDE
239    Device_SelectDrive      EQU     IdeCommand_SelectDrive
240%endif
241
242
243%ifdef MODULE_SERIAL
244ReturnSuccessForSerialPort:
245    xor     ax, ax
246    ret
247%endif
Note: See TracBrowser for help on using the repository browser.