mirror of
https://github.com/ProDOS-8/xHD.git
synced 2024-12-28 10:30:11 +00:00
Added command line parsing (incl. printing usage).
This commit is contained in:
parent
21dbb3da3d
commit
9fd4088746
@ -19,9 +19,6 @@
|
|||||||
|
|
||||||
#define PORT_STR "usbserial"
|
#define PORT_STR "usbserial"
|
||||||
|
|
||||||
#define VERBOSE (0)
|
|
||||||
#define LOG (1)
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
//TODO: Switch xHD client to Z8530 built-in CRC calc
|
//TODO: Switch xHD client to Z8530 built-in CRC calc
|
||||||
/*
|
/*
|
||||||
@ -51,16 +48,59 @@ crc_xmodem(char *ptr, unsigned count)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main(void)
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
// TODO: Parse cmd line for switches & disk image filenames
|
bool bVerbose = false;
|
||||||
|
bool bLog = true;
|
||||||
|
char *apFilename[2] = {0, 0};
|
||||||
|
|
||||||
unsigned char auReadBuf[256] = {0};
|
for (int iArg = 1; iArg < argc; iArg++)
|
||||||
enum sp_return eResult;
|
{
|
||||||
|
if (argv[iArg][0] == '-')
|
||||||
|
{
|
||||||
|
for (int iChar = 1; argv[iArg][iChar]; iChar++)
|
||||||
|
{
|
||||||
|
switch (argv[iArg][iChar])
|
||||||
|
{
|
||||||
|
case 'v':
|
||||||
|
{
|
||||||
|
bVerbose = true;
|
||||||
|
printf("Verbose: On\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'n':
|
||||||
|
{
|
||||||
|
bLog = false;
|
||||||
|
if (bVerbose)
|
||||||
|
printf("Logging: Off\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int iDrive = 0; iDrive < 2; iDrive++)
|
||||||
|
{
|
||||||
|
if (apFilename[iDrive] == 0)
|
||||||
|
{
|
||||||
|
apFilename[iDrive] = argv[iArg];
|
||||||
|
if (bVerbose)
|
||||||
|
printf("Drive %d: %s\n", iDrive + 1, apFilename[iDrive]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Map virtual drives
|
if (apFilename[0] == 0)
|
||||||
const char *apFilename[2] = {"/Applications/GSport/HD/P1NEW.PO", "/Applications/GSport/HD/P2.PO"};
|
{
|
||||||
//const char *apFilename[2] = {"/Applications/GSport/HD/P1NEW.PO", "/Applications/GSport/Disk5.25/ProDOS_2_5a1.PO"};
|
printf("Usage: %s [-nv] img1 [img2]\n"
|
||||||
|
"\t-n\tno logging\n"
|
||||||
|
"\t-v\tbe verbose\n"
|
||||||
|
"\timg1\tdrive 1 disk image filename\n"
|
||||||
|
"\timg2\tdrive 2 disk image filename\n",
|
||||||
|
argv[0]);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
char * apFileData[2];
|
char * apFileData[2];
|
||||||
for (int iDrive=0; iDrive<2; iDrive++)
|
for (int iDrive=0; iDrive<2; iDrive++)
|
||||||
@ -72,6 +112,8 @@ int main(void)
|
|||||||
apFileData[iDrive] = (char*) mmap(0, uFilesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
apFileData[iDrive] = (char*) mmap(0, uFilesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum sp_return eResult;
|
||||||
|
|
||||||
// Create a configuration for the serial ports
|
// Create a configuration for the serial ports
|
||||||
struct sp_port_config *pSerialConfig=0;
|
struct sp_port_config *pSerialConfig=0;
|
||||||
{
|
{
|
||||||
@ -105,7 +147,7 @@ int main(void)
|
|||||||
|
|
||||||
if (strstr(sp_get_port_name(pPort), PORT_STR) )
|
if (strstr(sp_get_port_name(pPort), PORT_STR) )
|
||||||
{
|
{
|
||||||
if (VERBOSE)
|
if (bVerbose)
|
||||||
{
|
{
|
||||||
printf("Valid port %d: %s\n", iValidPortCount, sp_get_port_name(pPort) );
|
printf("Valid port %d: %s\n", iValidPortCount, sp_get_port_name(pPort) );
|
||||||
printf("\tDescr: %s\n", sp_get_port_description(pPort));
|
printf("\tDescr: %s\n", sp_get_port_description(pPort));
|
||||||
@ -146,7 +188,7 @@ int main(void)
|
|||||||
iValidPortCount--;
|
iValidPortCount--;
|
||||||
sp_close(pPort);
|
sp_close(pPort);
|
||||||
sp_free_port(pPort);
|
sp_free_port(pPort);
|
||||||
if (VERBOSE)
|
if (bVerbose)
|
||||||
{
|
{
|
||||||
printf("\n\t--- Could not open this port ---\n\n");
|
printf("\n\t--- Could not open this port ---\n\n");
|
||||||
}
|
}
|
||||||
@ -155,8 +197,8 @@ int main(void)
|
|||||||
}
|
}
|
||||||
else // ! usbserial
|
else // ! usbserial
|
||||||
{
|
{
|
||||||
if (VERBOSE)
|
if (bVerbose)
|
||||||
printf("\tskip\t'%s'.\n", sp_get_port_name(pPort));
|
printf("\tskip\t'%s'\n", sp_get_port_name(pPort));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sp_free_port_list(ports);
|
sp_free_port_list(ports);
|
||||||
@ -171,6 +213,8 @@ int main(void)
|
|||||||
// TODO: Add server shutdown
|
// TODO: Add server shutdown
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
unsigned char auReadBuf[256];
|
||||||
|
|
||||||
for (int iIndex = 0; iIndex < iValidPortCount; iIndex++)
|
for (int iIndex = 0; iIndex < iValidPortCount; iIndex++)
|
||||||
{
|
{
|
||||||
struct sp_port *pPort = apValidPorts[iIndex];
|
struct sp_port *pPort = apValidPorts[iIndex];
|
||||||
@ -183,13 +227,13 @@ int main(void)
|
|||||||
|
|
||||||
if (iBytesRead > 0)
|
if (iBytesRead > 0)
|
||||||
{
|
{
|
||||||
if (VERBOSE)
|
if (bVerbose)
|
||||||
printf("P%d) Cmd %02X\n", iIndex, auReadBuf[0]);
|
printf("P%d) Cmd %02X\n", iIndex, auReadBuf[0]);
|
||||||
|
|
||||||
// Now read 16-bit block number and byte checksum
|
// Now read 16-bit block number and byte checksum
|
||||||
iBytesRead = 1 + sp_blocking_read(pPort, auReadBuf+1, 3, 1/*ms timeout*/);
|
iBytesRead = 1 + sp_blocking_read(pPort, auReadBuf+1, 3, 1/*ms timeout*/);
|
||||||
if (iBytesRead != 4) continue;
|
if (iBytesRead != 4) continue;
|
||||||
if (VERBOSE)
|
if (bVerbose)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < iBytesRead; i++)
|
for (int i = 0; i < iBytesRead; i++)
|
||||||
{
|
{
|
||||||
@ -203,7 +247,7 @@ int main(void)
|
|||||||
auReadBuf[0],auReadBuf[1],auReadBuf[2],auReadBuf[3],iChksum);
|
auReadBuf[0],auReadBuf[1],auReadBuf[2],auReadBuf[3],iChksum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (VERBOSE)
|
if (bVerbose)
|
||||||
printf("\tChksum ok: %02X\n", auReadBuf[4]);
|
printf("\tChksum ok: %02X\n", auReadBuf[4]);
|
||||||
|
|
||||||
// If 4x bytes were read and the checksum passed, process request
|
// If 4x bytes were read and the checksum passed, process request
|
||||||
@ -235,7 +279,7 @@ int main(void)
|
|||||||
iTxLen = sp_blocking_write(pPort, &iChksum, 1, 30/*ms timeout*/);
|
iTxLen = sp_blocking_write(pPort, &iChksum, 1, 30/*ms timeout*/);
|
||||||
if (iTxLen != 1) continue;
|
if (iTxLen != 1) continue;
|
||||||
|
|
||||||
if (LOG)
|
if (bLog)
|
||||||
{
|
{
|
||||||
printf("%d\tR %5d\r", (auReadBuf[0] >> 2) & 1, iBlock);
|
printf("%d\tR %5d\r", (auReadBuf[0] >> 2) & 1, iBlock);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
@ -262,7 +306,7 @@ int main(void)
|
|||||||
memcpy(pDriveData, auBlockBuf, 512);
|
memcpy(pDriveData, auBlockBuf, 512);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LOG)
|
if (bLog)
|
||||||
{
|
{
|
||||||
printf("%d\t\t\t\tW %5d\r", (auReadBuf[0] >> 2) & 1, iBlock);
|
printf("%d\t\t\t\tW %5d\r", (auReadBuf[0] >> 2) & 1, iBlock);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
Loading…
Reference in New Issue
Block a user