An emulator, assembler, and disassembler for the Sega Game Gear
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

107 lignes
2.3 KiB

  1. /* Copyright (C) 2014-2016 Ben Kurtovic <ben.kurtovic@gmail.com>
  2. Released under the terms of the MIT License. See LICENSE for details. */
  3. #include <signal.h>
  4. #include <SDL.h>
  5. #include "emulator.h"
  6. #include "logging.h"
  7. #define SCREEN_WIDTH 3 * (160 + 96) // TODO: define elsewhere; use scale
  8. #define SCREEN_HEIGHT 3 * (144 + 48)
  9. static GameGear *global_gg;
  10. static SDL_Window *window;
  11. SDL_Renderer* renderer;
  12. /*
  13. Signal handler for SIGINT.
  14. */
  15. static void handle_sigint(int sig)
  16. {
  17. (void) sig;
  18. if (global_gg)
  19. gamegear_power_off(global_gg);
  20. }
  21. /*
  22. TODO: ...
  23. */
  24. static void setup_graphics()
  25. {
  26. if (SDL_Init(SDL_INIT_VIDEO) < 0)
  27. FATAL("SDL failed to initialize: %s", SDL_GetError());
  28. SDL_CreateWindowAndRenderer(SCREEN_WIDTH, SCREEN_HEIGHT,
  29. SDL_WINDOW_BORDERLESS/* |SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE ? */,
  30. &window, &renderer);
  31. if (!window)
  32. FATAL("SDL failed to create a window: %s", SDL_GetError());
  33. if (!renderer)
  34. FATAL("SDL failed to create a renderer: %s", SDL_GetError());
  35. SDL_SetRenderDrawColor(renderer, 0x33, 0x33, 0x33, 0xFF);
  36. SDL_RenderClear(renderer);
  37. SDL_RenderPresent(renderer);
  38. }
  39. /*
  40. GameGear callback: handle SDL logic at the end of a frame.
  41. */
  42. static void draw_frame(GameGear *gg)
  43. {
  44. SDL_RenderPresent(renderer);
  45. SDL_Event e;
  46. while (SDL_PollEvent(&e)) {
  47. if (e.type == SDL_QUIT) {
  48. gamegear_power_off(gg);
  49. return;
  50. }
  51. }
  52. SDL_SetRenderDrawColor(renderer, 0x33, 0x33, 0x33, 0xFF);
  53. SDL_RenderClear(renderer);
  54. }
  55. /*
  56. TODO: ...
  57. */
  58. static void cleanup_graphics()
  59. {
  60. SDL_DestroyRenderer(renderer);
  61. SDL_DestroyWindow(window);
  62. window = NULL;
  63. renderer = NULL;
  64. SDL_Quit();
  65. }
  66. /*
  67. Emulate a Game Gear. Handle I/O with the host computer.
  68. Block until emulation is finished.
  69. */
  70. void emulate(GameGear *gg)
  71. {
  72. global_gg = gg;
  73. signal(SIGINT, handle_sigint);
  74. gamegear_set_callback(gg, draw_frame);
  75. setup_graphics();
  76. gamegear_simulate(gg);
  77. if (gamegear_get_exception(gg))
  78. ERROR("caught exception: %s", gamegear_get_exception(gg))
  79. else
  80. WARN("caught signal, stopping...")
  81. if (DEBUG_LEVEL)
  82. gamegear_print_state(gg);
  83. cleanup_graphics();
  84. gamegear_clear_callback(gg);
  85. signal(SIGINT, SIG_DFL);
  86. global_gg = NULL;
  87. }