示例#1
0
文件: main.c 项目: lokedhs/ostis
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;
}
示例#2
0
文件: event.c 项目: nocrew/ostis
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;
}
示例#3
0
文件: debug.c 项目: nocrew/ostis
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;
}