diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac6c5e0e..afc43c49 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -76,6 +76,8 @@ additional guidelines: - I will run a test suite to make sure this is the case. - if something breaks, you might want to add a compatibility flag (this requires changing the format though). - do not use `#pragma once`. +- on a switch block, **always** put `default` last and not in any other position. + - I have fear of some C/C++ compilers ignoring the rest of cases upon hitting default. ## Demo Songs diff --git a/src/engine/config.cpp b/src/engine/config.cpp index 84fdd1ff..1c15f4af 100644 --- a/src/engine/config.cpp +++ b/src/engine/config.cpp @@ -48,6 +48,41 @@ String DivConfig::toString() { return ret; } +const char* base64Table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +String DivConfig::toBase64() { + String data=toString(); + String ret; + + ret.reserve((2+data.size()*4)/3); + + unsigned int groupOfThree=0; + unsigned char pos=0; + for (char& i: data) { + groupOfThree|=((unsigned char)i)<<((2-pos)<<3); + if (++pos>=3) { + pos=0; + ret+=base64Table[(groupOfThree>>18)&63]; + ret+=base64Table[(groupOfThree>>12)&63]; + ret+=base64Table[(groupOfThree>>6)&63]; + ret+=base64Table[groupOfThree&63]; + groupOfThree=0; + } + } + if (pos==2) { + ret+=base64Table[(groupOfThree>>18)&63]; + ret+=base64Table[(groupOfThree>>12)&63]; + ret+=base64Table[(groupOfThree>>6)&63]; + ret+='='; + } else if (pos==1) { + ret+=base64Table[(groupOfThree>>18)&63]; + ret+=base64Table[(groupOfThree>>12)&63]; + ret+="=="; + } + + return ret; +} + void DivConfig::parseLine(const char* line) { String key=""; String value=""; @@ -105,7 +140,41 @@ bool DivConfig::loadFromMemory(const char* buf) { return true; } -bool DivConfig::getBool(String key, bool fallback) { +bool DivConfig::loadFromBase64(const char* buf) { + String data; + + unsigned int groupOfThree=0; + signed char pos=18; + for (const char* i=buf; *i; i++) { + unsigned char nextVal=0; + if ((*i)=='/') { + nextVal=63; + } else if ((*i)=='+') { + nextVal=62; + } else if ((*i)>='0' && (*i)<='9') { + nextVal=52+((*i)-'0'); + } else if ((*i)>='a' && (*i)<='z') { + nextVal=26+((*i)-'a'); + } else if ((*i)>='A' && (*i)<='Z') { + nextVal=((*i)-'A'); + } else { + nextVal=0; + } + groupOfThree|=nextVal<>16)&0xff) data+=(groupOfThree>>16)&0xff; + if ((groupOfThree>>8)&0xff) data+=(groupOfThree>>8)&0xff; + if (groupOfThree&0xff) data+=groupOfThree&0xff; + groupOfThree=0; + } + } + + return loadFromMemory(data.c_str()); +} + +bool DivConfig::getBool(String key, bool fallback) const { try { String val=conf.at(key); if (val=="true") { @@ -118,7 +187,7 @@ bool DivConfig::getBool(String key, bool fallback) { return fallback; } -int DivConfig::getInt(String key, int fallback) { +int DivConfig::getInt(String key, int fallback) const { try { String val=conf.at(key); int ret=std::stoi(val); @@ -129,7 +198,7 @@ int DivConfig::getInt(String key, int fallback) { return fallback; } -float DivConfig::getFloat(String key, float fallback) { +float DivConfig::getFloat(String key, float fallback) const { try { String val=conf.at(key); float ret=std::stof(val); @@ -140,7 +209,7 @@ float DivConfig::getFloat(String key, float fallback) { return fallback; } -double DivConfig::getDouble(String key, double fallback) { +double DivConfig::getDouble(String key, double fallback) const { try { String val=conf.at(key); double ret=std::stod(val); @@ -151,7 +220,7 @@ double DivConfig::getDouble(String key, double fallback) { return fallback; } -String DivConfig::getString(String key, String fallback) { +String DivConfig::getString(String key, String fallback) const { try { String val=conf.at(key); return val; diff --git a/src/engine/config.h b/src/engine/config.h index 15ded011..d573a451 100644 --- a/src/engine/config.h +++ b/src/engine/config.h @@ -29,16 +29,18 @@ class DivConfig { public: // config loading/saving bool loadFromMemory(const char* buf); + bool loadFromBase64(const char* buf); bool loadFromFile(const char* path, bool createOnFail=true); String toString(); + String toBase64(); bool save(const char* path); // get a config value - bool getBool(String key, bool fallback); - int getInt(String key, int fallback); - float getFloat(String key, float fallback); - double getDouble(String key, double fallback); - String getString(String key, String fallback); + bool getBool(String key, bool fallback) const; + int getInt(String key, int fallback) const; + float getFloat(String key, float fallback) const; + double getDouble(String key, double fallback) const; + String getString(String key, String fallback) const; // set a config value void set(String key, bool value); diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index c7b75791..9484054b 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -23,6 +23,7 @@ #include #include #include +#include "config.h" #define ONE_SEMITONE 2200 @@ -434,9 +435,9 @@ class DivDispatch { /** * set the chip flags. - * @param flags the flags. see song.h for possible values. + * @param flags a DivConfig containing chip flags. */ - virtual void setFlags(unsigned int flags); + virtual void setFlags(const DivConfig& flags); /** * set skip reg writes. @@ -522,10 +523,10 @@ class DivDispatch { * @param parent the parent DivEngine. * @param channels the number of channels to acquire. * @param sugRate the suggested rate. this may change, so don't rely on it. - * @param flags the chip flags. see song.h for possible values. + * @param flags a DivConfig containing chip flags. * @return the number of channels allocated. */ - virtual int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + virtual int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); /** * quit the DivDispatch. diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index 1262d0a5..7a246da8 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -157,7 +157,7 @@ void DivDispatchContainer::clear() { prevSample[1]=temp[1];*/ } -void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, unsigned int flags) { +void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags) { if (dispatch!=NULL) return; bb[0]=blip_new(32768); diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index ce7f2a2a..5073fcf6 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -3467,12 +3467,77 @@ void DivEngine::setOrder(unsigned char order) { BUSY_END; } -void DivEngine::setSysFlags(int system, unsigned int flags, bool restart) { +void DivEngine::setSysFlags(int system, String key, bool value, bool restart) { BUSY_BEGIN_SOFT; saveLock.lock(); - song.systemFlagsOld[system]=flags; + song.systemFlags[system].set(key,value); saveLock.unlock(); - disCont[system].dispatch->setFlags(song.systemFlagsOld[system]); + disCont[system].dispatch->setFlags(song.systemFlags[system]); + disCont[system].setRates(got.rate); + if (restart && isPlaying()) { + playSub(false); + } + BUSY_END; +} + +void DivEngine::setSysFlags(int system, String key, int value, bool restart) { + BUSY_BEGIN_SOFT; + saveLock.lock(); + song.systemFlags[system].set(key,value); + saveLock.unlock(); + disCont[system].dispatch->setFlags(song.systemFlags[system]); + disCont[system].setRates(got.rate); + if (restart && isPlaying()) { + playSub(false); + } + BUSY_END; +} + +void DivEngine::setSysFlags(int system, String key, float value, bool restart) { + BUSY_BEGIN_SOFT; + saveLock.lock(); + song.systemFlags[system].set(key,value); + saveLock.unlock(); + disCont[system].dispatch->setFlags(song.systemFlags[system]); + disCont[system].setRates(got.rate); + if (restart && isPlaying()) { + playSub(false); + } + BUSY_END; +} + +void DivEngine::setSysFlags(int system, String key, double value, bool restart) { + BUSY_BEGIN_SOFT; + saveLock.lock(); + song.systemFlags[system].set(key,value); + saveLock.unlock(); + disCont[system].dispatch->setFlags(song.systemFlags[system]); + disCont[system].setRates(got.rate); + if (restart && isPlaying()) { + playSub(false); + } + BUSY_END; +} + +void DivEngine::setSysFlags(int system, String key, const char* value, bool restart) { + BUSY_BEGIN_SOFT; + saveLock.lock(); + song.systemFlags[system].set(key,value); + saveLock.unlock(); + disCont[system].dispatch->setFlags(song.systemFlags[system]); + disCont[system].setRates(got.rate); + if (restart && isPlaying()) { + playSub(false); + } + BUSY_END; +} + +void DivEngine::setSysFlags(int system, String key, String value, bool restart) { + BUSY_BEGIN_SOFT; + saveLock.lock(); + song.systemFlags[system].set(key,value); + saveLock.unlock(); + disCont[system].dispatch->setFlags(song.systemFlags[system]); disCont[system].setRates(got.rate); if (restart && isPlaying()) { playSub(false); @@ -3630,7 +3695,7 @@ void DivEngine::rescanAudioDevices() { void DivEngine::initDispatch() { BUSY_BEGIN; for (int i=0; i>24)&255)); break; case DIV_SYSTEM_PCM_DAC: + if (!oldFlags) oldFlags=0x1f0000|44099; newFlags.set("rate",(int)((oldFlags&0xffff)+1)); newFlags.set("outDepth",(int)((oldFlags>>16)&15)); if (oldFlags&0x100000) newFlags.set("stereo",true); @@ -2982,7 +2983,10 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { ds.systemLen=(chCount+3)/4; for(int i=0; i1 || bypassLimits)?2:0); // PAL + ds.systemFlags[i].set("clockSel",1); // PAL + ds.systemFlags[i].set("stereoSep",80); + ds.systemFlags[i].set("bypassLimits",bypassLimits); + ds.systemFlags[i].set("chipType",(bool)(ds.systemLen>1 || bypassLimits)); } for(int i=0; ichanShow[i]=true; @@ -3188,7 +3192,8 @@ bool DivEngine::loadFC(unsigned char* file, size_t len) { ds.system[0]=DIV_SYSTEM_AMIGA; ds.systemVol[0]=64; ds.systemPan[0]=0; - ds.systemFlagsOld[0]=1|(80<<8); // PAL + ds.systemFlags[0].set("clockSel",1); // PAL + ds.systemFlags[0].set("stereoSep",80); ds.systemName="Amiga"; seqLen=reader.readI_BE(); @@ -3828,11 +3833,11 @@ bool DivEngine::loadFTM(unsigned char* file, size_t len) { } if (expansions&16) { ds.system[systemID]=DIV_SYSTEM_N163; - ds.systemFlagsOld[systemID++]=n163Chans; + ds.systemFlags[systemID++].set("channels",(int)n163Chans); } if (expansions&32) { ds.system[systemID]=DIV_SYSTEM_AY8910; - ds.systemFlagsOld[systemID++]=38; // Sunsoft 5B + ds.systemFlags[systemID++].set("chipType",2); // Sunsoft 5B } ds.systemLen=systemID; diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 358e54aa..746e8e80 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -94,7 +94,7 @@ bool DivDispatch::getWantPreNote() { return false; } -void DivDispatch::setFlags(unsigned int flags) { +void DivDispatch::setFlags(const DivConfig& flags) { } void DivDispatch::setSkipRegisterWrites(bool value) { @@ -157,7 +157,7 @@ void DivDispatch::renderSamples() { } -int DivDispatch::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivDispatch::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { return 0; } diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 7a49fccf..85e0e855 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -427,8 +427,8 @@ void DivPlatformAmiga::notifyInsDeletion(void* ins) { } } -void DivPlatformAmiga::setFlags(unsigned int flags) { - if (flags&1) { +void DivPlatformAmiga::setFlags(const DivConfig& flags) { + if (flags.getInt("clockSel",0)) { chipClock=COLOR_PAL*4.0/5.0; } else { chipClock=COLOR_NTSC; @@ -437,10 +437,11 @@ void DivPlatformAmiga::setFlags(unsigned int flags) { for (int i=0; i<4; i++) { oscBuf[i]->rate=rate; } - sep1=((flags>>8)&127)+127; - sep2=127-((flags>>8)&127); - amigaModel=flags&2; - bypassLimits=flags&4; + int sep=flags.getInt("stereoSep",0)&127; + sep1=sep+127; + sep2=127-sep; + amigaModel=flags.getInt("chipType",0); + bypassLimits=flags.getBool("bypassLimits",false); if (amigaModel) { filtConstOff=4000; filtConstOn=sin(M_PI*8000.0/(double)rate)*4096.0; @@ -450,7 +451,7 @@ void DivPlatformAmiga::setFlags(unsigned int flags) { } } -int DivPlatformAmiga::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformAmiga::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/amiga.h b/src/engine/platform/amiga.h index a0a80d6c..1b509d1b 100644 --- a/src/engine/platform/amiga.h +++ b/src/engine/platform/amiga.h @@ -101,12 +101,12 @@ class DivPlatformAmiga: public DivDispatch { bool isStereo(); bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); }; diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index aaf64e07..ee003b54 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -849,13 +849,8 @@ void DivPlatformArcade::reset() { //rWrite(0x1b,0x00); } -void DivPlatformArcade::setFlags(unsigned int flags) { - switch (flags&0xff) { - default: - case 0: - chipClock=COLOR_NTSC; - baseFreqOff=0; - break; +void DivPlatformArcade::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { case 1: chipClock=COLOR_PAL*4.0/5.0; baseFreqOff=12; @@ -864,6 +859,10 @@ void DivPlatformArcade::setFlags(unsigned int flags) { chipClock=4000000.0; baseFreqOff=-122; break; + default: + chipClock=COLOR_NTSC; + baseFreqOff=0; + break; } rate=chipClock/64; for (int i=0; i<8; i++) { @@ -879,7 +878,7 @@ void DivPlatformArcade::setYMFM(bool use) { useYMFM=use; } -int DivPlatformArcade::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformArcade::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/arcade.h b/src/engine/platform/arcade.h index 70265be3..eee273df 100644 --- a/src/engine/platform/arcade.h +++ b/src/engine/platform/arcade.h @@ -111,13 +111,13 @@ class DivPlatformArcade: public DivPlatformOPM { void muteChannel(int ch, bool mute); DivMacroInt* getChanMacroInt(int ch); void notifyInsChange(int ins); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); bool isStereo(); void setYMFM(bool use); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformArcade(); }; diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index 05fdfa57..b01d6a9f 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -772,17 +772,13 @@ void DivPlatformAY8910::setExtClockDiv(unsigned int eclk, unsigned char ediv) { } } -void DivPlatformAY8910::setFlags(unsigned int flags) { +void DivPlatformAY8910::setFlags(const DivConfig& flags) { if (extMode) { chipClock=extClock; rate=chipClock/extDiv; } else { - clockSel=(flags>>7)&1; - switch (flags&15) { - default: - case 0: - chipClock=COLOR_NTSC/2.0; - break; + clockSel=flags.getBool("halfClock",false); + switch (flags.getInt("clockSel",0)) { case 1: chipClock=COLOR_PAL*2.0/5.0; break; @@ -825,6 +821,9 @@ void DivPlatformAY8910::setFlags(unsigned int flags) { case 14: chipClock=1536000; break; + default: + chipClock=COLOR_NTSC/2.0; + break; } rate=chipClock/8; } @@ -833,7 +832,7 @@ void DivPlatformAY8910::setFlags(unsigned int flags) { } if (ay!=NULL) delete ay; - switch ((flags>>4)&3) { + switch (flags.getInt("chipType",0)) { case 1: ay=new ym2149_device(rate,clockSel); sunsoft=false; @@ -858,11 +857,11 @@ void DivPlatformAY8910::setFlags(unsigned int flags) { ay->device_start(); ay->device_reset(); - stereo=(flags>>6)&1; - stereoSep=(flags>>8)&255; + stereo=flags.getBool("stereo",false); + stereoSep=flags.getInt("stereoSep",0)&255; } -int DivPlatformAY8910::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformAY8910::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/ay.h b/src/engine/platform/ay.h index 854eb5fb..d28eac1b 100644 --- a/src/engine/platform/ay.h +++ b/src/engine/platform/ay.h @@ -162,7 +162,7 @@ class DivPlatformAY8910: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); bool isStereo(); bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); @@ -171,7 +171,7 @@ class DivPlatformAY8910: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformAY8910(bool useExtMode=false, unsigned int eclk=COLOR_NTSC, unsigned char ediv=8): DivDispatch(), diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 9a1067fe..821fa4fe 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -761,9 +761,9 @@ void DivPlatformAY8930::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) immWrite(i.addr,i.val); } -void DivPlatformAY8930::setFlags(unsigned int flags) { - clockSel=(flags>>7)&1; - switch (flags&15) { +void DivPlatformAY8930::setFlags(const DivConfig& flags) { + clockSel=flags.getBool("halfClock",false); + switch (flags.getInt("clockSel",0)) { case 1: chipClock=COLOR_PAL*2.0/5.0; break; @@ -809,11 +809,11 @@ void DivPlatformAY8930::setFlags(unsigned int flags) { oscBuf[i]->rate=rate; } - stereo=(flags>>6)&1; - stereoSep=(flags>>8)&255; + stereo=flags.getBool("stereo",false); + stereoSep=flags.getInt("stereoSep",0)&255; } -int DivPlatformAY8930::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformAY8930::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/ay8930.h b/src/engine/platform/ay8930.h index fa4b83d9..3663ee99 100644 --- a/src/engine/platform/ay8930.h +++ b/src/engine/platform/ay8930.h @@ -164,7 +164,7 @@ class DivPlatformAY8930: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); bool isStereo(); bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); @@ -172,7 +172,7 @@ class DivPlatformAY8930: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); }; #endif diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index 89d609ce..c00b4ce2 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -321,7 +321,7 @@ void DivPlatformBubSysWSG::notifyInsDeletion(void* ins) { } } -void DivPlatformBubSysWSG::setFlags(unsigned int flags) { +void DivPlatformBubSysWSG::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC; rate=chipClock; for (int i=0; i<2; i++) { @@ -337,7 +337,7 @@ void DivPlatformBubSysWSG::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformBubSysWSG::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformBubSysWSG::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/bubsyswsg.h b/src/engine/platform/bubsyswsg.h index 34bdad3d..0d7e3fd5 100644 --- a/src/engine/platform/bubsyswsg.h +++ b/src/engine/platform/bubsyswsg.h @@ -80,13 +80,13 @@ class DivPlatformBubSysWSG: public DivDispatch { bool isStereo(); bool keyOffAffectsArp(int ch); DivMacroInt* getChanMacroInt(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformBubSysWSG(); }; diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index ad111347..6e98fd8a 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -531,8 +531,8 @@ void DivPlatformC64::setFP(bool fp) { isFP=fp; } -void DivPlatformC64::setFlags(unsigned int flags) { - switch (flags&0xf) { +void DivPlatformC64::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { case 0x0: // NTSC C64 rate=COLOR_NTSC*2.0/7.0; break; @@ -554,7 +554,7 @@ void DivPlatformC64::setFlags(unsigned int flags) { } } -int DivPlatformC64::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformC64::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/c64.h b/src/engine/platform/c64.h index 52685ce7..ba9a0512 100644 --- a/src/engine/platform/c64.h +++ b/src/engine/platform/c64.h @@ -101,7 +101,7 @@ class DivPlatformC64: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsChange(int ins); bool getDCOffRequired(); bool getWantPreNote(); @@ -111,7 +111,7 @@ class DivPlatformC64: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void setChipModel(bool is6581); void setFP(bool fp); void quit(); diff --git a/src/engine/platform/dummy.cpp b/src/engine/platform/dummy.cpp index 48c33f05..56a2420d 100644 --- a/src/engine/platform/dummy.cpp +++ b/src/engine/platform/dummy.cpp @@ -138,7 +138,7 @@ void DivPlatformDummy::reset() { } } -int DivPlatformDummy::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformDummy::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/dummy.h b/src/engine/platform/dummy.h index 0b5181f0..d3a1b91e 100644 --- a/src/engine/platform/dummy.h +++ b/src/engine/platform/dummy.h @@ -44,7 +44,7 @@ class DivPlatformDummy: public DivDispatch { DivDispatchOscBuffer* getOscBuffer(int chan); void reset(); void tick(bool sysTick=true); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformDummy(); }; diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index 7622a099..5859be56 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -451,10 +451,11 @@ void DivPlatformFDS::setNSFPlay(bool use) { useNP=use; } -void DivPlatformFDS::setFlags(unsigned int flags) { - if (flags==2) { // Dendy +void DivPlatformFDS::setFlags(const DivConfig& flags) { + int clockSel=flags.getInt("clockSel",0); + if (clockSel==2) { // Dendy rate=COLOR_PAL*2.0/5.0; - } else if (flags==1) { // PAL + } else if (clockSel==1) { // PAL rate=COLOR_PAL*3.0/8.0; } else { // NTSC rate=COLOR_NTSC/2.0; @@ -485,9 +486,8 @@ void DivPlatformFDS::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformFDS::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformFDS::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; - apuType=flags; dumpWrites=false; skipRegisterWrites=false; writeOscBuf=0; diff --git a/src/engine/platform/fds.h b/src/engine/platform/fds.h index 2721876e..7a54aa52 100644 --- a/src/engine/platform/fds.h +++ b/src/engine/platform/fds.h @@ -69,7 +69,6 @@ class DivPlatformFDS: public DivDispatch { DivDispatchOscBuffer* oscBuf; bool isMuted[1]; DivWaveSynth ws; - unsigned char apuType; unsigned char writeOscBuf; bool useNP; struct _fds* fds; @@ -99,13 +98,13 @@ class DivPlatformFDS: public DivDispatch { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void setNSFPlay(bool use); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); float getPostAmp(); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformFDS(); }; diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index 406d7281..a6eb7185 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -106,6 +106,8 @@ class DivPlatformOPN: public DivPlatformFMBase { unsigned int ayDiv; bool extSys; + DivConfig ayFlags; + DivPlatformOPN(double f=9440540.0, unsigned int d=72, unsigned int a=32, bool isExtSys=false): DivPlatformFMBase(), fmFreqBase(f), diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 7c1c5d25..0c9ab7b3 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -629,9 +629,9 @@ void DivPlatformGB::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) immWrite(i.addr,i.val); } -void DivPlatformGB::setFlags(unsigned int flags) { - antiClickEnabled=!(flags&8); - switch (flags&3) { +void DivPlatformGB::setFlags(const DivConfig& flags) { + antiClickEnabled=!flags.getBool("noAntiClick",false); + switch (flags.getInt("chipType",0)) { case 0: model=GB_MODEL_DMG_B; break; @@ -647,7 +647,7 @@ void DivPlatformGB::setFlags(unsigned int flags) { } } -int DivPlatformGB::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformGB::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { chipClock=4194304; rate=chipClock/16; for (int i=0; i<4; i++) { diff --git a/src/engine/platform/gb.h b/src/engine/platform/gb.h index 347f528b..d0a2c1f3 100644 --- a/src/engine/platform/gb.h +++ b/src/engine/platform/gb.h @@ -116,8 +116,8 @@ class DivPlatformGB: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - void setFlags(unsigned int flags); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + void setFlags(const DivConfig& flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformGB(); }; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 6b253f42..480ecb44 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1186,16 +1186,25 @@ void DivPlatformGenesis::setSoftPCM(bool value) { softPCM=value; } -void DivPlatformGenesis::setFlags(unsigned int flags) { - switch (flags&(~0x80000000)) { +void DivPlatformGenesis::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { + case 1: + chipClock=COLOR_PAL*12.0/7.0; + break; + case 2: + chipClock=8000000.0; + break; + case 3: + chipClock=COLOR_NTSC*12.0/7.0; + break; + case 4: + chipClock=COLOR_NTSC*9.0/4.0; + break; default: - case 0: chipClock=COLOR_NTSC*15.0/7.0; break; - case 1: chipClock=COLOR_PAL*12.0/7.0; break; - case 2: chipClock=8000000.0; break; - case 3: chipClock=COLOR_NTSC*12.0/7.0; break; - case 4: chipClock=COLOR_NTSC*9.0/4.0; break; + chipClock=COLOR_NTSC*15.0/7.0; + break; } - ladder=flags&0x80000000; + ladder=flags.getBool("ladderEffect",false); OPN2_SetChipType(ladder?ym3438_mode_ym2612:0); if (useYMFM) { if (fm_ymfm!=NULL) delete fm_ymfm; @@ -1213,7 +1222,7 @@ void DivPlatformGenesis::setFlags(unsigned int flags) { } } -int DivPlatformGenesis::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformGenesis::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; ladder=false; diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 6c6837c0..f4b853a8 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -140,14 +140,14 @@ class DivPlatformGenesis: public DivPlatformOPN { bool keyOffAffectsArp(int ch); bool keyOffAffectsPorta(int ch); void toggleRegisterDump(bool enable); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyInsDeletion(void* ins); void setSoftPCM(bool value); int getPortaFloor(int ch); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformGenesis(): DivPlatformOPN(9440540.0, 72, 32) {} diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 84b906be..2134568a 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -630,7 +630,7 @@ int DivPlatformGenesisExt::getPortaFloor(int ch) { return (ch>8)?12:0; } -int DivPlatformGenesisExt::init(DivEngine* parent, int channels, int sugRate, unsigned int flags) { +int DivPlatformGenesisExt::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformGenesis::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { isOpMuted[i]=false; diff --git a/src/engine/platform/genesisext.h b/src/engine/platform/genesisext.h index ffc83d46..6f46402f 100644 --- a/src/engine/platform/genesisext.h +++ b/src/engine/platform/genesisext.h @@ -67,7 +67,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis { bool keyOffAffectsPorta(int ch); void notifyInsChange(int ins); int getPortaFloor(int ch); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformGenesisExt(); }; diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 4db41bcf..66acdcd5 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -460,7 +460,7 @@ void DivPlatformLynx::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr, i.val); } -int DivPlatformLynx::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformLynx::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/lynx.h b/src/engine/platform/lynx.h index a6c1c91c..c03402e2 100644 --- a/src/engine/platform/lynx.h +++ b/src/engine/platform/lynx.h @@ -107,7 +107,7 @@ class DivPlatformLynx: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformLynx(); }; diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index 7d271046..9e3e5292 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -386,10 +386,11 @@ bool DivPlatformMMC5::keyOffAffectsArp(int ch) { return true; } -void DivPlatformMMC5::setFlags(unsigned int flags) { - if (flags==2) { // Dendy +void DivPlatformMMC5::setFlags(const DivConfig& flags) { + int clockSel=flags.getInt("clockSel",0); + if (clockSel==2) { // Dendy rate=COLOR_PAL*2.0/5.0; - } else if (flags==1) { // PAL + } else if (clockSel==1) { // PAL rate=COLOR_PAL*3.0/8.0; } else { // NTSC rate=COLOR_NTSC/2.0; @@ -414,9 +415,8 @@ void DivPlatformMMC5::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformMMC5::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformMMC5::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; - apuType=flags; dumpWrites=false; skipRegisterWrites=false; writeOscBuf=0; diff --git a/src/engine/platform/mmc5.h b/src/engine/platform/mmc5.h index 0da3da32..ddad9ec2 100644 --- a/src/engine/platform/mmc5.h +++ b/src/engine/platform/mmc5.h @@ -63,7 +63,6 @@ class DivPlatformMMC5: public DivDispatch { unsigned int dacPos; int dacSample; unsigned char sampleBank; - unsigned char apuType; unsigned char writeOscBuf; struct _mmc5* mmc5; unsigned char regPool[128]; @@ -85,12 +84,12 @@ class DivPlatformMMC5: public DivDispatch { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); float getPostAmp(); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformMMC5(); }; diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index 05465bbe..3d8ec38c 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -387,8 +387,8 @@ void DivPlatformMSM6258::renderSamples() { adpcmMemLen=memPos+256; } -void DivPlatformMSM6258::setFlags(unsigned int flags) { - switch (flags) { +void DivPlatformMSM6258::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { case 3: chipClock=8192000; break; @@ -408,7 +408,7 @@ void DivPlatformMSM6258::setFlags(unsigned int flags) { } } -int DivPlatformMSM6258::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformMSM6258::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; adpcmMem=new unsigned char[getSampleMemCapacity(0)]; adpcmMemLen=0; diff --git a/src/engine/platform/msm6258.h b/src/engine/platform/msm6258.h index f06bdc26..02ec7e14 100644 --- a/src/engine/platform/msm6258.h +++ b/src/engine/platform/msm6258.h @@ -108,14 +108,14 @@ class DivPlatformMSM6258: public DivDispatch { void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); const char** getRegisterSheet(); const void* getSampleMem(int index); size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); void renderSamples(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformMSM6258(); }; diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index 8b9c573d..0f570d9c 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -376,13 +376,9 @@ void DivPlatformMSM6295::renderSamples() { } } -void DivPlatformMSM6295::setFlags(unsigned int flags) { - rateSelInit=(flags>>7)&1; - switch (flags&0x7f) { - default: - case 0: - chipClock=4000000/4; - break; +void DivPlatformMSM6295::setFlags(const DivConfig& flags) { + rateSelInit=flags.getBool("rateSel",false); + switch (flags.getInt("clockSel",0)) { case 1: chipClock=4224000/4; break; @@ -425,6 +421,9 @@ void DivPlatformMSM6295::setFlags(unsigned int flags) { case 14: chipClock=COLOR_NTSC/3.0; break; + default: + chipClock=4000000/4; + break; } rate=chipClock/3; for (int i=0; i<4; i++) { @@ -436,7 +435,7 @@ void DivPlatformMSM6295::setFlags(unsigned int flags) { } } -int DivPlatformMSM6295::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformMSM6295::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; adpcmMem=new unsigned char[getSampleMemCapacity(0)]; adpcmMemLen=0; diff --git a/src/engine/platform/msm6295.h b/src/engine/platform/msm6295.h index 5fc5ac7b..40d35757 100644 --- a/src/engine/platform/msm6295.h +++ b/src/engine/platform/msm6295.h @@ -96,14 +96,14 @@ class DivPlatformMSM6295: public DivDispatch, public vgsound_emu_mem_intf { virtual void notifyInsDeletion(void* ins) override; virtual void poke(unsigned int addr, unsigned short val) override; virtual void poke(std::vector& wlist) override; - virtual void setFlags(unsigned int flags) override; + virtual void setFlags(const DivConfig& flags) override; virtual const char** getRegisterSheet() override; virtual const void* getSampleMem(int index) override; virtual size_t getSampleMemCapacity(int index) override; virtual size_t getSampleMemUsage(int index) override; virtual void renderSamples() override; - virtual int init(DivEngine* parent, int channels, int sugRate, unsigned int flags) override; + virtual int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) override; virtual void quit() override; DivPlatformMSM6295(): DivDispatch(), diff --git a/src/engine/platform/n163.cpp b/src/engine/platform/n163.cpp index 1597d0fa..26d42e45 100644 --- a/src/engine/platform/n163.cpp +++ b/src/engine/platform/n163.cpp @@ -621,20 +621,20 @@ void DivPlatformN163::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -void DivPlatformN163::setFlags(unsigned int flags) { - switch (flags&0xf) { - case 0x0: // NTSC - rate=COLOR_NTSC/2.0; - break; - case 0x1: // PAL +void DivPlatformN163::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { + case 1: // PAL rate=COLOR_PAL*3.0/8.0; break; - case 0x2: // Dendy + case 2: // Dendy rate=COLOR_PAL*2.0/5.0; break; + default: // NTSC + rate=COLOR_NTSC/2.0; + break; } - initChanMax=chanMax=(flags>>4)&7; - multiplex=((flags>>7)&1)?false:true; // not accurate in real hardware + initChanMax=chanMax=flags.getInt("channels",0)&7; + multiplex=!flags.getBool("multiplex",false); // not accurate in real hardware chipClock=rate; rate/=15; n163.set_multiplex(multiplex); @@ -647,7 +647,7 @@ void DivPlatformN163::setFlags(unsigned int flags) { reset(); } -int DivPlatformN163::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformN163::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/n163.h b/src/engine/platform/n163.h index 0ff969b6..2f8e5ef9 100644 --- a/src/engine/platform/n163.h +++ b/src/engine/platform/n163.h @@ -104,14 +104,14 @@ class DivPlatformN163: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsChange(int ins); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformN163(); }; diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index 236790e3..aab625b1 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -530,7 +530,7 @@ void DivPlatformNamcoWSG::setDeviceType(int type) { } } -void DivPlatformNamcoWSG::setFlags(unsigned int flags) { +void DivPlatformNamcoWSG::setFlags(const DivConfig& flags) { chipClock=3072000; rate=chipClock/32; namco->device_clock_changed(rate); @@ -547,7 +547,7 @@ void DivPlatformNamcoWSG::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformNamcoWSG::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformNamcoWSG::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/namcowsg.h b/src/engine/platform/namcowsg.h index 56a8ba3c..1656dedd 100644 --- a/src/engine/platform/namcowsg.h +++ b/src/engine/platform/namcowsg.h @@ -91,13 +91,13 @@ class DivPlatformNamcoWSG: public DivDispatch { bool isStereo(); bool keyOffAffectsArp(int ch); void setDeviceType(int type); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformNamcoWSG(); }; diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index d087ac81..5749167b 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -640,11 +640,12 @@ bool DivPlatformNES::keyOffAffectsArp(int ch) { return true; } -void DivPlatformNES::setFlags(unsigned int flags) { - if (flags==2) { // Dendy +void DivPlatformNES::setFlags(const DivConfig& flags) { + int clockSel=flags.getInt("clockSel",0); + if (clockSel==2) { // Dendy rate=COLOR_PAL*2.0/5.0; apuType=2; - } else if (flags==1) { // PAL + } else if (clockSel==1) { // PAL rate=COLOR_PAL*3.0/8.0; apuType=1; } else { // NTSC @@ -730,9 +731,8 @@ void DivPlatformNES::renderSamples() { dpcmMemLen=memPos; } -int DivPlatformNES::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformNES::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; - apuType=flags; dumpWrites=false; skipRegisterWrites=false; if (useNP) { diff --git a/src/engine/platform/nes.h b/src/engine/platform/nes.h index e8e04e9e..ef4a9e72 100644 --- a/src/engine/platform/nes.h +++ b/src/engine/platform/nes.h @@ -104,7 +104,7 @@ class DivPlatformNES: public DivDispatch { float getPostAmp(); unsigned char readDMC(unsigned short addr); void setNSFPlay(bool use); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); @@ -113,7 +113,7 @@ class DivPlatformNES: public DivDispatch { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); void renderSamples(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformNES(); }; diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 76adeafd..1157bf50 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1646,7 +1646,7 @@ void DivPlatformOPL::setOPLType(int type, bool drums) { properDrumsSys=drums; } -void DivPlatformOPL::setFlags(unsigned int flags) { +void DivPlatformOPL::setFlags(const DivConfig& flags) { /* if (flags==3) { chipClock=COLOR_NTSC*12.0/7.0; @@ -1674,7 +1674,7 @@ void DivPlatformOPL::setFlags(unsigned int flags) { switch (chipType) { default: case 1: case 2: case 8950: - switch (flags&0xff) { + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=COLOR_PAL*4.0/5.0; break; @@ -1698,7 +1698,7 @@ void DivPlatformOPL::setFlags(unsigned int flags) { chipRateBase=rate; break; case 3: - switch (flags&0xff) { + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=COLOR_PAL*16.0/5.0; break; @@ -1719,7 +1719,7 @@ void DivPlatformOPL::setFlags(unsigned int flags) { chipRateBase=rate; break; case 4: - switch (flags&0xff) { + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=COLOR_PAL*32.0/5.0; break; @@ -1785,7 +1785,7 @@ void DivPlatformOPL::renderSamples() { adpcmBMemLen=memPos+256; } -int DivPlatformOPL::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformOPL::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index 41be2c89..8fe8cb25 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -143,7 +143,7 @@ class DivPlatformOPL: public DivDispatch { bool keyOffAffectsArp(int ch); bool keyOffAffectsPorta(int ch); void toggleRegisterDump(bool enable); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyInsDeletion(void* ins); int getPortaFloor(int ch); @@ -153,7 +153,7 @@ class DivPlatformOPL: public DivDispatch { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); void renderSamples(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformOPL(); }; diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 5c698158..4c53350c 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -947,24 +947,25 @@ void DivPlatformOPLL::setYMFM(bool use) { useYMFM=use; } -void DivPlatformOPLL::setFlags(unsigned int flags) { - if ((flags&15)==3) { +void DivPlatformOPLL::setFlags(const DivConfig& flags) { + int clockSel=flags.getInt("clockSel",0); + if (clockSel==3) { chipClock=COLOR_NTSC/2.0; - } else if ((flags&15)==2) { + } else if (clockSel==2) { chipClock=4000000.0; - } else if ((flags&15)==1) { + } else if (clockSel==1) { chipClock=COLOR_PAL*4.0/5.0; } else { chipClock=COLOR_NTSC; } rate=chipClock/36; - patchSet=flags>>4; + patchSet=flags.getInt("patchSet",0); for (int i=0; i<11; i++) { oscBuf[i]->rate=rate/2; } } -int DivPlatformOPLL::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformOPLL::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index 3f243057..390d79a9 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -117,13 +117,13 @@ class DivPlatformOPLL: public DivDispatch { void toggleRegisterDump(bool enable); void setVRC7(bool vrc); void setProperDrums(bool pd); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyInsDeletion(void* ins); int getPortaFloor(int ch); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformOPLL(); }; diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 19b71a1b..518b598f 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -557,14 +557,13 @@ void DivPlatformPCE::notifyInsDeletion(void* ins) { } } -void DivPlatformPCE::setFlags(unsigned int flags) { - if (flags&1) { // technically there is no PAL PC Engine but oh well... +void DivPlatformPCE::setFlags(const DivConfig& flags) { + if (flags.getInt("clockSel",0)) { // technically there is no PAL PC Engine but oh well... chipClock=COLOR_PAL*4.0/5.0; } else { chipClock=COLOR_NTSC; } - // flags&4 will be chip revision - antiClickEnabled=!(flags&8); + antiClickEnabled=!flags.getBool("noAntiClick",false); rate=chipClock/12; for (int i=0; i<6; i++) { oscBuf[i]->rate=rate; @@ -574,7 +573,7 @@ void DivPlatformPCE::setFlags(unsigned int flags) { delete pce; pce=NULL; } - pce=new PCE_PSG(tempL,tempR,(flags&4)?PCE_PSG::REVISION_HUC6280A:PCE_PSG::REVISION_HUC6280); + pce=new PCE_PSG(tempL,tempR,flags.getInt("chipType",0)?PCE_PSG::REVISION_HUC6280A:PCE_PSG::REVISION_HUC6280); } void DivPlatformPCE::poke(unsigned int addr, unsigned short val) { @@ -585,7 +584,7 @@ void DivPlatformPCE::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformPCE::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformPCE::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index ec030834..a7878310 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -107,13 +107,13 @@ class DivPlatformPCE: public DivDispatch { void muteChannel(int ch, bool mute); bool isStereo(); bool keyOffAffectsArp(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformPCE(); }; diff --git a/src/engine/platform/pcmdac.cpp b/src/engine/platform/pcmdac.cpp index ae3362ec..b961b33e 100644 --- a/src/engine/platform/pcmdac.cpp +++ b/src/engine/platform/pcmdac.cpp @@ -382,18 +382,17 @@ void DivPlatformPCMDAC::notifyInsDeletion(void* ins) { chan.std.notifyInsDeletion((DivInstrument*)ins); } -void DivPlatformPCMDAC::setFlags(unsigned int flags) { +void DivPlatformPCMDAC::setFlags(const DivConfig& flags) { // default to 44100Hz 16-bit stereo - if (!flags) flags=0x1f0000|44099; - rate=(flags&0xffff)+1; + rate=flags.getInt("rate",44100); // rate can't be too low or the resampler will break if (rate<1000) rate=1000; chipClock=rate; - outDepth=(flags>>16)&0xf; - outStereo=(flags>>20)&1; + outDepth=(flags.getInt("outDepth",15))&15; + outStereo=flags.getBool("stereo",true); } -int DivPlatformPCMDAC::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformPCMDAC::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/pcmdac.h b/src/engine/platform/pcmdac.h index 7292f6dd..46b9e224 100644 --- a/src/engine/platform/pcmdac.h +++ b/src/engine/platform/pcmdac.h @@ -91,11 +91,11 @@ class DivPlatformPCMDAC: public DivDispatch { void muteChannel(int ch, bool mute); bool isStereo(); DivMacroInt* getChanMacroInt(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); }; diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index ab3b8a7c..42a9ac5c 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -586,10 +586,10 @@ bool DivPlatformPCSpeaker::keyOffAffectsArp(int ch) { return true; } -void DivPlatformPCSpeaker::setFlags(unsigned int flags) { +void DivPlatformPCSpeaker::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC/3.0; rate=chipClock/PCSPKR_DIVIDER; - speakerType=flags&3; + speakerType=flags.getInt("speakerType",0)&3; oscBuf->rate=rate; } @@ -611,7 +611,7 @@ void DivPlatformPCSpeaker::poke(std::vector& wlist) { // ??? } -int DivPlatformPCSpeaker::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformPCSpeaker::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/pcspkr.h b/src/engine/platform/pcspkr.h index 48bf1bf5..9d84c210 100644 --- a/src/engine/platform/pcspkr.h +++ b/src/engine/platform/pcspkr.h @@ -108,13 +108,13 @@ class DivPlatformPCSpeaker: public DivDispatch { void tick(bool sysTick=true); void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void notifyPlaybackStop(); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformPCSpeaker(); }; diff --git a/src/engine/platform/pet.cpp b/src/engine/platform/pet.cpp index c314edf6..8a606ecf 100644 --- a/src/engine/platform/pet.cpp +++ b/src/engine/platform/pet.cpp @@ -295,7 +295,7 @@ void DivPlatformPET::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformPET::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformPET::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/pet.h b/src/engine/platform/pet.h index 3046cc26..17c0686f 100644 --- a/src/engine/platform/pet.h +++ b/src/engine/platform/pet.h @@ -81,7 +81,7 @@ class DivPlatformPET: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformPET(); private: diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 2b54a90a..31525528 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -592,14 +592,14 @@ void DivPlatformQSound::notifyInsDeletion(void* ins) { } } -void DivPlatformQSound::setFlags(unsigned int flags) { - echoDelay = 2725 - (flags & 0xfff); - echoFeedback = (flags >> 12) & 255; +void DivPlatformQSound::setFlags(const DivConfig& flags) { + echoDelay = 2725 - flags.getInt("echoDelay",0); + echoFeedback = flags.getInt("echoFeedback",0) & 255; - if(echoDelay < 0) { + if (echoDelay < 0) { echoDelay = 0; } - if(echoDelay > 2725) { + if (echoDelay > 2725) { echoDelay = 2725; } //rate=chipClock/CHIP_DIVIDER; @@ -678,7 +678,7 @@ void DivPlatformQSound::renderSamples() { sampleMemLen=memPos+256; } -int DivPlatformQSound::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformQSound::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/qsound.h b/src/engine/platform/qsound.h index 7743e594..89488627 100644 --- a/src/engine/platform/qsound.h +++ b/src/engine/platform/qsound.h @@ -93,7 +93,7 @@ class DivPlatformQSound: public DivDispatch { void muteChannel(int ch, bool mute); bool isStereo(); bool keyOffAffectsArp(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsChange(int ins); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); @@ -104,7 +104,7 @@ class DivPlatformQSound: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); void renderSamples(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); }; diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index dccd0fd2..d0786896 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -342,13 +342,13 @@ void DivPlatformRF5C68::notifyInsDeletion(void* ins) { } } -void DivPlatformRF5C68::setFlags(unsigned int flags) { - switch (flags&0x0f) { +void DivPlatformRF5C68::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { case 1: chipClock=10000000; break; case 2: chipClock=12500000; break; default: chipClock=8000000; break; } - chipType=flags>>4; + chipType=flags.getInt("chipType",0); rate=chipClock/384; for (int i=0; i<8; i++) { oscBuf[i]->rate=rate; @@ -416,7 +416,7 @@ void DivPlatformRF5C68::renderSamples() { sampleMemLen=memPos; } -int DivPlatformRF5C68::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformRF5C68::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/rf5c68.h b/src/engine/platform/rf5c68.h index 840ece46..4c64c2d6 100644 --- a/src/engine/platform/rf5c68.h +++ b/src/engine/platform/rf5c68.h @@ -92,7 +92,7 @@ class DivPlatformRF5C68: public DivDispatch { void notifyInsChange(int ins); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); @@ -100,7 +100,7 @@ class DivPlatformRF5C68: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); void renderSamples(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); private: void chWrite(unsigned char ch, unsigned int addr, unsigned char val); diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index b7a77d96..acbecf68 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -422,10 +422,11 @@ void DivPlatformSAA1099::notifyInsDeletion(void* ins) { } } -void DivPlatformSAA1099::setFlags(unsigned int flags) { - if (flags==2) { +void DivPlatformSAA1099::setFlags(const DivConfig& flags) { + int clockSel=flags.getInt("clockSel",0); + if (clockSel==2) { chipClock=COLOR_PAL*8.0/5.0; - } else if (flags==1) { + } else if (clockSel==1) { chipClock=COLOR_NTSC*2.0; } else { chipClock=8000000; @@ -448,7 +449,7 @@ void DivPlatformSAA1099::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformSAA1099::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformSAA1099::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/saa.h b/src/engine/platform/saa.h index d2092efb..6bae715e 100644 --- a/src/engine/platform/saa.h +++ b/src/engine/platform/saa.h @@ -89,7 +89,7 @@ class DivPlatformSAA1099: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); bool isStereo(); int getPortaFloor(int ch); bool keyOffAffectsArp(int ch); @@ -97,7 +97,7 @@ class DivPlatformSAA1099: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); }; #endif diff --git a/src/engine/platform/scc.cpp b/src/engine/platform/scc.cpp index 725c53da..a8fbcd7c 100644 --- a/src/engine/platform/scc.cpp +++ b/src/engine/platform/scc.cpp @@ -360,11 +360,8 @@ void DivPlatformSCC::setChipModel(bool isplus) { isPlus=isplus; } -void DivPlatformSCC::setFlags(unsigned int flags) { - switch (flags&0x7f) { - case 0x00: - chipClock=COLOR_NTSC/2.0; - break; +void DivPlatformSCC::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=COLOR_PAL*2.0/5.0; break; @@ -374,6 +371,9 @@ void DivPlatformSCC::setFlags(unsigned int flags) { case 0x03: chipClock=4000000.0/2.0; break; + default: + chipClock=COLOR_NTSC/2.0; + break; } rate=chipClock/8; for (int i=0; i<5; i++) { @@ -381,7 +381,7 @@ void DivPlatformSCC::setFlags(unsigned int flags) { } } -int DivPlatformSCC::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformSCC::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/scc.h b/src/engine/platform/scc.h index 20dcf4a9..ed886547 100644 --- a/src/engine/platform/scc.h +++ b/src/engine/platform/scc.h @@ -85,8 +85,8 @@ class DivPlatformSCC: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - void setFlags(unsigned int flags); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + void setFlags(const DivConfig& flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void setChipModel(bool isPlus); void quit(); ~DivPlatformSCC(); diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 8bec9f30..fc389a81 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -17,7 +17,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -// TODO: new macro formula #include "segapcm.h" #include "../engine.h" #include "../../ta-log.h" @@ -485,7 +484,7 @@ void DivPlatformSegaPCM::reset() { } } -void DivPlatformSegaPCM::setFlags(unsigned int flags) { +void DivPlatformSegaPCM::setFlags(const DivConfig& flags) { chipClock=8000000.0; rate=31250; for (int i=0; i<16; i++) { @@ -497,7 +496,7 @@ bool DivPlatformSegaPCM::isStereo() { return true; } -int DivPlatformSegaPCM::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformSegaPCM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index 2a76143b..222f4bd9 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -111,11 +111,11 @@ class DivPlatformSegaPCM: public DivDispatch { void muteChannel(int ch, bool mute); void notifyInsChange(int ins); void renderSamples(); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); bool isStereo(); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformSegaPCM(); }; diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index e4d408f7..ffafc0cb 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -429,85 +429,78 @@ void DivPlatformSMS::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -void DivPlatformSMS::setFlags(unsigned int flags) { - switch (flags&0xff03) { - default: - case 0x0000: - chipClock=COLOR_NTSC; - break; - case 0x0001: +void DivPlatformSMS::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { + case 1: chipClock=COLOR_PAL*4.0/5.0; break; - case 0x0002: + case 2: chipClock=4000000; break; - case 0x0003: + case 3: chipClock=COLOR_NTSC/2.0; break; - case 0x0100: + case 4: chipClock=3000000; break; - case 0x0101: + case 5: chipClock=2000000; break; - case 0x0102: + case 6: chipClock=COLOR_NTSC/8.0; break; + default: + chipClock=COLOR_NTSC; + break; } - resetPhase=!(flags&16); + resetPhase=!flags.getBool("noPhaseReset",false); divider=16; toneDivider=64.0; noiseDivider=64.0; if (sn!=NULL) delete sn; - switch (flags&0xcc) { - default: // Sega - case 0x00: - sn=new segapsg_device(); - isRealSN=false; - stereo=false; - break; - case 0x04: // TI SN76489 + switch (flags.getInt("chipType",0)) { + case 1: // TI SN76489 sn=new sn76489_device(); isRealSN=true; stereo=false; noiseDivider=60.0; // 64 for match to tone frequency on non-Sega PSG but compatibility break; - case 0x08: // TI+Atari + case 2: // TI+Atari sn=new sn76496_base_device(0x4000, 0x0f35, 0x01, 0x02, true, false, 1/*8*/, false, true); isRealSN=true; stereo=false; noiseDivider=60.0; break; - case 0x0c: // Game Gear (not fully emulated yet!) + case 3: // Game Gear (not fully emulated yet!) sn=new gamegear_device(); isRealSN=false; stereo=true; break; - case 0x40: // TI SN76489A + case 4: // TI SN76489A sn=new sn76489a_device(); isRealSN=false; // TODO stereo=false; noiseDivider=60.0; break; - case 0x44: // TI SN76496 + case 5: // TI SN76496 sn=new sn76496_device(); isRealSN=false; // TODO stereo=false; noiseDivider=60.0; break; - case 0x48: // NCR 8496 + case 6: // NCR 8496 sn=new ncr8496_device(); isRealSN=false; stereo=false; noiseDivider=60.0; break; - case 0x4c: // Tandy PSSJ 3-voice sound + case 7: // Tandy PSSJ 3-voice sound sn=new pssj3_device(); isRealSN=false; stereo=false; noiseDivider=60.0; break; - case 0x80: // TI SN94624 + case 8: // TI SN94624 sn=new sn94624_device(); isRealSN=true; stereo=false; @@ -515,7 +508,7 @@ void DivPlatformSMS::setFlags(unsigned int flags) { toneDivider=8.0; noiseDivider=7.5; break; - case 0x84: // TI SN76494 + case 9: // TI SN76494 sn=new sn76494_device(); isRealSN=false; // TODO stereo=false; @@ -523,6 +516,11 @@ void DivPlatformSMS::setFlags(unsigned int flags) { toneDivider=8.0; noiseDivider=7.5; break; + default: // Sega + sn=new segapsg_device(); + isRealSN=false; + stereo=false; + break; } rate=chipClock/divider; for (int i=0; i<4; i++) { @@ -534,7 +532,7 @@ void DivPlatformSMS::setNuked(bool value) { nuked=value; } -int DivPlatformSMS::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformSMS::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/sms.h b/src/engine/platform/sms.h index b382d38d..0a4b121f 100644 --- a/src/engine/platform/sms.h +++ b/src/engine/platform/sms.h @@ -97,13 +97,13 @@ class DivPlatformSMS: public DivDispatch { bool keyOffAffectsArp(int ch); bool keyOffAffectsPorta(int ch); int getPortaFloor(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); void setNuked(bool value); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformSMS(); }; diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index e99db88a..f76047c8 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -767,12 +767,12 @@ void DivPlatformSNES::renderSamples() { memcpy(sampleMem,copyOfSampleMem,65536); } -void DivPlatformSNES::setFlags(unsigned int flags) { - globalVolL=127-(flags&127); - globalVolR=127-((flags>>8)&127); +void DivPlatformSNES::setFlags(const DivConfig& flags) { + globalVolL=127-flags.getInt("volScaleL",0); + globalVolR=127-flags.getInt("volScaleR",0); } -int DivPlatformSNES::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformSNES::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/snes.h b/src/engine/platform/snes.h index 61ddb486..0bc8cacf 100644 --- a/src/engine/platform/snes.h +++ b/src/engine/platform/snes.h @@ -117,7 +117,7 @@ class DivPlatformSNES: public DivDispatch { bool isStereo(); void notifyInsChange(int ins); void notifyWaveChange(int wave); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); @@ -126,7 +126,7 @@ class DivPlatformSNES: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); void renderSamples(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); private: void updateWave(int ch); diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index cd0aea34..66b91ef5 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -505,8 +505,8 @@ void DivPlatformSoundUnit::notifyInsDeletion(void* ins) { } } -void DivPlatformSoundUnit::setFlags(unsigned int flags) { - if (flags&1) { +void DivPlatformSoundUnit::setFlags(const DivConfig& flags) { + if (flags.getInt("clockSel",0)) { chipClock=1190000; } else { chipClock=1236000; @@ -515,14 +515,15 @@ void DivPlatformSoundUnit::setFlags(unsigned int flags) { for (int i=0; i<8; i++) { oscBuf[i]->rate=rate; } - initIlCtrl=3|(flags&4); - initIlSize=((flags>>8)&63)|((flags&4)?0x40:0)|((flags&8)?0x80:0); - initFil1=flags>>16; - initEchoVol=flags>>24; + bool echoOn=flags.getBool("echo",false); + initIlCtrl=3|(echoOn?4:0); + initIlSize=((flags.getInt("echoDelay",0))&63)|(echoOn?0x40:0)|(flags.getBool("swapEcho",false)?0x80:0); + initFil1=flags.getInt("echoFeedback",0); + initEchoVol=flags.getInt("echoVol",0); - sampleMemSize=flags&16; + sampleMemSize=flags.getInt("sampleMemSize",0); - su->Init(sampleMemSize?65536:8192,flags&32); + su->Init(sampleMemSize?65536:8192,flags.getBool("pdm",false)); renderSamples(); } @@ -572,7 +573,7 @@ void DivPlatformSoundUnit::renderSamples() { } -int DivPlatformSoundUnit::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformSoundUnit::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/su.h b/src/engine/platform/su.h index 784186c6..004c04c5 100644 --- a/src/engine/platform/su.h +++ b/src/engine/platform/su.h @@ -130,7 +130,7 @@ class DivPlatformSoundUnit: public DivDispatch { void muteChannel(int ch, bool mute); bool isStereo(); bool keyOffAffectsArp(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); @@ -139,7 +139,7 @@ class DivPlatformSoundUnit: public DivDispatch { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); void renderSamples(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformSoundUnit(); }; diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 9db46d14..222af4a5 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -509,7 +509,7 @@ void DivPlatformSwan::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformSwan::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformSwan::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/swan.h b/src/engine/platform/swan.h index 473667a9..8261e634 100644 --- a/src/engine/platform/swan.h +++ b/src/engine/platform/swan.h @@ -94,7 +94,7 @@ class DivPlatformSwan: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformSwan(); private: diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index 796c9448..d4703e28 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -350,21 +350,21 @@ void DivPlatformTIA::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -void DivPlatformTIA::setFlags(unsigned int flags) { - if (flags&1) { +void DivPlatformTIA::setFlags(const DivConfig& flags) { + if (flags.getInt("clockSel",0)) { rate=COLOR_PAL*4.0/5.0; } else { rate=COLOR_NTSC; } chipClock=rate; - mixingType=(flags>>1)&3; + mixingType=flags.getInt("mixingType",0)&3; for (int i=0; i<2; i++) { oscBuf[i]->rate=rate/114; } tia.reset(mixingType); } -int DivPlatformTIA::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformTIA::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/tia.h b/src/engine/platform/tia.h index 3eb32b97..85bfcabe 100644 --- a/src/engine/platform/tia.h +++ b/src/engine/platform/tia.h @@ -63,7 +63,7 @@ class DivPlatformTIA: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); float getPostAmp(); bool isStereo(); bool keyOffAffectsArp(int ch); @@ -71,7 +71,7 @@ class DivPlatformTIA: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); }; #endif diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index fa29cda6..c205435e 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -914,11 +914,12 @@ void DivPlatformTX81Z::reset() { extMode=false; } -void DivPlatformTX81Z::setFlags(unsigned int flags) { - if (flags==2) { +void DivPlatformTX81Z::setFlags(const DivConfig& flags) { + int clockSel=flags.getInt("clockSel",0); + if (clockSel==2) { chipClock=4000000.0; baseFreqOff=-122; - } else if (flags==1) { + } else if (clockSel==1) { chipClock=COLOR_PAL*4.0/5.0; baseFreqOff=12; } else { @@ -935,7 +936,7 @@ bool DivPlatformTX81Z::isStereo() { return true; } -int DivPlatformTX81Z::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformTX81Z::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/tx81z.h b/src/engine/platform/tx81z.h index b1d09db9..5b4b9f24 100644 --- a/src/engine/platform/tx81z.h +++ b/src/engine/platform/tx81z.h @@ -104,12 +104,12 @@ class DivPlatformTX81Z: public DivPlatformOPM { void tick(bool sysTick=true); void muteChannel(int ch, bool mute); void notifyInsChange(int ins); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); bool isStereo(); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformTX81Z(); }; diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index d0e9e00f..cd76f414 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -426,7 +426,7 @@ void DivPlatformVERA::poke(std::vector& wlist) { for (auto &i: wlist) poke(i.addr,i.val); } -int DivPlatformVERA::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformVERA::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { for (int i=0; i<17; i++) { isMuted[i]=false; oscBuf[i]=new DivDispatchOscBuffer; diff --git a/src/engine/platform/vera.h b/src/engine/platform/vera.h index 9cda0120..fec113fc 100644 --- a/src/engine/platform/vera.h +++ b/src/engine/platform/vera.h @@ -80,7 +80,7 @@ class DivPlatformVERA: public DivDispatch { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformVERA(); }; diff --git a/src/engine/platform/vic20.cpp b/src/engine/platform/vic20.cpp index 93c11948..d6200a16 100644 --- a/src/engine/platform/vic20.cpp +++ b/src/engine/platform/vic20.cpp @@ -301,8 +301,8 @@ void DivPlatformVIC20::notifyInsDeletion(void* ins) { } } -void DivPlatformVIC20::setFlags(unsigned int flags) { - if (flags&1) { +void DivPlatformVIC20::setFlags(const DivConfig& flags) { + if (flags.getInt("clockSel",0)) { chipClock=COLOR_PAL/4.0; } else { chipClock=COLOR_NTSC*2.0/7.0; @@ -321,7 +321,7 @@ void DivPlatformVIC20::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformVIC20::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformVIC20::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/vic20.h b/src/engine/platform/vic20.h index 834051dd..21669c27 100644 --- a/src/engine/platform/vic20.h +++ b/src/engine/platform/vic20.h @@ -77,13 +77,13 @@ class DivPlatformVIC20: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); bool isStereo(); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformVIC20(); private: diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index 1fb7cbb1..52a9350c 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -479,10 +479,11 @@ bool DivPlatformVRC6::keyOffAffectsArp(int ch) { return true; } -void DivPlatformVRC6::setFlags(unsigned int flags) { - if (flags==2) { // Dendy +void DivPlatformVRC6::setFlags(const DivConfig& flags) { + int clockSel=flags.getInt("clockSel",0); + if (clockSel==2) { // Dendy rate=COLOR_PAL*2.0/5.0; - } else if (flags==1) { // PAL + } else if (clockSel==1) { // PAL rate=COLOR_PAL*3.0/8.0; } else { // NTSC rate=COLOR_NTSC/2.0; @@ -507,7 +508,7 @@ void DivPlatformVRC6::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformVRC6::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformVRC6::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/vrc6.h b/src/engine/platform/vrc6.h index 4c56bc79..839c089b 100644 --- a/src/engine/platform/vrc6.h +++ b/src/engine/platform/vrc6.h @@ -94,12 +94,12 @@ class DivPlatformVRC6: public DivDispatch, public vrcvi_intf { void tick(bool sysTick=true); void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformVRC6() : vrc6(*this) {}; ~DivPlatformVRC6(); diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index 5f71b8fd..29e5edbd 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -903,8 +903,8 @@ void DivPlatformX1_010::notifyInsDeletion(void* ins) { } } -void DivPlatformX1_010::setFlags(unsigned int flags) { - switch (flags&15) { +void DivPlatformX1_010::setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { case 0: // 16MHz (earlier hardwares) chipClock=16000000; break; @@ -917,7 +917,7 @@ void DivPlatformX1_010::setFlags(unsigned int flags) { break; } rate=chipClock/512; - stereo=flags&16; + stereo=flags.getBool("stereo",false); for (int i=0; i<16; i++) { oscBuf[i]->rate=rate; } @@ -980,7 +980,7 @@ void DivPlatformX1_010::setBanked(bool banked) { isBanked=banked; } -int DivPlatformX1_010::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformX1_010::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/x1_010.h b/src/engine/platform/x1_010.h index ce3e86c1..94d03011 100644 --- a/src/engine/platform/x1_010.h +++ b/src/engine/platform/x1_010.h @@ -138,7 +138,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf { void muteChannel(int ch, bool mute); bool isStereo(); bool keyOffAffectsArp(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); @@ -149,7 +149,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf { void renderSamples(); const char** getRegisterSheet(); void setBanked(bool banked); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformX1_010(): DivDispatch(), diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 6a086437..cd85731e 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -909,13 +909,9 @@ void DivPlatformYM2203::setSkipRegisterWrites(bool value) { ay->setSkipRegisterWrites(value); } -void DivPlatformYM2203::setFlags(unsigned int flags) { +void DivPlatformYM2203::setFlags(const DivConfig& flags) { // Clock flags - switch (flags&0x1f) { - default: - case 0x00: - chipClock=COLOR_NTSC; - break; + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=COLOR_PAL*4.0/5.0; break; @@ -931,16 +927,12 @@ void DivPlatformYM2203::setFlags(unsigned int flags) { case 0x05: chipClock=3000000.0/2.0; break; + default: + chipClock=COLOR_NTSC; + break; } // Prescaler flags - switch ((flags>>5)&0x3) { - default: - case 0x00: // /6 - prescale=0x2d; - fmFreqBase=4720270.0, - fmDivBase=36, - ayDiv=16; - break; + switch (flags.getInt("prescale",0)) { case 0x01: // /3 prescale=0x2e; fmFreqBase=4720270.0/2.0, @@ -953,6 +945,12 @@ void DivPlatformYM2203::setFlags(unsigned int flags) { fmDivBase=12, ayDiv=4; break; + default: // /6 + prescale=0x2d; + fmFreqBase=4720270.0, + fmDivBase=36, + ayDiv=16; + break; } rate=fm->sample_rate(chipClock); for (int i=0; i<6; i++) { @@ -961,10 +959,11 @@ void DivPlatformYM2203::setFlags(unsigned int flags) { immWrite(0x2d,0xff); immWrite(prescale,0xff); ay->setExtClockDiv(chipClock,ayDiv); - ay->setFlags(16); + ay->setFlags(ayFlags); } -int DivPlatformYM2203::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2203::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { + ayFlags.set("chipType",1); parent=p; dumpWrites=false; skipRegisterWrites=false; @@ -976,7 +975,7 @@ int DivPlatformYM2203::init(DivEngine* p, int channels, int sugRate, unsigned in fm->set_fidelity(ymfm::OPN_FIDELITY_MIN); // YM2149, 2MHz ay=new DivPlatformAY8910(true,chipClock,ayDiv); - ay->init(p,3,sugRate,16); + ay->init(p,3,sugRate,ayFlags); ay->toggleRegisterDump(true); setFlags(flags); diff --git a/src/engine/platform/ym2203.h b/src/engine/platform/ym2203.h index 7a4aa797..b51a4234 100644 --- a/src/engine/platform/ym2203.h +++ b/src/engine/platform/ym2203.h @@ -117,8 +117,8 @@ class DivPlatformYM2203: public DivPlatformOPN { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - void setFlags(unsigned int flags); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + void setFlags(const DivConfig& flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2203(): DivPlatformOPN(4720270.0, 36, 16), diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index fc629487..9c404ca6 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -505,7 +505,7 @@ void DivPlatformYM2203Ext::notifyInsChange(int ins) { } } -int DivPlatformYM2203Ext::init(DivEngine* parent, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2203Ext::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2203::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { isOpMuted[i]=false; diff --git a/src/engine/platform/ym2203ext.h b/src/engine/platform/ym2203ext.h index 9bc460af..5cf66429 100644 --- a/src/engine/platform/ym2203ext.h +++ b/src/engine/platform/ym2203ext.h @@ -64,7 +64,7 @@ class DivPlatformYM2203Ext: public DivPlatformYM2203 { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2203Ext(); }; diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 87fc7914..48739823 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1361,26 +1361,18 @@ void DivPlatformYM2608::renderSamples() { adpcmBMemLen=memPos+256; } -void DivPlatformYM2608::setFlags(unsigned int flags) { +void DivPlatformYM2608::setFlags(const DivConfig& flags) { // Clock flags - switch (flags&0x1f) { - default: - case 0x00: - chipClock=8000000.0; - break; + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=38400*13*16; // 31948800/4 break; + default: + chipClock=8000000.0; + break; } // Prescaler flags - switch ((flags>>5)&0x3) { - default: - case 0x00: // /6 - prescale=0x2d; - fmFreqBase=9440540.0, - fmDivBase=72, - ayDiv=32; - break; + switch (flags.getInt("prescale",0)) { case 0x01: // /3 prescale=0x2e; fmFreqBase=9440540.0/2.0, @@ -1393,6 +1385,12 @@ void DivPlatformYM2608::setFlags(unsigned int flags) { fmDivBase=24, ayDiv=8; break; + default: // /6 + prescale=0x2d; + fmFreqBase=9440540.0, + fmDivBase=72, + ayDiv=32; + break; } rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { @@ -1401,11 +1399,12 @@ void DivPlatformYM2608::setFlags(unsigned int flags) { immWrite(0x2d,0xff); immWrite(prescale,0xff); ay->setExtClockDiv(chipClock,ayDiv); - ay->setFlags(16); + ay->setFlags(ayFlags); } -int DivPlatformYM2608::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2608::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; + ayFlags.set("chipType",1); adpcmBMem=new unsigned char[getSampleMemCapacity(0)]; adpcmBMemLen=0; iface.adpcmBMem=adpcmBMem; @@ -1420,7 +1419,7 @@ int DivPlatformYM2608::init(DivEngine* p, int channels, int sugRate, unsigned in fm->set_fidelity(ymfm::OPN_FIDELITY_MIN); // YM2149, 2MHz ay=new DivPlatformAY8910(true,chipClock,ayDiv); - ay->init(p,3,sugRate,16); + ay->init(p,3,sugRate,ayFlags); ay->toggleRegisterDump(true); setFlags(flags); reset(); diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index a1b52320..7a9eefa9 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -138,8 +138,8 @@ class DivPlatformYM2608: public DivPlatformOPN { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); void renderSamples(); - void setFlags(unsigned int flags); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + void setFlags(const DivConfig& flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2608(): DivPlatformOPN(9440540.0, 72, 32), diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index 0b73b42c..925e7084 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -541,7 +541,7 @@ void DivPlatformYM2608Ext::notifyInsChange(int ins) { } } -int DivPlatformYM2608Ext::init(DivEngine* parent, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2608Ext::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2608::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { isOpMuted[i]=false; diff --git a/src/engine/platform/ym2608ext.h b/src/engine/platform/ym2608ext.h index 4792323c..fc734097 100644 --- a/src/engine/platform/ym2608ext.h +++ b/src/engine/platform/ym2608ext.h @@ -66,7 +66,7 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2608Ext(); }; diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 89e354a9..f4a7dbfe 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1278,7 +1278,7 @@ void DivPlatformYM2610::setSkipRegisterWrites(bool value) { ay->setSkipRegisterWrites(value); } -int DivPlatformYM2610::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2610::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2610Base::init(p, channels, sugRate, flags); reset(); return 14; diff --git a/src/engine/platform/ym2610.h b/src/engine/platform/ym2610.h index cfe4a585..1572b4a2 100644 --- a/src/engine/platform/ym2610.h +++ b/src/engine/platform/ym2610.h @@ -58,7 +58,7 @@ class DivPlatformYM2610: public DivPlatformYM2610Base<14> { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2610(): DivPlatformYM2610Base<14>(1,4,7,13) {} diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 3ee916a2..b19ad5d7 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1345,7 +1345,7 @@ void DivPlatformYM2610B::setSkipRegisterWrites(bool value) { ay->setSkipRegisterWrites(value); } -int DivPlatformYM2610B::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2610B::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2610Base::init(p, channels, sugRate, flags); reset(); return 16; diff --git a/src/engine/platform/ym2610b.h b/src/engine/platform/ym2610b.h index 488fadf9..1fba7061 100644 --- a/src/engine/platform/ym2610b.h +++ b/src/engine/platform/ym2610b.h @@ -54,7 +54,7 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base<16> { void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2610B(): DivPlatformYM2610Base<16>(2,6,9,15) {} diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index 201bb598..e09f0c57 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -532,7 +532,7 @@ void DivPlatformYM2610BExt::notifyInsChange(int ins) { } } -int DivPlatformYM2610BExt::init(DivEngine* parent, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2610BExt::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2610B::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { isOpMuted[i]=false; diff --git a/src/engine/platform/ym2610bext.h b/src/engine/platform/ym2610bext.h index fcb5e2b0..accd7eee 100644 --- a/src/engine/platform/ym2610bext.h +++ b/src/engine/platform/ym2610bext.h @@ -37,7 +37,7 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2610BExt(); }; diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index ac82bb81..5a0fadab 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -532,7 +532,7 @@ void DivPlatformYM2610Ext::notifyInsChange(int ins) { } } -int DivPlatformYM2610Ext::init(DivEngine* parent, int channels, int sugRate, unsigned int flags) { +int DivPlatformYM2610Ext::init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) { DivPlatformYM2610::init(parent,channels,sugRate,flags); for (int i=0; i<4; i++) { isOpMuted[i]=false; diff --git a/src/engine/platform/ym2610ext.h b/src/engine/platform/ym2610ext.h index 5cc4432c..97ce9c1c 100644 --- a/src/engine/platform/ym2610ext.h +++ b/src/engine/platform/ym2610ext.h @@ -37,7 +37,7 @@ class DivPlatformYM2610Ext: public DivPlatformYM2610 { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); void notifyInsChange(int ins); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformYM2610Ext(); }; diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 920cf499..3641306c 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -260,15 +260,14 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { adpcmBMemLen=memPos+256; } - void setFlags(unsigned int flags) { - switch (flags&0xff) { - default: - case 0x00: - chipClock=8000000.0; - break; + void setFlags(const DivConfig& flags) { + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=24167829/3; break; + default: + chipClock=8000000.0; + break; } rate=chipClock/16; for (int i=0; i class DivPlatformYM2610Base: public DivPlatformOPN { } } - int init(DivEngine* p, int channels, int sugRate, unsigned int flags) { + int init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; + ayFlags.set("chipType",1); dumpWrites=false; skipRegisterWrites=false; for (int i=0; i class DivPlatformYM2610Base: public DivPlatformOPN { setFlags(flags); // YM2149, 2MHz ay=new DivPlatformAY8910(true,chipClock,32); - ay->init(p,3,sugRate,16); + ay->init(p,3,sugRate,ayFlags); ay->toggleRegisterDump(true); return 0; } diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index e89c3f9b..b2797cd6 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -447,14 +447,11 @@ void DivPlatformYMZ280B::setChipModel(int type) { chipType=type; } -void DivPlatformYMZ280B::setFlags(unsigned int flags) { +void DivPlatformYMZ280B::setFlags(const DivConfig& flags) { switch (chipType) { default: case 280: - switch (flags&0xff) { - case 0x00: - chipClock=16934400; - break; + switch (flags.getInt("clockSel",0)) { case 0x01: chipClock=COLOR_NTSC*4.0; break; @@ -470,6 +467,9 @@ void DivPlatformYMZ280B::setFlags(unsigned int flags) { case 0x05: chipClock=14000000; break; + default: + chipClock=16934400; + break; } rate=chipClock/384; break; @@ -483,7 +483,7 @@ void DivPlatformYMZ280B::setFlags(unsigned int flags) { } } -int DivPlatformYMZ280B::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformYMZ280B::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/ymz280b.h b/src/engine/platform/ymz280b.h index e4f65848..3b4b60d5 100644 --- a/src/engine/platform/ymz280b.h +++ b/src/engine/platform/ymz280b.h @@ -100,8 +100,8 @@ class DivPlatformYMZ280B: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); void renderSamples(); - void setFlags(unsigned int flags); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + void setFlags(const DivConfig& flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); private: void writeOutVol(int ch); diff --git a/src/engine/platform/zxbeeper.cpp b/src/engine/platform/zxbeeper.cpp index 5fa3840b..76af5022 100644 --- a/src/engine/platform/zxbeeper.cpp +++ b/src/engine/platform/zxbeeper.cpp @@ -286,8 +286,9 @@ void DivPlatformZXBeeper::notifyInsDeletion(void* ins) { } } -void DivPlatformZXBeeper::setFlags(unsigned int flags) { - if (flags&1) { // technically there is no PAL PC Engine but oh well... +void DivPlatformZXBeeper::setFlags(const DivConfig& flags) { + // TODO: where's ZX Spectrum 48K?! + if (flags.getInt("clockSel",0)) { chipClock=COLOR_PAL*4.0/5.0; } else { chipClock=COLOR_NTSC; @@ -306,7 +307,7 @@ void DivPlatformZXBeeper::poke(std::vector& wlist) { } -int DivPlatformZXBeeper::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { +int DivPlatformZXBeeper::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; skipRegisterWrites=false; diff --git a/src/engine/platform/zxbeeper.h b/src/engine/platform/zxbeeper.h index b02b1fb7..ed82caee 100644 --- a/src/engine/platform/zxbeeper.h +++ b/src/engine/platform/zxbeeper.h @@ -87,13 +87,13 @@ class DivPlatformZXBeeper: public DivDispatch { void tick(bool sysTick=true); void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); - void setFlags(unsigned int flags); + void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); void poke(unsigned int addr, unsigned short val); void poke(std::vector& wlist); const char** getRegisterSheet(); - int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformZXBeeper(); };