source: xtideuniversalbios/trunk/Serial_Server/win32/Win32.cpp@ 338

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

Added GNU GPL notice to the serial server.

File size: 7.0 KB
Line 
1//======================================================================
2//
3// Project: XTIDE Universal BIOS, Serial Port Server
4//
5// File: Win32.cpp - Microsoft Windows 32-bit application
6//
7// This file contains the entry point for the Win32 version of the server.
8// It also handles log reporting, timers, and command line parameter parsing.
9//
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <fcntl.h>
14#include <stdarg.h>
15
16#include "../library/library.h"
17#include "../library/flatimage.h"
18
19void usage(void)
20{
21 char *usageStrings[] = {
22 "SerDrive - XTIDE Universal BIOS Serial Drive Server",
23 "Version 2.0.0 Beta1, Built " __DATE__,
24 "",
25 "SerDrive is released under the GNU GPL v2. SerDrive comes with ABSOLUTELY",
26 "NO WARRANTY. This is free software, and you are welcome to redistribute it",
27 "under certain conditions. See LICENSE.TXT (included with this distribution)",
28 "for more details, or visit http://www.gnu.org/licenses/gpl-2.0.html.",
29 "",
30 "Usage: SerDrive [options] imagefile [[slave-options] slave-imagefile]",
31 "",
32 " -g [cyl:head:sect] Geometry in cylinders, sectors per cylinder, and heads",
33 " -g also implies CHS addressing mode (default is LBA28)",
34 "",
35 " -n [megabytes] Create new disk with given size or use -g geometry",
36 " Maximum size is " USAGE_MAXSECTORS,
37 " Floppy images can also be created, such as \"360K\"",
38 " (default is a 32 MB disk, with CHS geometry 65:16:63)",
39 "",
40 " -p [pipename] Named Pipe mode for emulators",
41 " (must begin with \"\\\\\", default is \"" PIPENAME "\")",
42 "",
43 " -c COMPortNumber COM Port to use (default is first found)",
44 " Available COM ports on this system are:",
45 "COM ",
46 "",
47 " -b BaudRate Baud rate to use on the COM port, with client machine",
48 " rate multiplier in effect:",
49 " None: 2400, 4800, 9600, 28.8K, 57.6K, 115.2K",
50 " 2x: 4800, 9600, 19200, 57.6K, 115.2K, 230.4K",
51 " 4x: 9600, 19200, 38400, 115.2K, 230.4K, 460.8K",
52 " and for completeness: 76.8K, 153.6K",
53 " (default is 9600, 115.2K when in named pipe mode)",
54 "",
55 " -t Disable timeout, useful for long delays when debugging",
56 "",
57 " -r Read Only disk, do not allow writes",
58 "",
59 " -v [level] Reporting level 1-6, with increasing information",
60 "",
61 "On the client computer, a serial port can be configured for use as a hard disk",
62 "with xtidecfg.com. Or one can hold down the ALT key at the end of the normal",
63 "IDE hard disk scan and the XTIDE Universal BIOS will scan COM1-7, at each of",
64 "the six speeds given above for BaudRate. Note that hardware rate multipliers",
65 "must be taken into account on the server end, but are invisible on the client.",
66 "",
67 "Floppy images may also be used. Image size must be exactly the same size",
68 "as a 2.88MB, 1.44MB, 1.2MB, 720KB, 360KB, 320KB, 180KB, or 160KB disk.",
69 "Floppy images must be the last disks discovered by the BIOS, and only",
70 "two floppy drives are supported by the BIOS at a time.",
71 NULL };
72
73 for( int t = 0; usageStrings[t]; t++ )
74 {
75 if( !strncmp( usageStrings[t], "COM", 3 ) )
76 {
77 char logbuff[ 1024 ];
78
79 SerialAccess::EnumerateCOMPorts( logbuff, 1024 );
80 fprintf( stderr, "%s%s\n", usageStrings[t]+3, logbuff );
81 }
82 else
83 fprintf( stderr, "%s\n", usageStrings[t] );
84 }
85
86 exit( 1 );
87}
88
89int verbose = 0;
90
91int main(int argc, char* argv[])
92{
93 DWORD len;
94
95 unsigned long check;
96 unsigned char w;
97
98 unsigned short wbuff[256];
99
100 SerialAccess serial;
101 Image *img;
102 struct baudRate *baudRate = NULL;
103
104 int timeoutEnabled = 1;
105
106 char *ComPort = NULL, ComPortBuff[20];
107
108 _fmode = _O_BINARY;
109
110 unsigned long cyl = 0, sect = 0, head = 0;
111 int readOnly = 0, createFile = 0;
112 int useCHS = 0;
113
114 int imagecount = 0;
115 Image *images[2] = { NULL, NULL };
116
117 for( int t = 1; t < argc; t++ )
118 {
119 if( argv[t][0] == '/' || argv[t][0] == '-' )
120 {
121 char *c;
122 unsigned long a;
123 for( c = &argv[t][1]; *c && !isdigit( *c ); c++ )
124 ;
125 a = atol(c);
126
127 switch( argv[t][1] )
128 {
129 case 'c': case 'C':
130 a = atol( argv[++t] );
131 if( a < 1 )
132 usage();
133 sprintf( ComPortBuff, "COM%d", a );
134 ComPort = &ComPortBuff[0];
135 break;
136 case 'v': case 'V':
137 if( atol(argv[t+1]) != 0 )
138 verbose = atol(argv[++t]);
139 else
140 verbose = 1;
141 break;
142 case 'r': case 'R':
143 readOnly = 1;
144 break;
145 case 'p': case 'P':
146 if( argv[t+1][0] == '\\' && argv[t+1][1] == '\\' )
147 ComPort = argv[++t];
148 else
149 ComPort = PIPENAME;
150 if( !baudRate )
151 baudRate = baudRateMatchString( "115200" );
152 break;
153 case 'g': case 'G':
154 if( atol(argv[t+1]) != 0 )
155 {
156 if( !Image::parseGeometry( argv[++t], &cyl, &head, &sect ) )
157 usage();
158 }
159 useCHS = 1;
160 break;
161 case 'h': case 'H': case '?':
162 usage();
163 break;
164 case 'n': case 'N':
165 createFile = 1;
166 if( atol(argv[t+1]) != 0 )
167 {
168 double size = atof(argv[++t]);
169 struct floppyInfo *fi;
170 char *c;
171
172 size *= 2;
173 for( c = argv[t]; *c && *c != 'k' && *c != 'K'; c++ ) ;
174 if( !(*c) )
175 size *= 1000;
176
177 if( (fi = FindFloppyInfoBySize( size )) )
178 {
179 sect = fi->sectors;
180 head = fi->heads;
181 cyl = fi->cylinders;
182 }
183 else
184 {
185 sect = 63;
186 head = 16;
187 cyl = size / (16*63);
188 }
189 }
190 break;
191 case 't': case 'T':
192 timeoutEnabled = 0;
193 break;
194 case 'b': case 'B':
195 if( !(baudRate = baudRateMatchString( argv[++t] )) || !baudRate->rate )
196 log( -2, "Unknown Baud Rate \"%s\"", argv[t] );
197 break;
198 default:
199 log( -2, "Unknown Option: \"%s\"", argv[t] );
200 }
201 }
202 else if( imagecount < 2 )
203 {
204 if( createFile && cyl == 0 )
205 {
206 cyl = 65;
207 sect = 63;
208 head = 16;
209 }
210 images[imagecount] = new FlatImage( argv[t], readOnly, imagecount, createFile, cyl, head, sect, useCHS );
211 imagecount++;
212 createFile = readOnly = cyl = sect = head = useCHS = 0;
213 }
214 else
215 usage();
216 }
217
218 if( imagecount == 0 )
219 usage();
220
221 if( !baudRate )
222 baudRate = baudRateMatchString( "9600" );
223
224 do
225 {
226 serial.Connect( ComPort, baudRate );
227
228 processRequests( &serial, images[0], images[1], timeoutEnabled, verbose );
229
230 serial.Disconnect();
231
232 if( serial.resetConnection )
233 log( 0, "Serial Connection closed, reset..." );
234 }
235 while( serial.resetConnection );
236}
237
238void log( int level, char *message, ... )
239{
240 va_list args;
241
242 va_start( args, message );
243
244 if( level < 0 )
245 {
246 fprintf( stderr, "ERROR: " );
247 vfprintf( stderr, message, args );
248 fprintf( stderr, "\n" );
249 if( level < -1 )
250 {
251 fprintf( stderr, "\n" );
252 usage();
253 }
254 exit( 1 );
255 }
256 else if( verbose >= level )
257 {
258 vprintf( message, args );
259 printf( "\n" );
260 }
261
262 va_end( args );
263}
264
265unsigned long GetTime(void)
266{
267 return( GetTickCount() );
268}
269
270unsigned long GetTime_Timeout(void)
271{
272 return( 1000 );
273}
Note: See TracBrowser for help on using the repository browser.