fix broken DAC mode

adds new compat flag
This commit is contained in:
tildearrow 2022-03-11 22:11:33 -05:00
parent b73591970d
commit 2a0aa19b2b
6 changed files with 36 additions and 6 deletions

View File

@ -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:
- 64: Furnace dev64
- 63: Furnace dev63 - 63: Furnace dev63
- 62: Furnace dev62 - 62: Furnace dev62
- 61: Furnace dev61 - 61: Furnace dev61
@ -203,7 +204,8 @@ size | description
1 | ignore duplicate slides (>=50) or reserved 1 | ignore duplicate slides (>=50) or reserved
1 | stop portamento on note off (>=62) or reserved 1 | stop portamento on note off (>=62) or reserved
1 | continuous vibrato (>=62) or reserved 1 | continuous vibrato (>=62) or reserved
4 | reserved 1 | broken DAC mode (>=64) or reserved
3 | reserved
4?? | pointers to instruments 4?? | pointers to instruments
4?? | pointers to wavetables 4?? | pointers to wavetables
4?? | pointers to samples 4?? | pointers to samples

View File

@ -37,8 +37,8 @@
warnings+=(String("\n")+x); \ warnings+=(String("\n")+x); \
} }
#define DIV_VERSION "dev63" #define DIV_VERSION "dev64"
#define DIV_ENGINE_VERSION 63 #define DIV_ENGINE_VERSION 64
enum DivStatusView { enum DivStatusView {
DIV_STATUS_NOTHING=0, DIV_STATUS_NOTHING=0,

View File

@ -140,6 +140,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
ds.algMacroBehavior=false; ds.algMacroBehavior=false;
ds.brokenShortcutSlides=false; ds.brokenShortcutSlides=false;
ds.ignoreDuplicateSlides=true; ds.ignoreDuplicateSlides=true;
ds.brokenDACMode=true;
// 1.1 compat flags // 1.1 compat flags
if (ds.version>24) { if (ds.version>24) {
@ -799,6 +800,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
if (ds.version<62) { if (ds.version<62) {
ds.stopPortaOnNoteOff=true; ds.stopPortaOnNoteOff=true;
} }
if (ds.version<64) {
ds.brokenDACMode=false;
}
ds.isDMF=false; ds.isDMF=false;
reader.readS(); // reserved reader.readS(); // reserved
@ -975,7 +979,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
reader.readC(); reader.readC();
reader.readC(); reader.readC();
} }
for (int i=0; i<4; i++) reader.readC(); if (ds.version>=64) {
ds.brokenDACMode=reader.readC();
} else {
reader.readC();
}
for (int i=0; i<3; i++) reader.readC();
} else { } else {
for (int i=0; i<20; i++) reader.readC(); for (int i=0; i<20; i++) reader.readC();
} }
@ -1417,7 +1426,8 @@ SafeWriter* DivEngine::saveFur() {
w->writeC(song.ignoreDuplicateSlides); w->writeC(song.ignoreDuplicateSlides);
w->writeC(song.stopPortaOnNoteOff); w->writeC(song.stopPortaOnNoteOff);
w->writeC(song.continuousVibrato); w->writeC(song.continuousVibrato);
for (int i=0; i<4; i++) { w->writeC(song.brokenDACMode);
for (int i=0; i<3; i++) {
w->writeC(0); w->writeC(0);
} }

View File

@ -99,6 +99,9 @@ void DivPlatformGenesis::acquire_nuked(short* bufL, short* bufR, size_t start, s
dacPos=s->loopStart; dacPos=s->loopStart;
} else { } else {
dacSample=-1; dacSample=-1;
if (parent->song.brokenDACMode) {
rWrite(0x2b,0);
}
} }
} }
dacPeriod+=MAX(40,dacRate); dacPeriod+=MAX(40,dacRate);
@ -163,6 +166,9 @@ void DivPlatformGenesis::acquire_ymfm(short* bufL, short* bufR, size_t start, si
dacPos=s->loopStart; dacPos=s->loopStart;
} else { } else {
dacSample=-1; dacSample=-1;
if (parent->song.brokenDACMode) {
rWrite(0x2b,0);
}
} }
} }
dacPeriod+=MAX(40,dacRate); dacPeriod+=MAX(40,dacRate);
@ -460,6 +466,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) {
if (dumpWrites) addWrite(0xffff0002,0); if (dumpWrites) addWrite(0xffff0002,0);
break; break;
} else { } else {
rWrite(0x2b,1<<7);
if (dumpWrites) addWrite(0xffff0000,dacSample); if (dumpWrites) addWrite(0xffff0000,dacSample);
} }
dacPos=0; dacPos=0;
@ -477,6 +484,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) {
if (dumpWrites) addWrite(0xffff0002,0); if (dumpWrites) addWrite(0xffff0002,0);
break; break;
} else { } else {
rWrite(0x2b,1<<7);
if (dumpWrites) addWrite(0xffff0000,dacSample); if (dumpWrites) addWrite(0xffff0000,dacSample);
} }
dacPos=0; dacPos=0;
@ -541,6 +549,10 @@ int DivPlatformGenesis::dispatch(DivCommand c) {
if (c.chan==5) { if (c.chan==5) {
dacSample=-1; dacSample=-1;
if (dumpWrites) addWrite(0xffff0002,0); if (dumpWrites) addWrite(0xffff0002,0);
if (parent->song.brokenDACMode) {
rWrite(0x2b,0);
break;
}
} }
chan[c.chan].keyOff=true; chan[c.chan].keyOff=true;
chan[c.chan].keyOn=false; chan[c.chan].keyOn=false;

View File

@ -295,6 +295,7 @@ struct DivSong {
bool ignoreDuplicateSlides; bool ignoreDuplicateSlides;
bool stopPortaOnNoteOff; bool stopPortaOnNoteOff;
bool continuousVibrato; bool continuousVibrato;
bool brokenDACMode;
DivOrders orders; DivOrders orders;
std::vector<DivInstrument*> ins; std::vector<DivInstrument*> ins;
@ -359,7 +360,8 @@ struct DivSong {
brokenShortcutSlides(false), brokenShortcutSlides(false),
ignoreDuplicateSlides(false), ignoreDuplicateSlides(false),
stopPortaOnNoteOff(false), stopPortaOnNoteOff(false),
continuousVibrato(false) { continuousVibrato(false),
brokenDACMode(false) {
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;

View File

@ -2115,6 +2115,10 @@ void FurnaceGUI::drawCompatFlags() {
if (ImGui::IsItemHovered()) { if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("when enabled, vibrato will not be reset on a new note."); ImGui::SetTooltip("when enabled, vibrato will not be reset on a new note.");
} }
ImGui::Checkbox("Broken DAC mode",&e->song.brokenDACMode);
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("when enabled, the DAC in YM2612 will be disabled if there isn't any sample playing.");
}
ImGui::Text("Loop modality:"); ImGui::Text("Loop modality:");
if (ImGui::RadioButton("Reset channels",e->song.loopModality==0)) { if (ImGui::RadioButton("Reset channels",e->song.loopModality==0)) {