parent
6b6320b961
commit
4daaaa4f2f
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue