source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialCommand.asm@ 623

Last change on this file since 623 was 621, checked in by Krister Nordvall, 3 years 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.2 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Serial Device Command functions.
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%define SERIALSERVER_AH_ALREADY_HAS_COMMAND_BYTE
24%define SERIALSERVER_NO_ZERO_SECTOR_COUNTS
25
26;--------------------------------------------------------------------
27; SerialCommand_OutputWithParameters
28; Parameters:
29; BH: Non-zero if 48-bit addressing used
30; (ignored at present as 48-bit addressing is not supported)
31; BL: IDE Status Register bit to poll after command
32; (ignored at present, since there is no IDE status register to poll)
33; ES:SI: Ptr to buffer (for data transfer commands)
34; DS:DI: Ptr to DPT (in RAMVARS segment)
35; SS:BP: Ptr to IDEREGS_AND_INTPACK
36; Returns:
37; AH: INT 13h Error Code
38; CX: Number of successfully transferred sectors (for transfer commands)
39; CF: Cleared if success, Set if error
40; Corrupts registers:
41; AL, BX, CX, DX, (ES:SI for data transfer commands)
42;--------------------------------------------------------------------
43ALIGN JUMP_ALIGN
44SerialCommand_OutputWithParameters:
45 mov ah, SerialServer_Command_Read
46 mov al, [bp+IDEPACK.bCommand]
47
48 cmp al, 20h ; Read Sectors IDE command
49 je SHORT .readOrWrite
50 inc ah ; now SerialServer_Protocol_Write
51 cmp al, 30h ; Write Sectors IDE command
52 je SHORT .readOrWrite
53
54; all other commands return success
55; including function 0ech which should return drive information, this is handled with the identify functions
56;
57 xor ah, ah ; also clears carry
58 ret
59
60.readOrWrite:
61 mov [bp+IDEPACK.bFeatures], ah ; store protocol command
62%ifdef USE_AT
63 mov dh, [bp+IDEPACK.bSectorCount]
64%endif
65 call IdeTransfer_NormalizePointerInESSI
66%ifdef USE_AT
67 jnc SHORT .PointerNormalizationWasSuccessful
68 xor cx, cx ; Nothing transferred
69 stc
70 ret
71.PointerNormalizationWasSuccessful:
72%endif
73
74 mov dx, [di+DPT_SERIAL.wSerialPortAndBaud]
75; fall through to SerialCommand_FallThroughToSerialServer_SendReceive
76
77ALIGN JUMP_ALIGN
78SerialCommand_FallThroughToSerialServer_SendReceive:
79; fall through to SerialServer_SendReceive
80%include "SerialServer.asm"
81
82%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
83 %if SerialCommand_FallThroughToSerialServer_SendReceive <> SerialServer_SendReceive
84 %error "SerialServer_SendReceive must be the first routine at the top of SerialServer.asm in the Assembly_Library"
85 %endif
86%endif
87
88ALIGN JUMP_ALIGN
89SerialCommand_ReturnError:
90 stc
91 ret
92
93;--------------------------------------------------------------------
94; SerialCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH
95; Parameters:
96; BH: Drive Select byte for Drive and Head Select Register
97; DS: Segment to RAMVARS
98; ES:SI: Ptr to buffer to receive 512-byte IDE Information
99; CS:BP: Ptr to IDEVARS
100; Returns:
101; CF: Cleared if success, Set if error
102; Corrupts registers:
103; AL, BL, CX, DX, SI, DI, ES
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
106SerialCommand_IdentifyDeviceToBufferInESSIwithDriveSelectByteInBH:
107;
108; To improve boot time, we do our best to avoid looking for slave serial drives when we already know the results
109; from the looking for a master. This is particularly true when doing a COM port scan, as we will end up running
110; through all the COM ports and baud rates a second time.
111;
112; But drive detection isn't the only case - we also need to get the right drive when called on int13h/25h.
113;
114; The decision tree:
115;
116; Master:
117; wSerialPortAndBaud Non-Zero: -> Continue with wSerialPortAndBaud (1)
118; wSerialPortAndBaud Zero:
119; previous serial drive not found: -> Scan (2)
120; previous serial drive found: -> Continue with previous serial drive info (3)
121;
122; Slave:
123; wSerialPortAndBaud Non-Zero:
124; previous serial drive not found: -> Error - Not Found (4)
125; previous serial drive found: -> Continue with wSerialPackedAndBaud (5)
126; wSerialPortAndBaud Zero:
127; previous serial drive not found: -> Error - Not Found (4)
128; previous serial drive found: -> Continue with previous serial drive info (6)
129;
130; (1) This was a port/baud that was explicitly set with the configurator. In the drive detection case, as this
131; is the Master, we are checking out a new controller, and so don't care if we already have a serial drive.
132; And as with the int13h/25h case, we just go off and get the needed information using the user's setting.
133; (2) We are using the special .ideVarsSerialAuto structure. During drive detection, we would only be here
134; if we hadn't already seen a serial drive (since we only scan if no explicit drives are set),
135; so we go off to scan.
136; (3) We are using the special .ideVarsSerialAuto structure. We won't get here during drive detection, but
137; we might get here on an int13h/25h call. If we have scanned COM drives, they are the ONLY serial drives
138; in use, and so we use the values from the previously seen serial drive DPT.
139; (4) No master has been found yet, therefore no slave should be found. Avoiding the slave reduces boot time,
140; especially in the full COM port scan case. Note that this is different from the hardware IDE, where we
141; will scan for a slave even if a master is not present. Note that if ANY master had been previously found,
142; we will do the slave scan, which isn't harmful, it just wastes time. But the most common case (by a wide
143; margin) will be just one serial controller.
144; (5) A COM port scan for a master had been previously completed, and a drive was found. In a multiple serial
145; controller scenario being called with int13h/25h, we need to use the value in bSerialPackedPortAndBaud
146; to make sure we get the proper drive.
147; (6) A COM port scan for a master had been previously completed, and a drive was found. We would only get here
148; if no serial drive was explicitly set by the user in the configurator or that drive had not been found.
149; Instead of performing the full COM port scan for the slave, use the port/baud value stored during the
150; master scan.
151;
152 mov dx, [cs:bp+IDEVARS.wSerialPortAndBaud]
153 xor ax, ax
154
155 push si
156 call FindDPT_ToDSDIforSerialDevice ; Preserves AX
157 pop si
158%ifdef MODULE_SERIAL_FLOPPY
159 jnc SHORT .founddpt
160;
161; If not found above with FindDPT_ToDSDIforSerialDevice, DI will point to the DPT after the last hard disk DPT
162; So, if there was a previously found floppy disk, DI will point to that DPT and we use that value for the slave.
163;
164 cmp [RAMVARS.xlateVars+XLATEVARS.bFlopCntAndFirst], al ; Zero?
165 je SHORT .notfounddpt
166.founddpt:
167%else
168 jc SHORT .notfounddpt
169%endif
170 mov ax, [di+DPT_SERIAL.wSerialPortAndBaud]
171.notfounddpt:
172 test bh, FLG_DRVNHEAD_DRV
173 jz SHORT .master
174
175 test ax, ax ; Take care of the case that is different between master and slave.
176 jz SHORT SerialCommand_ReturnError
177
178; fall-through
179.master:
180 test dx, dx
181 jnz SHORT .identifyDeviceInDX
182
183 xchg dx, ax ; move ax to dx (move previously found serial drive to dx, could be zero)
184
185.identifyDeviceInDX:
186; fall through to SerialCommand_FallThroughToSerialServerScan_ScanForServer
187
188ALIGN JUMP_ALIGN
189SerialCommand_FallThroughToSerialServerScan_ScanForServer:
190; fall through to SerialServerScan_ScanForServer
191%include "SerialServerScan.asm"
192
193%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
194 %if SerialCommand_FallThroughToSerialServerScan_ScanForServer <> SerialServerScan_ScanForServer
195 %error "SerialServerScan_ScanForServer must be the first routine at the top of SerialServerScan.asm in the Assembly_Library"
196 %endif
197%endif
198
Note: See TracBrowser for help on using the repository browser.