From 69b03172b10ce484820a98c675dd065497c39672 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 19 Oct 2024 18:28:27 -0500 Subject: [PATCH] get it done OPL UNFINISHED --- src/engine/platform/arcade.cpp | 24 ++++++----- src/engine/platform/genesisext.cpp | 4 +- src/engine/platform/opl.cpp | 64 +++++++++++++++--------------- src/engine/platform/opl.h | 4 +- src/engine/platform/tx81z.cpp | 16 ++++---- src/engine/platform/ym2203.cpp | 21 ++++++---- src/engine/platform/ym2203ext.cpp | 4 +- src/engine/platform/ym2608.cpp | 21 ++++++---- src/engine/platform/ym2608ext.cpp | 4 +- src/engine/platform/ym2610.cpp | 21 ++++++---- src/engine/platform/ym2610b.cpp | 21 ++++++---- src/engine/platform/ym2610bext.cpp | 4 +- src/engine/platform/ym2610ext.cpp | 4 +- 13 files changed, 116 insertions(+), 96 deletions(-) diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 1ac541ed0..3d477a0b3 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -55,10 +55,14 @@ void DivPlatformArcade::acquire_nuked(short** buf, size_t len) { thread_local int o[2]; for (size_t h=0; h0) delay--; for (int i=0; i<8; i++) { - if (!writes.empty() && !fm.write_busy) { + if (delay<=0 && !writes.empty() && !fm.write_busy) { QueuedWrite& w=writes.front(); - if (w.addrOrVal) { + if (w.addr==0xfffffffe) { + delay=w.val; + writes.pop_front(); + } else if (w.addrOrVal) { OPM_Write(&fm,1,w.val); regPool[w.addr&0xff]=w.val; //printf("write: %x = %.2x\n",w.addr,w.val); @@ -101,11 +105,15 @@ void DivPlatformArcade::acquire_ymfm(short** buf, size_t len) { if (!writes.empty()) { if (--delay<1) { QueuedWrite& w=writes.front(); - fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr); - fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val); - regPool[w.addr&0xff]=w.val; + if (w.addr==0xfffffffe) { + delay=w.val; + } else { + fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr); + fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0xff]=w.val; + delay=1; + } writes.pop_front(); - delay=1; } } @@ -380,9 +388,7 @@ void DivPlatformArcade::tick(bool sysTick) { // hard reset handling if (mustHardReset) { - for (unsigned int i=hardResetElapsed; i=0x200) { - pcm.writeReg(w.addr&0xff,w.val); - regPool[0x200|(w.addr&0xff)]=w.val; + if (w.addr==0xfffffffe) { + delay=w.val; } else { - switch (w.addr) { - case 8: - if (adpcmChan>=0) { - adpcmB->write(w.addr-7,(w.val&15)|0x80); - OPL3_WriteReg(&fm,w.addr,w.val&0xc0); - } else { + delay=1; + if (w.addr>=0x200) { + pcm.writeReg(w.addr&0xff,w.val); + regPool[0x200|(w.addr&0xff)]=w.val; + } else { + switch (w.addr) { + case 8: + if (adpcmChan>=0) { + adpcmB->write(w.addr-7,(w.val&15)|0x80); + OPL3_WriteReg(&fm,w.addr,w.val&0xc0); + } else { + OPL3_WriteReg(&fm,w.addr,w.val); + } + break; + case 7: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 21: case 22: case 23: + if (adpcmChan>=0) { + adpcmB->write(w.addr-7,w.val); + } else { + OPL3_WriteReg(&fm,w.addr,w.val); + } + break; + default: OPL3_WriteReg(&fm,w.addr,w.val); - } - break; - case 7: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 21: case 22: case 23: - if (adpcmChan>=0) { - adpcmB->write(w.addr-7,w.val); - } else { - OPL3_WriteReg(&fm,w.addr,w.val); - } - break; - default: - OPL3_WriteReg(&fm,w.addr,w.val); - break; + break; + } + regPool[w.addr&511]=w.val; } - regPool[w.addr&511]=w.val; } writes.pop(); } @@ -353,11 +357,11 @@ void DivPlatformOPL::acquire_ymfm1(short** buf, size_t len) { for (size_t h=0; hwrite(0,w.addr); fm_ymfm1->write(1,w.val); + delay=1; regPool[w.addr&511]=w.val; writes.pop(); @@ -395,11 +399,11 @@ void DivPlatformOPL::acquire_ymfm2(short** buf, size_t len) { for (size_t h=0; hwrite(0,w.addr); fm_ymfm2->write(1,w.val); + delay=1; regPool[w.addr&511]=w.val; writes.pop(); @@ -438,11 +442,11 @@ void DivPlatformOPL::acquire_ymfm8950(short** buf, size_t len) { for (size_t h=0; hwrite(0,w.addr); fm_ymfm8950->write(1,w.val); + delay=1; regPool[w.addr&511]=w.val; writes.pop(); @@ -482,11 +486,11 @@ void DivPlatformOPL::acquire_ymfm3(short** buf, size_t len) { for (size_t h=0; hwrite((w.addr&0x100)?2:0,w.addr); fm_ymfm3->write(1,w.val); + delay=1; regPool[w.addr&511]=w.val; writes.pop(); @@ -582,11 +586,11 @@ void DivPlatformOPL::acquire_ymfm4(short** buf, size_t len) { for (size_t h=0; hwrite((w.addr&0x200)?4:(w.addr&0x100)?2:0,w.addr); fm_ymfm4->write((w.addr&0x200)?5:1,w.val); + delay=1; regPool[(w.addr&0x200)?(0x200+(w.addr&255)):(w.addr&511)]=w.val; writes.pop(); @@ -1480,9 +1484,7 @@ void DivPlatformOPL::tick(bool sysTick) { // hard reset handling if (mustHardReset) { - for (unsigned int i=hardResetElapsed; i<128; i++) { - immWrite(0x3f,i&0xff); - } + immWrite(0xfffffffe,128-hardResetElapsed); for (int i=0x80; i<0xa0; i++) { if (weWillWriteRRLater[i-0x80]) { immWrite(i,pendingWrites[i]&0xff); diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index e648dc0f9..f976d0468 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -98,11 +98,11 @@ class DivPlatformOPL: public DivDispatch { DivDispatchOscBuffer* oscBuf[44]; bool isMuted[44]; struct QueuedWrite { - unsigned short addr; + unsigned int addr; unsigned char val; bool addrOrVal; QueuedWrite(): addr(0), val(0), addrOrVal(false) {} - QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {} + QueuedWrite(unsigned int a, unsigned char v): addr(a), val(v), addrOrVal(false) {} }; FixedQueue writes; diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 4cfc132ad..ae5579579 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -67,11 +67,15 @@ void DivPlatformTX81Z::acquire(short** buf, size_t len) { if (!writes.empty()) { if (--delay<1) { QueuedWrite& w=writes.front(); - fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr); - fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val); - regPool[w.addr&0xff]=w.val; + if (w.addr==0xfffffffe) { + delay=w.val; + } else { + fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr); + fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0xff]=w.val; + delay=1; + } writes.pop_front(); - delay=1; } } @@ -419,9 +423,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { // hard reset handling if (mustHardReset) { - for (unsigned int i=hardResetElapsed; iread(0)&0x80)) { QueuedWrite& w=writes.front(); - if (w.addr<=0x1c || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f) { + if (w.addr==0xfffffffe) { + delay=w.val; + writes.pop_front(); + } else if (w.addr<=0x1c || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f) { // ymfm write fm->write(0x0,w.addr); fm->write(0x1,w.val); @@ -267,11 +270,15 @@ void DivPlatformYM2203::acquire_ymfm(short** buf, size_t len) { if (!writes.empty()) { if (--delay<1) { QueuedWrite& w=writes.front(); - fm->write(0x0,w.addr); - fm->write(0x1,w.val); - regPool[w.addr&0xff]=w.val; + if (w.addr==0xfffffffe) { + delay=w.val*6; + } else { + fm->write(0x0,w.addr); + fm->write(0x1,w.val); + regPool[w.addr&0xff]=w.val; + delay=6; + } writes.pop_front(); - delay=6; } } @@ -661,9 +668,7 @@ void DivPlatformYM2203::tick(bool sysTick) { // hard reset handling if (mustHardReset) { - for (unsigned int i=hardResetElapsed; iread(0)&0x80)) { QueuedWrite& w=writes.front(); - if (w.addr<=0x1d || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f || (w.addr>=0x100 && w.addr<=0x12d)) { + if (w.addr==0xfffffffe) { + delay=w.val; + writes.pop_front(); + } else if (w.addr<=0x1d || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f || (w.addr>=0x100 && w.addr<=0x12d)) { // ymfm write fm->write(0x0+((w.addr>>8)<<1),w.addr); fm->write(0x1+((w.addr>>8)<<1),w.val); @@ -451,11 +454,15 @@ void DivPlatformYM2608::acquire_ymfm(short** buf, size_t len) { if (!writes.empty()) { if (--delay<1) { QueuedWrite& w=writes.front(); - fm->write(0x0+((w.addr>>8)<<1),w.addr); - fm->write(0x1+((w.addr>>8)<<1),w.val); - regPool[w.addr&0x1ff]=w.val; + if (w.addr==0xfffffffe) { + delay=w.val*4; + } else { + fm->write(0x0+((w.addr>>8)<<1),w.addr); + fm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; + delay=4; + } writes.pop_front(); - delay=4; } } @@ -1028,9 +1035,7 @@ void DivPlatformYM2608::tick(bool sysTick) { // hard reset handling if (mustHardReset) { - for (unsigned int i=hardResetElapsed; iread(0)&0x80)) { QueuedWrite& w=writes.front(); - if (w.addr<=0x1c || (w.addr>=0x100 && w.addr<=0x12d)) { + if (w.addr==0xfffffffe) { + delay=w.val; + writes.pop_front(); + } else if (w.addr<=0x1c || (w.addr>=0x100 && w.addr<=0x12d)) { // ymfm write fm->write(0x0+((w.addr>>8)<<1),w.addr); fm->write(0x1+((w.addr>>8)<<1),w.val); @@ -385,11 +388,15 @@ void DivPlatformYM2610::acquire_ymfm(short** buf, size_t len) { if (!writes.empty()) { if (--delay<1 && !(fm->read(0)&0x80)) { QueuedWrite& w=writes.front(); - fm->write(0x0+((w.addr>>8)<<1),w.addr); - fm->write(0x1+((w.addr>>8)<<1),w.val); - regPool[w.addr&0x1ff]=w.val; + if (w.addr==0xfffffffe) { + delay=w.val; + } else { + fm->write(0x0+((w.addr>>8)<<1),w.addr); + fm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; + delay=1; + } writes.pop_front(); - delay=1; } } @@ -956,9 +963,7 @@ void DivPlatformYM2610::tick(bool sysTick) { // hard reset handling if (mustHardReset) { - for (unsigned int i=hardResetElapsed; iread(0)&0x80)) { QueuedWrite& w=writes.front(); - if (w.addr<=0x1c || (w.addr>=0x100 && w.addr<=0x12d)) { + if (w.addr==0xfffffffe) { + delay=w.val; + writes.pop_front(); + } else if (w.addr<=0x1c || (w.addr>=0x100 && w.addr<=0x12d)) { // ymfm write fm->write(0x0+((w.addr>>8)<<1),w.addr); fm->write(0x1+((w.addr>>8)<<1),w.val); @@ -451,11 +454,15 @@ void DivPlatformYM2610B::acquire_ymfm(short** buf, size_t len) { if (!writes.empty()) { if (--delay<1 && !(fm->read(0)&0x80)) { QueuedWrite& w=writes.front(); - fm->write(0x0+((w.addr>>8)<<1),w.addr); - fm->write(0x1+((w.addr>>8)<<1),w.val); - regPool[w.addr&0x1ff]=w.val; + if (w.addr==0xfffffffe) { + delay=w.val; + } else { + fm->write(0x0+((w.addr>>8)<<1),w.addr); + fm->write(0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; + delay=1; + } writes.pop_front(); - delay=1; } } @@ -1024,9 +1031,7 @@ void DivPlatformYM2610B::tick(bool sysTick) { // hard reset handling if (mustHardReset) { - for (unsigned int i=hardResetElapsed; i