83 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 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;
 | 
						|
}
 | 
						|
 |