📄 c4emu.cpp
字号:
break; case 0x10: // Polar to rectangluar#ifdef DEBUGGER// printf("10 Polar->Rect!\n"); if(Memory.C4RAM[0x1f4d]!=2) printf("$7f4d=%02x, expected 02 for command 10 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif { int32 tmp=SAR((int32)READ_WORD(Memory.C4RAM+0x1f83)*C4CosTable[READ_WORD(Memory.C4RAM+0x1f80)&0x1ff]*2, 16); WRITE_3WORD(Memory.C4RAM+0x1f86, tmp); tmp=SAR((int32)READ_WORD(Memory.C4RAM+0x1f83)*C4SinTable[READ_WORD(Memory.C4RAM+0x1f80)&0x1ff]*2, 16); WRITE_3WORD(Memory.C4RAM+0x1f89, (tmp-SAR(tmp, 6))); } break; case 0x13: // Polar to rectangluar#ifdef DEBUGGER// printf("13 Polar->Rect!\n"); if(Memory.C4RAM[0x1f4d]!=2) printf("$7f4d=%02x, expected 02 for command 13 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif { int32 tmp=SAR((int32)READ_WORD(Memory.C4RAM+0x1f83)*C4CosTable[READ_WORD(Memory.C4RAM+0x1f80)&0x1ff]*2, 8); WRITE_3WORD(Memory.C4RAM+0x1f86, tmp); tmp=SAR((int32)READ_WORD(Memory.C4RAM+0x1f83)*C4SinTable[READ_WORD(Memory.C4RAM+0x1f80)&0x1ff]*2, 8); WRITE_3WORD(Memory.C4RAM+0x1f89, tmp); } break; case 0x15: // Pythagorean#ifdef DEBUGGER printf("15 Pythagorean!\n"); if(Memory.C4RAM[0x1f4d]!=2) printf("$7f4d=%02x, expected 02 for command 15 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif C41FXVal=READ_WORD(Memory.C4RAM+0x1f80); C41FYVal=READ_WORD(Memory.C4RAM+0x1f83); C41FDist=(int16)sqrt((double)C41FXVal*C41FXVal + (double)C41FYVal*C41FYVal); WRITE_WORD(Memory.C4RAM+0x1f80, C41FDist); break; case 0x1f: // atan#ifdef DEBUGGER// printf("1f atan!\n"); if(Memory.C4RAM[0x1f4d]!=2) printf("$7f4d=%02x, expected 02 for command 1f %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif C41FXVal=READ_WORD(Memory.C4RAM+0x1f80); C41FYVal=READ_WORD(Memory.C4RAM+0x1f83); C4Op1F(); WRITE_WORD(Memory.C4RAM+0x1f86, C41FAngleRes); break; case 0x22: // Trapezoid {#ifdef DEBUGGER// printf("22 Trapezoid!\n"); if(Memory.C4RAM[0x1f4d]!=2) printf("$7f4d=%02x, expected 02 for command 22 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif int16 angle1=READ_WORD(Memory.C4RAM+0x1f8c)&0x1ff; int16 angle2=READ_WORD(Memory.C4RAM+0x1f8f)&0x1ff;#ifdef DEBUGGER if(C4CosTable[angle1]==0) fprintf(stderr, "22 Trapezoid: Invalid tangent! angle1=%d\n", angle1); if(C4CosTable[angle2]==0) fprintf(stderr, "22 Trapezoid: Invalid tangent! angle2=%d\n", angle2);#endif int32 tan1=(C4CosTable[angle1]!=0)?((((int32)C4SinTable[angle1])<<16)/C4CosTable[angle1]):0x80000000; int32 tan2=(C4CosTable[angle2]!=0)?((((int32)C4SinTable[angle2])<<16)/C4CosTable[angle2]):0x80000000; int16 y = READ_WORD(Memory.C4RAM+0x1f83) - READ_WORD(Memory.C4RAM+0x1f89); int16 left, right; for(int j=0; j<225; j++) { if(y>=0) { left = SAR((int32)tan1*y, 16) - READ_WORD(Memory.C4RAM+0x1f80) + READ_WORD(Memory.C4RAM+0x1f86); right = SAR((int32)tan2*y, 16) - READ_WORD(Memory.C4RAM+0x1f80) + READ_WORD(Memory.C4RAM+0x1f86) + READ_WORD(Memory.C4RAM+0x1f93); if(left<0 && right<0){ left=1; right=0; } else if(left<0){ left=0; } else if(right<0){ right=0; } if(left>255 && right>255){ left=255; right=254; } else if(left>255){ left=255; } else if(right>255){ right=255; } } else { left=1; right=0; } Memory.C4RAM[j+0x800] = (uint8)left; Memory.C4RAM[j+0x900] = (uint8)right; y++; } } break; case 0x25: // Multiply#ifdef DEBUGGER printf("25 Multiply!\n"); if(Memory.C4RAM[0x1f4d]!=2) printf("$7f4d=%02x, expected 02 for command 25 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif { int32 foo=READ_3WORD(Memory.C4RAM+0x1f80); int32 bar=READ_3WORD(Memory.C4RAM+0x1f83); foo*=bar; WRITE_3WORD(Memory.C4RAM+0x1f80, foo); } break; case 0x2d: // Transform Coords#ifdef DEBUGGER// printf("2d Transform Coords!\n"); if(Memory.C4RAM[0x1f4d]!=2) printf("$7f4d=%02x, expected 02 for command 2d %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); if(READ_3WORD(Memory.C4RAM+0x1f8f)&0xff00ff) printf("2d transform coords: Unexpected value in $7f8f: %06x\n", READ_3WORD(Memory.C4RAM+0x1f8f)); if(READ_3WORD(Memory.C4RAM+0x1f8c)!=0x001000) printf("0d transform coords: Unexpected value in $7f8c: %06x\n", READ_3WORD(Memory.C4RAM+0x1f8c));#endif C4WFXVal=READ_WORD(Memory.C4RAM+0x1f81); C4WFYVal=READ_WORD(Memory.C4RAM+0x1f84); C4WFZVal=READ_WORD(Memory.C4RAM+0x1f87); C4WFX2Val=Memory.C4RAM[0x1f89]; C4WFY2Val=Memory.C4RAM[0x1f8a]; C4WFDist=Memory.C4RAM[0x1f8b]; C4WFScale=READ_WORD(Memory.C4RAM+0x1f90); C4TransfWireFrame2(); WRITE_WORD(Memory.C4RAM+0x1f80, C4WFXVal); WRITE_WORD(Memory.C4RAM+0x1f83, C4WFYVal); break; case 0x40: // Sum#ifdef DEBUGGER printf("40 Sum!\n"); if(Memory.C4RAM[0x1f4d]!=0x0e) printf("$7f4d=%02x, expected 0e for command 40 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif { uint16 sum=0; for(int i=0; i<0x800; sum+=Memory.C4RAM[i++]); WRITE_WORD(Memory.C4RAM+0x1f80, sum); } break; case 0x54: // Square#ifdef DEBUGGER printf("54 Square!\n"); if(Memory.C4RAM[0x1f4d]!=0x0e) printf("$7f4d=%02x, expected 0e for command 54 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif { int64 a=SAR((int64)READ_3WORD(Memory.C4RAM+0x1f80)<<40, 40); // printf("%08X%08X\n", (uint32)(a>>32), (uint32)(a&0xFFFFFFFF)); a*=a; // printf("%08X%08X\n", (uint32)(a>>32), (uint32)(a&0xFFFFFFFF)); WRITE_3WORD(Memory.C4RAM+0x1f83, a); WRITE_3WORD(Memory.C4RAM+0x1f86, (a>>24)); } break; case 0x5c: // Immediate Reg#ifdef DEBUGGER printf("5c Immediate Reg!\n"); if(Memory.C4RAM[0x1f4d]!=0x0e) printf("$7f4d=%02x, expected 0e for command 5c %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif for (i = 0; i < 12 * 4; i++) Memory.C4RAM [i] = C4TestPattern [i]; break; case 0x89: // Immediate ROM#ifdef DEBUGGER printf("89 Immediate ROM!\n"); if(Memory.C4RAM[0x1f4d]!=0x0e) printf("$7f4d=%02x, expected 0e for command 89 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]);#endif Memory.C4RAM [0x1f80] = 0x36; Memory.C4RAM [0x1f81] = 0x43; Memory.C4RAM [0x1f82] = 0x05; break; default:#ifdef DEBUGGER printf ("Unknown C4 command (%02x)\n", byte);#endif break; } } } else if (Address == 0x7f47) {#ifdef DEBUGGER// printf("C4 load memory %06x => %04x, %04x bytes\n", READ_3WORD(Memory.C4RAM+0x1f40), READ_WORD(Memory.C4RAM+0x1f45), READ_WORD(Memory.C4RAM+0x1f43)); if(byte != 0) printf("C4 load: non-0 written to $7f47! Wrote %02x\n", byte); if(READ_WORD(Memory.C4RAM+0x1f45) < 0x6000 || (READ_WORD(Memory.C4RAM+0x1f45) + READ_WORD(Memory.C4RAM+0x1f43)) > 0x6c00) printf("C4 load: Dest unusual! It's %04x\n", READ_WORD(Memory.C4RAM+0x1f45));#endif memmove(Memory.C4RAM+(READ_WORD(Memory.C4RAM+0x1f45)&0x1fff), S9xGetMemPointer(READ_3WORD(Memory.C4RAM+0x1f40)), READ_WORD(Memory.C4RAM+0x1f43)); }}int16 C4SinTable[512] = { 0, 402, 804, 1206, 1607, 2009, 2410, 2811, 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765, 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, 0, -402, -804, -1206, -1607, -2009, -2410, -2811, -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, -3211, -2811, -2410, -2009, -1607, -1206, -804, -402};int16 C4CosTable[512] = { 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, 0, -402, -804, -1206, -1607, -2009, -2410, -2811, -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, -3211, -2811, -2410, -2009, -1607, -1206, -804, -402, 0, 402, 804, 1206, 1607, 2009, 2410, 2811, 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -