diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 37a001b2..4574ebb9 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -453,18 +453,6 @@ class DivDispatch { */ virtual bool getWantPreNote(); - /** - * get minimum chip clock. - * @return clock in Hz, or 0 if custom clocks are not supported. - */ - virtual unsigned int getClockRangeMin(); - - /** - * get maximum chip clock. - * @return clock in Hz, or 0 if custom clocks are not supported. - */ - virtual unsigned int getClockRangeMax(); - /** * set the chip flags. * @param flags a DivConfig containing chip flags. @@ -591,6 +579,14 @@ class DivDispatch { virtual ~DivDispatch(); }; +// custom chip clock helper define. put in setFlags, but before rate is set. +#define CHECK_CUSTOM_CLOCK \ + if (flags.getInt("customClock",0)>0) { \ + chipClock=flags.getInt("customClock",1000000); \ + if (chipClock>20000000) chipClock=20000000; \ + if (chipClock<100000) chipClock=100000; \ + } + // pitch calculation: // - a DivDispatch usually contains four variables per channel: // - baseFreq: this changes on new notes, legato, arpeggio and slides. diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 8ee1d45a..33dd3c17 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -97,14 +97,6 @@ bool DivDispatch::getWantPreNote() { return false; } -unsigned int DivDispatch::getClockRangeMin() { - return 0; -} - -unsigned int DivDispatch::getClockRangeMax() { - return 0; -} - void DivDispatch::setFlags(const DivConfig& flags) { } diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index ab2c2c72..b10cdfd8 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -826,6 +826,7 @@ void DivPlatformAY8910::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC/2.0; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/8; } for (int i=0; i<3; i++) { diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index 821fa4fe..2ec70048 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -804,6 +804,7 @@ void DivPlatformAY8930::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC/2.0; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/4; for (int i=0; i<3; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index c00b4ce2..a43b8b1d 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -323,6 +323,7 @@ void DivPlatformBubSysWSG::notifyInsDeletion(void* ins) { void DivPlatformBubSysWSG::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC; + CHECK_CUSTOM_CLOCK; rate=chipClock; for (int i=0; i<2; i++) { oscBuf[i]->rate=rate/64; diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 9fb10d41..068dd1b3 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -535,17 +535,18 @@ void DivPlatformC64::setFP(bool fp) { void DivPlatformC64::setFlags(const DivConfig& flags) { switch (flags.getInt("clockSel",0)) { case 0x0: // NTSC C64 - rate=COLOR_NTSC*2.0/7.0; + chipClock=COLOR_NTSC*2.0/7.0; break; case 0x1: // PAL C64 - rate=COLOR_PAL*2.0/9.0; + chipClock=COLOR_PAL*2.0/9.0; break; case 0x2: // SSI 2001 default: - rate=14318180.0/16.0; + chipClock=14318180.0/16.0; break; } - chipClock=rate; + CHECK_CUSTOM_CLOCK; + rate=chipClock; for (int i=0; i<3; i++) { oscBuf[i]->rate=rate/16; } diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index 5859be56..ab4c228a 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -454,13 +454,14 @@ void DivPlatformFDS::setNSFPlay(bool use) { void DivPlatformFDS::setFlags(const DivConfig& flags) { int clockSel=flags.getInt("clockSel",0); if (clockSel==2) { // Dendy - rate=COLOR_PAL*2.0/5.0; + chipClock=COLOR_PAL*2.0/5.0; } else if (clockSel==1) { // PAL - rate=COLOR_PAL*3.0/8.0; + chipClock=COLOR_PAL*3.0/8.0; } else { // NTSC - rate=COLOR_NTSC/2.0; + chipClock=COLOR_NTSC/2.0; } - chipClock=rate; + CHECK_CUSTOM_CLOCK; + rate=chipClock; oscBuf->rate=rate/32; if (useNP) { fds_NP->SetClock(rate); diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 6a88d0f7..0bdd2434 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -655,6 +655,7 @@ void DivPlatformGB::setFlags(const DivConfig& flags) { int DivPlatformGB::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { chipClock=4194304; + CHECK_CUSTOM_CLOCK; rate=chipClock/16; for (int i=0; i<4; i++) { isMuted[i]=false; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 85074228..adfdf258 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1221,6 +1221,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) { ladder=flags.getBool("ladderEffect",false); noExtMacros=flags.getBool("noExtMacros",false); OPN2_SetChipType(ladder?ym3438_mode_ym2612:0); + CHECK_CUSTOM_CLOCK; if (useYMFM) { if (fm_ymfm!=NULL) delete fm_ymfm; if (ladder) { diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 66acdcd5..e6704b64 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -471,6 +471,7 @@ int DivPlatformLynx::init(DivEngine* p, int channels, int sugRate, const DivConf } chipClock = 16000000; + CHECK_CUSTOM_CLOCK; rate = chipClock/128; for (int i=0; i<4; i++) { diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index b52017e8..9feaabfc 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -389,13 +389,14 @@ bool DivPlatformMMC5::keyOffAffectsArp(int ch) { void DivPlatformMMC5::setFlags(const DivConfig& flags) { int clockSel=flags.getInt("clockSel",0); if (clockSel==2) { // Dendy - rate=COLOR_PAL*2.0/5.0; + chipClock=COLOR_PAL*2.0/5.0; } else if (clockSel==1) { // PAL - rate=COLOR_PAL*3.0/8.0; + chipClock=COLOR_PAL*3.0/8.0; } else { // NTSC - rate=COLOR_NTSC/2.0; + chipClock=COLOR_NTSC/2.0; } - chipClock=rate; + CHECK_CUSTOM_CLOCK; + rate=chipClock; for (int i=0; i<3; i++) { oscBuf[i]->rate=rate/32; } diff --git a/src/engine/platform/msm5232.cpp b/src/engine/platform/msm5232.cpp index 84e8d91b..a9a70092 100644 --- a/src/engine/platform/msm5232.cpp +++ b/src/engine/platform/msm5232.cpp @@ -372,6 +372,7 @@ void DivPlatformMSM5232::notifyInsDeletion(void* ins) { void DivPlatformMSM5232::setFlags(const DivConfig& flags) { chipClock=2119040; + CHECK_CUSTOM_CLOCK; detune=flags.getInt("detune",0); msm->set_clock(chipClock+detune*1024); rate=msm->get_rate(); diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index 7111c84c..ef11c717 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -412,6 +412,7 @@ void DivPlatformMSM6258::setFlags(const DivConfig& flags) { chipClock=4000000; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/256; for (int i=0; i<1; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index 71b8d7cf..3bf0b8eb 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -438,6 +438,7 @@ void DivPlatformMSM6295::setFlags(const DivConfig& flags) { chipClock=4000000/4; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/3; for (int i=0; i<4; i++) { oscBuf[i]->rate=rate/22; diff --git a/src/engine/platform/n163.cpp b/src/engine/platform/n163.cpp index 26d42e45..50da45f0 100644 --- a/src/engine/platform/n163.cpp +++ b/src/engine/platform/n163.cpp @@ -624,18 +624,19 @@ void DivPlatformN163::poke(std::vector& wlist) { void DivPlatformN163::setFlags(const DivConfig& flags) { switch (flags.getInt("clockSel",0)) { case 1: // PAL - rate=COLOR_PAL*3.0/8.0; + chipClock=COLOR_PAL*3.0/8.0; break; case 2: // Dendy - rate=COLOR_PAL*2.0/5.0; + chipClock=COLOR_PAL*2.0/5.0; break; default: // NTSC - rate=COLOR_NTSC/2.0; + chipClock=COLOR_NTSC/2.0; break; } + CHECK_CUSTOM_CLOCK; initChanMax=chanMax=flags.getInt("channels",0)&7; multiplex=!flags.getBool("multiplex",false); // not accurate in real hardware - chipClock=rate; + rate=chipClock; rate/=15; n163.set_multiplex(multiplex); rWrite(0x7f,initChanMax<<4); diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index aab625b1..c1466b90 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -532,6 +532,7 @@ void DivPlatformNamcoWSG::setDeviceType(int type) { void DivPlatformNamcoWSG::setFlags(const DivConfig& flags) { chipClock=3072000; + CHECK_CUSTOM_CLOCK; rate=chipClock/32; namco->device_clock_changed(rate); for (int i=0; iapu.type=apuType; } - chipClock=rate; + CHECK_CUSTOM_CLOCK; + rate=chipClock; for (int i=0; i<5; i++) { oscBuf[i]->rate=rate/32; } diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 5353fa6c..4464508c 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1694,6 +1694,7 @@ void DivPlatformOPL::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/72; chipRateBase=rate; break; @@ -1715,6 +1716,7 @@ void DivPlatformOPL::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC*4.0; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/288; chipRateBase=rate; break; @@ -1730,6 +1732,7 @@ void DivPlatformOPL::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC*8.0; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/768; chipRateBase=chipClock/684; break; diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index a8b51b10..77dea2e7 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -958,6 +958,7 @@ void DivPlatformOPLL::setFlags(const DivConfig& flags) { } else { chipClock=COLOR_NTSC; } + CHECK_CUSTOM_CLOCK; rate=chipClock/36; patchSet=flags.getInt("patchSet",0); for (int i=0; i<11; i++) { diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index e8a308f1..f6a8df51 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -565,6 +565,7 @@ void DivPlatformPCE::setFlags(const DivConfig& flags) { } else { chipClock=COLOR_NTSC; } + CHECK_CUSTOM_CLOCK; antiClickEnabled=!flags.getBool("noAntiClick",false); rate=chipClock/12; for (int i=0; i<6; i++) { diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index 226ee98c..59154dca 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -598,6 +598,7 @@ void DivPlatformPCSpeaker::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC/3.0; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/PCSPKR_DIVIDER; speakerType=flags.getInt("speakerType",0)&3; oscBuf->rate=rate; diff --git a/src/engine/platform/pet.cpp b/src/engine/platform/pet.cpp index 8a606ecf..3722d52f 100644 --- a/src/engine/platform/pet.cpp +++ b/src/engine/platform/pet.cpp @@ -300,6 +300,7 @@ int DivPlatformPET::init(DivEngine* p, int channels, int sugRate, const DivConfi dumpWrites=false; skipRegisterWrites=false; chipClock=1000000; + CHECK_CUSTOM_CLOCK; rate=chipClock/SAMP_DIVIDER; // = 250000kHz isMuted=false; oscBuf=new DivDispatchOscBuffer; diff --git a/src/engine/platform/pong.cpp b/src/engine/platform/pong.cpp index 1015fdda..a98fe7ba 100644 --- a/src/engine/platform/pong.cpp +++ b/src/engine/platform/pong.cpp @@ -21,7 +21,7 @@ #include "../engine.h" #include "../../ta-log.h" -#define CHIP_DIVIDER 16 +#define CHIP_DIVIDER 1024 void DivPlatformPong::acquire(short* bufL, short* bufR, size_t start, size_t len) { int out=0; @@ -226,8 +226,9 @@ bool DivPlatformPong::keyOffAffectsArp(int ch) { } void DivPlatformPong::setFlags(const DivConfig& flags) { - chipClock=15625; - rate=chipClock; + chipClock=1000000; + CHECK_CUSTOM_CLOCK; + rate=chipClock/64; oscBuf->rate=rate; } diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index e33cfbf3..f13a25aa 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -348,6 +348,7 @@ void DivPlatformRF5C68::setFlags(const DivConfig& flags) { case 2: chipClock=12500000; break; default: chipClock=8000000; break; } + CHECK_CUSTOM_CLOCK; chipType=flags.getInt("chipType",0); rate=chipClock/384; for (int i=0; i<8; i++) { diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 7f48bca4..c3e48f1f 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -438,6 +438,7 @@ void DivPlatformSAA1099::setFlags(const DivConfig& flags) { } else { chipClock=8000000; } + CHECK_CUSTOM_CLOCK; rate=chipClock/32; for (int i=0; i<6; i++) { diff --git a/src/engine/platform/scc.cpp b/src/engine/platform/scc.cpp index a8fbcd7c..a75496d5 100644 --- a/src/engine/platform/scc.cpp +++ b/src/engine/platform/scc.cpp @@ -375,6 +375,7 @@ void DivPlatformSCC::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC/2.0; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/8; for (int i=0; i<5; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 860f9926..25de3395 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -486,7 +486,8 @@ void DivPlatformSegaPCM::reset() { void DivPlatformSegaPCM::setFlags(const DivConfig& flags) { chipClock=8000000.0; - rate=31250; + CHECK_CUSTOM_CLOCK; + rate=chipClock/256; for (int i=0; i<16; i++) { oscBuf[i]->rate=rate; } diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 9f65a953..0ce4c836 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -568,6 +568,7 @@ void DivPlatformSMS::setFlags(const DivConfig& flags) { stereo=false; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/divider; for (int i=0; i<4; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 931225b4..d85a9d94 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -511,6 +511,7 @@ void DivPlatformSoundUnit::setFlags(const DivConfig& flags) { } else { chipClock=1236000; } + CHECK_CUSTOM_CLOCK; rate=chipClock/4; for (int i=0; i<8; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 222af4a5..852450a7 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -514,6 +514,7 @@ int DivPlatformSwan::init(DivEngine* p, int channels, int sugRate, const DivConf dumpWrites=false; skipRegisterWrites=false; chipClock=3072000; + CHECK_CUSTOM_CLOCK; rate=chipClock/16; // = 192000kHz, should be enough for (int i=0; i<4; i++) { isMuted[i]=false; diff --git a/src/engine/platform/t6w28.cpp b/src/engine/platform/t6w28.cpp index c6317e11..0d294836 100644 --- a/src/engine/platform/t6w28.cpp +++ b/src/engine/platform/t6w28.cpp @@ -343,6 +343,7 @@ void DivPlatformT6W28::notifyInsDeletion(void* ins) { void DivPlatformT6W28::setFlags(const DivConfig& flags) { chipClock=3072000.0; + CHECK_CUSTOM_CLOCK; rate=chipClock/16; for (int i=0; i<4; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index d4703e28..2a28cb0a 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -356,6 +356,7 @@ void DivPlatformTIA::setFlags(const DivConfig& flags) { } else { rate=COLOR_NTSC; } + CHECK_CUSTOM_CLOCK; chipClock=rate; mixingType=flags.getInt("mixingType",0)&3; for (int i=0; i<2; i++) { diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index a8baab3c..1523a153 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -486,6 +486,7 @@ void DivPlatformVB::notifyInsDeletion(void* ins) { void DivPlatformVB::setFlags(const DivConfig& flags) { chipClock=5000000.0; + CHECK_CUSTOM_CLOCK; rate=chipClock/16; for (int i=0; i<6; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index 2966f9d1..9294a344 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -438,6 +438,7 @@ int DivPlatformVERA::init(DivEngine* p, int channels, int sugRate, const DivConf dumpWrites=false; skipRegisterWrites=false; chipClock=25000000; + CHECK_CUSTOM_CLOCK; rate=chipClock/512; for (int i=0; i<17; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/vic20.cpp b/src/engine/platform/vic20.cpp index d6200a16..52a08836 100644 --- a/src/engine/platform/vic20.cpp +++ b/src/engine/platform/vic20.cpp @@ -307,6 +307,7 @@ void DivPlatformVIC20::setFlags(const DivConfig& flags) { } else { chipClock=COLOR_NTSC*2.0/7.0; } + CHECK_CUSTOM_CLOCK; rate=chipClock/4; for (int i=0; i<4; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index 52a9350c..56df0e83 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -482,13 +482,14 @@ bool DivPlatformVRC6::keyOffAffectsArp(int ch) { void DivPlatformVRC6::setFlags(const DivConfig& flags) { int clockSel=flags.getInt("clockSel",0); if (clockSel==2) { // Dendy - rate=COLOR_PAL*2.0/5.0; + chipClock=COLOR_PAL*2.0/5.0; } else if (clockSel==1) { // PAL - rate=COLOR_PAL*3.0/8.0; + chipClock=COLOR_PAL*3.0/8.0; } else { // NTSC - rate=COLOR_NTSC/2.0; + chipClock=COLOR_NTSC/2.0; } - chipClock=rate; + CHECK_CUSTOM_CLOCK; + rate=chipClock; for (int i=0; i<3; i++) { oscBuf[i]->rate=rate/32; } diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index 683b36a6..b7382c28 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -922,6 +922,7 @@ void DivPlatformX1_010::setFlags(const DivConfig& flags) { chipClock=16000000; break; } + CHECK_CUSTOM_CLOCK; rate=chipClock/512; stereo=flags.getBool("stereo",false); for (int i=0; i<16; i++) { diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index b3dc596c..3d6eaa8a 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -952,6 +952,7 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) { ayDiv=16; break; } + CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); rate=fm->sample_rate(chipClock); for (int i=0; i<6; i++) { diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 63c84ad5..e15bf6b4 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1407,6 +1407,7 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) { ayDiv=32; break; } + CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 065eb5f3..c2dce8aa 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -294,6 +294,7 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { chipClock=8000000.0; break; } + CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); rate=chipClock/16; for (int i=0; irate=rate; diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 326c39a9..170e2d8b 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -24,6 +24,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange) { bool altered=false; bool restart=settings.restartOnFlagChange && modifyOnChange; + bool supportsCustomRate=true; switch (type) { case DIV_SYSTEM_YM2612: @@ -765,6 +766,8 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo flags.set("echoFeedback",echoFeedback); }); } + + supportsCustomRate=false; break; } case DIV_SYSTEM_X1_010: { @@ -1401,6 +1404,8 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo }); } + supportsCustomRate=false; + break; } case DIV_SYSTEM_MSM5232: { @@ -1542,13 +1547,15 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo break; } case DIV_SYSTEM_SWAN: - case DIV_SYSTEM_VERA: case DIV_SYSTEM_BUBSYS_WSG: - case DIV_SYSTEM_YMU759: case DIV_SYSTEM_PET: case DIV_SYSTEM_VBOY: ImGui::Text("nothing to configure"); break; + case DIV_SYSTEM_VERA: + case DIV_SYSTEM_YMU759: + supportsCustomRate=false; + break; default: { bool sysPal=flags.getInt("clockSel",0); @@ -1565,6 +1572,32 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo } } + if (supportsCustomRate) { + ImGui::Separator(); + int customClock=flags.getInt("customClock",0); + bool usingCustomClock=customClock>=100000; + + if (ImGui::Checkbox("Custom clock rate",&usingCustomClock)) { + if (usingCustomClock) { + customClock=1000000; + } else { + customClock=0; + } + altered=true; + } + if (ImGui::InputInt("Hz",&customClock)) { + if (customClock<100000) customClock=0; + if (customClock>20000000) customClock=20000000; + altered=true; + } + + if (altered) { + e->lockSave([&]() { + flags.set("customClock",customClock); + }); + } + } + if (altered) { if (chan>=0) { e->updateSysFlags(chan,restart);