⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c4emu.cpp

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                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 + -