implement operator muting for ExtCh mode
This commit is contained in:
parent
7b1713758b
commit
d64e20e859
|
@ -69,6 +69,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) {
|
||||||
rWrite(baseAddr+0x70,op.d2r&31);
|
rWrite(baseAddr+0x70,op.d2r&31);
|
||||||
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
||||||
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
||||||
|
opChan[ch].mask=op.enable;
|
||||||
}
|
}
|
||||||
if (opChan[ch].insChanged) { // TODO how does this work?
|
if (opChan[ch].insChanged) { // TODO how does this work?
|
||||||
rWrite(chanOffs[2]+0xb0,(chan[2].state.alg&7)|(chan[2].state.fb<<3));
|
rWrite(chanOffs[2]+0xb0,(chan[2].state.alg&7)|(chan[2].state.fb<<3));
|
||||||
|
@ -412,7 +413,7 @@ void DivPlatformGenesisExt::tick(bool sysTick) {
|
||||||
bool writeSomething=false;
|
bool writeSomething=false;
|
||||||
unsigned char writeMask=2;
|
unsigned char writeMask=2;
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn || opChan[i].keyOff) {
|
if (opChan[i].keyOn || opChan[i].keyOff) {
|
||||||
writeSomething=true;
|
writeSomething=true;
|
||||||
writeMask&=~(1<<(4+i));
|
writeMask&=~(1<<(4+i));
|
||||||
|
@ -459,10 +460,12 @@ void DivPlatformGenesisExt::tick(bool sysTick) {
|
||||||
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
||||||
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
||||||
}
|
}
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn) {
|
if (opChan[i].keyOn) {
|
||||||
writeNoteOn=true;
|
writeNoteOn=true;
|
||||||
writeMask|=1<<(4+i);
|
if (opChan[i].mask) {
|
||||||
|
writeMask|=1<<(4+i);
|
||||||
|
}
|
||||||
opChan[i].keyOn=false;
|
opChan[i].keyOn=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis {
|
||||||
unsigned char freqH, freqL;
|
unsigned char freqH, freqL;
|
||||||
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
||||||
signed char konCycles;
|
signed char konCycles;
|
||||||
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
|
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta, mask;
|
||||||
int vol;
|
int vol;
|
||||||
unsigned char pan;
|
unsigned char pan;
|
||||||
OpChannel():
|
OpChannel():
|
||||||
|
@ -46,6 +46,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis {
|
||||||
keyOff(false),
|
keyOff(false),
|
||||||
portaPause(false),
|
portaPause(false),
|
||||||
inPorta(false),
|
inPorta(false),
|
||||||
|
mask(true),
|
||||||
vol(0),
|
vol(0),
|
||||||
pan(3) {}
|
pan(3) {}
|
||||||
};
|
};
|
||||||
|
|
|
@ -59,6 +59,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) {
|
||||||
rWrite(baseAddr+0x70,op.d2r&31);
|
rWrite(baseAddr+0x70,op.d2r&31);
|
||||||
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
||||||
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
||||||
|
opChan[ch].mask=op.enable;
|
||||||
}
|
}
|
||||||
if (opChan[ch].insChanged) { // TODO how does this work?
|
if (opChan[ch].insChanged) { // TODO how does this work?
|
||||||
rWrite(chanOffs[2]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
rWrite(chanOffs[2]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
||||||
|
@ -358,7 +359,7 @@ void DivPlatformYM2203Ext::tick(bool sysTick) {
|
||||||
bool writeSomething=false;
|
bool writeSomething=false;
|
||||||
unsigned char writeMask=2;
|
unsigned char writeMask=2;
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn || opChan[i].keyOff) {
|
if (opChan[i].keyOn || opChan[i].keyOff) {
|
||||||
writeSomething=true;
|
writeSomething=true;
|
||||||
writeMask&=~(1<<(4+i));
|
writeMask&=~(1<<(4+i));
|
||||||
|
@ -395,10 +396,12 @@ void DivPlatformYM2203Ext::tick(bool sysTick) {
|
||||||
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
||||||
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
||||||
}
|
}
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn) {
|
if (opChan[i].keyOn) {
|
||||||
writeNoteOn=true;
|
writeNoteOn=true;
|
||||||
writeMask|=1<<(4+i);
|
if (opChan[i].mask) {
|
||||||
|
writeMask|=1<<(4+i);
|
||||||
|
}
|
||||||
opChan[i].keyOn=false;
|
opChan[i].keyOn=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,12 +27,12 @@ class DivPlatformYM2203Ext: public DivPlatformYM2203 {
|
||||||
unsigned char freqH, freqL;
|
unsigned char freqH, freqL;
|
||||||
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
||||||
signed char konCycles;
|
signed char konCycles;
|
||||||
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
|
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta, mask;
|
||||||
int vol;
|
int vol;
|
||||||
unsigned char pan;
|
unsigned char pan;
|
||||||
// UGLY
|
// UGLY
|
||||||
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
||||||
inPorta(false), vol(0), pan(3) {}
|
inPorta(false), mask(true), vol(0), pan(3) {}
|
||||||
};
|
};
|
||||||
OpChannel opChan[4];
|
OpChannel opChan[4];
|
||||||
bool isOpMuted[4];
|
bool isOpMuted[4];
|
||||||
|
|
|
@ -59,6 +59,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) {
|
||||||
rWrite(baseAddr+0x70,op.d2r&31);
|
rWrite(baseAddr+0x70,op.d2r&31);
|
||||||
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
||||||
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
||||||
|
opChan[ch].mask=op.enable;
|
||||||
}
|
}
|
||||||
if (opChan[ch].insChanged) { // TODO how does this work?
|
if (opChan[ch].insChanged) { // TODO how does this work?
|
||||||
rWrite(chanOffs[2]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
rWrite(chanOffs[2]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
||||||
|
@ -358,7 +359,7 @@ void DivPlatformYM2608Ext::tick(bool sysTick) {
|
||||||
bool writeSomething=false;
|
bool writeSomething=false;
|
||||||
unsigned char writeMask=2;
|
unsigned char writeMask=2;
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn || opChan[i].keyOff) {
|
if (opChan[i].keyOn || opChan[i].keyOff) {
|
||||||
writeSomething=true;
|
writeSomething=true;
|
||||||
writeMask&=~(1<<(4+i));
|
writeMask&=~(1<<(4+i));
|
||||||
|
@ -395,10 +396,12 @@ void DivPlatformYM2608Ext::tick(bool sysTick) {
|
||||||
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
||||||
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
||||||
}
|
}
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn) {
|
if (opChan[i].keyOn) {
|
||||||
writeNoteOn=true;
|
writeNoteOn=true;
|
||||||
writeMask|=1<<(4+i);
|
if (opChan[i].mask) {
|
||||||
|
writeMask|=1<<(4+i);
|
||||||
|
}
|
||||||
opChan[i].keyOn=false;
|
opChan[i].keyOn=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,12 +27,12 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 {
|
||||||
unsigned char freqH, freqL;
|
unsigned char freqH, freqL;
|
||||||
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
||||||
signed char konCycles;
|
signed char konCycles;
|
||||||
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
|
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta, mask;
|
||||||
int vol;
|
int vol;
|
||||||
unsigned char pan;
|
unsigned char pan;
|
||||||
// UGLY
|
// UGLY
|
||||||
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
||||||
inPorta(false), vol(0), pan(3) {}
|
inPorta(false), mask(true), vol(0), pan(3) {}
|
||||||
};
|
};
|
||||||
OpChannel opChan[4];
|
OpChannel opChan[4];
|
||||||
bool isOpMuted[4];
|
bool isOpMuted[4];
|
||||||
|
|
|
@ -59,6 +59,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) {
|
||||||
rWrite(baseAddr+0x70,op.d2r&31);
|
rWrite(baseAddr+0x70,op.d2r&31);
|
||||||
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
||||||
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
||||||
|
opChan[ch].mask=op.enable;
|
||||||
}
|
}
|
||||||
if (opChan[ch].insChanged) { // TODO how does this work?
|
if (opChan[ch].insChanged) { // TODO how does this work?
|
||||||
rWrite(chanOffs[2]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
rWrite(chanOffs[2]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
||||||
|
@ -358,7 +359,7 @@ void DivPlatformYM2610BExt::tick(bool sysTick) {
|
||||||
bool writeSomething=false;
|
bool writeSomething=false;
|
||||||
unsigned char writeMask=2;
|
unsigned char writeMask=2;
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn || opChan[i].keyOff) {
|
if (opChan[i].keyOn || opChan[i].keyOff) {
|
||||||
writeSomething=true;
|
writeSomething=true;
|
||||||
writeMask&=~(1<<(4+i));
|
writeMask&=~(1<<(4+i));
|
||||||
|
@ -395,10 +396,12 @@ void DivPlatformYM2610BExt::tick(bool sysTick) {
|
||||||
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
||||||
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
||||||
}
|
}
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn) {
|
if (opChan[i].keyOn) {
|
||||||
writeNoteOn=true;
|
writeNoteOn=true;
|
||||||
writeMask|=1<<(4+i);
|
if (opChan[i].mask) {
|
||||||
|
writeMask|=1<<(4+i);
|
||||||
|
}
|
||||||
opChan[i].keyOn=false;
|
opChan[i].keyOn=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,12 +27,12 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B {
|
||||||
unsigned char freqH, freqL;
|
unsigned char freqH, freqL;
|
||||||
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
||||||
signed char konCycles;
|
signed char konCycles;
|
||||||
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
|
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta, mask;
|
||||||
int vol;
|
int vol;
|
||||||
unsigned char pan;
|
unsigned char pan;
|
||||||
// UGLY
|
// UGLY
|
||||||
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
||||||
inPorta(false), vol(0), pan(3) {}
|
inPorta(false), mask(true), vol(0), pan(3) {}
|
||||||
};
|
};
|
||||||
OpChannel opChan[4];
|
OpChannel opChan[4];
|
||||||
bool isOpMuted[4];
|
bool isOpMuted[4];
|
||||||
|
|
|
@ -59,6 +59,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) {
|
||||||
rWrite(baseAddr+0x70,op.d2r&31);
|
rWrite(baseAddr+0x70,op.d2r&31);
|
||||||
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
rWrite(baseAddr+0x80,(op.rr&15)|(op.sl<<4));
|
||||||
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
rWrite(baseAddr+0x90,op.ssgEnv&15);
|
||||||
|
opChan[ch].mask=op.enable;
|
||||||
}
|
}
|
||||||
if (opChan[ch].insChanged) { // TODO how does this work?
|
if (opChan[ch].insChanged) { // TODO how does this work?
|
||||||
rWrite(chanOffs[1]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
rWrite(chanOffs[1]+0xb0,(ins->fm.alg&7)|(ins->fm.fb<<3));
|
||||||
|
@ -358,7 +359,7 @@ void DivPlatformYM2610Ext::tick(bool sysTick) {
|
||||||
bool writeSomething=false;
|
bool writeSomething=false;
|
||||||
unsigned char writeMask=2;
|
unsigned char writeMask=2;
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn || opChan[i].keyOff) {
|
if (opChan[i].keyOn || opChan[i].keyOff) {
|
||||||
writeSomething=true;
|
writeSomething=true;
|
||||||
writeMask&=~(1<<(4+i));
|
writeMask&=~(1<<(4+i));
|
||||||
|
@ -395,10 +396,12 @@ void DivPlatformYM2610Ext::tick(bool sysTick) {
|
||||||
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
immWrite(opChanOffsH[i],opChan[i].freq>>8);
|
||||||
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
immWrite(opChanOffsL[i],opChan[i].freq&0xff);
|
||||||
}
|
}
|
||||||
writeMask|=opChan[i].active<<(4+i);
|
writeMask|=(unsigned char)(opChan[i].mask && opChan[i].active)<<(4+i);
|
||||||
if (opChan[i].keyOn) {
|
if (opChan[i].keyOn) {
|
||||||
writeNoteOn=true;
|
writeNoteOn=true;
|
||||||
writeMask|=1<<(4+i);
|
if (opChan[i].mask) {
|
||||||
|
writeMask|=1<<(4+i);
|
||||||
|
}
|
||||||
opChan[i].keyOn=false;
|
opChan[i].keyOn=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,12 +27,12 @@ class DivPlatformYM2610Ext: public DivPlatformYM2610 {
|
||||||
unsigned char freqH, freqL;
|
unsigned char freqH, freqL;
|
||||||
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
|
||||||
signed char konCycles;
|
signed char konCycles;
|
||||||
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
|
bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta, mask;
|
||||||
int vol;
|
int vol;
|
||||||
unsigned char pan;
|
unsigned char pan;
|
||||||
// UGLY
|
// UGLY
|
||||||
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
|
||||||
inPorta(false), vol(0), pan(3) {}
|
inPorta(false), mask(true), vol(0), pan(3) {}
|
||||||
};
|
};
|
||||||
OpChannel opChan[4];
|
OpChannel opChan[4];
|
||||||
bool isOpMuted[4];
|
bool isOpMuted[4];
|
||||||
|
|
Loading…
Reference in New Issue