Amiga: better emulation, part 8

This commit is contained in:
tildearrow 2023-03-11 03:16:18 -05:00
parent 698726174d
commit 60766326fb
2 changed files with 17 additions and 11 deletions

View file

@ -344,14 +344,9 @@ void DivPlatformAmiga::rWrite(unsigned short addr, unsigned short val) {
} }
void DivPlatformAmiga::updateWave(int ch) { void DivPlatformAmiga::updateWave(int ch) {
if (chan[ch].useWave) {
for (int i=0; i<MIN(256,(chan[ch].audLen<<1)); i++) { for (int i=0; i<MIN(256,(chan[ch].audLen<<1)); i++) {
sampleMem[(ch<<8)|i]=chan[ch].ws.output[i]^0x80; sampleMem[(ch<<8)|i]=chan[ch].ws.output[i]^0x80;
} }
} else {
sampleMem[(ch<<8)]=0;
sampleMem[(ch<<8)|1]=0;
}
} }
void DivPlatformAmiga::tick(bool sysTick) { void DivPlatformAmiga::tick(bool sysTick) {
@ -381,10 +376,13 @@ void DivPlatformAmiga::tick(bool sysTick) {
if (chan[i].wave!=chan[i].std.wave.val || chan[i].ws.activeChanged()) { if (chan[i].wave!=chan[i].std.wave.val || chan[i].ws.activeChanged()) {
chan[i].wave=chan[i].std.wave.val; chan[i].wave=chan[i].std.wave.val;
chan[i].ws.changeWave1(chan[i].wave); chan[i].ws.changeWave1(chan[i].wave);
chan[i].updateWave=true;
} }
} }
if (chan[i].useWave && chan[i].active) { if (chan[i].useWave && chan[i].active) {
chan[i].ws.tick(); if (chan[i].ws.tick()) {
chan[i].updateWave=true;
}
} }
if (chan[i].std.pitch.had) { if (chan[i].std.pitch.had) {
if (chan[i].std.pitch.mode) { if (chan[i].std.pitch.mode) {
@ -472,9 +470,12 @@ void DivPlatformAmiga::tick(bool sysTick) {
chan[i].writeVol=false; chan[i].writeVol=false;
chWrite(i,8,chan[i].outVol); chWrite(i,8,chan[i].outVol);
} }
if (chan[i].updateWave) {
chan[i].updateWave=false;
updateWave(i); updateWave(i);
} }
} }
}
int DivPlatformAmiga::dispatch(DivCommand c) { int DivPlatformAmiga::dispatch(DivCommand c) {
switch (c.cmd) { switch (c.cmd) {
@ -488,6 +489,7 @@ int DivPlatformAmiga::dispatch(DivCommand c) {
chan[c.chan].wave=0; chan[c.chan].wave=0;
chan[c.chan].ws.setWidth(chan[c.chan].audLen<<1); chan[c.chan].ws.setWidth(chan[c.chan].audLen<<1);
chan[c.chan].ws.changeWave1(chan[c.chan].wave); chan[c.chan].ws.changeWave1(chan[c.chan].wave);
chan[c.chan].updateWave=true;
} }
} }
} else { } else {
@ -519,6 +521,7 @@ int DivPlatformAmiga::dispatch(DivCommand c) {
} }
if (chan[c.chan].useWave) { if (chan[c.chan].useWave) {
chan[c.chan].ws.init(ins,chan[c.chan].audLen<<1,255,chan[c.chan].insChanged); chan[c.chan].ws.init(ins,chan[c.chan].audLen<<1,255,chan[c.chan].insChanged);
chan[c.chan].updateWave=true;
} }
chan[c.chan].insChanged=false; chan[c.chan].insChanged=false;
break; break;
@ -563,6 +566,7 @@ int DivPlatformAmiga::dispatch(DivCommand c) {
chan[c.chan].wave=c.value; chan[c.chan].wave=c.value;
chan[c.chan].keyOn=true; chan[c.chan].keyOn=true;
chan[c.chan].ws.changeWave1(chan[c.chan].wave); chan[c.chan].ws.changeWave1(chan[c.chan].wave);
chan[c.chan].updateWave=true;
break; break;
case DIV_CMD_NOTE_PORTA: { case DIV_CMD_NOTE_PORTA: {
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_AMIGA); DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_AMIGA);
@ -703,6 +707,7 @@ void DivPlatformAmiga::notifyWaveChange(int wave) {
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
if (chan[i].useWave && chan[i].wave==wave) { if (chan[i].useWave && chan[i].wave==wave) {
chan[i].ws.changeWave1(wave); chan[i].ws.changeWave1(wave);
chan[i].updateWave=true;
} }
} }
} }

View file

@ -31,7 +31,7 @@ class DivPlatformAmiga: public DivDispatch {
int audSub; int audSub;
unsigned char volPos; unsigned char volPos;
int sample, wave; int sample, wave;
bool useWave, setPos, useV, useP, dmaOn, audDatClock, writeVol; bool useWave, setPos, useV, useP, dmaOn, audDatClock, writeVol, updateWave;
DivWaveSynth ws; DivWaveSynth ws;
Channel(): Channel():
SharedChannel<signed char>(64), SharedChannel<signed char>(64),
@ -50,7 +50,8 @@ class DivPlatformAmiga: public DivDispatch {
useP(false), useP(false),
dmaOn(false), dmaOn(false),
audDatClock(false), audDatClock(false),
writeVol(true) {} writeVol(true),
updateWave(true) {}
}; };
Channel chan[4]; Channel chan[4];
DivDispatchOscBuffer* oscBuf[4]; DivDispatchOscBuffer* oscBuf[4];