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; }
static int event_key(SDL_KeyboardEvent key, int state) { SDL_Keysym k; k = key.keysym; if((k.mod & KMOD_CTRL) && (k.mod & KMOD_LGUI) && (k.mod & KMOD_SHIFT)) { if(k.sym == SDLK_F1) { screen_set_delay(0); } else if(k.sym == SDLK_F2) { screen_set_delay(10000); } else if(k.sym == SDLK_F3) { screen_set_delay(20000); } else if(k.sym == SDLK_F4) { screen_set_delay(30000); } else if(k.sym == SDLK_F5) { screen_set_delay(40000); } else if(k.sym == SDLK_F6) { screen_set_delay(50000); } else if(k.sym == SDLK_F7) { screen_set_delay(75000); } else if(k.sym == SDLK_F8) { screen_set_delay(100000); } else if(k.sym == SDLK_F9) { screen_set_delay(150000); } else if(k.sym == SDLK_F10) { screen_set_delay(200000); } else if(k.sym == SDLK_F11) { screen_set_delay(500000); } else if(k.sym == SDLK_F12) { screen_set_delay(1000000); } return EVENT_NONE; } if((k.sym == ' ') || (k.sym == 27) || ((k.sym >= '0') && (k.sym <= '9')) || ((k.sym >= 'a') && (k.sym <= 'z')) || (k.sym == '\'') || (k.sym == ',') || (k.sym == '-') || (k.sym == '.') || (k.sym == '/') || (k.sym == ';') || (k.sym == '=') || (k.sym == '[') || (k.sym == '\\') || (k.sym == ']') || (k.sym == '`') || (k.sym == '\r') || (k.sym == '\b') || (k.sym == '\t') ) { ikbd_queue_key(scancode[k.sym], state); } else if((k.sym >= SDLK_F1) && (k.sym <= SDLK_F10)) { ikbd_queue_key(SCAN_F1+k.sym-SDLK_F1, state); } else if(k.sym == SDLK_F11) { if(k.mod & KMOD_CTRL && state == EVENT_RELEASE) { printf("DEBUG: Toggle screen disable\n"); screen_disable(!screen_check_disable()); } else { if(state == EVENT_RELEASE) { if(debugger) return EVENT_DEBUG; else { state_save("ostis.state", state_collect()); SDL_Quit(); exit(0); } } } } else if(k.sym == SDLK_PAUSE) { if(k.mod & KMOD_CTRL) { if(state == EVENT_RELEASE) { screen_toggle_fullscreen(); } } else { if(state == EVENT_RELEASE) { screen_toggle_grab(); } } } else if(k.sym == SDLK_PRINTSCREEN) { if(k.mod & KMOD_ALT) { if(state == EVENT_RELEASE) { printf("DEBUG: Start debugger\n"); } } else { if(state == EVENT_RELEASE) { // TODO: toggle this state. diag_set_module_levels("CPU0:6"); } } } else if(k.sym == SDLK_F12) { if(state == EVENT_RELEASE) { printf("-------------------------------------------\n"); cpu_print_status(CPU_USE_CURRENT_PC); printf("- - - - - - - - - - - - - - - - - - - - - -\n"); mfp_print_status(); printf("- - - - - - - - - - - - - - - - - - - - - -\n"); ikbd_print_status(); printf("DEBUG: Speed: %g FPS\n", screen_fps()); printf("-------------------------------------------\n"); } } else if(k.sym == SDLK_F13) { if(state == EVENT_RELEASE) { printf("DEBUG: Collecting state\n"); laststate = state_collect(); } } else if(k.sym == SDLK_F14) { if(state == EVENT_RELEASE) { printf("DEBUG: Restoring state\n"); state_restore(laststate); } } else if(k.sym == SDLK_LSHIFT) { ikbd_queue_key(SCAN_LSHIFT, state); } else if(k.sym == SDLK_RSHIFT) { ikbd_queue_key(SCAN_RSHIFT, state); } else if(k.sym == SDLK_LCTRL) { ikbd_queue_key(SCAN_CONTROL, state); } else if(k.sym == SDLK_LALT) { ikbd_queue_key(SCAN_ALT, state); } else if(k.sym == SDLK_UP) { ikbd_queue_key(SCAN_UP, state); } else if(k.sym == SDLK_DOWN) { ikbd_queue_key(SCAN_DOWN, state); } else if(k.sym == SDLK_LEFT) { ikbd_queue_key(SCAN_LEFT, state); } else if(k.sym == SDLK_RIGHT) { ikbd_queue_key(SCAN_RIGHT, state); } else if(k.sym == SDLK_END) { ikbd_queue_key(SCAN_INSERT, state); } else if(k.sym == SDLK_PAGEDOWN) { ikbd_queue_key(SCAN_DELETE, state); } else { printf("Unimplemented key: %d\n", k.sym); } return EVENT_NONE; }
static int debug_do_key_normal(SDL_KeyboardEvent key) { SDL_Keysym k; int ret; k = key.keysym; win_set_message(""); switch(k.sym) { case SDLK_ESCAPE: win[2].addr = cpu->pc; break; case SDLK_TAB: win_cycle_selected(); break; case SDLK_PRINTSCREEN: // TODO: toggle this state. diag_set_module_levels("CPU0:6"); break; case SDLK_UP: win_move_window(MOVE_UP, k.mod&KMOD_SHIFT); break; case SDLK_DOWN: win_move_window(MOVE_DOWN, k.mod&KMOD_SHIFT); break; case SDLK_LEFT: win_move_window(MOVE_LEFT, k.mod&KMOD_SHIFT); break; case SDLK_RIGHT: win_move_window(MOVE_RIGHT, k.mod&KMOD_SHIFT); break; case SDLK_d: if(debugmode) debugmode = 0; else debugmode = 1; break; case SDLK_t: if(k.mod & KMOD_ALT) win_toggle_window_type(WIN_CURRENT); break; case SDLK_f: if(k.mod & KMOD_ALT) win_toggle_window_font(WIN_CURRENT); break; case SDLK_s: if(k.mod & KMOD_ALT) win_toggle_window_split(WIN_CURRENT); if(k.mod & KMOD_CTRL) debug_skip_next_instr(); break; case SDLK_y: if(k.mod & KMOD_ALT) win_toggle_window_full(WIN_CURRENT); break; case SDLK_z: if(k.mod & KMOD_CTRL) { if((win_get_selected() != 2) && (win_get_selected() != 4)) win_set_selected(2); ret = stepfn(CPU_TRACE_SINGLE); if(debugmode) { cpu_print_status(CPU_USE_CURRENT_PC); mfp_print_status(); } if(ret == CPU_BREAKPOINT) { win_set_message("Breakpoint"); } else if(ret == CPU_WATCHPOINT) { win_set_message("Watchpoint"); } else { win_set_message("Trace"); } win_move_window_to_pc(); } break; case SDLK_a: if(k.mod & KMOD_CTRL) { debug_breakpoint_next_instr(); if((win_get_selected() != 2) && (win_get_selected() != 4)) win_set_selected(2); debug_update_win = 0; ret = runfn(CPU_DEBUG_RUN); debug_update_win = 1; if(ret == CPU_BREAKPOINT) { win_set_message("Breakpoint"); } else if(ret == CPU_WATCHPOINT) { win_set_message("Watchpoint"); } win_move_window_to_pc(); } break; case SDLK_r: if(k.mod & KMOD_CTRL) { if((win_get_selected() != 2) && (win_get_selected() != 4)) win_set_selected(2); debug_update_win = 0; ret = runfn(CPU_DEBUG_RUN); debug_update_win = 1; if(ret == CPU_BREAKPOINT) { win_set_message("Breakpoint"); } else if(ret == CPU_WATCHPOINT) { win_set_message("Watchpoint"); } else { printf("DEBUG: Run Return %d\n", ret); } win_move_window_to_pc(); } else if(k.mod & KMOD_ALT) { win_set_exwin(EDIT_SETREG); debug_set_editmode(); } break; case SDLK_m: if(k.mod & KMOD_ALT) { win_set_exwin(EDIT_SETMEM); debug_set_editmode(); } else { if(win_get_selected() > 1) { win_set_exwin(EDIT_SETADDR); debug_set_editmode(); } } break; case SDLK_v: if(viewmode == VIEW_DISPLAY) viewmode = VIEW_DEBUG; else viewmode = VIEW_DISPLAY; break; case SDLK_l: if(k.mod & KMOD_SHIFT) { win_set_exwin(EDIT_LABELCMD); } else { win_set_exwin(EDIT_LABEL); } debug_set_editmode(); break; case SDLK_b: if(k.mod & KMOD_ALT) { win_set_exwin(EDIT_SETBRK); debug_set_editmode(); } else if(k.mod & KMOD_CTRL) { if(win[win_get_selected()].type == TYPE_DIS) debug_toggle_breakpoint(win_get_selected()); } else { cpu_print_breakpoints(); } break; case SDLK_w: if(k.mod & KMOD_ALT) { win_set_exwin(EDIT_SETWATCH); debug_set_editmode(); } break; case SDLK_c: if(k.mod & KMOD_CTRL) return 1; screen_clear(); break; case SDLK_F12: printf("-------------------------------------------\n"); cpu_print_status(CPU_USE_CURRENT_PC); printf("- - - - - - - - - - - - - - - - - - - - - -\n"); mfp_print_status(); printf("- - - - - - - - - - - - - - - - - - - - - -\n"); ikbd_print_status(); printf("-------------------------------------------\n"); default: break; } screen_swap(DEBUG_INDICATE_RASTERPOS); display_swap_screen(); return 0; }