7473601172
than libz80ex; enable tests for cpm.
84 lines
1.6 KiB
C
84 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <stdarg.h>
|
|
#include <getopt.h>
|
|
#include <ctype.h>
|
|
#include "globals.h"
|
|
|
|
bool flag_enter_debugger = false;
|
|
char* const* user_command_line = NULL;
|
|
|
|
void fatal(const char* message, ...)
|
|
{
|
|
va_list ap;
|
|
va_start(ap, message);
|
|
fprintf(stderr, "fatal: ");
|
|
vfprintf(stderr, message, ap);
|
|
fprintf(stderr, "\n");
|
|
exit(1);
|
|
}
|
|
|
|
static void syntax(void)
|
|
{
|
|
printf("cpm [<flags>] [command] [args]:\n");
|
|
printf(" -h this help\n");
|
|
printf(" -d enter debugger on startup\n");
|
|
printf(" -p DRIVE=PATH map a drive to a path (by default, A=.)\n");
|
|
printf("If command is specified, a Unix file of that name will be loaded and\n");
|
|
printf("injected directly into memory (it's not loaded through the CCP).\n");
|
|
printf("Arguments may also be provided, but note that any FCBs aren't set up,\n");
|
|
printf("so traditional Unix utilities probably won't work.\n");
|
|
exit(1);
|
|
}
|
|
|
|
static void parse_options(int argc, char* const* argv)
|
|
{
|
|
for (;;)
|
|
{
|
|
switch (getopt(argc, argv, "hdp:"))
|
|
{
|
|
case -1:
|
|
goto end_of_flags;
|
|
|
|
case 'd':
|
|
flag_enter_debugger = true;
|
|
break;
|
|
|
|
case 'p':
|
|
{
|
|
if (!optarg[0] || (optarg[1] != '='))
|
|
fatal("invalid syntax in drive assignment");
|
|
|
|
uint8_t drive = toupper(optarg[0]) - 'A';
|
|
const char* path = &optarg[2];
|
|
file_set_drive(drive, path);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
syntax();
|
|
}
|
|
}
|
|
|
|
end_of_flags:
|
|
user_command_line = &argv[optind];
|
|
}
|
|
|
|
int main(int argc, char* const* argv)
|
|
{
|
|
files_init();
|
|
parse_options(argc, argv);
|
|
|
|
emulator_init();
|
|
bios_coldboot();
|
|
|
|
for (;;)
|
|
{
|
|
emulator_run();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|