cx4ops.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #ifdef CX4_CPP
  2. //Sprite Functions
  3. void Cx4::op00() {
  4. switch(reg[0x4d]) {
  5. case 0x00:op00_00();break;
  6. case 0x03:op00_03();break;
  7. case 0x05:op00_05();break;
  8. case 0x07:op00_07();break;
  9. case 0x08:op00_08();break;
  10. case 0x0b:op00_0b();break;
  11. case 0x0c:op00_0c();break;
  12. }
  13. }
  14. //Draw Wireframe
  15. void Cx4::op01() {
  16. memset(ram + 0x300, 0, 2304);
  17. C4DrawWireFrame();
  18. }
  19. //Propulsion
  20. void Cx4::op05() {
  21. int32 temp = 0x10000;
  22. if(readw(0x1f83)) {
  23. temp = sar((temp / readw(0x1f83)) * readw(0x1f81), 8);
  24. }
  25. writew(0x1f80, temp);
  26. }
  27. //Set Vector length
  28. void Cx4::op0d() {
  29. C41FXVal = readw(0x1f80);
  30. C41FYVal = readw(0x1f83);
  31. C41FDistVal = readw(0x1f86);
  32. tanval = sqrt(((double)C41FYVal) * ((double)C41FYVal) + ((double)C41FXVal) * ((double)C41FXVal));
  33. tanval = (double)C41FDistVal / tanval;
  34. C41FYVal = (int16)(((double)C41FYVal * tanval) * 0.99);
  35. C41FXVal = (int16)(((double)C41FXVal * tanval) * 0.98);
  36. writew(0x1f89, C41FXVal);
  37. writew(0x1f8c, C41FYVal);
  38. }
  39. //Triangle
  40. void Cx4::op10() {
  41. r0 = ldr(0);
  42. r1 = ldr(1);
  43. r4 = r0 & 0x1ff;
  44. if(r1 & 0x8000)r1 |= ~0x7fff;
  45. mul(cos(r4), r1, r5, r2);
  46. r5 = (r5 >> 16) & 0xff;
  47. r2 = (r2 << 8) + r5;
  48. mul(sin(r4), r1, r5, r3);
  49. r5 = (r5 >> 16) & 0xff;
  50. r3 = (r3 << 8) + r5;
  51. str(0, r0);
  52. str(1, r1);
  53. str(2, r2);
  54. str(3, r3);
  55. str(4, r4);
  56. str(5, r5);
  57. }
  58. //Triangle
  59. void Cx4::op13() {
  60. r0 = ldr(0);
  61. r1 = ldr(1);
  62. r4 = r0 & 0x1ff;
  63. mul(cos(r4), r1, r5, r2);
  64. r5 = (r5 >> 8) & 0xffff;
  65. r2 = (r2 << 16) + r5;
  66. mul(sin(r4), r1, r5, r3);
  67. r5 = (r5 >> 8) & 0xffff;
  68. r3 = (r3 << 16) + r5;
  69. str(0, r0);
  70. str(1, r1);
  71. str(2, r2);
  72. str(3, r3);
  73. str(4, r4);
  74. str(5, r5);
  75. }
  76. //Pythagorean
  77. void Cx4::op15() {
  78. C41FXVal = readw(0x1f80);
  79. C41FYVal = readw(0x1f83);
  80. C41FDist = (int16)sqrt((double)C41FXVal * (double)C41FXVal + (double)C41FYVal * (double)C41FYVal);
  81. writew(0x1f80, C41FDist);
  82. }
  83. //Calculate distance
  84. void Cx4::op1f() {
  85. C41FXVal = readw(0x1f80);
  86. C41FYVal = readw(0x1f83);
  87. if(!C41FXVal) {
  88. C41FAngleRes = (C41FYVal > 0) ? 0x080 : 0x180;
  89. } else {
  90. tanval = ((double)C41FYVal) / ((double)C41FXVal);
  91. C41FAngleRes = (short)(atan(tanval) / (PI * 2) * 512);
  92. C41FAngleRes = C41FAngleRes;
  93. if(C41FXVal < 0) {
  94. C41FAngleRes += 0x100;
  95. }
  96. C41FAngleRes &= 0x1ff;
  97. }
  98. writew(0x1f86, C41FAngleRes);
  99. }
  100. //Trapezoid
  101. void Cx4::op22() {
  102. int16 angle1 = readw(0x1f8c) & 0x1ff;
  103. int16 angle2 = readw(0x1f8f) & 0x1ff;
  104. int32 tan1 = Tan(angle1);
  105. int32 tan2 = Tan(angle2);
  106. int16 y = readw(0x1f83) - readw(0x1f89);
  107. int16 left, right;
  108. for(int32 j = 0; j < 225; j++, y++) {
  109. if(y >= 0) {
  110. left = sar((int32)tan1 * y, 16) - readw(0x1f80) + readw(0x1f86);
  111. right = sar((int32)tan2 * y, 16) - readw(0x1f80) + readw(0x1f86) + readw(0x1f93);
  112. if(left < 0 && right < 0) {
  113. left = 1;
  114. right = 0;
  115. } else if(left < 0) {
  116. left = 0;
  117. } else if(right < 0) {
  118. right = 0;
  119. }
  120. if(left > 255 && right > 255) {
  121. left = 255;
  122. right = 254;
  123. } else if(left > 255) {
  124. left = 255;
  125. } else if(right > 255) {
  126. right = 255;
  127. }
  128. } else {
  129. left = 1;
  130. right = 0;
  131. }
  132. ram[j + 0x800] = (uint8)left;
  133. ram[j + 0x900] = (uint8)right;
  134. }
  135. }
  136. //Multiply
  137. void Cx4::op25() {
  138. r0 = ldr(0);
  139. r1 = ldr(1);
  140. mul(r0, r1, r0, r1);
  141. str(0, r0);
  142. str(1, r1);
  143. }
  144. //Transform Coords
  145. void Cx4::op2d() {
  146. C4WFXVal = readw(0x1f81);
  147. C4WFYVal = readw(0x1f84);
  148. C4WFZVal = readw(0x1f87);
  149. C4WFX2Val = read (0x1f89);
  150. C4WFY2Val = read (0x1f8a);
  151. C4WFDist = read (0x1f8b);
  152. C4WFScale = readw(0x1f90);
  153. C4TransfWireFrame2();
  154. writew(0x1f80, C4WFXVal);
  155. writew(0x1f83, C4WFYVal);
  156. }
  157. //Sum
  158. void Cx4::op40() {
  159. r0 = 0;
  160. for(uint32 i=0;i<0x800;i++) {
  161. r0 += ram[i];
  162. }
  163. str(0, r0);
  164. }
  165. //Square
  166. void Cx4::op54() {
  167. r0 = ldr(0);
  168. mul(r0, r0, r1, r2);
  169. str(1, r1);
  170. str(2, r2);
  171. }
  172. //Immediate Register
  173. void Cx4::op5c() {
  174. str(0, 0x000000);
  175. immediate_reg(0);
  176. }
  177. //Immediate Register (Multiple)
  178. void Cx4::op5e() { immediate_reg( 0); }
  179. void Cx4::op60() { immediate_reg( 3); }
  180. void Cx4::op62() { immediate_reg( 6); }
  181. void Cx4::op64() { immediate_reg( 9); }
  182. void Cx4::op66() { immediate_reg(12); }
  183. void Cx4::op68() { immediate_reg(15); }
  184. void Cx4::op6a() { immediate_reg(18); }
  185. void Cx4::op6c() { immediate_reg(21); }
  186. void Cx4::op6e() { immediate_reg(24); }
  187. void Cx4::op70() { immediate_reg(27); }
  188. void Cx4::op72() { immediate_reg(30); }
  189. void Cx4::op74() { immediate_reg(33); }
  190. void Cx4::op76() { immediate_reg(36); }
  191. void Cx4::op78() { immediate_reg(39); }
  192. void Cx4::op7a() { immediate_reg(42); }
  193. void Cx4::op7c() { immediate_reg(45); }
  194. //Immediate ROM
  195. void Cx4::op89() {
  196. str(0, 0x054336);
  197. str(1, 0xffffff);
  198. }
  199. #endif