From 34f6a303a6dedd692e5d2e69161e2a06399752e9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 20 Dec 2022 17:40:45 -0500 Subject: [PATCH] prepare for more CSM --- src/engine/platform/fmshared_OPN.h | 4 +- src/engine/platform/genesis.cpp | 8 ++-- src/engine/platform/genesis.h | 2 +- src/engine/platform/genesisext.cpp | 26 ++++++------- src/engine/song.h | 7 +++- src/engine/sysDef.cpp | 60 ++++++++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 20 deletions(-) diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index a8ec67723..769a1814b 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -147,17 +147,19 @@ class DivPlatformOPN: public DivPlatformFMBase { double fmFreqBase; unsigned int fmDivBase; unsigned int ayDiv; + unsigned char csmChan; bool extSys; DivConfig ayFlags; friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); - DivPlatformOPN(double f=9440540.0, unsigned int d=72, unsigned int a=32, bool isExtSys=false): + DivPlatformOPN(double f=9440540.0, unsigned int d=72, unsigned int a=32, bool isExtSys=false, unsigned char cc=255): DivPlatformFMBase(), fmFreqBase(f), fmDivBase(d), ayDiv(a), + csmChan(cc), extSys(isExtSys) {} }; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 288218da7..c375e51ff 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -554,7 +554,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { switch (c.cmd) { case DIV_CMD_NOTE_ON: { DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); - if (c.chan==7 && extMode && softPCM) { // CSM + if (c.chan==csmChan && extMode && softPCM) { // CSM chan[c.chan].macroInit(ins); chan[c.chan].insChanged=false; @@ -686,7 +686,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { break; } case DIV_CMD_NOTE_OFF: - if (c.chan>=5 && c.chan<7) { + if (c.chan>=5 && c.chansong.brokenDACMode) { @@ -781,7 +781,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } break; } - if (c.chan==7) { + if (c.chan==csmChan) { int destFreq=NOTE_PERIODIC(c.value2); bool return2=false; if (destFreq>chan[c.chan].baseFreq) { @@ -850,7 +850,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { break; } case DIV_CMD_LEGATO: { - if (c.chan==7) { + if (c.chan==csmChan) { chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); } else if (c.chan>=5 && chan[c.chan].furnaceDac && chan[c.chan].dacMode) { chan[c.chan].baseFreq=parent->calcBaseFreq(1,1,c.value,false); diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index bd5d9afff..a6b7eec61 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -128,7 +128,7 @@ class DivPlatformGenesis: public DivPlatformOPN { int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformGenesis(): - DivPlatformOPN(9440540.0, 72, 32) {} + DivPlatformOPN(9440540.0, 72, 32, false, 7) {} ~DivPlatformGenesis(); }; #endif diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 6bf151a0c..6443729ff 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -454,7 +454,7 @@ void DivPlatformGenesisExt::tick(bool sysTick) { } } if (writeSomething) { - if (chan[7].active) { // CSM + if (chan[csmChan].active) { // CSM writeMask^=0xf0; } /*printf( @@ -589,17 +589,17 @@ void DivPlatformGenesisExt::tick(bool sysTick) { } if (extMode && softPCM) { - if (chan[7].freqChanged) { - chan[7].freq=parent->calcFreq(chan[7].baseFreq,chan[7].pitch,chan[7].fixedArp?chan[7].baseNoteOverride:chan[7].arpOff,chan[7].fixedArp,true,0,chan[7].pitch2,chipClock,CHIP_DIVIDER); - if (chan[7].freq<1) chan[7].freq=1; - if (chan[7].freq>1024) chan[7].freq=1024; - int wf=0x400-chan[7].freq; + if (chan[csmChan].freqChanged) { + chan[csmChan].freq=parent->calcFreq(chan[csmChan].baseFreq,chan[csmChan].pitch,chan[csmChan].fixedArp?chan[csmChan].baseNoteOverride:chan[csmChan].arpOff,chan[csmChan].fixedArp,true,0,chan[csmChan].pitch2,chipClock,CHIP_DIVIDER); + if (chan[csmChan].freq<1) chan[csmChan].freq=1; + if (chan[csmChan].freq>1024) chan[csmChan].freq=1024; + int wf=0x400-chan[csmChan].freq; immWrite(0x24,wf>>2); immWrite(0x25,wf&3); - chan[7].freqChanged=false; + chan[csmChan].freqChanged=false; } - if (chan[7].keyOff || chan[7].keyOn) { + if (chan[csmChan].keyOff || chan[csmChan].keyOn) { writeNoteOn=true; for (int i=0; i<4; i++) { writeMask|=opChan[i].active<<(4+i); @@ -608,7 +608,7 @@ void DivPlatformGenesisExt::tick(bool sysTick) { } if (writeNoteOn) { - if (chan[7].active) { // CSM + if (chan[csmChan].active) { // CSM writeMask^=0xf0; } /*printf( @@ -622,13 +622,13 @@ void DivPlatformGenesisExt::tick(bool sysTick) { } if (extMode && softPCM) { - if (chan[7].keyOn) { + if (chan[csmChan].keyOn) { immWrite(0x27,0x81); - chan[7].keyOn=false; + chan[csmChan].keyOn=false; } - if (chan[7].keyOff) { + if (chan[csmChan].keyOff) { immWrite(0x27,0x40); - chan[7].keyOff=false; + chan[csmChan].keyOff=false; } } } diff --git a/src/engine/song.h b/src/engine/song.h index cd2d59d0b..d564f3dac 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -119,7 +119,12 @@ enum DivSystem { DIV_SYSTEM_GA20, DIV_SYSTEM_PCM_DAC, DIV_SYSTEM_PONG, - DIV_SYSTEM_DUMMY + DIV_SYSTEM_DUMMY, + DIV_SYSTEM_YM2612_CSM, + DIV_SYSTEM_YM2610_CSM, + DIV_SYSTEM_YM2610B_CSM, + DIV_SYSTEM_OPN_CSM, + DIV_SYSTEM_PC98_CSM }; struct DivSubSong { diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index bfade1f00..359a46486 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1030,6 +1030,18 @@ void DivEngine::registerSystems() { fmOPNPostEffectHandlerMap ); + sysDefs[DIV_SYSTEM_OPN_CSM]=new DivSysDef( + "Yamaha YM2203 (OPN) CSM", NULL, 0xc3, 0, 10, true, true, 0x151, false, 1U<