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

Last change on this file since 369 was 369, checked in by gregli@…, 13 years ago

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 4.2 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%include "SerialServer.inc"
9
10; Section containing code
11SECTION .text
12
13;--------------------------------------------------------------------
14; SerialServerScan_ScanForServer:
15; Parameters:
16; BH: Drive Select byte for Drive and Head Select Register
17; 0xAx: Scan for drive, low nibble indicates drive
18; 0x0: Scan for Server, independent of drives
19; DX: Port and Baud to Scan for
20; 0: Scan a known set of ports and bauds
21; ES:SI: Ptr to buffer for return
22; Returns:
23; CF: Cleared if success, Set if error
24; Corrupts registers:
25; AL, BX, CX, DX, DI
26;--------------------------------------------------------------------
27SerialServerScan_ScanForServer:
28 mov cx, 1 ; one sector, not scanning (default)
29
30 test dx, dx
31 jnz short SerialServerScan_CheckForServer_PortAndBaudInDX
32
33 mov di,.scanPortAddresses-1
34 mov ch,1 ; tell server that we are scanning
35
36.nextPort:
37 inc di ; load next port address
38 xor dh, dh
39 mov dl,[cs:di]
40 eSHL_IM dx, 2 ; shift from one byte to two
41 stc ; setup error code for exit
42 jz .error
43
44;
45; Test for COM port presence, write to and read from registers
46;
47 push dx
48 add dl,Serial_UART_lineControl
49 mov al, 09ah
50 out dx, al
51 in al, dx
52 pop dx
53 cmp al, 09ah
54 jnz .nextPort
55
56 mov al, 0ch
57 out dx, al
58 in al, dx
59 cmp al, 0ch
60 jnz .nextPort
61
62;
63; Begin baud rate scan on this port...
64;
65; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a
66; small jump between 9600 and 38800. These 6 were selected since we wanted to support 9600 baud and 115200,
67; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier.
68;
69; Starting with 30h, that means 30h (2400 baud), 18h (4800 baud), 0ch (9600 baud), and
70; 04h (28800 baud), 02h (57600 baud), 01h (115200 baud)
71;
72; Note: hardware baud multipliers (2x, 4x) will impact the final baud rate and are not known at this level
73;
74 mov dh,030h * 2 ; multiply by 2 since we are about to divide by 2
75 mov dl,[cs:di] ; restore single byte port address for scan
76
77.nextBaud:
78 shr dh,1
79 jz .nextPort
80 cmp dh,6 ; skip from 6 to 4, to move from the top of the 9600 baud range
81 jnz .testBaud ; to the bottom of the 115200 baud range
82 mov dh,4
83
84.testBaud:
85 call SerialServerScan_CheckForServer_PortAndBaudInDX
86 jc .nextBaud
87
88.error:
89 ret
90
91.scanPortAddresses: db SERIAL_COM7_IOADDRESS >> 2
92 db SERIAL_COM6_IOADDRESS >> 2
93 db SERIAL_COM5_IOADDRESS >> 2
94 db SERIAL_COM4_IOADDRESS >> 2
95 db SERIAL_COM3_IOADDRESS >> 2
96 db SERIAL_COM2_IOADDRESS >> 2
97 db SERIAL_COM1_IOADDRESS >> 2
98 db 0
99
100
101;--------------------------------------------------------------------
102; SerialServer_CheckForServer_PortAndBaudInDX:
103; Parameters:
104; BH: Drive Select byte for Drive and Head Select Register
105; 0xAx: Scan for drive, low nibble indicates drive
106; 0x0: Scan for Server, independent of drives
107; DX: Baud and Port
108; CH: 1: We are doing a scan for the serial server
109; 0: We are working off a specific port given by the user
110; CL: 1, for one sector to read
111; ES:SI: Ptr to buffer for return
112; Returns:
113; AH: INT 13h Error Code
114; CF: Cleared if success, Set if error
115; Corrupts registers:
116; AL, BX
117;--------------------------------------------------------------------
118SerialServerScan_CheckForServer_PortAndBaudInDX:
119 push bp ; setup fake SerialServer_Command
120
121 push dx ; send port baud and rate, returned in inquire packet
122 ; (and possibly returned in the drive identification string)
123
124 push cx ; send number of sectors, and if it is on a scan or not
125
126 mov bl,SerialServer_Command_Inquire ; protocol command onto stack with bh
127 push bx
128
129 mov bp,sp
130
131 call SerialServer_SendReceive
132
133 pop bx
134 pop cx
135 pop dx
136 pop bp
137
138 ret
139
Note: See TracBrowser for help on using the repository browser.