diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index c9c75f0f5..13dd2d842 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -120,7 +120,7 @@ void DivPlatformAY8910::runDAC() { bool end=false; bool changed=false; int prevOut=chan[i].dac.out; - while (chan[i].dac.period>rate && !end) { + while (chan[i].dac.period>dacRate && !end) { DivSample* s=parent->getSample(chan[i].dac.sample); if (s->samples<=0) { chan[i].dac.sample=-1; @@ -143,7 +143,7 @@ void DivPlatformAY8910::runDAC() { end=true; break; } - chan[i].dac.period-=rate; + chan[i].dac.period-=dacRate; } if (changed && !end) { if (!isMuted[i]) { @@ -797,6 +797,7 @@ void DivPlatformAY8910::setFlags(const DivConfig& flags) { chipClock=extClock; rate=chipClock/extDiv; clockSel=false; + dacRate=chipClock/dacRateDiv; } else { clockSel=flags.getBool("halfClock",false); switch (flags.getInt("clockSel",0)) { @@ -851,6 +852,7 @@ void DivPlatformAY8910::setFlags(const DivConfig& flags) { } CHECK_CUSTOM_CLOCK; rate=chipClock/8; + dacRate=rate; } for (int i=0; i<3; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/ay.h b/src/engine/platform/ay.h index 8f938d0a9..04e3aed12 100644 --- a/src/engine/platform/ay.h +++ b/src/engine/platform/ay.h @@ -104,7 +104,9 @@ class DivPlatformAY8910: public DivDispatch { bool extMode; unsigned int extClock; + int dacRate; unsigned char extDiv; + unsigned char dacRateDiv; bool stereo, sunsoft, intellivision, clockSel; bool ioPortA, ioPortB; @@ -119,7 +121,6 @@ class DivPlatformAY8910: public DivDispatch { short* ayBuf[3]; size_t ayBufLen; - void runDAC(); void checkWrites(); void updateOutSel(bool immediate=false); @@ -127,6 +128,7 @@ class DivPlatformAY8910: public DivDispatch { friend void putDispatchChan(void*,int,int); public: + void runDAC(); void setExtClockDiv(unsigned int eclk=COLOR_NTSC, unsigned char ediv=8); void acquire(short** buf, size_t len); int dispatch(DivCommand c); @@ -151,10 +153,11 @@ class DivPlatformAY8910: public DivDispatch { const char** getRegisterSheet(); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); - DivPlatformAY8910(bool useExtMode=false, unsigned int eclk=COLOR_NTSC, unsigned char ediv=8): + DivPlatformAY8910(bool useExtMode=false, unsigned int eclk=COLOR_NTSC, unsigned char ediv=8, unsigned char ddiv=24): DivDispatch(), extMode(useExtMode), extClock(eclk), - extDiv(ediv) {} + extDiv(ediv), + dacRateDiv(ddiv) {} }; #endif diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 974dbafae..cc2d1f3f7 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -169,6 +169,15 @@ void DivPlatformYM2203::acquire_combo(short** buf, size_t len) { static short ignored[2]; for (size_t h=0; h OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); + os=0; // Nuked part for (unsigned int i=0; i OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); + os=0; if (!writes.empty()) { if (--delay<1) { diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 6bfb7d42e..7c10e76c2 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -321,6 +321,15 @@ void DivPlatformYM2608::acquire_combo(short** buf, size_t len) { } for (size_t h=0; h OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); + os[0]=0; os[1]=0; // Nuked part for (int i=0; i OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); + os[0]=0; os[1]=0; if (!writes.empty()) { if (--delay<1) { @@ -1675,7 +1693,7 @@ int DivPlatformYM2608::init(DivEngine* p, int channels, int sugRate, const DivCo fm=new ymfm::ym2608(iface); fm->set_fidelity(ymfm::OPN_FIDELITY_MIN); // YM2149, 2MHz - ay=new DivPlatformAY8910(true,chipClock,ayDiv); + ay=new DivPlatformAY8910(true,chipClock,ayDiv,48); ay->init(p,3,sugRate,ayFlags); ay->toggleRegisterDump(true); setFlags(flags); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index a6ee50daf..e9cb021d0 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -256,6 +256,15 @@ void DivPlatformYM2610::acquire_combo(short** buf, size_t len) { } for (size_t h=0; h OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); + os[0]=0; os[1]=0; // Nuked part for (int i=0; i<24; i++) { @@ -360,6 +369,15 @@ void DivPlatformYM2610::acquire_ymfm(short** buf, size_t len) { } for (size_t h=0; h OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); + os[0]=0; os[1]=0; if (!writes.empty()) { if (--delay<1 && !(fm->read(0)&0x80)) { diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index a7e0112ad..7d28a8016 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -320,7 +320,16 @@ void DivPlatformYM2610B::acquire_combo(short** buf, size_t len) { } for (size_t h=0; h OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); os[0]=0; os[1]=0; + // Nuked part for (int i=0; i<24; i++) { if (!writes.empty()) { @@ -426,6 +435,15 @@ void DivPlatformYM2610B::acquire_ymfm(short** buf, size_t len) { } for (size_t h=0; h OPN + ay->runDAC(); + ay->flushWrites(); + for (DivRegWrite& i: ay->getRegisterWrites()) { + if (i.addr>15) continue; + immWrite(i.addr&15,i.val); + } + ay->getRegisterWrites().clear(); + os[0]=0; os[1]=0; if (!writes.empty()) { if (--delay<1 && !(fm->read(0)&0x80)) { diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 5af52ba6f..36db018f2 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -250,7 +250,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN { fm->set_fidelity(ymfm::OPN_FIDELITY_MED); setFlags(flags); // YM2149, 2MHz - ay=new DivPlatformAY8910(true,chipClock,32); + ay=new DivPlatformAY8910(true,chipClock,32,144); ay->init(p,3,sugRate,ayFlags); ay->toggleRegisterDump(true); return 0;