S S G P C M

issue #1098
This commit is contained in:
tildearrow 2023-05-05 15:34:19 -05:00
parent 6b6320b961
commit 4daaaa4f2f
7 changed files with 84 additions and 7 deletions

View File

@ -120,7 +120,7 @@ void DivPlatformAY8910::runDAC() {
bool end=false; bool end=false;
bool changed=false; bool changed=false;
int prevOut=chan[i].dac.out; 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); DivSample* s=parent->getSample(chan[i].dac.sample);
if (s->samples<=0) { if (s->samples<=0) {
chan[i].dac.sample=-1; chan[i].dac.sample=-1;
@ -143,7 +143,7 @@ void DivPlatformAY8910::runDAC() {
end=true; end=true;
break; break;
} }
chan[i].dac.period-=rate; chan[i].dac.period-=dacRate;
} }
if (changed && !end) { if (changed && !end) {
if (!isMuted[i]) { if (!isMuted[i]) {
@ -797,6 +797,7 @@ void DivPlatformAY8910::setFlags(const DivConfig& flags) {
chipClock=extClock; chipClock=extClock;
rate=chipClock/extDiv; rate=chipClock/extDiv;
clockSel=false; clockSel=false;
dacRate=chipClock/dacRateDiv;
} else { } else {
clockSel=flags.getBool("halfClock",false); clockSel=flags.getBool("halfClock",false);
switch (flags.getInt("clockSel",0)) { switch (flags.getInt("clockSel",0)) {
@ -851,6 +852,7 @@ void DivPlatformAY8910::setFlags(const DivConfig& flags) {
} }
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
rate=chipClock/8; rate=chipClock/8;
dacRate=rate;
} }
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->rate=rate;

View File

@ -104,7 +104,9 @@ class DivPlatformAY8910: public DivDispatch {
bool extMode; bool extMode;
unsigned int extClock; unsigned int extClock;
int dacRate;
unsigned char extDiv; unsigned char extDiv;
unsigned char dacRateDiv;
bool stereo, sunsoft, intellivision, clockSel; bool stereo, sunsoft, intellivision, clockSel;
bool ioPortA, ioPortB; bool ioPortA, ioPortB;
@ -119,7 +121,6 @@ class DivPlatformAY8910: public DivDispatch {
short* ayBuf[3]; short* ayBuf[3];
size_t ayBufLen; size_t ayBufLen;
void runDAC();
void checkWrites(); void checkWrites();
void updateOutSel(bool immediate=false); void updateOutSel(bool immediate=false);
@ -127,6 +128,7 @@ class DivPlatformAY8910: public DivDispatch {
friend void putDispatchChan(void*,int,int); friend void putDispatchChan(void*,int,int);
public: public:
void runDAC();
void setExtClockDiv(unsigned int eclk=COLOR_NTSC, unsigned char ediv=8); void setExtClockDiv(unsigned int eclk=COLOR_NTSC, unsigned char ediv=8);
void acquire(short** buf, size_t len); void acquire(short** buf, size_t len);
int dispatch(DivCommand c); int dispatch(DivCommand c);
@ -151,10 +153,11 @@ class DivPlatformAY8910: public DivDispatch {
const char** getRegisterSheet(); const char** getRegisterSheet();
int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags);
void quit(); 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(), DivDispatch(),
extMode(useExtMode), extMode(useExtMode),
extClock(eclk), extClock(eclk),
extDiv(ediv) {} extDiv(ediv),
dacRateDiv(ddiv) {}
}; };
#endif #endif

View File

@ -169,6 +169,15 @@ void DivPlatformYM2203::acquire_combo(short** buf, size_t len) {
static short ignored[2]; static short ignored[2];
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os=0;
// Nuked part // Nuked part
for (unsigned int i=0; i<nukedMult; i++) { for (unsigned int i=0; i<nukedMult; i++) {
@ -242,6 +251,15 @@ void DivPlatformYM2203::acquire_ymfm(short** buf, size_t len) {
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os=0;
if (!writes.empty()) { if (!writes.empty()) {
if (--delay<1) { if (--delay<1) {

View File

@ -321,6 +321,15 @@ void DivPlatformYM2608::acquire_combo(short** buf, size_t len) {
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os[0]=0; os[1]=0;
// Nuked part // Nuked part
for (int i=0; i<nukedMult; i++) { for (int i=0; i<nukedMult; i++) {
@ -427,6 +436,15 @@ void DivPlatformYM2608::acquire_ymfm(short** buf, size_t len) {
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os[0]=0; os[1]=0;
if (!writes.empty()) { if (!writes.empty()) {
if (--delay<1) { if (--delay<1) {
@ -1675,7 +1693,7 @@ int DivPlatformYM2608::init(DivEngine* p, int channels, int sugRate, const DivCo
fm=new ymfm::ym2608(iface); fm=new ymfm::ym2608(iface);
fm->set_fidelity(ymfm::OPN_FIDELITY_MIN); fm->set_fidelity(ymfm::OPN_FIDELITY_MIN);
// YM2149, 2MHz // YM2149, 2MHz
ay=new DivPlatformAY8910(true,chipClock,ayDiv); ay=new DivPlatformAY8910(true,chipClock,ayDiv,48);
ay->init(p,3,sugRate,ayFlags); ay->init(p,3,sugRate,ayFlags);
ay->toggleRegisterDump(true); ay->toggleRegisterDump(true);
setFlags(flags); setFlags(flags);

View File

@ -256,6 +256,15 @@ void DivPlatformYM2610::acquire_combo(short** buf, size_t len) {
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os[0]=0; os[1]=0;
// Nuked part // Nuked part
for (int i=0; i<24; i++) { 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<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os[0]=0; os[1]=0;
if (!writes.empty()) { if (!writes.empty()) {
if (--delay<1 && !(fm->read(0)&0x80)) { if (--delay<1 && !(fm->read(0)&0x80)) {

View File

@ -320,7 +320,16 @@ void DivPlatformYM2610B::acquire_combo(short** buf, size_t len) {
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os[0]=0; os[1]=0;
// Nuked part // Nuked part
for (int i=0; i<24; i++) { for (int i=0; i<24; i++) {
if (!writes.empty()) { if (!writes.empty()) {
@ -426,6 +435,15 @@ void DivPlatformYM2610B::acquire_ymfm(short** buf, size_t len) {
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
// AY -> 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; os[0]=0; os[1]=0;
if (!writes.empty()) { if (!writes.empty()) {
if (--delay<1 && !(fm->read(0)&0x80)) { if (--delay<1 && !(fm->read(0)&0x80)) {

View File

@ -250,7 +250,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
fm->set_fidelity(ymfm::OPN_FIDELITY_MED); fm->set_fidelity(ymfm::OPN_FIDELITY_MED);
setFlags(flags); setFlags(flags);
// YM2149, 2MHz // YM2149, 2MHz
ay=new DivPlatformAY8910(true,chipClock,32); ay=new DivPlatformAY8910(true,chipClock,32,144);
ay->init(p,3,sugRate,ayFlags); ay->init(p,3,sugRate,ayFlags);
ay->toggleRegisterDump(true); ay->toggleRegisterDump(true);
return 0; return 0;