dsp2.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include <../base.hpp>
  2. #define DSP2_CPP
  3. #include "dsp2.hpp"
  4. #include "dsp2_op.cpp"
  5. void DSP2::init() {}
  6. void DSP2::enable() {}
  7. void DSP2::power() {
  8. reset();
  9. }
  10. void DSP2::reset() {
  11. status.waiting_for_command = true;
  12. status.in_count = 0;
  13. status.in_index = 0;
  14. status.out_count = 0;
  15. status.out_index = 0;
  16. status.op05transparent = 0;
  17. status.op05haslen = false;
  18. status.op05len = 0;
  19. status.op06haslen = false;
  20. status.op06len = 0;
  21. status.op09word1 = 0;
  22. status.op09word2 = 0;
  23. status.op0dhaslen = false;
  24. status.op0doutlen = 0;
  25. status.op0dinlen = 0;
  26. }
  27. uint8 DSP2::read(unsigned addr) {
  28. uint8 r = 0xff;
  29. if(status.out_count) {
  30. r = status.output[status.out_index++];
  31. status.out_index &= 511;
  32. if(status.out_count == status.out_index) {
  33. status.out_count = 0;
  34. }
  35. }
  36. return r;
  37. }
  38. void DSP2::write(unsigned addr, uint8 data) {
  39. if(status.waiting_for_command) {
  40. status.command = data;
  41. status.in_index = 0;
  42. status.waiting_for_command = false;
  43. switch(data) {
  44. case 0x01: status.in_count = 32; break;
  45. case 0x03: status.in_count = 1; break;
  46. case 0x05: status.in_count = 1; break;
  47. case 0x06: status.in_count = 1; break;
  48. case 0x07: break;
  49. case 0x08: break;
  50. case 0x09: status.in_count = 4; break;
  51. case 0x0d: status.in_count = 2; break;
  52. case 0x0f: status.in_count = 0; break;
  53. }
  54. } else {
  55. status.parameters[status.in_index++] = data;
  56. status.in_index &= 511;
  57. }
  58. if(status.in_count == status.in_index) {
  59. status.waiting_for_command = true;
  60. status.out_index = 0;
  61. switch(status.command) {
  62. case 0x01: {
  63. status.out_count = 32;
  64. op01();
  65. } break;
  66. case 0x03: {
  67. op03();
  68. } break;
  69. case 0x05: {
  70. if(status.op05haslen) {
  71. status.op05haslen = false;
  72. status.out_count = status.op05len;
  73. op05();
  74. } else {
  75. status.op05len = status.parameters[0];
  76. status.in_index = 0;
  77. status.in_count = status.op05len * 2;
  78. status.op05haslen = true;
  79. if(data)status.waiting_for_command = false;
  80. }
  81. } break;
  82. case 0x06: {
  83. if(status.op06haslen) {
  84. status.op06haslen = false;
  85. status.out_count = status.op06len;
  86. op06();
  87. } else {
  88. status.op06len = status.parameters[0];
  89. status.in_index = 0;
  90. status.in_count = status.op06len;
  91. status.op06haslen = true;
  92. if(data)status.waiting_for_command = false;
  93. }
  94. } break;
  95. case 0x07: break;
  96. case 0x08: break;
  97. case 0x09: {
  98. op09();
  99. } break;
  100. case 0x0d: {
  101. if(status.op0dhaslen) {
  102. status.op0dhaslen = false;
  103. status.out_count = status.op0doutlen;
  104. op0d();
  105. } else {
  106. status.op0dinlen = status.parameters[0];
  107. status.op0doutlen = status.parameters[1];
  108. status.in_index = 0;
  109. status.in_count = (status.op0dinlen + 1) >> 1;
  110. status.op0dhaslen = true;
  111. if(data)status.waiting_for_command = false;
  112. }
  113. } break;
  114. case 0x0f: break;
  115. }
  116. }
  117. }
  118. DSP2::DSP2() {}
  119. DSP2::~DSP2() {}