diff --git a/zsnes/src/Makefile.in b/zsnes/src/Makefile.in index 2580e4a7..b63da08f 100644 --- a/zsnes/src/Makefile.in +++ b/zsnes/src/Makefile.in @@ -33,7 +33,7 @@ CHIPSOBJ=${CHIPDIR}/sfxproc.o ${CHIPDIR}/fxemu2.o ${CHIPDIR}/dsp1proc.o\ ${CHIPDIR}/fxemu2b.o ${CHIPDIR}/fxemu2c.o ${CHIPDIR}/fxtable.o\ ${CHIPDIR}/sa1proc.o ${CHIPDIR}/sa1regs.o ${CHIPDIR}/dsp1emu.o\ ${CHIPDIR}/st10proc.o ${CHIPDIR}/seta10.o ${CHIPDIR}/dsp2proc.o\ - ${CHIPDIR}/sdd1emu.o + ${CHIPDIR}/sdd1emu.o ${CHIPDIR}/c4emu.o CPUOBJ=${CPUDIR}/addrni.o ${CPUDIR}/dma.o ${CPUDIR}/dsp.o ${CPUDIR}/dspproc.o\ ${CPUDIR}/execute.o ${CPUDIR}/executec.o ${CPUDIR}/irq.o\ diff --git a/zsnes/src/chips/c4emu.c b/zsnes/src/chips/c4emu.c new file mode 100644 index 00000000..cee5813d --- /dev/null +++ b/zsnes/src/chips/c4emu.c @@ -0,0 +1,345 @@ +/* +Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach ) + +http://www.zsnes.com +http://sourceforge.net/projects/zsnes + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifdef __LINUX__ +#include "../gblhdr.h" +#else +#include +#endif + +#ifdef PI +#undef PI +#endif +#define PI 3.1415926535897932384626433832795 +#define Cos(a) ((double) CosTable[a]) +#define Sin(a) ((double) SinTable[a]) +#define Tan(a) (CosTable[a]?((((int)SinTable[a])<<16)/CosTable[a]):0x80000000) + +short SinTable[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 +}; + +short CosTable[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 +}; + +short C4WFXVal; +short C4WFYVal; +short C4WFZVal; +short C4WFX2Val; +short C4WFY2Val; +short C4WFDist; +short C4WFScale; +double tanval; +double c4x,c4y,c4z; +double c4x2,c4y2,c4z2; + +void C4TransfWireFrame() +{ + c4x=(double)C4WFXVal; + c4y=(double)C4WFYVal; + c4z=(double)C4WFZVal-0x95; + + // Rotate X + tanval=-(double)C4WFX2Val*PI*2/128; + c4y2=c4y*cos(tanval)-c4z*sin(tanval); + c4z2=c4y*sin(tanval)+c4z*cos(tanval); + + // Rotate Y + tanval=-(double)C4WFY2Val*PI*2/128; + c4x2=c4x*cos(tanval)+c4z2*sin(tanval); + c4z=c4x*-sin(tanval)+c4z2*cos(tanval); + + // Rotate Z + tanval=-(double)C4WFDist*PI*2/128; + c4x=c4x2*cos(tanval)-c4y2*sin(tanval); + c4y=c4x2*sin(tanval)+c4y2*cos(tanval); + + // Scale + C4WFXVal=(short)(c4x*C4WFScale/(0x90*(c4z+0x95))*0x95); + C4WFYVal=(short)(c4y*C4WFScale/(0x90*(c4z+0x95))*0x95); +} + +void C4TransfWireFrame2() +{ + c4x=(double)C4WFXVal; + c4y=(double)C4WFYVal; + c4z=(double)C4WFZVal; + + // Rotate X + tanval=-(double)C4WFX2Val*PI*2/128; + c4y2=c4y*cos(tanval)-c4z*sin(tanval); + c4z2=c4y*sin(tanval)+c4z*cos(tanval); + + // Rotate Y + tanval=-(double)C4WFY2Val*PI*2/128; + c4x2=c4x*cos(tanval)+c4z2*sin(tanval); + c4z=c4x*-sin(tanval)+c4z2*cos(tanval); + + // Rotate Z + tanval=-(double)C4WFDist*PI*2/128; + c4x=c4x2*cos(tanval)-c4y2*sin(tanval); + c4y=c4x2*sin(tanval)+c4y2*cos(tanval); + + // Scale + C4WFXVal=(short)(c4x*C4WFScale/0x100); + C4WFYVal=(short)(c4y*C4WFScale/0x100); +} + +void C4CalcWireFrame() +{ + C4WFXVal=C4WFX2Val-C4WFXVal; + C4WFYVal=C4WFY2Val-C4WFYVal; + if (abs(C4WFXVal)>abs(C4WFYVal)){ + C4WFDist=abs(C4WFXVal)+1; + C4WFYVal=(256*(long)C4WFYVal)/abs(C4WFXVal); + if (C4WFXVal<0) C4WFXVal=-256; + else C4WFXVal=256; + } + else + if (C4WFYVal!=0) { + C4WFDist=abs(C4WFYVal)+1; + C4WFXVal=(256*(long)C4WFXVal)/abs(C4WFYVal); + if (C4WFYVal<0) C4WFYVal=-256; + else C4WFYVal=256; + } + else C4WFDist=0; +} + +short C41FXVal; +short C41FYVal; +short C41FAngleRes; +short C41FDist; +short C41FDistVal; + +void C4Op1F() +{ + if (C41FXVal == 0) { + if (C41FYVal>0) C41FAngleRes=0x80; + else C41FAngleRes=0x180; + } + else { + tanval = ((double)C41FYVal)/((double)C41FXVal); + C41FAngleRes=(short)(atan(tanval)/(PI*2)*512); + C41FAngleRes=C41FAngleRes; + if (C41FXVal<0) C41FAngleRes+=0x100; + C41FAngleRes&=0x1FF; + } +} + +void C4Op15() +{ + tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* + ((double)C41FXVal)); + C41FDist=(short)tanval; +} + +void C4Op0D() +{ + tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* + ((double)C41FXVal)); + tanval=(double)C41FDistVal/tanval; + C41FYVal=(short)(((double)C41FYVal*tanval)*0.99); + C41FXVal=(short)(((double)C41FXVal*tanval)*0.98); +} + +#define READ_WORD(s) (*(unsigned short *) (s)) +void C4Op22() +{ + extern unsigned char *C4Ram; + short angle1 = READ_WORD(C4Ram+0x1f8c) & 0x1ff; + short angle2 = READ_WORD(C4Ram+0x1f8f) & 0x1ff; + int tan1 = Tan(angle1); + int tan2 = Tan(angle2); + short y = READ_WORD(C4Ram+0x1f83) - READ_WORD(C4Ram+0x1f89); + short left, right; + + int j; + for (j = 0; j < 225; j++, y++) + { + if (y >= 0) + { + left = (((int)tan1*y) >> 16) - READ_WORD(C4Ram+0x1f80) + READ_WORD(C4Ram+0x1f86); + right = (((int)tan2*y) >> 16) - READ_WORD(C4Ram+0x1f80) + READ_WORD(C4Ram+0x1f86) + READ_WORD(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; + } + C4Ram[j+0x800] = (unsigned char)left; + C4Ram[j+0x900] = (unsigned char)right; + } +} diff --git a/zsnes/src/chips/dsp1emu.c b/zsnes/src/chips/dsp1emu.c index 02a1afb8..c9524162 100644 --- a/zsnes/src/chips/dsp1emu.c +++ b/zsnes/src/chips/dsp1emu.c @@ -238,132 +238,6 @@ double Atan(double x) return (PI/2 - Atan(1/x)); } -#ifdef __ZSNES__ -/***************************************************************************\ -* C4 C code * -\***************************************************************************/ - -short C4WFXVal; -short C4WFYVal; -short C4WFZVal; -short C4WFX2Val; -short C4WFY2Val; -short C4WFDist; -short C4WFScale; -double tanval; -double c4x,c4y,c4z; -double c4x2,c4y2,c4z2; - -void C4TransfWireFrame() -{ - c4x=(double)C4WFXVal; - c4y=(double)C4WFYVal; - c4z=(double)C4WFZVal-0x95; - - // Rotate X - tanval=-(double)C4WFX2Val*PI*2/128; - c4y2=c4y*cos(tanval)-c4z*sin(tanval); - c4z2=c4y*sin(tanval)+c4z*cos(tanval); - - // Rotate Y - tanval=-(double)C4WFY2Val*PI*2/128; - c4x2=c4x*cos(tanval)+c4z2*sin(tanval); - c4z=c4x*-sin(tanval)+c4z2*cos(tanval); - - // Rotate Z - tanval=-(double)C4WFDist*PI*2/128; - c4x=c4x2*cos(tanval)-c4y2*sin(tanval); - c4y=c4x2*sin(tanval)+c4y2*cos(tanval); - - // Scale - C4WFXVal=(short)(c4x*C4WFScale/(0x90*(c4z+0x95))*0x95); - C4WFYVal=(short)(c4y*C4WFScale/(0x90*(c4z+0x95))*0x95); -} - -void C4TransfWireFrame2() -{ - c4x=(double)C4WFXVal; - c4y=(double)C4WFYVal; - c4z=(double)C4WFZVal; - - // Rotate X - tanval=-(double)C4WFX2Val*PI*2/128; - c4y2=c4y*cos(tanval)-c4z*sin(tanval); - c4z2=c4y*sin(tanval)+c4z*cos(tanval); - - // Rotate Y - tanval=-(double)C4WFY2Val*PI*2/128; - c4x2=c4x*cos(tanval)+c4z2*sin(tanval); - c4z=c4x*-sin(tanval)+c4z2*cos(tanval); - - // Rotate Z - tanval=-(double)C4WFDist*PI*2/128; - c4x=c4x2*cos(tanval)-c4y2*sin(tanval); - c4y=c4x2*sin(tanval)+c4y2*cos(tanval); - - // Scale - C4WFXVal=(short)(c4x*C4WFScale/0x100); - C4WFYVal=(short)(c4y*C4WFScale/0x100); -} - -void C4CalcWireFrame() -{ - C4WFXVal=C4WFX2Val-C4WFXVal; - C4WFYVal=C4WFY2Val-C4WFYVal; - if (abs(C4WFXVal)>abs(C4WFYVal)){ - C4WFDist=abs(C4WFXVal)+1; - C4WFYVal=(256*(long)C4WFYVal)/abs(C4WFXVal); - if (C4WFXVal<0) C4WFXVal=-256; - else C4WFXVal=256; - } - else - if (C4WFYVal!=0) { - C4WFDist=abs(C4WFYVal)+1; - C4WFXVal=(256*(long)C4WFXVal)/abs(C4WFYVal); - if (C4WFYVal<0) C4WFYVal=-256; - else C4WFYVal=256; - } - else C4WFDist=0; -} - -short C41FXVal; -short C41FYVal; -short C41FAngleRes; -short C41FDist; -short C41FDistVal; - -void C4Op1F() -{ - if (C41FXVal == 0) { - if (C41FYVal>0) C41FAngleRes=0x80; - else C41FAngleRes=0x180; - } - else { - tanval = ((double)C41FYVal)/((double)C41FXVal); - C41FAngleRes=(short)(atan(tanval)/(PI*2)*512); - C41FAngleRes=C41FAngleRes; - if (C41FXVal<0) C41FAngleRes+=0x100; - C41FAngleRes&=0x1FF; - } -} - -void C4Op15() -{ - tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* - ((double)C41FXVal)); - C41FDist=(short)tanval; -} - -void C4Op0D() -{ - tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* - ((double)C41FXVal)); - tanval=(double)C41FDistVal/tanval; - C41FYVal=(short)(((double)C41FYVal*tanval)*0.99); - C41FXVal=(short)(((double)C41FXVal*tanval)*0.98); -} -#endif - /***************************************************************************\ * DSP1 code * \***************************************************************************/ diff --git a/zsnes/src/cpu/memory.asm b/zsnes/src/cpu/memory.asm index cc667e77..c7103c2a 100644 --- a/zsnes/src/cpu/memory.asm +++ b/zsnes/src/cpu/memory.asm @@ -26,7 +26,7 @@ EXTSYM C4WFXVal,C4WFYVal,C4WFX2Val,C4WFY2Val,C4CalcWireFrame EXTSYM C4WFDist,C4WFScale,C4TransfWireFrame,C4WFZVal EXTSYM debstop3 EXTSYM C41FXVal,C41FYVal,C41FAngleRes,C41FDist,C4Op1F,C4Op15 -EXTSYM C41FDistVal,C4Op0D +EXTSYM C41FDistVal,C4Op0D,C4Op22,SinTable,CosTable EXTSYM SFXEnable,regptra,sfxramdata,snesmmap,wramdataa,debstop,C4Ram,C4Enable EXTSYM C4RamR,C4RamW,snesmap2,SPC7110Enable EXTSYM DSP1Read16b @@ -2059,95 +2059,13 @@ C4activate: .dowireframe call WireFrameB ret + .linearray pushad - ; C,F,0,3,6,9 -> 6800 (E1h bytes) - ; 0,3 = screen scroll coordinates - ; 6,9 = light source coordinates - ; C,F = angle of both arrays - mov esi,[C4Ram] - xor ecx,ecx -.loopline - ; process position - xor eax,eax - mov al,[esi+1F8Ch] - or ecx,ecx - jz .secondlineb - mov al,[esi+1F8Fh] -.secondlineb - test al,80h - jz .notua - or ah,1 -.notua - movsx ebx,word[CosTable+eax*2] - mov ax,word[SinTable+eax*2] - shl eax,16 - cmp ebx,0 - je near .finish - xor edx,edx - test eax,80000000h - jz .notnegline - mov edx,0FFFFFFFFh -.notnegline - idiv ebx - mov [C4Temp],eax - xor edx,edx - mov bx,[esi+1F83h] - sub bx,[esi+1F89h] - dec bx - movsx ebx,bx -.nextline - test ebx,80000000h - jnz .none - mov eax,[C4Temp] - imul eax,ebx - sar eax,16 - sub ax,[esi+1F80h] - add ax,[esi+1F86h] - inc ax - add ax,cx - cmp ax,0 - jge .not0line - xor ax,ax - or ecx,ecx - jz .not0line - mov byte[esi+edx+$800],1 -.not0line - cmp ax,255 - jl .not255line - mov ax,255 -.not255line - jmp .doneline -.none - mov al,1 - sub al,cl -.doneline - or ecx,ecx - jnz .secondline - mov [esi+edx+$800],al - jmp .firstline -.secondline - mov [esi+edx+$900],al -.firstline - inc ebx - inc edx - cmp edx,0E1h - jne .nextline - or ecx,ecx - jnz .finish - mov ecx,1 - jmp .loopline -.finish - mov cx,[C4Temp] -; mov [C4values],cx - mov cx,[C4Temp+2] -; mov [C4values+2],cx - mov cx,[esi+1F8Ch] -; mov [C4values+4],cx - mov cx,[esi+1F8Fh] -; mov [C4values+6],cx + call C4Op22 popad ret + .propulsion pushad ; 81 = 5B, 83 = 0x300 @@ -2532,110 +2450,6 @@ NEWSYM C4WriteReg ret -section .data -SinTable: -dw $00000,$00192,$00324,$004B6,$00647,$007D9,$0096A,$00AFB,$00C8B,$00E1B,$00FAB -dw $01139,$012C8,$01455,$015E2,$0176D,$018F8,$01A82,$01C0B,$01D93,$01F19,$0209F -dw $02223,$023A6,$02528,$026A8,$02826,$029A3,$02B1F,$02C98,$02E11,$02F87,$030FB -dw $0326E,$033DE,$0354D,$036BA,$03824,$0398C,$03AF2,$03C56,$03DB8,$03F17,$04073 -dw $041CE,$04325,$0447A,$045CD,$0471C,$04869,$049B4,$04AFB,$04C3F,$04D81,$04EBF -dw $04FFB,$05133,$05269,$0539B,$054CA,$055F5,$0571D,$05842,$05964,$05A82,$05B9D -dw $05CB4,$05DC7,$05ED7,$05FE3,$060EC,$061F1,$062F2,$063EF,$064E8,$065DD,$066CF -dw $067BD,$068A6,$0698C,$06A6D,$06B4A,$06C24,$06CF9,$06DCA,$06E96,$06F5F,$07023 -dw $070E2,$0719E,$07255,$07307,$073B5,$0745F,$07504,$075A5,$07641,$076D9,$0776C -dw $077FA,$07884,$07909,$0798A,$07A05,$07A7D,$07AEF,$07B5D,$07BC5,$07C29,$07C89 -dw $07CE3,$07D39,$07D8A,$07DD6,$07E1D,$07E5F,$07E9D,$07ED5,$07F09,$07F38,$07F62 -dw $07F87,$07FA7,$07FC2,$07FD8,$07FE9,$07FF6,$07FFD,$07FFF,$07FFD,$07FF6,$07FE9 -dw $07FD8,$07FC2,$07FA7,$07F87,$07F62,$07F38,$07F09,$07ED5,$07E9D,$07E5F,$07E1D -dw $07DD6,$07D8A,$07D39,$07CE3,$07C89,$07C29,$07BC5,$07B5D,$07AEF,$07A7D,$07A05 -dw $0798A,$07909,$07884,$077FA,$0776C,$076D9,$07641,$075A5,$07504,$0745F,$073B5 -dw $07307,$07255,$0719E,$070E2,$07023,$06F5F,$06E96,$06DCA,$06CF9,$06C24,$06B4A -dw $06A6D,$0698C,$068A6,$067BD,$066CF,$065DD,$064E8,$063EF,$062F2,$061F1,$060EC -dw $05FE3,$05ED7,$05DC7,$05CB4,$05B9D,$05A82,$05964,$05842,$0571D,$055F5,$054CA -dw $0539B,$05269,$05133,$04FFB,$04EBF,$04D81,$04C3F,$04AFB,$049B4,$04869,$0471C -dw $045CD,$0447A,$04325,$041CE,$04073,$03F17,$03DB8,$03C56,$03AF2,$0398C,$03824 -dw $036BA,$0354D,$033DE,$0326E,$030FB,$02F87,$02E11,$02C98,$02B1F,$029A3,$02826 -dw $026A8,$02528,$023A6,$02223,$0209F,$01F19,$01D93,$01C0B,$01A82,$018F8,$0176D -dw $015E2,$01455,$012C8,$01139,$00FAB,$00E1B,$00C8B,$00AFB,$0096A,$007D9,$00647 -dw $004B6,$00324,$00192 -dw $00000,$0FE6E,$0FCDC,$0FB4A,$0F9B9,$0F827,$0F696,$0F505,$0F375,$0F1E5,$0F055 -dw $0EEC7,$0ED38,$0EBAB,$0EA1E,$0E893,$0E708,$0E57E,$0E3F5,$0E26D,$0E0E7,$0DF61 -dw $0DDDD,$0DC5A,$0DAD8,$0D958,$0D7DA,$0D65D,$0D4E1,$0D368,$0D1EF,$0D079,$0CF05 -dw $0CD92,$0CC22,$0CAB3,$0C946,$0C7DC,$0C674,$0C50E,$0C3AA,$0C248,$0C0E9,$0BF8D -dw $0BE32,$0BCDB,$0BB86,$0BA33,$0B8E4,$0B797,$0B64C,$0B505,$0B3C1,$0B27F,$0B141 -dw $0B005,$0AECD,$0AD97,$0AC65,$0AB36,$0AA0B,$0A8E3,$0A7BE,$0A69C,$0A57E,$0A463 -dw $0A34C,$0A239,$0A129,$0A01D,$09F14,$09E0F,$09D0E,$09C11,$09B18,$09A23,$09931 -dw $09843,$0975A,$09674,$09593,$094B6,$093DC,$09307,$09236,$0916A,$090A1,$08FDD -dw $08F1E,$08E62,$08DAB,$08CF9,$08C4B,$08BA1,$08AFC,$08A5B,$089BF,$08927,$08894 -dw $08806,$0877C,$086F7,$08676,$085FB,$08583,$08511,$084A3,$0843B,$083D7,$08377 -dw $0831D,$082C7,$08276,$0822A,$081E3,$081A1,$08163,$0812B,$080F7,$080C8,$0809E -dw $08079,$08059,$0803E,$08028,$08017,$0800A,$08003,$08001,$08003,$0800A,$08017 -dw $08028,$0803E,$08059,$08079,$0809E,$080C8,$080F7,$0812B,$08163,$081A1,$081E3 -dw $0822A,$08276,$082C7,$0831D,$08377,$083D7,$0843B,$084A3,$08511,$08583,$085FB -dw $08676,$086F7,$0877C,$08806,$08894,$08927,$089BF,$08A5B,$08AFC,$08BA1,$08C4B -dw $08CF9,$08DAB,$08E62,$08F1E,$08FDD,$090A1,$0916A,$09236,$09307,$093DC,$094B6 -dw $09593,$09674,$0975A,$09843,$09931,$09A23,$09B18,$09C11,$09D0E,$09E0F,$09F14 -dw $0A01D,$0A129,$0A239,$0A34C,$0A463,$0A57E,$0A69C,$0A7BE,$0A8E3,$0AA0B,$0AB36 -dw $0AC65,$0AD97,$0AECD,$0B005,$0B141,$0B27F,$0B3C1,$0B505,$0B64C,$0B797,$0B8E4 -dw $0BA33,$0BB86,$0BCDB,$0BE32,$0BF8D,$0C0E9,$0C248,$0C3AA,$0C50E,$0C674,$0C7DC -dw $0C946,$0CAB3,$0CC22,$0CD92,$0CF05,$0D079,$0D1EF,$0D368,$0D4E1,$0D65D,$0D7DA -dw $0D958,$0DAD8,$0DC5A,$0DDDD,$0DF61,$0E0E7,$0E26D,$0E3F5,$0E57E,$0E708,$0E893 -dw $0EA1E,$0EBAB,$0ED38,$0EEC7,$0F055,$0F1E5,$0F375,$0F505,$0F696,$0F827,$0F9B9 -dw $0FB4A,$0FCDC,$0FE6E - - -CosTable: -dw $07FFF,$07FFD,$07FF6,$07FE9,$07FD8,$07FC2,$07FA7,$07F87,$07F62,$07F38,$07F09 -dw $07ED5,$07E9D,$07E5F,$07E1D,$07DD6,$07D8A,$07D39,$07CE3,$07C89,$07C29,$07BC5 -dw $07B5D,$07AEF,$07A7D,$07A05,$0798A,$07909,$07884,$077FA,$0776C,$076D9,$07641 -dw $075A5,$07504,$0745F,$073B5,$07307,$07255,$0719E,$070E2,$07023,$06F5F,$06E96 -dw $06DCA,$06CF9,$06C24,$06B4A,$06A6D,$0698C,$068A6,$067BD,$066CF,$065DD,$064E8 -dw $063EF,$062F2,$061F1,$060EC,$05FE3,$05ED7,$05DC7,$05CB4,$05B9D,$05A82,$05964 -dw $05842,$0571D,$055F5,$054CA,$0539B,$05269,$05133,$04FFB,$04EBF,$04D81,$04C3F -dw $04AFB,$049B4,$04869,$0471C,$045CD,$0447A,$04325,$041CE,$04073,$03F17,$03DB8 -dw $03C56,$03AF2,$0398C,$03824,$036BA,$0354D,$033DE,$0326E,$030FB,$02F87,$02E11 -dw $02C98,$02B1F,$029A3,$02826,$026A8,$02528,$023A6,$02223,$0209F,$01F19,$01D93 -dw $01C0B,$01A82,$018F8,$0176D,$015E2,$01455,$012C8,$01139,$00FAB,$00E1B,$00C8B -dw $00AFB,$0096A,$007D9,$00647,$004B6,$00324,$00192,$00000,$0FE6E,$0FCDC,$0FB4A -dw $0F9B9,$0F827,$0F696,$0F505,$0F375,$0F1E5,$0F055,$0EEC7,$0ED38,$0EBAB,$0EA1E -dw $0E893,$0E708,$0E57E,$0E3F5,$0E26D,$0E0E7,$0DF61,$0DDDD,$0DC5A,$0DAD8,$0D958 -dw $0D7DA,$0D65D,$0D4E1,$0D368,$0D1EF,$0D079,$0CF05,$0CD92,$0CC22,$0CAB3,$0C946 -dw $0C7DC,$0C674,$0C50E,$0C3AA,$0C248,$0C0E9,$0BF8D,$0BE32,$0BCDB,$0BB86,$0BA33 -dw $0B8E4,$0B797,$0B64C,$0B505,$0B3C1,$0B27F,$0B141,$0B005,$0AECD,$0AD97,$0AC65 -dw $0AB36,$0AA0B,$0A8E3,$0A7BE,$0A69C,$0A57E,$0A463,$0A34C,$0A239,$0A129,$0A01D -dw $09F14,$09E0F,$09D0E,$09C11,$09B18,$09A23,$09931,$09843,$0975A,$09674,$09593 -dw $094B6,$093DC,$09307,$09236,$0916A,$090A1,$08FDD,$08F1E,$08E62,$08DAB,$08CF9 -dw $08C4B,$08BA1,$08AFC,$08A5B,$089BF,$08927,$08894,$08806,$0877C,$086F7,$08676 -dw $085FB,$08583,$08511,$084A3,$0843B,$083D7,$08377,$0831D,$082C7,$08276,$0822A -dw $081E3,$081A1,$08163,$0812B,$080F7,$080C8,$0809E,$08079,$08059,$0803E,$08028 -dw $08017,$0800A,$08003 -dw $08001,$08003,$0800A,$08017,$08028,$0803E,$08059,$08079,$0809E,$080C8,$080F7, -dw $0812B,$08163,$081A1,$081E3,$0822A,$08276,$082C7,$0831D,$08377,$083D7,$0843B, -dw $084A3,$08511,$08583,$085FB,$08676,$086F7,$0877C,$08806,$08894,$08927,$089BF, -dw $08A5B,$08AFC,$08BA1,$08C4B,$08CF9,$08DAB,$08E62,$08F1E,$08FDD,$090A1,$0916A, -dw $09236,$09307,$093DC,$094B6,$09593,$09674,$0975A,$09843,$09931,$09A23,$09B18, -dw $09C11,$09D0E,$09E0F,$09F14,$0A01D,$0A129,$0A239,$0A34C,$0A463,$0A57E,$0A69C, -dw $0A7BE,$0A8E3,$0AA0B,$0AB36,$0AC65,$0AD97,$0AECD,$0B005,$0B141,$0B27F,$0B3C1, -dw $0B505,$0B64C,$0B797,$0B8E4,$0BA33,$0BB86,$0BCDB,$0BE32,$0BF8D,$0C0E9,$0C248, -dw $0C3AA,$0C50E,$0C674,$0C7DC,$0C946,$0CAB3,$0CC22,$0CD92,$0CF05,$0D079,$0D1EF, -dw $0D368,$0D4E1,$0D65D,$0D7DA,$0D958,$0DAD8,$0DC5A,$0DDDD,$0DF61,$0E0E7,$0E26D, -dw $0E3F5,$0E57E,$0E708,$0E893,$0EA1E,$0EBAB,$0ED38,$0EEC7,$0F055,$0F1E5,$0F375, -dw $0F505,$0F696,$0F827,$0F9B9,$0FB4A,$0FCDC,$0FE6E,$00000,$00192,$00324,$004B6, -dw $00647,$007D9,$0096A,$00AFB,$00C8B,$00E1B,$00FAB,$01139,$012C8,$01455,$015E2, -dw $0176D,$018F8,$01A82,$01C0B,$01D93,$01F19,$0209F,$02223,$023A6,$02528,$026A8, -dw $02826,$029A3,$02B1F,$02C98,$02E11,$02F87,$030FB,$0326E,$033DE,$0354D,$036BA, -dw $03824,$0398C,$03AF2,$03C56,$03DB8,$03F17,$04073,$041CE,$04325,$0447A,$045CD, -dw $0471C,$04869,$049B4,$04AFB,$04C3F,$04D81,$04EBF,$04FFB,$05133,$05269,$0539B, -dw $054CA,$055F5,$0571D,$05842,$05964,$05A82,$05B9D,$05CB4,$05DC7,$05ED7,$05FE3, -dw $060EC,$061F1,$062F2,$063EF,$064E8,$065DD,$066CF,$067BD,$068A6,$0698C,$06A6D, -dw $06B4A,$06C24,$06CF9,$06DCA,$06E96,$06F5F,$07023,$070E2,$0719E,$07255,$07307, -dw $073B5,$0745F,$07504,$075A5,$07641,$076D9,$0776C,$077FA,$07884,$07909,$0798A, -dw $07A05,$07A7D,$07AEF,$07B5D,$07BC5,$07C29,$07C89,$07CE3,$07D39,$07D8A,$07DD6, -dw $07E1D,$07E5F,$07E9D,$07ED5,$07F09,$07F38,$07F62,$07F87,$07FA7,$07FC2,$07FD8, -dw $07FE9,$07FF6,$07FFD - -section .text - NEWSYM regaccessbankr8 test ecx,8000h jz .regacc diff --git a/zsnes/src/makefile.ms b/zsnes/src/makefile.ms index f53fd692..3fa4eb97 100644 --- a/zsnes/src/makefile.ms +++ b/zsnes/src/makefile.ms @@ -108,7 +108,7 @@ CHIPSOBJ=${CHIPDIR}/dsp1emu${OE} ${CHIPDIR}/fxemu2${OE} ${CHIPDIR}/sfxproc${OE}\ ${CHIPDIR}/fxemu2b${OE} ${CHIPDIR}/fxemu2c${OE} ${CHIPDIR}/fxtable${OE}\ ${CHIPDIR}/sa1proc${OE} ${CHIPDIR}/sa1regs${OE} ${CHIPDIR}/dsp1proc${OE}\ ${CHIPDIR}/st10proc${OE} ${CHIPDIR}/seta10${OE} ${CHIPDIR}/dsp2proc${OE}\ - ${CHIPDIR}/sdd1emu${OE} + ${CHIPDIR}/sdd1emu${OE} ${CHIPDIR}/c4emu${OE} CPUOBJ=${CPUDIR}/dma${OE} ${CPUDIR}/dsp${OE} ${CPUDIR}/dspproc${OE}\ ${CPUDIR}/execute${OE} ${CPUDIR}/executec${OE} ${CPUDIR}/irq${OE}\ @@ -260,10 +260,11 @@ ${CHIPDIR}/sfxproc${OE}: $< macros.mac ${CPUDIR}/regs.mac ${CPUDIR}/regsw.mac ${CHIPDIR}/dsp1emu${OE}: $< ${CHIPDIR}/st10proc${OE}: $< ${CHIPDIR}/seta10${OE}: $< +${CHIPDIR}/c4emu${OE}: $< ${CHIPDIR}/sdd1emu${OE}: $< ${CHIPDIR}/fxemu2${OE}: $< ${CHIPDIR}/fxemu2.mac macros.mac -${CHIPSDIR}/fxemu2b${OE}: $< ${CHIPDIR}/fxemu2.mac ${CHIPDIR}/fxemu2b.mac -${CHIPSDIR}/fxemu2c${OE}: $< macros.mac ${CHIPDIR}/fxemu2.mac ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac +${CHIPDIR}/fxemu2b${OE}: $< ${CHIPDIR}/fxemu2.mac ${CHIPDIR}/fxemu2b.mac +${CHIPDIR}/fxemu2c${OE}: $< macros.mac ${CHIPDIR}/fxemu2.mac ${CHIPDIR}/fxemu2b.mac ${CHIPDIR}/fxemu2c.mac ${CHIPDIR}/fxtable${OE}: $< macros.mac ${CHIPDIR}/sa1proc${OE}: $< macros.mac