diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index 27a93799b..3e0055e1e 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -123,6 +123,7 @@ void DivPlatformVB::acquire(short** buf, size_t len) { } void DivPlatformVB::updateWave(int ch) { + if (romMode) return; if (ch>=5) return; for (int i=0; i<32; i++) { @@ -162,6 +163,9 @@ void DivPlatformVB::tick(bool sysTick) { if (chan[i].std.wave.had) { if (chan[i].wave!=chan[i].std.wave.val || chan[i].ws.activeChanged()) { chan[i].wave=chan[i].std.wave.val; + if (romMode) { + chWrite(i,0x06,chan[i].wave); + } chan[i].ws.changeWave1(chan[i].wave); if (!chan[i].keyOff) chan[i].keyOn=true; } @@ -282,6 +286,9 @@ int DivPlatformVB::dispatch(DivCommand c) { case DIV_CMD_WAVE: chan[c.chan].wave=c.value; chan[c.chan].ws.changeWave1(chan[c.chan].wave); + if (romMode) { + chWrite(c.chan,0x06,chan[c.chan].wave); + } chan[c.chan].keyOn=true; break; case DIV_CMD_NOTE_PORTA: { @@ -464,8 +471,13 @@ void DivPlatformVB::reset() { chWrite(i,0x01,isMuted[i]?0:chan[i].pan); chWrite(i,0x05,0x00); chWrite(i,0x00,0x80); - chWrite(i,0x06,i); + if (romMode) { + chWrite(i,0x06,0); + } else { + chWrite(i,0x06,i); + } } + updateROMWaves(); delay=500; } @@ -481,6 +493,27 @@ float DivPlatformVB::getPostAmp() { return 6.0f; } +void DivPlatformVB::updateROMWaves() { + if (romMode) { + // copy wavetables + for (int i=0; i<5; i++) { + int data=0; + DivWavetable* w=parent->getWave(i); + + for (int j=0; j<32; j++) { + if (w->max<1 || w->len<1) { + data=0; + } else { + data=w->data[j*w->len/32]*63/w->max; + if (data<0) data=0; + if (data>63) data=63; + } + rWrite((i<<7)+(j<<2),data); + } + } + } +} + void DivPlatformVB::notifyWaveChange(int wave) { for (int i=0; i<6; i++) { if (chan[i].wave==wave) { @@ -488,6 +521,7 @@ void DivPlatformVB::notifyWaveChange(int wave) { updateWave(i); } } + updateROMWaves(); } void DivPlatformVB::notifyInsDeletion(void* ins) { @@ -504,6 +538,8 @@ void DivPlatformVB::setFlags(const DivConfig& flags) { oscBuf[i]->rate=rate; } + romMode=flags.getBool("romMode",false); + if (vb!=NULL) { delete vb; vb=NULL; diff --git a/src/engine/platform/vb.h b/src/engine/platform/vb.h index 508e9a049..940491f60 100644 --- a/src/engine/platform/vb.h +++ b/src/engine/platform/vb.h @@ -57,10 +57,12 @@ class DivPlatformVB: public DivDispatch { int tempR; unsigned char modulation; bool modType; + bool romMode; signed char modTable[32]; VSU* vb; unsigned char regPool[0x600]; void updateWave(int ch); + void updateROMWaves(); void writeEnv(int ch, bool upperByteToo=false); friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index b286550ee..b4c4ff578 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -2242,10 +2242,31 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl } break; } + case DIV_SYSTEM_VBOY: { + bool romMode=flags.getBool("romMode",false); + + ImGui::Text("Waveform storage mode:"); + ImGui::Indent(); + if (ImGui::RadioButton("Dynamic (unconfirmed)",!romMode)) { + romMode=false; + altered=true; + } + if (ImGui::RadioButton("Static (up to 5 waves)",romMode)) { + romMode=true; + altered=true; + } + ImGui::Unindent(); + + if (altered) { + e->lockSave([&]() { + flags.set("romMode",romMode); + }); + } + break; + } case DIV_SYSTEM_SWAN: case DIV_SYSTEM_BUBSYS_WSG: case DIV_SYSTEM_PET: - case DIV_SYSTEM_VBOY: case DIV_SYSTEM_GA20: case DIV_SYSTEM_PV1000: case DIV_SYSTEM_VERA: