/* C64-specific initialization. */ int machine_specific_init(void) { int delay; scpu64_log = log_open("SCPU64"); if (mem_load() < 0) { return -1; } event_init(); /* Setup trap handling. */ traps_init(); if (!video_disabled_mode) { joystick_init(); } gfxoutput_init(); /* Initialize serial traps. */ if (serial_init(scpu64_serial_traps) < 0) { return -1; } serial_trap_init(0xa4); serial_iec_bus_init(); /* Initialize RS232 handler. */ rs232drv_init(); c64_rsuser_init(); /* Initialize print devices. */ printer_init(); /* Fire up the hardware-level drive emulation. */ drive_init(); disk_image_init(); resources_get_int("AutostartDelay", &delay); if (delay == 0) { delay = 3; /* default */ } /* Initialize autostart. */ autostart_init((CLOCK)(delay * SCPU64_PAL_RFSH_PER_SEC * SCPU64_PAL_CYCLES_PER_RFSH), 1, 0xcc, 0xd1, 0xd3, 0xd5); #ifdef USE_BEOS_UI /* Pre-init C64-specific parts of the menus before vicii_init() creates a canvas window with a menubar at the top. This could also be used by other ports, e.g. GTK+... */ if (!console_mode) { scpu64ui_init_early(); } #endif if (vicii_init(VICII_STANDARD) == NULL && !video_disabled_mode) { return -1; } scpu64_mem_init(); cia1_init(machine_context.cia1); cia2_init(machine_context.cia2); #ifndef COMMON_KBD /* Initialize the keyboard. */ if (c64_kbd_init() < 0) { return -1; } #endif c64keyboard_init(); scpu64_monitor_init(); /* Initialize vsync and register our hook function. */ vsync_init(machine_vsync_hook); vsync_set_machine_parameter(machine_timing.rfsh_per_sec, machine_timing.cycles_per_sec); /* Initialize native sound chip */ sid_sound_chip_init(); /* Initialize cartridge based sound chips */ cartridge_sound_chip_init(); /* Initialize userport based sound chips */ userport_dac_sound_chip_init(); drive_sound_init(); video_sound_init(); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(machine_timing.cycles_per_sec, machine_timing.cycles_per_rfsh); /* Initialize keyboard buffer. */ kbdbuf_init(631, 198, 10, (CLOCK)(machine_timing.rfsh_per_sec * machine_timing.cycles_per_rfsh)); /* Initialize the C64-specific I/O */ c64io_init(); /* Initialize the C64-specific part of the UI. */ if (!console_mode) { scpu64ui_init(); } /* Initialize glue logic. */ scpu64_glue_init(); #ifdef HAVE_MOUSE /* Initialize mouse support (if present). */ mouse_init(); #ifdef HAVE_LIGHTPEN /* Initialize lightpen support and register VICII callbacks */ lightpen_init(); lightpen_register_timing_callback(vicii_lightpen_timing, 0); lightpen_register_trigger_callback(vicii_trigger_light_pen); #endif #endif c64iec_init(); c64fastiec_init(); cartridge_init(); machine_drive_stub(); #if defined (USE_XF86_EXTENSIONS) && (defined(USE_XF86_VIDMODE_EXT) || defined (HAVE_XRANDR)) { /* set fullscreen if user used `-fullscreen' on cmdline */ int fs; resources_get_int("UseFullscreen", &fs); if (fs) { resources_set_int("VICIIFullscreen", 1); } } #endif return 0; }
/* C128-specific initialization. */ int machine_specific_init(void) { int delay; c128_log = log_open("C128"); if (mem_load() < 0) { return -1; } event_init(); if (z80mem_load() < 0) { return -1; } /* Setup trap handling. */ traps_init(); /* Initialize serial traps. */ if (serial_init(c128_serial_traps) < 0) { return -1; } serial_trap_init(0xa4); serial_iec_bus_init(); if (!video_disabled_mode) { joystick_init(); } gfxoutput_init(); /* initialize RS232 handler */ rs232drv_init(); c64_rsuser_init(); /* initialize print devices */ printer_init(); /* Initialize the tape emulation. */ machine_tape_init_c128(); /* Initialize the datasette emulation. */ datasette_init(); /* Fire up the hardware-level drive emulation. */ drive_init(); disk_image_init(); /* Initialize autostart. FIXME: at least 0xa26 is only for 40 cols */ resources_get_int("AutostartDelay", &delay); if (delay == 0) { delay = 3; /* default */ } autostart_init((CLOCK)(delay * C128_PAL_RFSH_PER_SEC * C128_PAL_CYCLES_PER_RFSH), 1, 0xa27, 0xe0, 0xec, 0xee); #ifdef USE_BEOS_UI /* Pre-init C128-specific parts of the menus before vdc_init() and vicii_init() create canvas windows with menubars at the top. This could also be used by other ports, e.g. GTK+... */ c128ui_init_early(); #endif if (vdc_init() == NULL) { return -1; } if (vicii_init(VICII_EXTENDED) == NULL) { return -1; } cia1_init(machine_context.cia1); cia2_init(machine_context.cia2); #ifndef COMMON_KBD /* Initialize the keyboard. */ if (c128_kbd_init() < 0) { return -1; } #endif c64keyboard_init(); c128_monitor_init(); /* Initialize vsync and register our hook function. */ vsync_init(machine_vsync_hook); vsync_set_machine_parameter(machine_timing.rfsh_per_sec, machine_timing.cycles_per_sec); /* Initialize native sound chip */ sid_sound_chip_init(); /* Initialize cartridge based sound chips */ cartridge_sound_chip_init(); drive_sound_init(); video_sound_init(); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(machine_timing.cycles_per_sec, machine_timing.cycles_per_rfsh); /* Initialize keyboard buffer. */ kbdbuf_init(842, 208, 10, (CLOCK)(machine_timing.rfsh_per_sec * machine_timing.cycles_per_rfsh)); /* Initialize the C128-specific I/O */ c128io_init(); /* Initialize the C128-specific part of the UI. */ c128ui_init(); #ifdef HAVE_MOUSE /* Initialize mouse support (if present). */ mouse_init(); #ifdef HAVE_LIGHTPEN /* Initialize lightpen support and register VICII/VDC callbacks */ lightpen_init(); lightpen_register_timing_callback(vicii_lightpen_timing, 1); lightpen_register_timing_callback(vdc_lightpen_timing, 0); lightpen_register_trigger_callback(c128_trigger_light_pen); #endif #endif c64iec_init(); c128fastiec_init(); cartridge_init(); mmu_init(); machine_drive_stub(); #if defined (USE_XF86_EXTENSIONS) && (defined(USE_XF86_VIDMODE_EXT) || defined (HAVE_XRANDR)) { /* set fullscreen if user used `-fullscreen' on cmdline use VICII as default */ int fs; resources_get_int("UseFullscreen", &fs); if (fs) { resources_get_int("40/80ColumnKey", &fs); if (fs == 1) { resources_set_int("VICIIFullscreen", 1); } else { resources_set_int("VDCFullscreen", 1); } } } #endif return 0; }
/* C128-specific initialization. */ int machine_specific_init(void) { c128_log = log_open("C128"); if (mem_load() < 0) { return -1; } if (z80mem_load() < 0) { return -1; } /* Setup trap handling. */ traps_init(); /* Initialize serial traps. */ if (serial_init(c128_serial_traps) < 0) { return -1; } serial_trap_init(0xa4); serial_iec_bus_init(); /* initialize RS232 handler */ rs232drv_init(); c64_rsuser_init(); /* initialize print devices */ printer_init(); /* Initialize the tape emulation. */ machine_tape_init_c128(); /* Initialize the datasette emulation. */ datasette_init(); /* Fire up the hardware-level drive emulation. */ drive_init(); /* Initialize autostart. FIXME: at least 0xa26 is only for 40 cols */ autostart_init((CLOCK)(3 * C128_PAL_RFSH_PER_SEC * C128_PAL_CYCLES_PER_RFSH), 1, 0xa27, 0xe0, 0xec, 0xee); if (vdc_init() == NULL) { return -1; } if (vicii_init(VICII_EXTENDED) == NULL) { return -1; } cia1_init(machine_context.cia1); cia2_init(machine_context.cia2); #ifndef COMMON_KBD /* Initialize the keyboard. */ if (c128_kbd_init() < 0) { return -1; } #endif c64keyboard_init(); c128_monitor_init(); /* Initialize vsync and register our hook function. */ vsync_init(machine_vsync_hook); vsync_set_machine_parameter(machine_timing.rfsh_per_sec, machine_timing.cycles_per_sec); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(machine_timing.cycles_per_sec, machine_timing.cycles_per_rfsh); /* Initialize keyboard buffer. */ kbdbuf_init(842, 208, 10, (CLOCK)(machine_timing.rfsh_per_sec * machine_timing.cycles_per_rfsh)); /* Initialize the C128-specific part of the UI. */ c128ui_init(); #ifdef HAVE_MOUSE /* Initialize mouse support (if present). */ mouse_init(); /* Initialize lightpen support and register VICII/VDC callbacks */ lightpen_init(); lightpen_register_timing_callback(vicii_lightpen_timing, 1); lightpen_register_timing_callback(vdc_lightpen_timing, 0); lightpen_register_trigger_callback(c128_trigger_light_pen); #endif c64iec_init(); c128fastiec_init(); cartridge_init(); mmu_init(); machine_drive_stub(); #if defined (USE_XF86_EXTENSIONS) && (defined(USE_XF86_VIDMODE_EXT) || defined (HAVE_XRANDR)) { /* set fullscreen if user used `-fullscreen' on cmdline use VICII as default */ int fs; resources_get_int("UseFullscreen", &fs); if (fs) { resources_get_int("40/80ColumnKey", &fs); if (fs == 1) { resources_set_int("VICIIFullscreen", 1); } else { resources_set_int("VDCFullscreen", 1); } } } #endif return 0; }
/* C64-specific initialization. */ int machine_specific_init(void) { int delay; c64_log = log_open("C64"); if (mem_load() < 0) { return -1; } /* Setup trap handling. */ traps_init(); /* Initialize serial traps. */ if (serial_init(c64_serial_traps) < 0) { return -1; } serial_trap_init(0xa4); serial_iec_bus_init(); /* Initialize RS232 handler. */ rs232drv_init(); c64_rsuser_init(); /* Initialize print devices. */ printer_init(); /* Initialize the tape emulation. */ tape_init(&tapeinit); /* Initialize the datasette emulation. */ datasette_init(); /* Fire up the hardware-level drive emulation. */ drive_init(); resources_get_int("AutostartDelay", &delay); if (delay == 0) { delay = 3; /* default */ } /* Initialize autostart. */ autostart_init((CLOCK)(delay * C64_PAL_RFSH_PER_SEC * C64_PAL_CYCLES_PER_RFSH), 1, 0xcc, 0xd1, 0xd3, 0xd5); if (vicii_init(VICII_STANDARD) == NULL && !video_disabled_mode) { return -1; } c64_mem_init(); cia1_init(machine_context.cia1); cia2_init(machine_context.cia2); #ifndef COMMON_KBD /* Initialize the keyboard. */ if (c64_kbd_init() < 0) { return -1; } #endif c64keyboard_init(); c64_monitor_init(); /* Initialize vsync and register our hook function. */ vsync_init(machine_vsync_hook); vsync_set_machine_parameter(machine_timing.rfsh_per_sec, machine_timing.cycles_per_sec); /* Initialize native sound chip */ sid_sound_chip_init(); /* Initialize cartridge based sound chips */ cartridge_sound_chip_init(); drive_sound_init(); video_sound_init(); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(machine_timing.cycles_per_sec, machine_timing.cycles_per_rfsh); /* Initialize keyboard buffer. */ kbdbuf_init(631, 198, 10, (CLOCK)(machine_timing.rfsh_per_sec * machine_timing.cycles_per_rfsh)); /* Initialize the C64-specific I/O */ c64io_init(); /* Initialize the C64-specific part of the UI. */ if (!console_mode) { if (machine_class == VICE_MACHINE_C64SC) { c64scui_init(); } else { c64ui_init(); } } /* Initialize glue logic. */ c64_glue_init(); /* Initialize the +60K. */ plus60k_init(); /* Initialize the +256K. */ plus256k_init(); /* Initialize the C64 256K. */ c64_256k_init(); #ifdef HAVE_MOUSE /* Initialize mouse support (if present). */ mouse_init(); /* Initialize lightpen support and register VICII callbacks */ lightpen_init(); lightpen_register_timing_callback(vicii_lightpen_timing, 0); lightpen_register_trigger_callback(vicii_trigger_light_pen); #endif c64iec_init(); c64fastiec_init(); cartridge_init(); machine_drive_stub(); #if defined (USE_XF86_EXTENSIONS) && (defined(USE_XF86_VIDMODE_EXT) || defined (HAVE_XRANDR)) { /* set fullscreen if user used `-fullscreen' on cmdline */ int fs; resources_get_int("UseFullscreen", &fs); if (fs) { resources_set_int("VICIIFullscreen", 1); } } #endif return 0; }
int cpr_load (FILE *pfile) { const int CPR_HEADER_SIZE = 12; const int CPR_CHUNK_ID_SIZE = 4; const int CPR_CHUNK_HEADER_SIZE = 8; cpr_eject(); int rc = cartridge_init(); if (rc != 0) { return rc; } std::unique_ptr<byte> tmpBuffer(new byte[CARTRIDGE_MAX_SIZE]); byte *pbTmpBuffer = tmpBuffer.get(); // Check RIFF header if(fread(pbTmpBuffer, CPR_HEADER_SIZE, 1, pfile) != 1) { // read RIFF header LOG("Cartridge file less than " << CPR_HEADER_SIZE << " bytes long !"); return ERR_CPR_INVALID; } if (memcmp(pbTmpBuffer, "RIFF", 4) != 0) { // RIFF file LOG("Cartridge file is not a RIFF file"); return ERR_CPR_INVALID; } if (memcmp(pbTmpBuffer + 8, "AMS!", 4) != 0) { // CPR file LOG("Cartridge file is not a CPR file"); return ERR_CPR_INVALID; } uint32_t totalSize = extractChunkSize(pbTmpBuffer); LOG("CPR size: " << totalSize) // Extract all chunks uint32_t offset = CPR_HEADER_SIZE; uint32_t cartridgeOffset = 0; while(offset < totalSize) { if(fread(pbTmpBuffer, CPR_CHUNK_HEADER_SIZE, 1, pfile) != 1) { // read chunk header LOG("Failed reading chunk header"); return ERR_CPR_INVALID; } offset += CPR_CHUNK_HEADER_SIZE; byte chunkId[CPR_CHUNK_ID_SIZE+1]; memcpy(chunkId, pbTmpBuffer, CPR_CHUNK_ID_SIZE); chunkId[CPR_CHUNK_ID_SIZE] = '\0'; uint32_t chunkSize = extractChunkSize(pbTmpBuffer); LOG("Chunk '" << chunkId << "' at offset " << offset << " of size " << chunkSize); // Normal chunk size is 16kB // If smaller, it must be filled with 0 up to this limit // If bigger, what is after must be ignored uint32_t chunkKept = std::min(chunkSize, CARTRIDGE_PAGE_SIZE); // If chunk size is not even, there's a pad byte at the end of it if (chunkKept % 2 != 0) { chunkKept++; } // A chunk can be empty (observed on some CPR files) if(chunkKept > 0) { if(fread(&pbCartridgeImage[cartridgeOffset], chunkKept, 1, pfile) != 1) { // read chunk content LOG("Failed reading chunk content"); return ERR_CPR_INVALID; } if(chunkKept < CARTRIDGE_PAGE_SIZE) { // TODO: use the chunkId to identify the cartridge page to set (cbXX with XX between 00 and 31) // This would require intializing the whole to 0 before instead of filling what remains at the end // Not sure if there are some CPR with unordered pages but this seems to be allowed in theory memset(&pbCartridgeImage[cartridgeOffset+chunkKept], 0, CARTRIDGE_PAGE_SIZE-chunkKept); } else if(chunkKept < chunkSize) { LOG("This chunk is bigger than the max allowed size !!!"); if(fread(pbTmpBuffer, chunkSize-chunkKept, 1, pfile) != 1) { // read excessive chunk content LOG("Failed reading chunk content"); return ERR_CPR_INVALID; } } cartridgeOffset += CARTRIDGE_PAGE_SIZE; offset += chunkSize; } } LOG("Final offset: " << offset); LOG("Final cartridge offset: " << cartridgeOffset); memset(&pbCartridgeImage[cartridgeOffset], 0, CARTRIDGE_MAX_SIZE-cartridgeOffset); pbROMlo = &pbCartridgeImage[0]; return 0; }
/* VIC20-specific initialization. */ int machine_specific_init(void) { int delay; vic20_log = log_open("VIC20"); if (mem_load() < 0) { return -1; } event_init(); /* Setup trap handling. */ traps_init(); if (!video_disabled_mode) { joystick_init(); } gfxoutput_init(); /* Initialize serial traps. If user does not want them, or if the ``drive'' emulation is used, do not install them. */ if (serial_init(vic20_serial_traps) < 0) { return -1; } serial_trap_init(0xa4); serial_iec_bus_init(); /* Initialize RS232 handler. */ rs232drv_init(); vic20_rsuser_init(); /* initialize print devices. */ printer_init(); /* Initialize the tape emulation. */ tape_init(&tapeinit); /* Initialize the datasette emulation. */ datasette_init(); /* Fire up the hardware-level drive emulation. */ drive_init(); disk_image_init(); /* Initialize autostart. */ resources_get_int("AutostartDelay", &delay); if (delay == 0) { delay = 3; /* default */ } autostart_init((CLOCK) (delay * VIC20_PAL_RFSH_PER_SEC * VIC20_PAL_CYCLES_PER_RFSH), 1, 0xcc, 0xd1, 0xd3, 0xd5); #ifdef USE_BEOS_UI /* Pre-init VIC20-specific parts of the menus before vic_init() creates a canvas window with a menubar at the top. This could also be used by other ports, e.g. GTK+... */ vic20ui_init_early(); #endif /* Initialize the VIC-I emulation. */ if (vic_init() == NULL) { return -1; } via1_init(machine_context.via1); via2_init(machine_context.via2); ieeevia1_init(machine_context.ieeevia1); ieeevia2_init(machine_context.ieeevia2); #ifndef COMMON_KBD /* Load the default keymap file. */ if (vic20_kbd_init() < 0) { return -1; } #endif vic20_monitor_init(); /* Initialize vsync and register our hook function. */ vsync_init(machine_vsync_hook); vsync_set_machine_parameter(machine_timing.rfsh_per_sec, machine_timing.cycles_per_sec); /* Initialize native sound chip first */ vic_sound_chip_init(); /* Initialize the sidcart */ sidcart_sound_chip_init(); /* Initialize cartridge based sound chips */ cartridge_sound_chip_init(); /* Initialize userport based sound chips */ userport_dac_sound_chip_init(); drive_sound_init(); video_sound_init(); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(machine_timing.cycles_per_sec, machine_timing.cycles_per_rfsh); /* Initialize keyboard buffer. */ kbdbuf_init(631, 198, 10, (CLOCK)(machine_timing.cycles_per_rfsh * machine_timing.rfsh_per_sec)); /* Initialize the VIC20-specific part of the UI. */ vic20ui_init(); vic20iec_init(); cartridge_init(); #ifdef HAVE_MOUSE mouse_init(); #ifdef HAVE_LIGHTPEN /* Initialize lightpen support and register VIC-I callbacks */ lightpen_init(); lightpen_register_timing_callback(vic_lightpen_timing, 0); lightpen_register_trigger_callback(vic_trigger_light_pen); #endif #endif /* Register joystick callback (for lightpen triggering via fire button) */ joystick_register_machine(via2_check_lightpen); #ifdef HAVE_MIDI midi_init(); #endif machine_drive_stub(); #if defined (USE_XF86_EXTENSIONS) && (defined(USE_XF86_VIDMODE_EXT) || defined (HAVE_XRANDR)) { /* set fullscreen if user used `-fullscreen' on cmdline */ int fs; resources_get_int("UseFullscreen", &fs); if (fs) { resources_set_int("VICFullscreen", 1); } } #endif return 0; }
/* C64-specific initialization. */ int machine_specific_init(void) { c64_log = log_open("C64"); if (mem_load() < 0) return -1; if (vsid_mode) { psid_init_driver(); } if (!vsid_mode) { /* Setup trap handling. */ traps_init(); /* Initialize serial traps. */ if (serial_init(c64_serial_traps) < 0) return -1; serial_trap_init(0xa4); serial_iec_bus_init(); /* Initialize RS232 handler. */ rs232drv_init(); c64_rsuser_init(); /* Initialize print devices. */ printer_init(); /* Initialize the tape emulation. */ tape_init(&tapeinit); /* Initialize the datasette emulation. */ datasette_init(); /* Fire up the hardware-level drive emulation. */ drive_init(); /* Initialize autostart. */ autostart_init((CLOCK)(3 * C64_PAL_RFSH_PER_SEC * C64_PAL_CYCLES_PER_RFSH), 1, 0xcc, 0xd1, 0xd3, 0xd5); } if (vicii_init(VICII_STANDARD) == NULL && !console_mode && !vsid_mode) return -1; c64_mem_init(); cia1_init(machine_context.cia1); cia2_init(machine_context.cia2); if (!vsid_mode) { tpi_init(machine_context.tpi1); acia1_init(); #ifndef COMMON_KBD /* Initialize the keyboard. */ if (c64_kbd_init() < 0) return -1; #endif c64keyboard_init(); } c64_monitor_init(); /* Initialize vsync and register our hook function. */ vsync_init(machine_vsync_hook); vsync_set_machine_parameter(machine_timing.rfsh_per_sec, machine_timing.cycles_per_sec); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(machine_timing.cycles_per_sec, machine_timing.cycles_per_rfsh); /* Initialize keyboard buffer. */ kbdbuf_init(631, 198, 10, (CLOCK)(machine_timing.rfsh_per_sec * machine_timing.cycles_per_rfsh)); /* Initialize the C64-specific part of the UI. */ if (!console_mode) { if (vsid_mode) vsid_ui_init(); else c64ui_init(); } if (!vsid_mode) { /* Initialize the REU. */ reu_init(); /* Initialize the GEORAM. */ georam_init(); /* Initialize the RAMCART. */ ramcart_init(); /* Initialize the +60K. */ plus60k_init(); /* Initialize the +256K. */ plus256k_init(); /* Initialize the C64 256K. */ c64_256k_init(); /* Initialize the MMC64. */ mmc64_init(); #ifdef HAVE_TFE /* Initialize the TFE. */ tfe_init(); #endif #ifdef HAVE_MOUSE /* Initialize mouse support (if present). */ mouse_init(); #endif c64iec_init(); c64fastiec_init(); cartridge_init(); } machine_drive_stub(); return 0; }
int main(int argc, char *argv[]) { int c; struct state *state = NULL; #if TEST_BUILD struct test_case *test_case; #endif prefs_init(); while(1) { int option_index = 0; static struct option long_options[] = { {"cart", required_argument, 0, OPT_CART }, {"force-extreme-disasm", no_argument, 0, OPT_FORCE_EXTREME_DISASM }, {"crop-screen", no_argument, 0, OPT_CROP_SCREEN }, {"loglevels" , required_argument, 0, OPT_LOGLEVELS }, {"audio-device" , required_argument, 0, OPT_AUDIO_DEVICE }, #if TEST_BUILD {"test-case", required_argument, 0, OPT_TEST_MODE}, #endif {0, 0, 0, 0 } }; c = getopt_long(argc, argv, "a:b:c:t:s:hdpyVAMvq", long_options, &option_index); if(c == -1) break; switch(c) { case 'a': prefs_set("diskimage", optarg); break; case 'b': prefs_set("diskimage2", optarg); break; case 'c': prefs_set("hdimage", optarg); break; case 't': prefs_set("tosimage", optarg); break; case 's': prefs_set("stateimage", optarg); break; case OPT_CART: prefs_set("cartimage", optarg); break; case OPT_FORCE_EXTREME_DISASM: cprint_all = 1; break; case OPT_CROP_SCREEN: crop_screen = 1; break; case OPT_LOGLEVELS: diag_set_module_levels(optarg); break; case OPT_AUDIO_DEVICE: if(!strncmp("list", optarg, 4)) { audio_device = -1; } else { audio_device = atoi(optarg); } break; #if TEST_BUILD case OPT_TEST_MODE: test_case_name = xstrdup(optarg); test_mode = 1; break; #endif case 'd': debugger = 1; break; case 'p': ppmoutput = 1; break; case 'y': psgoutput = 1; break; case 'v': verbosity++; break; case 'q': verbosity = MAX(1, verbosity-1); break; case 'V': vsync_delay = 1; break; case 'A': play_audio = 1; break; case 'M': monitor_sm124 = 1; break; case 'h': default: printf("Usage: %s [-AdMpqvVy] [-a diskimage1] [-b diskimage2] [-c hdimage] [-t tosimage] [-s stateimage]\n", argv[0]); exit(-1); break; } } /* Do not crop screen while debugging */ if(debugger) { crop_screen = 0; } if((prefs.diskimage == NULL) && (argv[optind] != NULL)) prefs_set("diskimage", argv[optind]); SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK|SDL_INIT_AUDIO); #if TEST_BUILD if(test_mode) { test_case = test_init(test_case_name); if(test_case) { if(test_case->cartridge_name) { prefs_set("cartimage", test_case->cartridge_name); } if(test_case->floppy_name) { prefs_set("diskimage", test_case->floppy_name); } } else { printf("DEBUG: Could not load test case %s\n", test_case_name); exit(-3); } } #endif /* Must run before hardware module inits */ mmu_init(); /* This must also be run before hardware modules. It gives a dummy area for some memory regions to not cause bus errors */ mmu_fallback_init(); /* Actual hardware */ ram_init(); rom_init(); cpu_init(); if(prefs.cartimage) { cartridge_init(prefs.cartimage); } else { cartridge_init(NULL); } psg_init(); midi_init(); acia_init(); ikbd_init(); #if INCLUDE_RTC rtc_init(); #endif dma_init(); fdc_init(); hdc_init(prefs.hdimage); mfp_init(); screen_disable(0); glue_init(); shifter_init(); if(debugger) { debug_init(); cpu_halt_for_debug(); } screen_init(); floppy_init(prefs.diskimage, prefs.diskimage2); if(prefs.stateimage) { state = state_load(prefs.stateimage); } if(state != NULL) state_restore(state); memset(&reset, 0, sizeof reset); reset.sa_sigaction = reset_action; sigaction(SIGHUP, &reset, NULL); while(cpu_run(CPU_RUN)); return 0; }