prepare for more CSM

This commit is contained in:
tildearrow 2022-12-20 17:40:45 -05:00
parent 2fbcacfbd0
commit 34f6a303a6
6 changed files with 87 additions and 20 deletions

View file

@ -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) {}
};

View file

@ -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.chan<csmChan) {
chan[c.chan].dacSample=-1;
if (dumpWrites) addWrite(0xffff0002,0);
if (parent->song.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);

View file

@ -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

View file

@ -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;
}
}
}