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

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

Small changes. 1) Changes biosdrvs.com to output CR+LF instead of LF+CR, consistent with DOS/Windows, but I did not update the Assembly Library as this would break the Configurator; 2) Put a C/C++ section in Version.inc for the serial server; 3) Configurator defaults the EEPROM address after scanning for a EEPROM in memory (as it does for loading the BIOS from ROM); 4) Added a command to the Configurator main menu to save chages to the file from which it was loaded (if it was loaded form a file), which is symmetric with the Load command and more discoverable than exiting DOS and then being prompted (which is still there too, if changes are unsaved).

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