Genesis: prioritize DAC writes
This commit is contained in:
parent
e009fc64f2
commit
67d516fcee
|
@ -92,7 +92,7 @@ void DivPlatformGenesis::acquire_nuked(short* bufL, short* bufR, size_t start, s
|
||||||
DivSample* s=parent->getSample(dacSample);
|
DivSample* s=parent->getSample(dacSample);
|
||||||
if (s->samples>0) {
|
if (s->samples>0) {
|
||||||
if (!isMuted[5]) {
|
if (!isMuted[5]) {
|
||||||
immWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80);
|
urgentWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80);
|
||||||
}
|
}
|
||||||
if (++dacPos>=s->samples) {
|
if (++dacPos>=s->samples) {
|
||||||
if (s->loopStart>=0 && s->loopStart<=(int)s->samples) {
|
if (s->loopStart>=0 && s->loopStart<=(int)s->samples) {
|
||||||
|
@ -121,7 +121,7 @@ void DivPlatformGenesis::acquire_nuked(short* bufL, short* bufR, size_t start, s
|
||||||
//printf("write: %x = %.2x\n",w.addr,w.val);
|
//printf("write: %x = %.2x\n",w.addr,w.val);
|
||||||
lastBusy=0;
|
lastBusy=0;
|
||||||
regPool[w.addr&0x1ff]=w.val;
|
regPool[w.addr&0x1ff]=w.val;
|
||||||
writes.pop();
|
writes.pop_front();
|
||||||
} else {
|
} else {
|
||||||
lastBusy++;
|
lastBusy++;
|
||||||
if (fm.write_busy==0) {
|
if (fm.write_busy==0) {
|
||||||
|
@ -159,7 +159,7 @@ void DivPlatformGenesis::acquire_ymfm(short* bufL, short* bufR, size_t start, si
|
||||||
DivSample* s=parent->getSample(dacSample);
|
DivSample* s=parent->getSample(dacSample);
|
||||||
if (s->samples>0) {
|
if (s->samples>0) {
|
||||||
if (!isMuted[5]) {
|
if (!isMuted[5]) {
|
||||||
immWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80);
|
urgentWrite(0x2a,(unsigned char)s->data8[dacPos]+0x80);
|
||||||
}
|
}
|
||||||
if (++dacPos>=s->samples) {
|
if (++dacPos>=s->samples) {
|
||||||
if (s->loopStart>=0 && s->loopStart<=(int)s->samples) {
|
if (s->loopStart>=0 && s->loopStart<=(int)s->samples) {
|
||||||
|
@ -184,7 +184,7 @@ void DivPlatformGenesis::acquire_ymfm(short* bufL, short* bufR, size_t start, si
|
||||||
fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr);
|
fm_ymfm->write(0x0+((w.addr>>8)<<1),w.addr);
|
||||||
fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val);
|
fm_ymfm->write(0x1+((w.addr>>8)<<1),w.val);
|
||||||
regPool[w.addr&0x1ff]=w.val;
|
regPool[w.addr&0x1ff]=w.val;
|
||||||
writes.pop();
|
writes.pop_front();
|
||||||
lastBusy=1;
|
lastBusy=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,7 +782,7 @@ int DivPlatformGenesis::getRegisterPoolSize() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformGenesis::reset() {
|
void DivPlatformGenesis::reset() {
|
||||||
while (!writes.empty()) writes.pop();
|
while (!writes.empty()) writes.pop_front();
|
||||||
memset(regPool,0,512);
|
memset(regPool,0,512);
|
||||||
if (useYMFM) {
|
if (useYMFM) {
|
||||||
fm_ymfm->reset();
|
fm_ymfm->reset();
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#ifndef _GENESIS_H
|
#ifndef _GENESIS_H
|
||||||
#define _GENESIS_H
|
#define _GENESIS_H
|
||||||
#include "../dispatch.h"
|
#include "../dispatch.h"
|
||||||
#include <queue>
|
#include <deque>
|
||||||
#include "../../../extern/Nuked-OPN2/ym3438.h"
|
#include "../../../extern/Nuked-OPN2/ym3438.h"
|
||||||
#include "sound/ymfm/ymfm_opn.h"
|
#include "sound/ymfm/ymfm_opn.h"
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ class DivPlatformGenesis: public DivDispatch {
|
||||||
bool addrOrVal;
|
bool addrOrVal;
|
||||||
QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {}
|
QueuedWrite(unsigned short a, unsigned char v): addr(a), val(v), addrOrVal(false) {}
|
||||||
};
|
};
|
||||||
std::queue<QueuedWrite> writes;
|
std::deque<QueuedWrite> writes;
|
||||||
ym3438_t fm;
|
ym3438_t fm;
|
||||||
int delay;
|
int delay;
|
||||||
unsigned char lastBusy;
|
unsigned char lastBusy;
|
||||||
|
|
|
@ -43,6 +43,7 @@ static int orderedOps[4]={
|
||||||
};
|
};
|
||||||
|
|
||||||
#define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;}
|
#define rWrite(a,v) if (!skipRegisterWrites) {pendingWrites[a]=v;}
|
||||||
#define immWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} }
|
#define immWrite(a,v) if (!skipRegisterWrites) {writes.push_back(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} }
|
||||||
|
#define urgentWrite(a,v) if (!skipRegisterWrites) {if (writes.front().addrOrVal) {writes.push_back(QueuedWrite(a,v));} else {writes.push_front(QueuedWrite(a,v));}; if (dumpWrites) {addWrite(a,v);} }
|
||||||
|
|
||||||
#include "fmshared_OPN.h"
|
#include "fmshared_OPN.h"
|
||||||
|
|
Loading…
Reference in a new issue