From 25324012656e3e7718b3801112699301de1c16c9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 16 May 2021 17:43:10 -0500 Subject: [PATCH] prepare for ch3 mode --- CMakeLists.txt | 1 + src/engine/engine.cpp | 4 ++ src/engine/platform/genesis.cpp | 2 - src/engine/platform/genesis.h | 72 ++++++++++++++++-------------- src/engine/platform/genesisext.cpp | 32 +++++++++++++ src/engine/platform/genesisext.h | 9 ++++ src/engine/playback.cpp | 4 +- 7 files changed, 87 insertions(+), 37 deletions(-) create mode 100644 src/engine/platform/genesisext.cpp create mode 100644 src/engine/platform/genesisext.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cfab8cf3..d7b81e88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ src/engine/macroInt.cpp src/engine/playback.cpp src/engine/platform/abstract.cpp src/engine/platform/genesis.cpp +src/engine/platform/genesisext.cpp src/engine/platform/sms.cpp src/engine/platform/dummy.cpp) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 650afb41..72f4b089 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -3,6 +3,7 @@ #include "../ta-log.h" #include "../audio/sdl.h" #include "platform/genesis.h" +#include "platform/genesisext.h" #include "platform/sms.h" #include "platform/dummy.h" #include @@ -676,6 +677,9 @@ bool DivEngine::init() { case DIV_SYSTEM_GENESIS: dispatch=new DivPlatformGenesis; break; + case DIV_SYSTEM_GENESIS_EXT: + dispatch=new DivPlatformGenesisExt; + break; case DIV_SYSTEM_SMS: dispatch=new DivPlatformSMS; break; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index a989f1b0..d959cd70 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -3,8 +3,6 @@ #include #include -// TODO fix all the writes. -// i think there is no wait for data writes, just for ON/OFF writes void DivPlatformGenesis::acquire(int& l, int& r) { static short o[2]; diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 9577c92d..22fd66f5 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -1,3 +1,5 @@ +#ifndef _GENESIS_H +#define _GENESIS_H #include "../dispatch.h" #include #include "../../../extern/Nuked-OPN2/ym3438.h" @@ -5,43 +7,45 @@ #include "sms.h" class DivPlatformGenesis: public DivDispatch { - struct Channel { - unsigned char freqH, freqL; - int freq, baseFreq, pitch; - unsigned char ins; - signed char konCycles; - bool active, insChanged, freqChanged, keyOn, keyOff; - signed char vol; - unsigned char pan; - Channel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), ins(0), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), vol(0), pan(3) {} - }; - Channel chan[10]; - struct QueuedWrite { - unsigned short addr; - unsigned char val; - bool addrOrVal; - QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} - }; - std::queue writes; - ym3438_t fm; - DivPlatformSMS psg; - int psgClocks; - int psgOut; - int delay; - unsigned char lastBusy; - - bool dacMode; - int dacPeriod; - int dacRate; - int dacPos; - int dacSample; - - short oldWrites[512]; - short pendingWrites[512]; - + protected: + struct Channel { + unsigned char freqH, freqL; + int freq, baseFreq, pitch; + unsigned char ins; + signed char konCycles; + bool active, insChanged, freqChanged, keyOn, keyOff; + signed char vol; + unsigned char pan; + Channel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), ins(0), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), vol(0), pan(3) {} + }; + Channel chan[10]; + struct QueuedWrite { + unsigned short addr; + unsigned char val; + bool addrOrVal; + QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} + }; + std::queue writes; + ym3438_t fm; + DivPlatformSMS psg; + int psgClocks; + int psgOut; + int delay; + unsigned char lastBusy; + + bool dacMode; + int dacPeriod; + int dacRate; + int dacPos; + int dacSample; + + short oldWrites[512]; + short pendingWrites[512]; + public: void acquire(int& l, int& r); int dispatch(DivCommand c); void tick(); int init(DivEngine* parent, int channels, int sugRate); }; +#endif diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp new file mode 100644 index 00000000..32126766 --- /dev/null +++ b/src/engine/platform/genesisext.cpp @@ -0,0 +1,32 @@ +#include "genesisext.h" +#include + +int DivPlatformGenesisExt::dispatch(DivCommand c) { + if (c.chan<2) { + return DivPlatformGenesis::dispatch(c); + } + if (c.chan>5) { + c.chan-=3; + return DivPlatformGenesis::dispatch(c); + } + printf("HANDLE: %d %d %d %d\n",c.cmd,c.chan,c.value,c.value2); + switch (c.cmd) { + case DIV_CMD_NOTE_ON: + chan[c.chan].freq=16.4f*pow(2.0f,((float)c.value/12.0f)); + chan[c.chan].active=true; + break; + case DIV_CMD_NOTE_OFF: + chan[c.chan].active=false; + break; + case DIV_CMD_VOLUME: + chan[c.chan].vol=c.value; + break; + default: + break; + } + return 1; +} + +void DivPlatformGenesisExt::tick() { + DivPlatformGenesis::tick(); +} diff --git a/src/engine/platform/genesisext.h b/src/engine/platform/genesisext.h new file mode 100644 index 00000000..330fb1dd --- /dev/null +++ b/src/engine/platform/genesisext.h @@ -0,0 +1,9 @@ +#include "../dispatch.h" + +#include "genesis.h" + +class DivPlatformGenesisExt: public DivPlatformGenesis { + public: + int dispatch(DivCommand c); + void tick(); +}; diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 936188e8..8a6a4a03 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -25,6 +25,7 @@ const char* formatNote(unsigned char note, unsigned char octave) { bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effectVal) { switch (song.system) { case DIV_SYSTEM_GENESIS: + case DIV_SYSTEM_GENESIS_EXT: switch (effect) { case 0x17: // DAC enable dispatch->dispatch(DivCommand(DIV_CMD_SAMPLE_MODE,ch,(effectVal>0))); @@ -54,6 +55,7 @@ bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effe bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char effectVal) { switch (song.system) { case DIV_SYSTEM_GENESIS: + case DIV_SYSTEM_GENESIS_EXT: switch (effect) { case 0x11: // FB dispatch->dispatch(DivCommand(DIV_CMD_FM_FB,ch,effectVal&7)); @@ -360,7 +362,7 @@ void DivEngine::nextTick() { dispatch->dispatch(DivCommand(DIV_CMD_NOTE_OFF,i)); } } - if (chan[i].arp!=0) { + if (chan[i].arp!=0 && chan[i].portaSpeed<1) { chan[i].arpStage++; if (chan[i].arpStage>2) chan[i].arpStage=0; switch (chan[i].arpStage) {