diff --git a/src/engine/engine.h b/src/engine/engine.h index 7705b2596..a443a9e76 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -53,8 +53,8 @@ #define EXTERN_BUSY_BEGIN_SOFT e->softLocked=true; e->isBusy.lock(); #define EXTERN_BUSY_END e->isBusy.unlock(); e->softLocked=false; -#define DIV_VERSION "dev153" -#define DIV_ENGINE_VERSION 153 +#define DIV_VERSION "dev154" +#define DIV_ENGINE_VERSION 154 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index c184d20ac..0b2e206c7 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -1040,6 +1040,11 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ds.systemFlags[0].set("noEasyNoise",true); } + // NES PCM + if (ds.system[0]==DIV_SYSTEM_NES) { + ds.systemFlags[0].set("dpcmMode",false); + } + ds.systemName=getSongSystemLegacyName(ds,!getConfInt("noMultiSystem",0)); if (active) quitDispatch(); @@ -2724,6 +2729,15 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } } + // NES PCM compat + if (ds.version<154) { + for (int i=0; igetSample(dacSample)->lengthDPCM+15)>>4; + unsigned int dpcmLen=parent->getSample(dacSample)->lengthDPCM>>4; if (dpcmLen>255) dpcmLen=255; goingToLoop=parent->getSample(dacSample)->isLoopable(); // write DPCM @@ -655,7 +655,7 @@ void DivPlatformNES::reset() { dacSample=-1; sampleBank=0; dpcmBank=0; - dpcmMode=false; + dpcmMode=dpcmModeDefault; goingToLoop=false; countMode=false; @@ -709,6 +709,8 @@ void DivPlatformNES::setFlags(const DivConfig& flags) { for (int i=0; i<5; i++) { oscBuf[i]->rate=rate/32; } + + dpcmModeDefault=flags.getBool("dpcmMode",true); } void DivPlatformNES::notifyInsDeletion(void* ins) { diff --git a/src/engine/platform/nes.h b/src/engine/platform/nes.h index cb30dbf78..cbc08e2a1 100644 --- a/src/engine/platform/nes.h +++ b/src/engine/platform/nes.h @@ -53,6 +53,7 @@ class DivPlatformNES: public DivDispatch { unsigned char writeOscBuf; unsigned char apuType; bool dpcmMode; + bool dpcmModeDefault; bool dacAntiClickOn; bool useNP; bool goingToLoop; diff --git a/src/engine/sample.cpp b/src/engine/sample.cpp index 4259d9d4c..4f8f2fa3d 100644 --- a/src/engine/sample.cpp +++ b/src/engine/sample.cpp @@ -485,9 +485,9 @@ bool DivSample::initInternal(DivSampleDepth d, int count) { break; case DIV_SAMPLE_DEPTH_1BIT_DPCM: // DPCM if (dataDPCM!=NULL) delete[] dataDPCM; - lengthDPCM=(count+7)/8; + lengthDPCM=1+((((count+7)/8)+15)&(~15)); dataDPCM=new unsigned char[lengthDPCM]; - memset(dataDPCM,0,lengthDPCM); + memset(dataDPCM,0xaa,lengthDPCM); break; case DIV_SAMPLE_DEPTH_YMZ_ADPCM: // YMZ ADPCM if (dataZ!=NULL) delete[] dataZ; @@ -1092,12 +1092,14 @@ void DivSample::render(unsigned int formatMask) { if (NOT_IN_FORMAT(DIV_SAMPLE_DEPTH_1BIT_DPCM)) { // DPCM if (!initInternal(DIV_SAMPLE_DEPTH_1BIT_DPCM,samples)) return; int accum=63; + int next=63; for (unsigned int i=0; i>9; + next=((unsigned short)(data16[i]^0x8000))>>9; if (next>accum) { dataDPCM[i>>3]|=1<<(i&7); accum++; } else { + dataDPCM[i>>3]&=~(1<<(i&7)); accum--; } if (accum<0) accum=0; diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index 42fab2cbf..6afbf4188 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -699,7 +699,7 @@ void DivEngine::registerSystems() { sysDefs[DIV_SYSTEM_NES]=new DivSysDef( "NES (Ricoh 2A03)", NULL, 0x06, 0x06, 5, false, true, 0x161, false, (1U<lockSave([&]() { flags.set("clockSel",clockSel); + flags.set("dpcmMode",dpcmMode); }); } break;