dev78 - new compat flag that fixes ExtCh
This commit is contained in:
parent
96d45dafb2
commit
ad09254cf4
|
@ -29,6 +29,7 @@ furthermore, an `or reserved` indicates this field is always present, but is res
|
||||||
|
|
||||||
the format versions are:
|
the format versions are:
|
||||||
|
|
||||||
|
- 78: Furnace dev78
|
||||||
- 77: Furnace dev77
|
- 77: Furnace dev77
|
||||||
- 76: Furnace dev76
|
- 76: Furnace dev76
|
||||||
- 75: Furnace dev75/April Fools' 0.6pre0
|
- 75: Furnace dev75/April Fools' 0.6pre0
|
||||||
|
@ -248,7 +249,8 @@ size | description
|
||||||
1 | ignore jump at end (>=71) or reserved
|
1 | ignore jump at end (>=71) or reserved
|
||||||
1 | buggy portamento after slide (>=72) or reserved
|
1 | buggy portamento after slide (>=72) or reserved
|
||||||
1 | new ins affects envelope (Game Boy) (>=72) or reserved
|
1 | new ins affects envelope (Game Boy) (>=72) or reserved
|
||||||
26 | reserved
|
1 | ExtCh channel state is shared (>=78) or reserved
|
||||||
|
25 | reserved
|
||||||
```
|
```
|
||||||
|
|
||||||
# instrument
|
# instrument
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
#define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock();
|
#define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock();
|
||||||
#define BUSY_END isBusy.unlock(); softLocked=false;
|
#define BUSY_END isBusy.unlock(); softLocked=false;
|
||||||
|
|
||||||
#define DIV_VERSION "dev77"
|
#define DIV_VERSION "dev78"
|
||||||
#define DIV_ENGINE_VERSION 77
|
#define DIV_ENGINE_VERSION 78
|
||||||
|
|
||||||
// for imports
|
// for imports
|
||||||
#define DIV_VERSION_MOD 0xff01
|
#define DIV_VERSION_MOD 0xff01
|
||||||
|
|
|
@ -890,6 +890,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
||||||
ds.buggyPortaAfterSlide=true;
|
ds.buggyPortaAfterSlide=true;
|
||||||
ds.gbInsAffectsEnvelope=false;
|
ds.gbInsAffectsEnvelope=false;
|
||||||
}
|
}
|
||||||
|
if (ds.version<78) {
|
||||||
|
ds.sharedExtStat=false;
|
||||||
|
}
|
||||||
ds.isDMF=false;
|
ds.isDMF=false;
|
||||||
|
|
||||||
reader.readS(); // reserved
|
reader.readS(); // reserved
|
||||||
|
@ -1222,7 +1225,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
||||||
reader.readC();
|
reader.readC();
|
||||||
reader.readC();
|
reader.readC();
|
||||||
}
|
}
|
||||||
for (int i=0; i<26; i++) {
|
if (ds.version>=78) {
|
||||||
|
ds.sharedExtStat=reader.readC();
|
||||||
|
} else {
|
||||||
|
reader.readC();
|
||||||
|
}
|
||||||
|
for (int i=0; i<25; i++) {
|
||||||
reader.readC();
|
reader.readC();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2125,7 +2133,8 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) {
|
||||||
w->writeC(song.ignoreJumpAtEnd);
|
w->writeC(song.ignoreJumpAtEnd);
|
||||||
w->writeC(song.buggyPortaAfterSlide);
|
w->writeC(song.buggyPortaAfterSlide);
|
||||||
w->writeC(song.gbInsAffectsEnvelope);
|
w->writeC(song.gbInsAffectsEnvelope);
|
||||||
for (int i=0; i<26; i++) {
|
w->writeC(song.sharedExtStat);
|
||||||
|
for (int i=0; i<25; i++) {
|
||||||
w->writeC(0);
|
w->writeC(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,12 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) {
|
||||||
} else {
|
} else {
|
||||||
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
||||||
}
|
}
|
||||||
// TODO: ???
|
if (parent->song.sharedExtStat) {
|
||||||
|
for (int i=0; i<4; i++) {
|
||||||
|
if (ch==i) continue;
|
||||||
|
opChan[i].pan=opChan[ch].pan;
|
||||||
|
}
|
||||||
|
}
|
||||||
rWrite(chanOffs[2]+0xb4,(opChan[ch].pan<<6)|(chan[2].state.fms&7)|((chan[2].state.ams&3)<<4));
|
rWrite(chanOffs[2]+0xb4,(opChan[ch].pan<<6)|(chan[2].state.fms&7)|((chan[2].state.ams&3)<<4));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,12 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) {
|
||||||
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
||||||
}
|
}
|
||||||
DivInstrument* ins=parent->getIns(opChan[ch].ins);
|
DivInstrument* ins=parent->getIns(opChan[ch].ins);
|
||||||
// TODO: ???
|
if (parent->song.sharedExtStat) {
|
||||||
|
for (int i=0; i<4; i++) {
|
||||||
|
if (ch==i) continue;
|
||||||
|
opChan[i].pan=opChan[ch].pan;
|
||||||
|
}
|
||||||
|
}
|
||||||
rWrite(chanOffs[2]+0xb4,(opChan[ch].pan<<6)|(ins->fm.fms&7)|((ins->fm.ams&3)<<4));
|
rWrite(chanOffs[2]+0xb4,(opChan[ch].pan<<6)|(ins->fm.fms&7)|((ins->fm.ams&3)<<4));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,12 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) {
|
||||||
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
opChan[ch].pan=((c.value&15)>0)|(((c.value>>4)>0)<<1);
|
||||||
}
|
}
|
||||||
DivInstrument* ins=parent->getIns(opChan[ch].ins);
|
DivInstrument* ins=parent->getIns(opChan[ch].ins);
|
||||||
// TODO: ???
|
if (parent->song.sharedExtStat) {
|
||||||
|
for (int i=0; i<4; i++) {
|
||||||
|
if (ch==i) continue;
|
||||||
|
opChan[i].pan=opChan[ch].pan;
|
||||||
|
}
|
||||||
|
}
|
||||||
rWrite(chanOffs[1]+0xb4,(opChan[ch].pan<<6)|(ins->fm.fms&7)|((ins->fm.ams&3)<<4));
|
rWrite(chanOffs[1]+0xb4,(opChan[ch].pan<<6)|(ins->fm.fms&7)|((ins->fm.ams&3)<<4));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,6 +308,7 @@ struct DivSong {
|
||||||
bool ignoreJumpAtEnd;
|
bool ignoreJumpAtEnd;
|
||||||
bool buggyPortaAfterSlide;
|
bool buggyPortaAfterSlide;
|
||||||
bool gbInsAffectsEnvelope;
|
bool gbInsAffectsEnvelope;
|
||||||
|
bool sharedExtStat;
|
||||||
|
|
||||||
DivOrders orders;
|
DivOrders orders;
|
||||||
std::vector<DivInstrument*> ins;
|
std::vector<DivInstrument*> ins;
|
||||||
|
@ -386,7 +387,8 @@ struct DivSong {
|
||||||
rowResetsArpPos(false),
|
rowResetsArpPos(false),
|
||||||
ignoreJumpAtEnd(false),
|
ignoreJumpAtEnd(false),
|
||||||
buggyPortaAfterSlide(false),
|
buggyPortaAfterSlide(false),
|
||||||
gbInsAffectsEnvelope(true) {
|
gbInsAffectsEnvelope(true),
|
||||||
|
sharedExtStat(true) {
|
||||||
for (int i=0; i<32; i++) {
|
for (int i=0; i<32; i++) {
|
||||||
system[i]=DIV_SYSTEM_NULL;
|
system[i]=DIV_SYSTEM_NULL;
|
||||||
systemVol[i]=64;
|
systemVol[i]=64;
|
||||||
|
|
|
@ -154,6 +154,10 @@ void FurnaceGUI::drawCompatFlags() {
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6");
|
ImGui::SetTooltip("behavior changed in 0.6");
|
||||||
}
|
}
|
||||||
|
ImGui::Checkbox("ExtCh channel status is shared among operators",&e->song.sharedExtStat);
|
||||||
|
if (ImGui::IsItemHovered()) {
|
||||||
|
ImGui::SetTooltip("behavior changed in 0.6");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_COMPAT_FLAGS;
|
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_COMPAT_FLAGS;
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|
Loading…
Reference in New Issue