/* * main.c * * Here we define the main entry point for the program; we also define a * couple of functions to run when we start (init) and finish * (...finish). */ #include #include #include #include #include "apple2.h" #include "log.h" #include "option.h" #include "vm_screen.h" /* * This function will establish the base environment that we want to use * while we execute. */ static void init(int argc, char **argv) { int options_ok; // If the option_parse() function returns zero, that means that it's // signaled to us that we should stop now. Whether that means we are // stopping in _error_ (bad input), or just because you asked for // --help, is not really specified. We exit with a non-zero error // code in any case. options_ok = option_parse(argc, argv); if (options_ok == 0) { const char *err = option_get_error(); if (strlen(err) > 0) { fprintf(stderr, "%s\n", err); option_print_help(); } exit(1); } // We're literally using stdout in this heavy phase of development. log_open(stdout); if (vm_screen_init() != OK) { fprintf(stderr, "Couldn't initialize video\n"); exit(1); } } /* * And this is the teardown function. */ static void finish() { // Close any file sources we had opened for (int i = 1; i <= OPTION_MAX_DISKS; i++) { FILE *stream = option_get_input(i); if (stream != NULL) { fclose(stream); } } log_close(); vm_screen_finish(); } /* * This is what will run when the program begins, if you were new to how * C works. */ int main(int argc, char **argv) { apple2 *mach; vm_screen *screen; int err; init(argc, argv); // When we exit, we want to wrap up a few loose ends. This syscall // will ensure that `finish()` runs whether we return from main // successfully or if we run `exit()` from elsewhere in the program. atexit(finish); // Let's build the basic machine, using the width and height // indicated by the user. mach = apple2_create(option_get_width(), option_get_height()); // Ok, it's time to boot this up! err = apple2_boot(mach); if (err != OK) { fprintf(stderr, "Bootup failed!\n"); exit(1); } // This will run for as long as we want to hang out in the emulated // machine. apple2_run_loop(mach); // We're all done, so let's tear everything down. apple2_free(mach); // ha ha ha ha #nervous #laughter printf("Hello, world\n"); }