From cc87d1502c1151ab6a4ebcac31a38a8adfd72d02 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 28 May 2022 17:45:34 -0500 Subject: [PATCH] MSM6295: add rate select effect (20xx) --- src/engine/platform/msm6295.cpp | 51 +++++++++++++++++++++++++++------ src/engine/platform/msm6295.h | 1 + src/engine/sysDef.cpp | 13 ++++++++- 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index c426af014..b2c725cb0 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -23,13 +23,18 @@ #include #include -#define rWrite(v) if (!skipRegisterWrites) {writes.emplace(0,v); if (dumpWrites) {addWrite(0,v);} } +#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} } const char** DivPlatformMSM6295::getRegisterSheet() { return NULL; } const char* DivPlatformMSM6295::getEffectName(unsigned char effect) { + switch (effect) { + case 0x20: + return "20xx: Set chip output rate (0: clock/132; 1: clock/165)"; + break; + } return NULL; } @@ -42,6 +47,27 @@ void DivPlatformMSM6295::acquire(short* bufL, short* bufR, size_t start, size_t if (delay<=0) { if (!writes.empty()) { QueuedWrite& w=writes.front(); + switch (w.addr) { + case 0: // command + break; + case 8: // chip clock select (VGM) + case 9: + case 10: + case 11: + break; + case 12: // rate select + msm->ss_w(w.val); + break; + case 14: // enable bankswitch + break; + case 15: // set bank base + break; + case 16: // switch bank + case 17: + case 18: + case 19: + break; + } msm->command_w(w.val); writes.pop(); delay=32; @@ -92,9 +118,9 @@ int DivPlatformMSM6295::dispatch(DivCommand c) { } chan[c.chan].active=true; chan[c.chan].keyOn=true; - rWrite((8<getSample(12*sampleBank+c.value%12); chan[c.chan].sample=12*sampleBank+c.value%12; - rWrite((8<(parent->song.sample.size()/12)) { @@ -190,6 +220,7 @@ void DivPlatformMSM6295::forceIns() { for (int i=0; i<4; i++) { chan[i].insChanged=true; } + rWrite(12,rateSel); } void* DivPlatformMSM6295::getChanState(int ch) { @@ -219,6 +250,7 @@ void DivPlatformMSM6295::poke(std::vector& wlist) { void DivPlatformMSM6295::reset() { while (!writes.empty()) writes.pop(); msm->reset(); + msm->ss_w(false); if (dumpWrites) { addWrite(0xffffffff,0); } @@ -232,6 +264,7 @@ void DivPlatformMSM6295::reset() { } sampleBank=0; + rateSel=false; delay=0; } diff --git a/src/engine/platform/msm6295.h b/src/engine/platform/msm6295.h index bedaab41c..d63a01dc7 100644 --- a/src/engine/platform/msm6295.h +++ b/src/engine/platform/msm6295.h @@ -101,6 +101,7 @@ class DivPlatformMSM6295: public DivDispatch { int delay, updateOsc; bool extMode; + bool rateSel; short oldWrites[512]; short pendingWrites[512]; diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index cb3d5e2f2..2ef13df2f 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1954,7 +1954,18 @@ void DivEngine::registerSystems() { {"Channel 1", "Channel 2", "Channel 3", "Channel 4"}, {"CH1", "CH2", "CH3", "CH4"}, {DIV_CH_PCM, DIV_CH_PCM, DIV_CH_PCM, DIV_CH_PCM}, - {DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA} + {DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA}, + {}, + [this](int ch, unsigned char effect, unsigned char effectVal) -> bool { + switch (effect) { + case 0x20: // select rate + dispatchCmd(DivCommand(DIV_CMD_SAMPLE_FREQ,ch,effectVal)); + break; + default: + return false; + } + return true; + } ); sysDefs[DIV_SYSTEM_MSM6258]=new DivSysDef(