diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index b27f81ea3..82a130ac0 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -358,14 +358,6 @@ void DivPlatformYM2608::acquire(short* bufL, short* bufR, size_t start, size_t l } void DivPlatformYM2608::tick(bool sysTick) { - // PSG - ay->tick(sysTick); - ay->flushWrites(); - for (DivRegWrite& i: ay->getRegisterWrites()) { - immWrite(i.addr&15,i.val); - } - ay->getRegisterWrites().clear(); - // FM for (int i=0; i<6; i++) { if (i==2 && extMode) continue; @@ -522,6 +514,44 @@ void DivPlatformYM2608::tick(bool sysTick) { chan[i].keyOff=false; } } + + for (int i=16; i<512; i++) { + if (pendingWrites[i]!=oldWrites[i]) { + immWrite(i,pendingWrites[i]&0xff); + oldWrites[i]=pendingWrites[i]; + } + } + + for (int i=0; i<6; i++) { + if (i==2 && extMode) continue; + if (chan[i].freqChanged) { + if (parent->song.linearPitch==2) { + chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); + } else { + int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2); + int block=(chan[i].baseFreq&0xf800)>>11; + if (fNum<0) fNum=0; + if (fNum>2047) { + while (block<7) { + fNum>>=1; + block++; + } + if (fNum>2047) fNum=2047; + } + chan[i].freq=(block<<11)|fNum; + } + if (chan[i].freq>0x3fff) chan[i].freq=0x3fff; + immWrite(chanOffs[i]+ADDR_FREQH,chan[i].freq>>8); + immWrite(chanOffs[i]+ADDR_FREQ,chan[i].freq&0xff); + chan[i].freqChanged=false; + } + if (chan[i].keyOn || chan[i].opMaskChanged) { + immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); + chan[i].opMaskChanged=false; + chan[i].keyOn=false; + } + } + // RSS for (int i=9; i<15; i++) { if (chan[i].furnacePCM) { @@ -615,47 +645,18 @@ void DivPlatformYM2608::tick(bool sysTick) { writeRSSOff=0; } - for (int i=16; i<512; i++) { - if (pendingWrites[i]!=oldWrites[i]) { - immWrite(i,pendingWrites[i]&0xff); - oldWrites[i]=pendingWrites[i]; - } - } - - for (int i=0; i<6; i++) { - if (i==2 && extMode) continue; - if (chan[i].freqChanged) { - if (parent->song.linearPitch==2) { - chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); - } else { - int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2); - int block=(chan[i].baseFreq&0xf800)>>11; - if (fNum<0) fNum=0; - if (fNum>2047) { - while (block<7) { - fNum>>=1; - block++; - } - if (fNum>2047) fNum=2047; - } - chan[i].freq=(block<<11)|fNum; - } - if (chan[i].freq>0x3fff) chan[i].freq=0x3fff; - immWrite(chanOffs[i]+ADDR_FREQH,chan[i].freq>>8); - immWrite(chanOffs[i]+ADDR_FREQ,chan[i].freq&0xff); - chan[i].freqChanged=false; - } - if (chan[i].keyOn || chan[i].opMaskChanged) { - immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); - chan[i].opMaskChanged=false; - chan[i].keyOn=false; - } - } - if (writeRSSOn) { immWrite(0x10,writeRSSOn); writeRSSOn=0; } + + // PSG + ay->tick(sysTick); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); } int DivPlatformYM2608::dispatch(DivCommand c) { diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index b8882304c..0adab3ba5 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -294,15 +294,7 @@ void DivPlatformYM2610::acquire(short* bufL, short* bufR, size_t start, size_t l } } -void DivPlatformYM2610::tick(bool sysTick) { - // PSG - ay->tick(sysTick); - ay->flushWrites(); - for (DivRegWrite& i: ay->getRegisterWrites()) { - immWrite(i.addr&15,i.val); - } - ay->getRegisterWrites().clear(); - +void DivPlatformYM2610::tick(bool sysTick) { // FM for (int i=0; isong.linearPitch==2) { + chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); + } else { + int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); + int block=(chan[i].baseFreq&0xf800)>>11; + if (fNum<0) fNum=0; + if (fNum>2047) { + while (block<7) { + fNum>>=1; + block++; + } + if (fNum>2047) fNum=2047; + } + chan[i].freq=(block<<11)|fNum; + } + if (chan[i].freq>0x3fff) chan[i].freq=0x3fff; + immWrite(chanOffs[i]+ADDR_FREQH,chan[i].freq>>8); + immWrite(chanOffs[i]+ADDR_FREQ,chan[i].freq&0xff); + chan[i].freqChanged=false; + } + if (chan[i].keyOn || chan[i].opMaskChanged) { + immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); + chan[i].opMaskChanged=false; + chan[i].keyOn=false; + } + } + // ADPCM-A for (int i=adpcmAChanOffs; isong.linearPitch==2) { - chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); - } else { - int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); - int block=(chan[i].baseFreq&0xf800)>>11; - if (fNum<0) fNum=0; - if (fNum>2047) { - while (block<7) { - fNum>>=1; - block++; - } - if (fNum>2047) fNum=2047; - } - chan[i].freq=(block<<11)|fNum; - } - if (chan[i].freq>0x3fff) chan[i].freq=0x3fff; - immWrite(chanOffs[i]+ADDR_FREQH,chan[i].freq>>8); - immWrite(chanOffs[i]+ADDR_FREQ,chan[i].freq&0xff); - chan[i].freqChanged=false; - } - if (chan[i].keyOn || chan[i].opMaskChanged) { - immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); - chan[i].opMaskChanged=false; - chan[i].keyOn=false; - } - } - if (writeADPCMAOn) { immWrite(0x100,writeADPCMAOn); writeADPCMAOn=0; } + + // PSG + ay->tick(sysTick); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); } int DivPlatformYM2610::dispatch(DivCommand c) { diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 9bcc45741..59913b147 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -358,14 +358,6 @@ void DivPlatformYM2610B::acquire(short* bufL, short* bufR, size_t start, size_t } void DivPlatformYM2610B::tick(bool sysTick) { - // PSG - ay->tick(sysTick); - ay->flushWrites(); - for (DivRegWrite& i: ay->getRegisterWrites()) { - immWrite(i.addr&15,i.val); - } - ay->getRegisterWrites().clear(); - // FM for (int i=0; isong.linearPitch==2) { + chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); + } else { + int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2); + int block=(chan[i].baseFreq&0xf800)>>11; + if (fNum<0) fNum=0; + if (fNum>2047) { + while (block<7) { + fNum>>=1; + block++; + } + if (fNum>2047) fNum=2047; + } + chan[i].freq=(block<<11)|fNum; + } + if (chan[i].freq>0x3fff) chan[i].freq=0x3fff; + immWrite(chanOffs[i]+ADDR_FREQH,chan[i].freq>>8); + immWrite(chanOffs[i]+ADDR_FREQ,chan[i].freq&0xff); + chan[i].freqChanged=false; + } + if (chan[i].keyOn || chan[i].opMaskChanged) { + immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); + chan[i].opMaskChanged=false; + chan[i].keyOn=false; + } + } + // ADPCM-A for (int i=adpcmAChanOffs; isong.linearPitch==2) { - chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,4,chan[i].pitch2,chipClock,CHIP_FREQBASE,11); - } else { - int fNum=parent->calcFreq(chan[i].baseFreq&0x7ff,chan[i].pitch,false,4,chan[i].pitch2); - int block=(chan[i].baseFreq&0xf800)>>11; - if (fNum<0) fNum=0; - if (fNum>2047) { - while (block<7) { - fNum>>=1; - block++; - } - if (fNum>2047) fNum=2047; - } - chan[i].freq=(block<<11)|fNum; - } - if (chan[i].freq>0x3fff) chan[i].freq=0x3fff; - immWrite(chanOffs[i]+ADDR_FREQH,chan[i].freq>>8); - immWrite(chanOffs[i]+ADDR_FREQ,chan[i].freq&0xff); - chan[i].freqChanged=false; - } - if (chan[i].keyOn || chan[i].opMaskChanged) { - immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); - chan[i].opMaskChanged=false; - chan[i].keyOn=false; - } - } - if (writeADPCMAOn) { immWrite(0x100,writeADPCMAOn); writeADPCMAOn=0; } + + // PSG + ay->tick(sysTick); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); } int DivPlatformYM2610B::dispatch(DivCommand c) { diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 6c06eb068..e8bbd16f9 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -265,7 +265,7 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { chipClock=24167829/3; break; } - rate=fm->sample_rate(chipClock); + rate=chipClock/16; for (int i=0; irate=rate; } @@ -287,7 +287,7 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { iface.adpcmBMem=adpcmBMem; iface.sampleBank=0; fm=new ymfm::ym2610b(iface); - fm->set_fidelity(ymfm::OPN_FIDELITY_MIN); + fm->set_fidelity(ymfm::OPN_FIDELITY_MAX); setFlags(flags); // YM2149, 2MHz ay=new DivPlatformAY8910(true,chipClock,32);