bsx_base.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #ifdef BSX_CPP
  2. void BSXBase::init() {
  3. }
  4. void BSXBase::enable() {
  5. for(uint16 i = 0x2188; i <= 0x219f; i++) memory::mmio.map(i, *this);
  6. }
  7. void BSXBase::power() {
  8. reset();
  9. }
  10. void BSXBase::reset() {
  11. memset(&regs, 0x00, sizeof regs);
  12. }
  13. uint8 BSXBase::mmio_read(unsigned addr) {
  14. addr &= 0xffff;
  15. switch(addr) {
  16. case 0x2188: return regs.r2188;
  17. case 0x2189: return regs.r2189;
  18. case 0x218a: return regs.r218a;
  19. case 0x218c: return regs.r218c;
  20. case 0x218e: return regs.r218e;
  21. case 0x218f: return regs.r218f;
  22. case 0x2190: return regs.r2190;
  23. case 0x2192: {
  24. unsigned counter = regs.r2192_counter++;
  25. if(regs.r2192_counter >= 18) regs.r2192_counter = 0;
  26. if(counter == 0) {
  27. time_t rawtime;
  28. time(&rawtime);
  29. tm *t = localtime(&rawtime);
  30. regs.r2192_hour = t->tm_hour;
  31. regs.r2192_minute = t->tm_min;
  32. regs.r2192_second = t->tm_sec;
  33. }
  34. switch(counter) {
  35. case 0: return 0x00; //???
  36. case 1: return 0x00; //???
  37. case 2: return 0x00; //???
  38. case 3: return 0x00; //???
  39. case 4: return 0x00; //???
  40. case 5: return 0x01;
  41. case 6: return 0x01;
  42. case 7: return 0x00;
  43. case 8: return 0x00;
  44. case 9: return 0x00;
  45. case 10: return regs.r2192_second;
  46. case 11: return regs.r2192_minute;
  47. case 12: return regs.r2192_hour;
  48. case 13: return 0x00; //???
  49. case 14: return 0x00; //???
  50. case 15: return 0x00; //???
  51. case 16: return 0x00; //???
  52. case 17: return 0x00; //???
  53. }
  54. } break;
  55. case 0x2193: return regs.r2193 & ~0x0c;
  56. case 0x2194: return regs.r2194;
  57. case 0x2196: return regs.r2196;
  58. case 0x2197: return regs.r2197;
  59. case 0x2199: return regs.r2199;
  60. }
  61. return cpu.regs.mdr;
  62. }
  63. void BSXBase::mmio_write(unsigned addr, uint8 data) {
  64. addr &= 0xffff;
  65. switch(addr) {
  66. case 0x2188: {
  67. regs.r2188 = data;
  68. } break;
  69. case 0x2189: {
  70. regs.r2189 = data;
  71. } break;
  72. case 0x218a: {
  73. regs.r218a = data;
  74. } break;
  75. case 0x218b: {
  76. regs.r218b = data;
  77. } break;
  78. case 0x218c: {
  79. regs.r218c = data;
  80. } break;
  81. case 0x218e: {
  82. regs.r218e = data;
  83. } break;
  84. case 0x218f: {
  85. regs.r218e >>= 1;
  86. regs.r218e = regs.r218f - regs.r218e;
  87. regs.r218f >>= 1;
  88. } break;
  89. case 0x2191: {
  90. regs.r2191 = data;
  91. regs.r2192_counter = 0;
  92. } break;
  93. case 0x2192: {
  94. regs.r2190 = 0x80;
  95. } break;
  96. case 0x2193: {
  97. regs.r2193 = data;
  98. } break;
  99. case 0x2194: {
  100. regs.r2194 = data;
  101. } break;
  102. case 0x2197: {
  103. regs.r2197 = data;
  104. } break;
  105. case 0x2199: {
  106. regs.r2199 = data;
  107. } break;
  108. }
  109. }
  110. #endif