diff --git a/src/engine/platform/sm8521.cpp b/src/engine/platform/sm8521.cpp index db2584c14..c72abcd9a 100644 --- a/src/engine/platform/sm8521.cpp +++ b/src/engine/platform/sm8521.cpp @@ -24,7 +24,7 @@ //#define rWrite(a,v) pendingWrites[a]=v; #define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } -#define CHIP_DIVIDER 16 +#define CHIP_DIVIDER 64 const char* regCheatSheetSM8521[]={ "SGC", "40", @@ -55,11 +55,12 @@ void DivPlatformSM8521::acquire(short** buf, size_t len) { writes.pop(); } for (size_t h=0; hdata[oscBuf[i]->needle++]=sm8521.sg[i].base.out; + oscBuf[i]->data[oscBuf[i]->needle++]=sm8521.sg[i].base.out<<6; } - oscBuf[2]->data[oscBuf[2]->needle++]=sm8521.noise.base.out; + oscBuf[2]->data[oscBuf[2]->needle++]=sm8521.noise.base.out<<6; } } @@ -80,6 +81,7 @@ void DivPlatformSM8521::updateWave(int ch) { } void DivPlatformSM8521::tick(bool sysTick) { + unsigned char keyState=0x80; for (int i=0; i<3; i++) { // anti-click if (antiClickEnabled && sysTick && chan[i].freq>0) { @@ -151,6 +153,15 @@ void DivPlatformSM8521::tick(bool sysTick) { if (chan[i].keyOff) chan[i].keyOff=false; chan[i].freqChanged=false; } + if (!isMuted[i] && chan[i].active) { + keyState|=(1<song.brokenOutVol && !chan[c.chan].std.vol.will) { chan[c.chan].outVol=chan[c.chan].vol; } - if (!isMuted[c.chan]) { - rWrite(0x40,regPool[0x40]|0x80|(1<rate=rate; } diff --git a/src/engine/platform/sound/sm8521.h b/src/engine/platform/sound/sm8521.h index 6577df004..c430ebd4e 100644 --- a/src/engine/platform/sound/sm8521.h +++ b/src/engine/platform/sound/sm8521.h @@ -48,7 +48,7 @@ struct sm8521_sg_t { unsigned short t; // Time constant register unsigned char level; // Output level control register - unsigned short out; // output + signed short out; // output int counter; // clock counter };