get it done
OPL UNFINISHED
This commit is contained in:
parent
dd9d8dccd1
commit
69b03172b1
|
@ -55,10 +55,14 @@ void DivPlatformArcade::acquire_nuked(short** buf, size_t len) {
|
||||||
thread_local int o[2];
|
thread_local int o[2];
|
||||||
|
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
|
if (delay>0) delay--;
|
||||||
for (int i=0; i<8; i++) {
|
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();
|
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);
|
OPM_Write(&fm,1,w.val);
|
||||||
regPool[w.addr&0xff]=w.val;
|
regPool[w.addr&0xff]=w.val;
|
||||||
//printf("write: %x = %.2x\n",w.addr,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 (!writes.empty()) {
|
||||||
if (--delay<1) {
|
if (--delay<1) {
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr);
|
if (w.addr==0xfffffffe) {
|
||||||
fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val);
|
delay=w.val;
|
||||||
regPool[w.addr&0xff]=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();
|
writes.pop_front();
|
||||||
delay=1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,9 +388,7 @@ void DivPlatformArcade::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0x1f,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<8; i++) {
|
for (int i=0; i<8; i++) {
|
||||||
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
||||||
// restore SL/RR
|
// restore SL/RR
|
||||||
|
|
|
@ -693,9 +693,7 @@ void DivPlatformGenesisExt::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
if (opChan[i].keyOn && opChan[i].hardReset) {
|
if (opChan[i].keyOn && opChan[i].hardReset) {
|
||||||
// restore SL/RR
|
// restore SL/RR
|
||||||
|
|
|
@ -190,33 +190,37 @@ void DivPlatformOPL::acquire_nuked(short** buf, size_t len) {
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
os[0]=0; os[1]=0; os[2]=0; os[3]=0; os[4]=0; os[5]=0;
|
os[0]=0; os[1]=0; os[2]=0; os[3]=0; os[4]=0; os[5]=0;
|
||||||
if (!writes.empty() && --delay<0) {
|
if (!writes.empty() && --delay<0) {
|
||||||
delay=1;
|
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
if (w.addr>=0x200) {
|
if (w.addr==0xfffffffe) {
|
||||||
pcm.writeReg(w.addr&0xff,w.val);
|
delay=w.val;
|
||||||
regPool[0x200|(w.addr&0xff)]=w.val;
|
|
||||||
} else {
|
} else {
|
||||||
switch (w.addr) {
|
delay=1;
|
||||||
case 8:
|
if (w.addr>=0x200) {
|
||||||
if (adpcmChan>=0) {
|
pcm.writeReg(w.addr&0xff,w.val);
|
||||||
adpcmB->write(w.addr-7,(w.val&15)|0x80);
|
regPool[0x200|(w.addr&0xff)]=w.val;
|
||||||
OPL3_WriteReg(&fm,w.addr,w.val&0xc0);
|
} else {
|
||||||
} 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);
|
OPL3_WriteReg(&fm,w.addr,w.val);
|
||||||
}
|
break;
|
||||||
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:
|
regPool[w.addr&511]=w.val;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
regPool[w.addr&511]=w.val;
|
|
||||||
}
|
}
|
||||||
writes.pop();
|
writes.pop();
|
||||||
}
|
}
|
||||||
|
@ -353,11 +357,11 @@ void DivPlatformOPL::acquire_ymfm1(short** buf, size_t len) {
|
||||||
|
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
if (!writes.empty() && --delay<0) {
|
if (!writes.empty() && --delay<0) {
|
||||||
delay=1;
|
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
|
|
||||||
fm_ymfm1->write(0,w.addr);
|
fm_ymfm1->write(0,w.addr);
|
||||||
fm_ymfm1->write(1,w.val);
|
fm_ymfm1->write(1,w.val);
|
||||||
|
delay=1;
|
||||||
|
|
||||||
regPool[w.addr&511]=w.val;
|
regPool[w.addr&511]=w.val;
|
||||||
writes.pop();
|
writes.pop();
|
||||||
|
@ -395,11 +399,11 @@ void DivPlatformOPL::acquire_ymfm2(short** buf, size_t len) {
|
||||||
|
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
if (!writes.empty() && --delay<0) {
|
if (!writes.empty() && --delay<0) {
|
||||||
delay=1;
|
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
|
|
||||||
fm_ymfm2->write(0,w.addr);
|
fm_ymfm2->write(0,w.addr);
|
||||||
fm_ymfm2->write(1,w.val);
|
fm_ymfm2->write(1,w.val);
|
||||||
|
delay=1;
|
||||||
|
|
||||||
regPool[w.addr&511]=w.val;
|
regPool[w.addr&511]=w.val;
|
||||||
writes.pop();
|
writes.pop();
|
||||||
|
@ -438,11 +442,11 @@ void DivPlatformOPL::acquire_ymfm8950(short** buf, size_t len) {
|
||||||
|
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
if (!writes.empty() && --delay<0) {
|
if (!writes.empty() && --delay<0) {
|
||||||
delay=1;
|
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
|
|
||||||
fm_ymfm8950->write(0,w.addr);
|
fm_ymfm8950->write(0,w.addr);
|
||||||
fm_ymfm8950->write(1,w.val);
|
fm_ymfm8950->write(1,w.val);
|
||||||
|
delay=1;
|
||||||
|
|
||||||
regPool[w.addr&511]=w.val;
|
regPool[w.addr&511]=w.val;
|
||||||
writes.pop();
|
writes.pop();
|
||||||
|
@ -482,11 +486,11 @@ void DivPlatformOPL::acquire_ymfm3(short** buf, size_t len) {
|
||||||
|
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
if (!writes.empty() && --delay<0) {
|
if (!writes.empty() && --delay<0) {
|
||||||
delay=1;
|
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
|
|
||||||
fm_ymfm3->write((w.addr&0x100)?2:0,w.addr);
|
fm_ymfm3->write((w.addr&0x100)?2:0,w.addr);
|
||||||
fm_ymfm3->write(1,w.val);
|
fm_ymfm3->write(1,w.val);
|
||||||
|
delay=1;
|
||||||
|
|
||||||
regPool[w.addr&511]=w.val;
|
regPool[w.addr&511]=w.val;
|
||||||
writes.pop();
|
writes.pop();
|
||||||
|
@ -582,11 +586,11 @@ void DivPlatformOPL::acquire_ymfm4(short** buf, size_t len) {
|
||||||
|
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
if (!writes.empty() && --delay<0) {
|
if (!writes.empty() && --delay<0) {
|
||||||
delay=1;
|
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
|
|
||||||
fm_ymfm4->write((w.addr&0x200)?4:(w.addr&0x100)?2:0,w.addr);
|
fm_ymfm4->write((w.addr&0x200)?4:(w.addr&0x100)?2:0,w.addr);
|
||||||
fm_ymfm4->write((w.addr&0x200)?5:1,w.val);
|
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;
|
regPool[(w.addr&0x200)?(0x200+(w.addr&255)):(w.addr&511)]=w.val;
|
||||||
writes.pop();
|
writes.pop();
|
||||||
|
@ -1480,9 +1484,7 @@ void DivPlatformOPL::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<128; i++) {
|
immWrite(0xfffffffe,128-hardResetElapsed);
|
||||||
immWrite(0x3f,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0x80; i<0xa0; i++) {
|
for (int i=0x80; i<0xa0; i++) {
|
||||||
if (weWillWriteRRLater[i-0x80]) {
|
if (weWillWriteRRLater[i-0x80]) {
|
||||||
immWrite(i,pendingWrites[i]&0xff);
|
immWrite(i,pendingWrites[i]&0xff);
|
||||||
|
|
|
@ -98,11 +98,11 @@ class DivPlatformOPL: public DivDispatch {
|
||||||
DivDispatchOscBuffer* oscBuf[44];
|
DivDispatchOscBuffer* oscBuf[44];
|
||||||
bool isMuted[44];
|
bool isMuted[44];
|
||||||
struct QueuedWrite {
|
struct QueuedWrite {
|
||||||
unsigned short addr;
|
unsigned int addr;
|
||||||
unsigned char val;
|
unsigned char val;
|
||||||
bool addrOrVal;
|
bool addrOrVal;
|
||||||
QueuedWrite(): addr(0), val(0), addrOrVal(false) {}
|
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<QueuedWrite,4096> writes;
|
FixedQueue<QueuedWrite,4096> writes;
|
||||||
|
|
||||||
|
|
|
@ -67,11 +67,15 @@ void DivPlatformTX81Z::acquire(short** buf, size_t len) {
|
||||||
if (!writes.empty()) {
|
if (!writes.empty()) {
|
||||||
if (--delay<1) {
|
if (--delay<1) {
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr);
|
if (w.addr==0xfffffffe) {
|
||||||
fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val);
|
delay=w.val;
|
||||||
regPool[w.addr&0xff]=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();
|
writes.pop_front();
|
||||||
delay=1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,9 +423,7 @@ void DivPlatformTX81Z::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0x1f,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<8; i++) {
|
for (int i=0; i<8; i++) {
|
||||||
if (chan[i].keyOn && chan[i].hardReset) {
|
if (chan[i].keyOn && chan[i].hardReset) {
|
||||||
// restore SL/RR
|
// restore SL/RR
|
||||||
|
|
|
@ -187,7 +187,10 @@ void DivPlatformYM2203::acquire_combo(short** buf, size_t len) {
|
||||||
if (--delay<1 && !(fm->read(0)&0x80)) {
|
if (--delay<1 && !(fm->read(0)&0x80)) {
|
||||||
QueuedWrite& w=writes.front();
|
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
|
// ymfm write
|
||||||
fm->write(0x0,w.addr);
|
fm->write(0x0,w.addr);
|
||||||
fm->write(0x1,w.val);
|
fm->write(0x1,w.val);
|
||||||
|
@ -267,11 +270,15 @@ void DivPlatformYM2203::acquire_ymfm(short** buf, size_t len) {
|
||||||
if (!writes.empty()) {
|
if (!writes.empty()) {
|
||||||
if (--delay<1) {
|
if (--delay<1) {
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
fm->write(0x0,w.addr);
|
if (w.addr==0xfffffffe) {
|
||||||
fm->write(0x1,w.val);
|
delay=w.val*6;
|
||||||
regPool[w.addr&0xff]=w.val;
|
} else {
|
||||||
|
fm->write(0x0,w.addr);
|
||||||
|
fm->write(0x1,w.val);
|
||||||
|
regPool[w.addr&0xff]=w.val;
|
||||||
|
delay=6;
|
||||||
|
}
|
||||||
writes.pop_front();
|
writes.pop_front();
|
||||||
delay=6;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,9 +668,7 @@ void DivPlatformYM2203::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<3; i++) {
|
for (int i=0; i<3; i++) {
|
||||||
if (i==2 && extMode) continue;
|
if (i==2 && extMode) continue;
|
||||||
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
||||||
|
|
|
@ -595,9 +595,7 @@ void DivPlatformYM2203Ext::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
if (opChan[i].keyOn && opChan[i].hardReset) {
|
if (opChan[i].keyOn && opChan[i].hardReset) {
|
||||||
// restore SL/RR
|
// restore SL/RR
|
||||||
|
|
|
@ -338,7 +338,10 @@ void DivPlatformYM2608::acquire_combo(short** buf, size_t len) {
|
||||||
if (--delay<1 && !(fm->read(0)&0x80)) {
|
if (--delay<1 && !(fm->read(0)&0x80)) {
|
||||||
QueuedWrite& w=writes.front();
|
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
|
// ymfm write
|
||||||
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
||||||
fm->write(0x1+((w.addr>>8)<<1),w.val);
|
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 (!writes.empty()) {
|
||||||
if (--delay<1) {
|
if (--delay<1) {
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
if (w.addr==0xfffffffe) {
|
||||||
fm->write(0x1+((w.addr>>8)<<1),w.val);
|
delay=w.val*4;
|
||||||
regPool[w.addr&0x1ff]=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=4;
|
||||||
|
}
|
||||||
writes.pop_front();
|
writes.pop_front();
|
||||||
delay=4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1028,9 +1035,7 @@ void DivPlatformYM2608::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<6; i++) {
|
for (int i=0; i<6; i++) {
|
||||||
if (i==2 && extMode) continue;
|
if (i==2 && extMode) continue;
|
||||||
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
||||||
|
|
|
@ -646,9 +646,7 @@ void DivPlatformYM2608Ext::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
if (opChan[i].keyOn && opChan[i].hardReset) {
|
if (opChan[i].keyOn && opChan[i].hardReset) {
|
||||||
// restore SL/RR
|
// restore SL/RR
|
||||||
|
|
|
@ -274,7 +274,10 @@ void DivPlatformYM2610::acquire_combo(short** buf, size_t len) {
|
||||||
if (--delay<1 && !(fm->read(0)&0x80)) {
|
if (--delay<1 && !(fm->read(0)&0x80)) {
|
||||||
QueuedWrite& w=writes.front();
|
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
|
// ymfm write
|
||||||
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
||||||
fm->write(0x1+((w.addr>>8)<<1),w.val);
|
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 (!writes.empty()) {
|
||||||
if (--delay<1 && !(fm->read(0)&0x80)) {
|
if (--delay<1 && !(fm->read(0)&0x80)) {
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
if (w.addr==0xfffffffe) {
|
||||||
fm->write(0x1+((w.addr>>8)<<1),w.val);
|
delay=w.val;
|
||||||
regPool[w.addr&0x1ff]=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();
|
writes.pop_front();
|
||||||
delay=1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -956,9 +963,7 @@ void DivPlatformYM2610::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||||
if (i==1 && extMode) continue;
|
if (i==1 && extMode) continue;
|
||||||
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
||||||
|
|
|
@ -338,7 +338,10 @@ void DivPlatformYM2610B::acquire_combo(short** buf, size_t len) {
|
||||||
if (--delay<1 && !(fm->read(0)&0x80)) {
|
if (--delay<1 && !(fm->read(0)&0x80)) {
|
||||||
QueuedWrite& w=writes.front();
|
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
|
// ymfm write
|
||||||
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
||||||
fm->write(0x1+((w.addr>>8)<<1),w.val);
|
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 (!writes.empty()) {
|
||||||
if (--delay<1 && !(fm->read(0)&0x80)) {
|
if (--delay<1 && !(fm->read(0)&0x80)) {
|
||||||
QueuedWrite& w=writes.front();
|
QueuedWrite& w=writes.front();
|
||||||
fm->write(0x0+((w.addr>>8)<<1),w.addr);
|
if (w.addr==0xfffffffe) {
|
||||||
fm->write(0x1+((w.addr>>8)<<1),w.val);
|
delay=w.val;
|
||||||
regPool[w.addr&0x1ff]=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();
|
writes.pop_front();
|
||||||
delay=1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1024,9 +1031,7 @@ void DivPlatformYM2610B::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||||
if (i==2 && extMode) continue;
|
if (i==2 && extMode) continue;
|
||||||
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
||||||
|
|
|
@ -638,9 +638,7 @@ void DivPlatformYM2610BExt::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
if (opChan[i].keyOn && opChan[i].hardReset) {
|
if (opChan[i].keyOn && opChan[i].hardReset) {
|
||||||
// restore SL/RR
|
// restore SL/RR
|
||||||
|
|
|
@ -638,9 +638,7 @@ void DivPlatformYM2610Ext::tick(bool sysTick) {
|
||||||
|
|
||||||
// hard reset handling
|
// hard reset handling
|
||||||
if (mustHardReset) {
|
if (mustHardReset) {
|
||||||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
immWrite(0xfffffffe,hardResetCycles-hardResetElapsed);
|
||||||
immWrite(0xf0,i&0xff);
|
|
||||||
}
|
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
if (opChan[i].keyOn && opChan[i].hardReset) {
|
if (opChan[i].keyOn && opChan[i].hardReset) {
|
||||||
// restore SL/RR
|
// restore SL/RR
|
||||||
|
|
Loading…
Reference in a new issue