source: xtideuniversalbios/trunk/Assembly_Library/Src/Serial/SerialServerScan.asm@ 598

Last change on this file since 598 was 589, checked in by Krister Nordvall, 9 years ago

Changes:

  • BIOS: Fixed a purely cosmetic bug from r542 where, in builds containing MODULE_EBIOS, the boot menu would display an incorrect drive size (0.4 kB with MODULE_STRINGS_COMPRESSED or 0.5 kB without) for old drives with no support for LBA.
  • Fixed a bug from r392 where Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent would return the ID in AL instead of AH (if DANGEROUS_DETECTION had been defined).
  • Fixed a bug from r587 in AdvAtaInit.asm that would prevent detection of QDI Vision controllers.
  • Also changed how the QDI Vision IDs are defined (removed the need for shifting) to avoid confusion. This fixed a potential bug from r587 in AdvAtaInit.asm where some IDs were not being shifted.
  • Fixed a bug in PDC20x30.asm from r587 where GetPdcIDtoAX would not return with the IDE base port in DX so DisablePdcProgrammingMode would fail.
  • Made some changes to ModuleDependency.inc and other files so that MODULE_ADVANCED_ATA now requires USE_386. Consequently it is no longer included in the regular AT-builds, only in the 386_8k-build.
  • Moved the UNROLL_SECTORS_IN_CX_TO_xWORDS macros from IDE_8bit.inc to IdeIO.inc which means it's now possible to build a BIOS without MODULE_8BIT_IDE.
  • XTIDECFG: Added a minimum DOS version check (since it needs DOS version 2+) to allow the program to quit gracefully in the unlikely scenario where someone tries to run it under DOS version 1.
  • Made some changes to Drive.asm to improve drive enumeration. The old method using GET_DOS_DRIVE_PARAMETER_BLOCK_FOR_SPECIFIC_DRIVE worked well in Windows XP but not in Windows 98 SE (in Windows or in DOS mode). The two problems were; 1) The function call would access the drives which on single floppy drive systems would cause Windows to swap between A: and B: (throwing a blue screen asking the user to insert a disk etc). 2) Only floppy drives and FAT16 drives would be available in the list of drives, no FAT32/optical/network drives.
  • Improved code in IdeControllerMenu.asm so that the default port addresses for all IDE interfaces are now restored when (re-)selecting the (same) type of IDE device.
  • Also made it impossible to select a device type unless the required module is included in the loaded BIOS.
  • The version check done when loading a BIOS now uses the FLASH_SIGNATURE definition from Version.inc. Any changes affecting RomVars now only requires updating that definition. This means that changes to RomVars must be implemented in both the BIOS and XTIDECFG before being committed to the repository.
  • Added a compatibility fix for 3Com 3C503 cards to the ROM checksumming code in Buffers.asm (Buffers_GenerateChecksum).
  • SerDrive: Made some minor changes to file names and paths to improve compatibility with case sensitive environments.
  • BIOSDRVS: Made a minor size optimization which as a side effect also makes it compatible with all DOS versions including DOS version 1.
  • Library: Renamed the WAIT_RETRACE_IF_NECESSARY_THEN macro to CALL_WAIT_FOR_RETRACE_IF_NECESSARY_THEN and made a tail-call-optimized version of it (JMP_WAIT_FOR_RETRACE_IF_NECESSARY_THEN).
  • A speed optimization to the eRCL_IM macro for 386 and higher. This change breaks emulation in the sense that the macro will fail when given a memory operand as the first parameter.
  • Other minor optimizations and fixes.
File size: 4.9 KB
Line 
1; Project name : Assembly Library
2; Description : Serial Server Support, Scan for Server
3;
4; This functionality is broken out from SerialServer as it may only be needed during
5; initialization to find a server, and then could be discarded, (for example the case
6; of a TSR).
7
8;
9; XTIDE Universal BIOS and Associated Tools
10; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
11;
12; This program is free software; you can redistribute it and/or modify
13; it under the terms of the GNU General Public License as published by
14; the Free Software Foundation; either version 2 of the License, or
15; (at your option) any later version.
16;
17; This program is distributed in the hope that it will be useful,
18; but WITHOUT ANY WARRANTY; without even the implied warranty of
19; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20; GNU General Public License for more details.
21; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22;
23
24
25%include "SerialServer.inc"
26
27; Section containing code
28SECTION .text
29
30;--------------------------------------------------------------------
31; SerialServerScan_ScanForServer:
32; Parameters:
33; BH: Drive Select byte for Drive and Head Select Register
34; 0xAx: Scan for drive, low nibble indicates drive
35; 0x0: Scan for Server, independent of drives
36; DX: Port and Baud to Scan for
37; 0: Scan a known set of ports and bauds
38; ES:SI: Ptr to buffer for return
39; Returns:
40; CF: Cleared if success, Set if error
41; Corrupts registers:
42; AL, BX, CX, DX, DI
43;--------------------------------------------------------------------
44SerialServerScan_ScanForServer:
45 mov cx, 1 ; one sector, not scanning (default)
46
47 test dx, dx
48 jnz SHORT SerialServerScan_CheckForServer_PortAndBaudInDX
49
50 mov di, .scanPortAddresses-1
51 mov ch, 1 ; tell server that we are scanning
52
53.nextPort:
54 inc di ; load next port address
55 mov dh, 40h ; Clear DH and make sure CF is set if error
56 mov dl, [cs:di]
57 eSHL_IM dx, 2 ; shift from one byte to two
58 jz SHORT .error
59
60;
61; Test for COM port presence, write to and read from registers
62;
63 push dx
64 add dl, Serial_UART_lineControl
65 mov al, 9Ah
66 out dx, al
67 in al, dx
68 pop dx
69 cmp al, 9Ah
70 jne SHORT .nextPort
71
72 mov al, 0Ch
73 out dx, al
74 in al, dx
75 cmp al, 0Ch
76 jne SHORT .nextPort
77
78;
79; Begin baud rate scan on this port...
80;
81; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a
82; small jump between 9600 and 38800. These 6 were selected since we wanted to support 9600 baud and 115200,
83; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier.
84;
85; Starting with 30h, that means 30h (2400 baud), 18h (4800 baud), 0Ch (9600 baud), and
86; 04h (28800 baud), 02h (57600 baud), 01h (115200 baud)
87;
88; Note: hardware baud multipliers (2x, 4x, 8x) will impact the final baud rate and are not known at this level
89;
90 mov dh, 30h * 2 ; multiply by 2 since we are about to divide by 2
91 mov dl, [cs:di] ; restore single byte port address for scan
92
93.nextBaud:
94 shr dh, 1
95 jz SHORT .nextPort
96 cmp dh, 6 ; skip from 6 to 4, to move from the top of the 9600 baud range
97 jne SHORT .testBaud ; to the bottom of the 115200 baud range
98 mov dh, 4
99
100.testBaud:
101 call SerialServerScan_CheckForServer_PortAndBaudInDX
102 jc SHORT .nextBaud
103
104.error:
105 ret
106
107.scanPortAddresses: db SERIAL_COM7_IOADDRESS >> 2
108 db SERIAL_COM6_IOADDRESS >> 2
109 db SERIAL_COM5_IOADDRESS >> 2
110 db SERIAL_COM4_IOADDRESS >> 2
111 db SERIAL_COM3_IOADDRESS >> 2
112 db SERIAL_COM2_IOADDRESS >> 2
113 db SERIAL_COM1_IOADDRESS >> 2
114 db 0
115
116
117;--------------------------------------------------------------------
118; SerialServer_CheckForServer_PortAndBaudInDX:
119; Parameters:
120; BH: Drive Select byte for Drive and Head Select Register
121; 0xAx: Scan for drive, low nibble indicates drive
122; 0x0: Scan for Server, independent of drives
123; DX: Baud and Port
124; CH: 1: We are doing a scan for the serial server
125; 0: We are working off a specific port given by the user
126; CL: 1, for one sector to read
127; ES:SI: Ptr to buffer for return
128; Returns:
129; AH: INT 13h Error Code
130; CF: Cleared if success, Set if error
131; Corrupts registers:
132; AL, BX
133;--------------------------------------------------------------------
134SerialServerScan_CheckForServer_PortAndBaudInDX:
135 push bp ; setup fake SerialServer_Command
136 push dx ; send port baud and rate, returned in inquire packet
137 ; (and possibly returned in the drive identification string)
138 push cx ; send number of sectors, and if it is on a scan or not
139 mov bl, SerialServer_Command_Inquire ; protocol command onto stack with bh
140 push bx
141
142 mov bp, sp
143 call SerialServer_SendReceive
144
145 pop bx
146 pop cx
147 pop dx
148 pop bp
149
150 ret
151
Note: See TracBrowser for help on using the repository browser.