chip flags rewrite, part 3 - DO NOT USE
the next thing to do is to change DivDispatch::setFlags() to use the new flags no chip configuration until this is finished!
This commit is contained in:
parent
3b28549885
commit
ee6e0aa0e0
|
@ -1229,7 +1229,7 @@ chips which aren't on this list don't have any flags.
|
|||
|
||||
## 0x05: PC Engine
|
||||
|
||||
- bit 1: clockSel (int)
|
||||
- bit 0: clockSel (int)
|
||||
- 0: NTSC
|
||||
- 1: pseudo-PAL
|
||||
- bit 2: chipType (int)
|
||||
|
@ -1289,6 +1289,7 @@ chips which aren't on this list don't have any flags.
|
|||
- 2: Sunsoft 5B
|
||||
- 3: AY-3-8914
|
||||
- bit 6: stereo (bool)
|
||||
- bit 7: halfClock (bool)
|
||||
- bit 8-15: stereoSep (int)
|
||||
|
||||
## 0x81: Amiga
|
||||
|
@ -1454,6 +1455,7 @@ chips which aren't on this list don't have any flags.
|
|||
- 11: double NTSC
|
||||
- 12: 3.6MHz
|
||||
- bit 6: stereo (bool)
|
||||
- bit 7: halfClock (bool)
|
||||
- bit 8-15: stereoSep (int)
|
||||
|
||||
## 0x9d: VRC7
|
||||
|
@ -1556,4 +1558,4 @@ chips which aren't on this list don't have any flags.
|
|||
## 0xe0: QSound
|
||||
|
||||
- bit 0-11: echoDelay (int)
|
||||
- bit 12-19: echoFeedback (int)
|
||||
- bit 12-19: echoFeedback (int)
|
||||
|
|
|
@ -105,7 +105,7 @@ bool DivConfig::loadFromMemory(const char* buf) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool DivConfig::getConfBool(String key, bool fallback) {
|
||||
bool DivConfig::getBool(String key, bool fallback) {
|
||||
try {
|
||||
String val=conf.at(key);
|
||||
if (val=="true") {
|
||||
|
@ -118,7 +118,7 @@ bool DivConfig::getConfBool(String key, bool fallback) {
|
|||
return fallback;
|
||||
}
|
||||
|
||||
int DivConfig::getConfInt(String key, int fallback) {
|
||||
int DivConfig::getInt(String key, int fallback) {
|
||||
try {
|
||||
String val=conf.at(key);
|
||||
int ret=std::stoi(val);
|
||||
|
@ -129,7 +129,7 @@ int DivConfig::getConfInt(String key, int fallback) {
|
|||
return fallback;
|
||||
}
|
||||
|
||||
float DivConfig::getConfFloat(String key, float fallback) {
|
||||
float DivConfig::getFloat(String key, float fallback) {
|
||||
try {
|
||||
String val=conf.at(key);
|
||||
float ret=std::stof(val);
|
||||
|
@ -140,7 +140,7 @@ float DivConfig::getConfFloat(String key, float fallback) {
|
|||
return fallback;
|
||||
}
|
||||
|
||||
double DivConfig::getConfDouble(String key, double fallback) {
|
||||
double DivConfig::getDouble(String key, double fallback) {
|
||||
try {
|
||||
String val=conf.at(key);
|
||||
double ret=std::stod(val);
|
||||
|
@ -151,7 +151,7 @@ double DivConfig::getConfDouble(String key, double fallback) {
|
|||
return fallback;
|
||||
}
|
||||
|
||||
String DivConfig::getConfString(String key, String fallback) {
|
||||
String DivConfig::getString(String key, String fallback) {
|
||||
try {
|
||||
String val=conf.at(key);
|
||||
return val;
|
||||
|
@ -160,7 +160,7 @@ String DivConfig::getConfString(String key, String fallback) {
|
|||
return fallback;
|
||||
}
|
||||
|
||||
void DivConfig::setConf(String key, bool value) {
|
||||
void DivConfig::set(String key, bool value) {
|
||||
if (value) {
|
||||
conf[key]="true";
|
||||
} else {
|
||||
|
@ -168,22 +168,30 @@ void DivConfig::setConf(String key, bool value) {
|
|||
}
|
||||
}
|
||||
|
||||
void DivConfig::setConf(String key, int value) {
|
||||
void DivConfig::set(String key, int value) {
|
||||
conf[key]=fmt::sprintf("%d",value);
|
||||
}
|
||||
|
||||
void DivConfig::setConf(String key, float value) {
|
||||
void DivConfig::set(String key, float value) {
|
||||
conf[key]=fmt::sprintf("%f",value);
|
||||
}
|
||||
|
||||
void DivConfig::setConf(String key, double value) {
|
||||
void DivConfig::set(String key, double value) {
|
||||
conf[key]=fmt::sprintf("%f",value);
|
||||
}
|
||||
|
||||
void DivConfig::setConf(String key, const char* value) {
|
||||
void DivConfig::set(String key, const char* value) {
|
||||
conf[key]=String(value);
|
||||
}
|
||||
|
||||
void DivConfig::setConf(String key, String value) {
|
||||
void DivConfig::set(String key, String value) {
|
||||
conf[key]=value;
|
||||
}
|
||||
|
||||
bool DivConfig::remove(String key) {
|
||||
return conf.erase(key);
|
||||
}
|
||||
|
||||
void DivConfig::clear() {
|
||||
conf.clear();
|
||||
}
|
||||
|
|
|
@ -34,19 +34,25 @@ class DivConfig {
|
|||
bool save(const char* path);
|
||||
|
||||
// get a config value
|
||||
bool getConfBool(String key, bool fallback);
|
||||
int getConfInt(String key, int fallback);
|
||||
float getConfFloat(String key, float fallback);
|
||||
double getConfDouble(String key, double fallback);
|
||||
String getConfString(String key, String fallback);
|
||||
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);
|
||||
|
||||
// set a config value
|
||||
void setConf(String key, bool value);
|
||||
void setConf(String key, int value);
|
||||
void setConf(String key, float value);
|
||||
void setConf(String key, double value);
|
||||
void setConf(String key, const char* value);
|
||||
void setConf(String key, String value);
|
||||
void set(String key, bool value);
|
||||
void set(String key, int value);
|
||||
void set(String key, float value);
|
||||
void set(String key, double value);
|
||||
void set(String key, const char* value);
|
||||
void set(String key, String value);
|
||||
|
||||
// remove a config value
|
||||
bool remove(String key);
|
||||
|
||||
// clear config
|
||||
void clear();
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -118,45 +118,45 @@ bool DivEngine::loadConf() {
|
|||
}
|
||||
|
||||
bool DivEngine::getConfBool(String key, bool fallback) {
|
||||
return conf.getConfBool(key,fallback);
|
||||
return conf.getBool(key,fallback);
|
||||
}
|
||||
|
||||
int DivEngine::getConfInt(String key, int fallback) {
|
||||
return conf.getConfInt(key,fallback);
|
||||
return conf.getInt(key,fallback);
|
||||
}
|
||||
|
||||
float DivEngine::getConfFloat(String key, float fallback) {
|
||||
return conf.getConfFloat(key,fallback);
|
||||
return conf.getFloat(key,fallback);
|
||||
}
|
||||
|
||||
double DivEngine::getConfDouble(String key, double fallback) {
|
||||
return conf.getConfDouble(key,fallback);
|
||||
return conf.getDouble(key,fallback);
|
||||
}
|
||||
|
||||
String DivEngine::getConfString(String key, String fallback) {
|
||||
return conf.getConfString(key,fallback);
|
||||
return conf.getString(key,fallback);
|
||||
}
|
||||
|
||||
void DivEngine::setConf(String key, bool value) {
|
||||
conf.setConf(key,value);
|
||||
conf.set(key,value);
|
||||
}
|
||||
|
||||
void DivEngine::setConf(String key, int value) {
|
||||
conf.setConf(key,value);
|
||||
conf.set(key,value);
|
||||
}
|
||||
|
||||
void DivEngine::setConf(String key, float value) {
|
||||
conf.setConf(key,value);
|
||||
conf.set(key,value);
|
||||
}
|
||||
|
||||
void DivEngine::setConf(String key, double value) {
|
||||
conf.setConf(key,value);
|
||||
conf.set(key,value);
|
||||
}
|
||||
|
||||
void DivEngine::setConf(String key, const char* value) {
|
||||
conf.setConf(key,value);
|
||||
conf.set(key,value);
|
||||
}
|
||||
|
||||
void DivEngine::setConf(String key, String value) {
|
||||
conf.setConf(key,value);
|
||||
}
|
||||
conf.set(key,value);
|
||||
}
|
||||
|
|
|
@ -47,8 +47,8 @@
|
|||
#define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock();
|
||||
#define BUSY_END isBusy.unlock(); softLocked=false;
|
||||
|
||||
#define DIV_VERSION "dev118"
|
||||
#define DIV_ENGINE_VERSION 118
|
||||
#define DIV_VERSION "dev119"
|
||||
#define DIV_ENGINE_VERSION 119
|
||||
// for imports
|
||||
#define DIV_VERSION_MOD 0xff01
|
||||
#define DIV_VERSION_FC 0xff02
|
||||
|
@ -442,6 +442,8 @@ class DivEngine {
|
|||
void reset();
|
||||
void playSub(bool preserveDrift, int goalRow=0);
|
||||
|
||||
void convertOldFlags(unsigned int oldFlags, DivConfig& newFlags, DivSystem sys);
|
||||
|
||||
bool loadDMF(unsigned char* file, size_t len);
|
||||
bool loadFur(unsigned char* file, size_t len);
|
||||
bool loadMod(unsigned char* file, size_t len);
|
||||
|
|
|
@ -977,11 +977,586 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
|
|||
return true;
|
||||
}
|
||||
|
||||
void DivEngine::convertOldFlags(unsigned int oldFlags, DivConfig& newFlags, DivSystem sys) {
|
||||
newFlags.clear();
|
||||
|
||||
switch (sys) {
|
||||
case DIV_SYSTEM_SMS:
|
||||
switch (oldFlags&0xff03) {
|
||||
case 0x0000:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 0x0001:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 0x0002:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 0x0003:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
case 0x0100:
|
||||
newFlags.set("clockSel",4);
|
||||
break;
|
||||
case 0x0101:
|
||||
newFlags.set("clockSel",5);
|
||||
break;
|
||||
case 0x0102:
|
||||
newFlags.set("clockSel",6);
|
||||
break;
|
||||
}
|
||||
switch (oldFlags&0xcc) {
|
||||
case 0x00:
|
||||
newFlags.set("chipType",0);
|
||||
break;
|
||||
case 0x04:
|
||||
newFlags.set("chipType",1);
|
||||
break;
|
||||
case 0x08:
|
||||
newFlags.set("chipType",2);
|
||||
break;
|
||||
case 0x0c:
|
||||
newFlags.set("chipType",3);
|
||||
break;
|
||||
case 0x40:
|
||||
newFlags.set("chipType",4);
|
||||
break;
|
||||
case 0x44:
|
||||
newFlags.set("chipType",5);
|
||||
break;
|
||||
case 0x48:
|
||||
newFlags.set("chipType",6);
|
||||
break;
|
||||
case 0x4c:
|
||||
newFlags.set("chipType",7);
|
||||
break;
|
||||
case 0x80:
|
||||
newFlags.set("chipType",8);
|
||||
break;
|
||||
case 0x84:
|
||||
newFlags.set("chipType",9);
|
||||
break;
|
||||
}
|
||||
if (oldFlags&16) newFlags.set("noPhaseReset",true);
|
||||
break;
|
||||
case DIV_SYSTEM_GB:
|
||||
newFlags.set("chipType",(int)(oldFlags&3));
|
||||
if (oldFlags&8) newFlags.set("noAntiClick",true);
|
||||
break;
|
||||
case DIV_SYSTEM_PCE:
|
||||
newFlags.set("clockSel",(int)(oldFlags&1));
|
||||
newFlags.set("chipType",(oldFlags&4)?1:0);
|
||||
if (oldFlags&8) newFlags.set("noAntiClick",true);
|
||||
break;
|
||||
case DIV_SYSTEM_NES:
|
||||
case DIV_SYSTEM_VRC6:
|
||||
case DIV_SYSTEM_FDS:
|
||||
case DIV_SYSTEM_MMC5:
|
||||
case DIV_SYSTEM_SAA1099:
|
||||
case DIV_SYSTEM_OPZ:
|
||||
switch (oldFlags) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_C64_6581:
|
||||
case DIV_SYSTEM_C64_8580:
|
||||
switch (oldFlags&15) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_YM2610:
|
||||
case DIV_SYSTEM_YM2610_EXT:
|
||||
case DIV_SYSTEM_YM2610_FULL:
|
||||
case DIV_SYSTEM_YM2610_FULL_EXT:
|
||||
case DIV_SYSTEM_YM2610B:
|
||||
case DIV_SYSTEM_YM2610B_EXT:
|
||||
switch (oldFlags&0xff) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_AY8910:
|
||||
case DIV_SYSTEM_AY8930:
|
||||
switch (oldFlags&15) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
case 4:
|
||||
newFlags.set("clockSel",4);
|
||||
break;
|
||||
case 5:
|
||||
newFlags.set("clockSel",5);
|
||||
break;
|
||||
case 6:
|
||||
newFlags.set("clockSel",6);
|
||||
break;
|
||||
case 7:
|
||||
newFlags.set("clockSel",7);
|
||||
break;
|
||||
case 8:
|
||||
newFlags.set("clockSel",8);
|
||||
break;
|
||||
case 9:
|
||||
newFlags.set("clockSel",9);
|
||||
break;
|
||||
case 10:
|
||||
newFlags.set("clockSel",10);
|
||||
break;
|
||||
case 11:
|
||||
newFlags.set("clockSel",11);
|
||||
break;
|
||||
case 12:
|
||||
newFlags.set("clockSel",12);
|
||||
break;
|
||||
case 13:
|
||||
if (sys==DIV_SYSTEM_AY8910) newFlags.set("clockSel",13);
|
||||
break;
|
||||
case 14:
|
||||
if (sys==DIV_SYSTEM_AY8910) newFlags.set("clockSel",14);
|
||||
break;
|
||||
}
|
||||
if (sys==DIV_SYSTEM_AY8910) switch ((oldFlags>>4)&3) {
|
||||
case 0:
|
||||
newFlags.set("chipType",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("chipType",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("chipType",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("chipType",3);
|
||||
break;
|
||||
}
|
||||
if (oldFlags&64) newFlags.set("stereo",true);
|
||||
if (oldFlags&128) newFlags.set("halfClock",true);
|
||||
newFlags.set("stereoSep",(int)((oldFlags>>8)&255));
|
||||
break;
|
||||
case DIV_SYSTEM_AMIGA:
|
||||
if (oldFlags&1) newFlags.set("clockSel",1);
|
||||
if (oldFlags&2) newFlags.set("chipType",1);
|
||||
if (oldFlags&4) newFlags.set("bypassLimits",true);
|
||||
newFlags.set("stereoSep",(int)((oldFlags>>8)&127));
|
||||
break;
|
||||
case DIV_SYSTEM_YM2151:
|
||||
switch (oldFlags&255) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_YM2612:
|
||||
case DIV_SYSTEM_YM2612_EXT:
|
||||
case DIV_SYSTEM_YM2612_FRAC:
|
||||
case DIV_SYSTEM_YM2612_FRAC_EXT:
|
||||
switch (oldFlags&0x7fffffff) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
case 4:
|
||||
newFlags.set("clockSel",4);
|
||||
break;
|
||||
}
|
||||
if (oldFlags&0x80000000) newFlags.set("ladderEffect",true);
|
||||
break;
|
||||
case DIV_SYSTEM_TIA:
|
||||
newFlags.set("clockSel",(int)(oldFlags&1));
|
||||
switch ((oldFlags>>1)&3) {
|
||||
case 0:
|
||||
newFlags.set("mixingType",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("mixingType",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("mixingType",2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_VIC20:
|
||||
newFlags.set("clockSel",(int)(oldFlags&1));
|
||||
break;
|
||||
case DIV_SYSTEM_SNES:
|
||||
newFlags.set("volScaleL",(int)(oldFlags&127));
|
||||
newFlags.set("volScaleR",(int)((oldFlags>>8)&127));
|
||||
break;
|
||||
case DIV_SYSTEM_OPLL:
|
||||
case DIV_SYSTEM_OPLL_DRUMS:
|
||||
switch (oldFlags&15) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
}
|
||||
switch (oldFlags>>4) {
|
||||
case 0:
|
||||
newFlags.set("patchSet",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("patchSet",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("patchSet",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("patchSet",3);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_N163:
|
||||
switch (oldFlags&15) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
}
|
||||
newFlags.set("channels",(int)((oldFlags>>4)&7));
|
||||
if (oldFlags&128) newFlags.set("multiplex",true);
|
||||
break;
|
||||
case DIV_SYSTEM_OPN:
|
||||
case DIV_SYSTEM_OPN_EXT:
|
||||
switch (oldFlags&31) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
case 4:
|
||||
newFlags.set("clockSel",4);
|
||||
break;
|
||||
case 5:
|
||||
newFlags.set("clockSel",5);
|
||||
break;
|
||||
}
|
||||
switch ((oldFlags>>5)&3) {
|
||||
case 0:
|
||||
newFlags.set("prescale",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("prescale",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("prescale",2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_PC98:
|
||||
case DIV_SYSTEM_PC98_EXT:
|
||||
switch (oldFlags&31) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
}
|
||||
switch ((oldFlags>>5)&3) {
|
||||
case 0:
|
||||
newFlags.set("prescale",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("prescale",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("prescale",2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_OPL:
|
||||
case DIV_SYSTEM_OPL2:
|
||||
case DIV_SYSTEM_Y8950:
|
||||
case DIV_SYSTEM_OPL_DRUMS:
|
||||
case DIV_SYSTEM_OPL2_DRUMS:
|
||||
case DIV_SYSTEM_Y8950_DRUMS:
|
||||
case DIV_SYSTEM_YMZ280B:
|
||||
switch (oldFlags&0xff) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
case 4:
|
||||
newFlags.set("clockSel",4);
|
||||
break;
|
||||
case 5:
|
||||
newFlags.set("clockSel",5);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_OPL3:
|
||||
case DIV_SYSTEM_OPL3_DRUMS:
|
||||
switch (oldFlags&0xff) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
case 4:
|
||||
newFlags.set("clockSel",4);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_PCSPKR:
|
||||
newFlags.set("speakerType",(int)(oldFlags&3));
|
||||
break;
|
||||
case DIV_SYSTEM_RF5C68:
|
||||
switch (oldFlags&15) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
}
|
||||
switch (oldFlags>>4) {
|
||||
case 0:
|
||||
newFlags.set("chipType",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("chipType",0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_VRC7:
|
||||
switch (oldFlags&15) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_SFX_BEEPER:
|
||||
newFlags.set("clockSel",(int)(oldFlags&1));
|
||||
break;
|
||||
case DIV_SYSTEM_SCC:
|
||||
case DIV_SYSTEM_SCC_PLUS:
|
||||
switch (oldFlags&63) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_MSM6295:
|
||||
switch (oldFlags&63) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
case 4:
|
||||
newFlags.set("clockSel",4);
|
||||
break;
|
||||
case 5:
|
||||
newFlags.set("clockSel",5);
|
||||
break;
|
||||
case 6:
|
||||
newFlags.set("clockSel",6);
|
||||
break;
|
||||
case 7:
|
||||
newFlags.set("clockSel",7);
|
||||
break;
|
||||
case 8:
|
||||
newFlags.set("clockSel",8);
|
||||
break;
|
||||
case 9:
|
||||
newFlags.set("clockSel",9);
|
||||
break;
|
||||
case 10:
|
||||
newFlags.set("clockSel",10);
|
||||
break;
|
||||
case 11:
|
||||
newFlags.set("clockSel",11);
|
||||
break;
|
||||
case 12:
|
||||
newFlags.set("clockSel",12);
|
||||
break;
|
||||
case 13:
|
||||
newFlags.set("clockSel",13);
|
||||
break;
|
||||
case 14:
|
||||
newFlags.set("clockSel",14);
|
||||
break;
|
||||
}
|
||||
if (oldFlags&128) newFlags.set("rateSel",true);
|
||||
break;
|
||||
case DIV_SYSTEM_MSM6258:
|
||||
switch (oldFlags) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
case 3:
|
||||
newFlags.set("clockSel",3);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_OPL4:
|
||||
case DIV_SYSTEM_OPL4_DRUMS:
|
||||
switch (oldFlags&0xff) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
case 2:
|
||||
newFlags.set("clockSel",2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_X1_010:
|
||||
switch (oldFlags&15) {
|
||||
case 0:
|
||||
newFlags.set("clockSel",0);
|
||||
break;
|
||||
case 1:
|
||||
newFlags.set("clockSel",1);
|
||||
break;
|
||||
}
|
||||
if (oldFlags&16) newFlags.set("stereo",true);
|
||||
break;
|
||||
case DIV_SYSTEM_SOUND_UNIT:
|
||||
newFlags.set("clockSel",(int)(oldFlags&1));
|
||||
if (oldFlags&4) newFlags.set("echo",true);
|
||||
if (oldFlags&8) newFlags.set("swapEcho",true);
|
||||
newFlags.set("sampleMemSize",(int)((oldFlags>>4)&1));
|
||||
if (oldFlags&32) newFlags.set("pdm",true);
|
||||
newFlags.set("echoDelay",(int)((oldFlags>>8)&63));
|
||||
newFlags.set("echoFeedback",(int)((oldFlags>>16)&15));
|
||||
newFlags.set("echoResolution",(int)((oldFlags>>20)&15));
|
||||
newFlags.set("echoVol",(int)((oldFlags>>24)&255));
|
||||
break;
|
||||
case DIV_SYSTEM_PCM_DAC:
|
||||
newFlags.set("rate",(int)((oldFlags&0xffff)+1));
|
||||
newFlags.set("outDepth",(int)((oldFlags>>16)&15));
|
||||
if (oldFlags&0x100000) newFlags.set("stereo",true);
|
||||
break;
|
||||
case DIV_SYSTEM_QSOUND:
|
||||
newFlags.set("echoDelay",(int)(oldFlags&0xfff));
|
||||
newFlags.set("echoFeedback",(int)((oldFlags>>12)&255));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
||||
unsigned int insPtr[256];
|
||||
unsigned int wavePtr[256];
|
||||
unsigned int samplePtr[256];
|
||||
unsigned int subSongPtr[256];
|
||||
unsigned int sysFlagsPtr[32];
|
||||
std::vector<int> patPtr;
|
||||
int numberOfSubSongs=0;
|
||||
char magic[5];
|
||||
|
@ -1235,7 +1810,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
|||
|
||||
// system props
|
||||
for (int i=0; i<32; i++) {
|
||||
ds.systemFlagsOld[i]=reader.readI();
|
||||
sysFlagsPtr[i]=reader.readI();
|
||||
}
|
||||
|
||||
// handle compound systems
|
||||
|
@ -1587,6 +2162,40 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
|||
ds.autoSystem=true;
|
||||
}
|
||||
|
||||
// read system flags
|
||||
if (ds.version>=119) {
|
||||
logD("reading chip flags...");
|
||||
for (int i=0; i<32; i++) {
|
||||
if (sysFlagsPtr[i]==0) continue;
|
||||
|
||||
if (!reader.seek(sysFlagsPtr[i],SEEK_SET)) {
|
||||
logE("couldn't seek to chip %d flags!",i+1);
|
||||
lastError=fmt::sprintf("couldn't seek to chip %d flags!",i+1);
|
||||
ds.unload();
|
||||
delete[] file;
|
||||
return false;
|
||||
}
|
||||
|
||||
reader.read(magic,4);
|
||||
if (strcmp(magic,"FLAG")!=0) {
|
||||
logE("%d: invalid flag header!",i);
|
||||
lastError="invalid flag header!";
|
||||
ds.unload();
|
||||
delete[] file;
|
||||
return false;
|
||||
}
|
||||
reader.readI();
|
||||
|
||||
String data=reader.readString();
|
||||
ds.systemFlags[i].loadFromMemory(data.c_str());
|
||||
}
|
||||
} else {
|
||||
logD("reading old chip flags...");
|
||||
for (int i=0; i<ds.systemLen; i++) {
|
||||
convertOldFlags(sysFlagsPtr[i],ds.systemFlags[i],ds.system[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// read subsongs
|
||||
if (ds.version>=95) {
|
||||
for (int i=0; i<numberOfSubSongs; i++) {
|
||||
|
@ -3605,11 +4214,12 @@ struct PatToWrite {
|
|||
SafeWriter* DivEngine::saveFur(bool notPrimary) {
|
||||
saveLock.lock();
|
||||
std::vector<int> subSongPtr;
|
||||
std::vector<int> sysFlagsPtr;
|
||||
std::vector<int> insPtr;
|
||||
std::vector<int> wavePtr;
|
||||
std::vector<int> samplePtr;
|
||||
std::vector<int> patPtr;
|
||||
size_t ptrSeek, subSongPtrSeek, blockStartSeek, blockEndSeek;
|
||||
size_t ptrSeek, subSongPtrSeek, sysFlagsPtrSeek, blockStartSeek, blockEndSeek;
|
||||
size_t subSongIndex=0;
|
||||
DivSubSong* subSong=song.subsong[subSongIndex];
|
||||
warnings="";
|
||||
|
@ -3733,8 +4343,10 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) {
|
|||
w->writeC(song.systemPan[i]);
|
||||
}
|
||||
|
||||
// chip flags (we'll seek here later)
|
||||
sysFlagsPtrSeek=w->tell();
|
||||
for (int i=0; i<32; i++) {
|
||||
w->writeI(song.systemFlagsOld[i]);
|
||||
w->writeI(0);
|
||||
}
|
||||
|
||||
// song name
|
||||
|
@ -3933,6 +4545,27 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) {
|
|||
w->seek(0,SEEK_END);
|
||||
}
|
||||
|
||||
/// CHIP FLAGS
|
||||
for (int i=0; i<song.systemLen; i++) {
|
||||
String data=song.systemFlags[i].toString();
|
||||
if (data.empty()) {
|
||||
sysFlagsPtr.push_back(0);
|
||||
continue;
|
||||
}
|
||||
|
||||
sysFlagsPtr.push_back(w->tell());
|
||||
w->write("FLAG",4);
|
||||
blockStartSeek=w->tell();
|
||||
w->writeI(0);
|
||||
|
||||
w->writeString(data,false);
|
||||
|
||||
blockEndSeek=w->tell();
|
||||
w->seek(blockStartSeek,SEEK_SET);
|
||||
w->writeI(blockEndSeek-blockStartSeek-4);
|
||||
w->seek(0,SEEK_END);
|
||||
}
|
||||
|
||||
/// INSTRUMENT
|
||||
for (int i=0; i<song.insLen; i++) {
|
||||
DivInstrument* ins=song.ins[i];
|
||||
|
@ -4050,14 +4683,18 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) {
|
|||
w->writeI(i);
|
||||
}
|
||||
|
||||
/// SUBSONG POINTERS
|
||||
w->seek(subSongPtrSeek,SEEK_SET);
|
||||
|
||||
// subsong pointers
|
||||
w->seek(subSongPtrSeek,SEEK_SET);
|
||||
for (size_t i=0; i<(song.subsong.size()-1); i++) {
|
||||
w->writeI(subSongPtr[i]);
|
||||
}
|
||||
|
||||
// flag pointers
|
||||
w->seek(sysFlagsPtrSeek,SEEK_SET);
|
||||
for (size_t i=0; i<sysFlagsPtr.size(); i++) {
|
||||
w->writeI(sysFlagsPtr[i]);
|
||||
}
|
||||
|
||||
saveLock.unlock();
|
||||
return w;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,9 @@
|
|||
#include "gui.h"
|
||||
|
||||
void FurnaceGUI::drawSysConf(int chan, DivSystem type, unsigned int& flags, bool modifyOnChange) {
|
||||
ImGui::Text("temporarily unavailable!");
|
||||
return;
|
||||
/*
|
||||
bool restart=settings.restartOnFlagChange && modifyOnChange;
|
||||
bool sysPal=flags&1;
|
||||
unsigned int copyOfFlags=flags;
|
||||
|
@ -797,4 +800,5 @@ void FurnaceGUI::drawSysConf(int chan, DivSystem type, unsigned int& flags, bool
|
|||
flags=copyOfFlags;
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue