An emulator, assembler, and disassembler for the Sega Game Gear
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

107 lines
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. }