diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index ad955cf98..25b5077b2 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -27,6 +27,8 @@ #define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define chWrite(c,a,v) {rWrite((a)+(c)*16,v)} +#define rWriteDelay(a,v,d) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v,d)); if (dumpWrites) {addWrite(a,v);} } +#define chWriteDelay(c,a,v,d) {rWrite((a)+(c)*16,v,d)} #define sampleTableAddr(c) (sampleTableBase+(c)*4) #define waveTableAddr(c) (sampleTableBase+8*4+(c)*9*16) @@ -77,7 +79,7 @@ void DivPlatformSNES::acquire(short** buf, size_t len) { dsp.write(w.addr,w.val); regPool[w.addr&0x7f]=w.val; writes.pop(); - delay=(w.addr==0x5c)?8:1; + delay=w.delay; } } dsp.set_output(out,1); @@ -253,7 +255,7 @@ void DivPlatformSNES::tick(bool sysTick) { } } if (koff!=0) { - rWrite(0x5c,koff); + rWriteDelay(0x5c,koff,8); } if (writeControl) { unsigned char control=(noiseFreq&0x1f)|(echoOn?0:0x20); @@ -314,7 +316,7 @@ void DivPlatformSNES::tick(bool sysTick) { } } if (koff!=0) { - rWrite(0x5c,0); + rWriteDelay(0x5c,0,8); } if (kon!=0) { rWrite(0x4c,kon); @@ -1027,6 +1029,7 @@ void DivPlatformSNES::setFlags(const DivConfig& flags) { initEchoMask=flags.getInt("echoMask",0); interpolationOff=flags.getBool("interpolationOff",false); + antiClick=flags.getBool("antiClick",true); } int DivPlatformSNES::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { diff --git a/src/engine/platform/snes.h b/src/engine/platform/snes.h index 8c8329065..6426cf395 100644 --- a/src/engine/platform/snes.h +++ b/src/engine/platform/snes.h @@ -70,6 +70,7 @@ class DivPlatformSNES: public DivDispatch { bool writeDryVol; bool echoOn; bool interpolationOff; + bool antiClick; bool initEchoOn; signed char initEchoVolL; @@ -82,8 +83,10 @@ class DivPlatformSNES: public DivDispatch { struct QueuedWrite { unsigned char addr; unsigned char val; - QueuedWrite(): addr(0), val(0) {} - QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} + unsigned char delay; + unsigned char padding; + QueuedWrite(): addr(0), val(0), delay(0), padding(0) {} + QueuedWrite(unsigned char a, unsigned char v, unsigned char d=0): addr(a), val(v), delay(d), padding(0) {} }; FixedQueue writes;