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.
 
 
 
 
 

95 lines
2.2 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 "io.h"
  4. /*
  5. Initialize an IO object.
  6. */
  7. void io_init(IO *io, VDP *vdp, PSG *psg)
  8. {
  9. io->vdp = vdp;
  10. io->psg = psg;
  11. }
  12. /*
  13. "Power on" the IO object.
  14. */
  15. void io_power(IO *io)
  16. {
  17. io->except = false;
  18. }
  19. /*
  20. Return whether the IRQ line is currently active.
  21. */
  22. bool io_check_irq(IO *io)
  23. {
  24. return vdp_assert_irq(io->vdp);
  25. }
  26. /*
  27. Read and return a byte from the given port.
  28. */
  29. uint8_t io_port_read(IO *io, uint8_t port)
  30. {
  31. if (port <= 0x06) {
  32. if (port == 0x00)
  33. return 0xC0;
  34. // TODO: GG specific registers; initial state: C0 7F FF 00 FF 00 FF
  35. } else if (port <= 0x3F) {
  36. return 0xFF;
  37. } else if (port <= 0x7F && !(port % 2)) {
  38. return io->vdp->v_counter;
  39. } else if (port <= 0x7F) {
  40. return io->vdp->h_counter;
  41. } else if (port <= 0xBF && !(port % 2)) {
  42. return vdp_read_data(io->vdp);
  43. } else if (port <= 0xBF) {
  44. return vdp_read_control(io->vdp);
  45. } else if (port == 0xCD || port == 0xDC) {
  46. // TODO: Return the I/O port A/B register
  47. return 0xFF;
  48. } else if (port == 0xC1 || port == 0xDD) {
  49. // TODO: Return the I/O port B/misc. register
  50. return 0xFF;
  51. } else {
  52. return 0xFF;
  53. }
  54. io->except = true;
  55. io->exc_port = port;
  56. return 0;
  57. }
  58. /*
  59. Write a byte to the given port.
  60. */
  61. void io_port_write(IO *io, uint8_t port, uint8_t value)
  62. {
  63. if (port <= 0x06) {
  64. // TODO: GG specific registers; initial state: C0 7F FF 00 FF 00 FF
  65. goto except;
  66. } else if (port <= 0x3F && !(port % 2)) {
  67. // TODO: Write to memory control register
  68. goto except;
  69. } else if (port <= 0x3F) {
  70. // TODO: Write to I/O control register
  71. goto except;
  72. } else if (port <= 0x7F) {
  73. psg_write(io->psg, value);
  74. } else if (port <= 0xBF && !(port % 2)) {
  75. vdp_write_data(io->vdp, value);
  76. } else if (port <= 0xBF) {
  77. vdp_write_control(io->vdp, value);
  78. } else {
  79. return;
  80. }
  81. return;
  82. except:
  83. io->except = true;
  84. io->exc_port = port;
  85. }