YM2612: implement urgent flag on ymfm and LLE

issue #2475
This commit is contained in:
tildearrow 2025-06-18 02:51:14 -05:00
parent f0207011da
commit a36d78305a

View file

@ -256,24 +256,36 @@ void DivPlatformGenesis::acquire_ymfm(short** buf, size_t len) {
if (delay>0) delay--; if (delay>0) delay--;
os[0]=0; os[1]=0; os[0]=0; os[1]=0;
if (delay<=0 && !writes.empty()) { if (!writes.empty()) {
QueuedWrite& w=writes.front(); QueuedWrite& w=writes.front();
if (w.addr==0xfffffffe) { if (delay<=0 || w.urgent) {
delay=w.val; if (w.addr==0xfffffffe) {
} else { delay=w.val;
fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr);
fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val);
regPool[w.addr&0x1ff]=w.val;
}
writes.pop_front();
if (dacWrite>=0) {
if (!canWriteDAC) {
canWriteDAC=true;
} else { } else {
urgentWrite(0x2a,dacWrite); fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr);
dacWrite=-1; fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val);
canWriteDAC=writes.empty(); regPool[w.addr&0x1ff]=w.val;
}
writes.pop_front();
if (dacWrite>=0) {
if (!canWriteDAC) {
canWriteDAC=true;
} else {
urgentWrite(0x2a,dacWrite);
dacWrite=-1;
canWriteDAC=writes.empty();
}
}
} else {
if (dacWrite>=0) {
if (!canWriteDAC) {
canWriteDAC=true;
} else {
urgentWrite(0x2a,dacWrite);
dacWrite=-1;
canWriteDAC=writes.empty();
}
} }
} }
} else { } else {
@ -414,55 +426,89 @@ void DivPlatformGenesis::acquire_nuked276(short** buf, size_t len) {
if (delay>0) delay--; if (delay>0) delay--;
if (delay<=0 && !writes.empty()) { if (!writes.empty()) {
QueuedWrite& w=writes.front(); QueuedWrite& w=writes.front();
if (w.addr==0xfffffffe) { if (delay<=0 || w.urgent) {
delay=w.val; if (w.addr==0xfffffffe) {
writes.pop_front(); delay=w.val;
} else if (w.addrOrVal) { writes.pop_front();
//logV("%.3x=%.2x",w.addr,w.val); } else if (w.addrOrVal) {
//OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val); //logV("%.3x=%.2x",w.addr,w.val);
was_reg_write=true; //OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val);
was_reg_write=true;
fm_276.input.address=w.addr<0x100?0:2; fm_276.input.address=w.addr<0x100?0:2;
fm_276.input.data=w.addr&0xff; fm_276.input.data=w.addr&0xff;
fm_276.input.wr=1; fm_276.input.wr=1;
FMOPN2_Clock(&fm_276,0);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
acquire276OscSub(h);
fm_276.input.wr=0;
FMOPN2_Clock(&fm_276,1);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
acquire276OscSub(h);
if (chipType==2) {
if (!o_bco && fm_276.o_bco) {
dacShifter=(dacShifter<<1)|fm_276.o_so;
if (o_lro!=fm_276.o_lro) {
if (o_lro)
sample_l=dacShifter;
else
sample_r=dacShifter;
}
o_lro=fm_276.o_lro;
}
o_bco=fm_276.o_bco;
}
for (int c=0; c<17; c++) {
FMOPN2_Clock(&fm_276,0); FMOPN2_Clock(&fm_276,0);
sum_l+=fm_276.out_l; sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r; sum_r+=fm_276.out_r;
acquire276OscSub(h); acquire276OscSub(h);
fm_276.input.wr=0;
FMOPN2_Clock(&fm_276,1);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
acquire276OscSub(h);
if (chipType==2) {
if (!o_bco && fm_276.o_bco) {
dacShifter=(dacShifter<<1)|fm_276.o_so;
if (o_lro!=fm_276.o_lro) {
if (o_lro)
sample_l=dacShifter;
else
sample_r=dacShifter;
}
o_lro=fm_276.o_lro;
}
o_bco=fm_276.o_bco;
}
for (int c=0; c<17; c++) {
FMOPN2_Clock(&fm_276,0);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
acquire276OscSub(h);
FMOPN2_Clock(&fm_276,1);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
acquire276OscSub(h);
if (chipType==2) {
if (!o_bco && fm_276.o_bco) {
dacShifter=(dacShifter<<1)|fm_276.o_so;
if (o_lro!=fm_276.o_lro) {
if (o_lro)
sample_l=dacShifter;
else
sample_r=dacShifter;
}
o_lro=fm_276.o_lro;
}
o_bco=fm_276.o_bco;
}
}
fm_276.input.address=w.addr<0x100?1:3;
fm_276.input.data=w.val;
fm_276.input.wr=1;
FMOPN2_Clock(&fm_276,0);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
fm_276.input.wr=0;
acquire276OscSub(h);
FMOPN2_Clock(&fm_276,1); FMOPN2_Clock(&fm_276,1);
sum_l+=fm_276.out_l; sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r; sum_r+=fm_276.out_r;
@ -484,74 +530,54 @@ void DivPlatformGenesis::acquire_nuked276(short** buf, size_t len) {
} }
o_bco=fm_276.o_bco; o_bco=fm_276.o_bco;
} }
}
fm_276.input.address=w.addr<0x100?1:3; for (int c=0; c<83; c++) {
fm_276.input.data=w.val; FMOPN2_Clock(&fm_276,0);
fm_276.input.wr=1; sum_l+=fm_276.out_l;
FMOPN2_Clock(&fm_276,0); sum_r+=fm_276.out_r;
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
fm_276.input.wr=0;
acquire276OscSub(h); acquire276OscSub(h);
FMOPN2_Clock(&fm_276,1); FMOPN2_Clock(&fm_276,1);
sum_l+=fm_276.out_l; sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r; sum_r+=fm_276.out_r;
acquire276OscSub(h); acquire276OscSub(h);
if (chipType==2) { if (chipType==2) {
if (!o_bco && fm_276.o_bco) { if (!o_bco && fm_276.o_bco) {
dacShifter=(dacShifter<<1)|fm_276.o_so; dacShifter=(dacShifter<<1)|fm_276.o_so;
if (o_lro!=fm_276.o_lro) { if (o_lro!=fm_276.o_lro) {
if (o_lro) if (o_lro) {
sample_l=dacShifter; sample_l=dacShifter;
else } else {
sample_r=dacShifter; sample_r=dacShifter;
} }
o_lro=fm_276.o_lro;
}
o_bco=fm_276.o_bco;
}
for (int c=0; c<83; c++) {
FMOPN2_Clock(&fm_276,0);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
acquire276OscSub(h);
FMOPN2_Clock(&fm_276,1);
sum_l+=fm_276.out_l;
sum_r+=fm_276.out_r;
acquire276OscSub(h);
if (chipType==2) {
if (!o_bco && fm_276.o_bco) {
dacShifter=(dacShifter<<1)|fm_276.o_so;
if (o_lro!=fm_276.o_lro) {
if (o_lro) {
sample_l=dacShifter;
} else {
sample_r=dacShifter;
} }
o_lro=fm_276.o_lro;
} }
o_bco=fm_276.o_bco;
o_lro=fm_276.o_lro;
} }
o_bco=fm_276.o_bco;
} }
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
if (dacWrite>=0) {
if (!canWriteDAC) {
canWriteDAC=true;
} else {
urgentWrite(0x2a,dacWrite);
dacWrite=-1;
canWriteDAC=writes.empty();
}
}
} else {
w.addrOrVal=true;
} }
} else {
regPool[w.addr&0x1ff]=w.val;
writes.pop_front();
if (dacWrite>=0) { if (dacWrite>=0) {
if (!canWriteDAC) { if (!canWriteDAC) {
canWriteDAC=true; canWriteDAC=true;
@ -561,8 +587,6 @@ void DivPlatformGenesis::acquire_nuked276(short** buf, size_t len) {
canWriteDAC=writes.empty(); canWriteDAC=writes.empty();
} }
} }
} else {
w.addrOrVal=true;
} }
} else { } else {
canWriteDAC=true; canWriteDAC=true;