Merge branch 'master' of github.com:tildearrow/furnace
This commit is contained in:
commit
486d7c8bc1
|
@ -115,7 +115,7 @@ const unsigned char dacLogTableAY[256]={
|
||||||
|
|
||||||
void DivPlatformAY8910::runDAC() {
|
void DivPlatformAY8910::runDAC() {
|
||||||
for (int i=0; i<3; i++) {
|
for (int i=0; i<3; i++) {
|
||||||
if (chan[i].psgMode.dac && chan[i].dac.sample!=-1) {
|
if (chan[i].active && chan[i].psgMode.dac && chan[i].dac.sample!=-1) {
|
||||||
chan[i].dac.period+=chan[i].dac.rate;
|
chan[i].dac.period+=chan[i].dac.rate;
|
||||||
bool end=false;
|
bool end=false;
|
||||||
bool changed=false;
|
bool changed=false;
|
||||||
|
@ -129,7 +129,7 @@ void DivPlatformAY8910::runDAC() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
unsigned char dacData=dacLogTableAY[(unsigned char)s->data8[chan[i].dac.pos]^0x80];
|
unsigned char dacData=dacLogTableAY[(unsigned char)s->data8[chan[i].dac.pos]^0x80];
|
||||||
chan[i].dac.out=MAX(0,dacData-(15-chan[i].outVol));
|
chan[i].dac.out=(chan[i].active && !isMuted[i])?MAX(0,dacData-(15-chan[i].outVol)):0;
|
||||||
if (prevOut!=chan[i].dac.out) {
|
if (prevOut!=chan[i].dac.out) {
|
||||||
prevOut=chan[i].dac.out;
|
prevOut=chan[i].dac.out;
|
||||||
changed=true;
|
changed=true;
|
||||||
|
@ -264,7 +264,7 @@ void DivPlatformAY8910::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
if (chan[i].std.wave.had) {
|
if (chan[i].std.wave.had) {
|
||||||
if (!chan[i].psgMode.dac) {
|
if (!chan[i].psgMode.dac) {
|
||||||
chan[i].psgMode=(chan[i].std.wave.val+1)&7;
|
chan[i].psgMode.val=(chan[i].std.wave.val+1)&7;
|
||||||
if (isMuted[i]) {
|
if (isMuted[i]) {
|
||||||
rWrite(0x08+i,0);
|
rWrite(0x08+i,0);
|
||||||
} else if (intellivision && (chan[i].psgMode.getEnvelope())) {
|
} else if (intellivision && (chan[i].psgMode.getEnvelope())) {
|
||||||
|
@ -336,8 +336,12 @@ void DivPlatformAY8910::tick(bool sysTick) {
|
||||||
if (chan[i].keyOn) {
|
if (chan[i].keyOn) {
|
||||||
//rWrite(16+i*5+1,((chan[i].duty&3)<<6)|(63-(ins->gb.soundLen&63)));
|
//rWrite(16+i*5+1,((chan[i].duty&3)<<6)|(63-(ins->gb.soundLen&63)));
|
||||||
//rWrite(16+i*5+2,((chan[i].vol<<4))|(ins->gb.envLen&7)|((ins->gb.envDir&1)<<3));
|
//rWrite(16+i*5+2,((chan[i].vol<<4))|(ins->gb.envLen&7)|((ins->gb.envDir&1)<<3));
|
||||||
|
if (chan[i].psgMode.val==0) {
|
||||||
|
chan[i].psgMode.val=1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (chan[i].keyOff) {
|
if (chan[i].keyOff) {
|
||||||
|
chan[i].psgMode.val=0;
|
||||||
rWrite(0x08+i,0);
|
rWrite(0x08+i,0);
|
||||||
}
|
}
|
||||||
rWrite((i)<<1,chan[i].freq&0xff);
|
rWrite((i)<<1,chan[i].freq&0xff);
|
||||||
|
@ -543,7 +547,7 @@ int DivPlatformAY8910::dispatch(DivCommand c) {
|
||||||
case DIV_CMD_STD_NOISE_MODE:
|
case DIV_CMD_STD_NOISE_MODE:
|
||||||
if (!chan[c.chan].psgMode.dac) {
|
if (!chan[c.chan].psgMode.dac) {
|
||||||
if (c.value<16) {
|
if (c.value<16) {
|
||||||
chan[c.chan].psgMode=(c.value+1)&7;
|
chan[c.chan].psgMode.val=(c.value+1)&7;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(0x08+c.chan,0);
|
rWrite(0x08+c.chan,0);
|
||||||
} else if (chan[c.chan].active) {
|
} else if (chan[c.chan].active) {
|
||||||
|
|
|
@ -32,10 +32,15 @@ class DivPlatformAY8910: public DivDispatch {
|
||||||
inline unsigned char regRemap(unsigned char reg) { return intellivision?AY8914RegRemap[reg&0x0f]:reg&0x0f; }
|
inline unsigned char regRemap(unsigned char reg) { return intellivision?AY8914RegRemap[reg&0x0f]:reg&0x0f; }
|
||||||
struct Channel {
|
struct Channel {
|
||||||
struct PSGMode {
|
struct PSGMode {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
unsigned char tone: 1;
|
unsigned char tone: 1;
|
||||||
unsigned char noise: 1;
|
unsigned char noise: 1;
|
||||||
unsigned char envelope: 1;
|
unsigned char envelope: 1;
|
||||||
unsigned char dac: 1;
|
unsigned char dac: 1;
|
||||||
|
};
|
||||||
|
unsigned char val=1;
|
||||||
|
};
|
||||||
|
|
||||||
unsigned char getTone() {
|
unsigned char getTone() {
|
||||||
return dac?0:(tone<<0);
|
return dac?0:(tone<<0);
|
||||||
|
@ -49,19 +54,8 @@ class DivPlatformAY8910: public DivDispatch {
|
||||||
return dac?0:(envelope<<2);
|
return dac?0:(envelope<<2);
|
||||||
}
|
}
|
||||||
|
|
||||||
PSGMode& operator=(unsigned char s) {
|
|
||||||
tone=(s>>0)&1;
|
|
||||||
noise=(s>>1)&1;
|
|
||||||
envelope=(s>>2)&1;
|
|
||||||
dac=(s>>3)&1;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSGMode():
|
PSGMode():
|
||||||
tone(1),
|
val(1) {}
|
||||||
noise(0),
|
|
||||||
envelope(0),
|
|
||||||
dac(0) {}
|
|
||||||
} psgMode;
|
} psgMode;
|
||||||
|
|
||||||
struct DAC {
|
struct DAC {
|
||||||
|
|
|
@ -111,7 +111,7 @@ const unsigned char dacLogTableAY8930[256]={
|
||||||
|
|
||||||
void DivPlatformAY8930::runDAC() {
|
void DivPlatformAY8930::runDAC() {
|
||||||
for (int i=0; i<3; i++) {
|
for (int i=0; i<3; i++) {
|
||||||
if (chan[i].psgMode.dac && chan[i].dac.sample!=-1) {
|
if (chan[i].active && chan[i].psgMode.dac && chan[i].dac.sample!=-1) {
|
||||||
chan[i].dac.period+=chan[i].dac.rate;
|
chan[i].dac.period+=chan[i].dac.rate;
|
||||||
bool end=false;
|
bool end=false;
|
||||||
bool changed=false;
|
bool changed=false;
|
||||||
|
@ -125,7 +125,7 @@ void DivPlatformAY8930::runDAC() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
unsigned char dacData=dacLogTableAY8930[(unsigned char)s->data8[chan[i].dac.pos]^0x80];
|
unsigned char dacData=dacLogTableAY8930[(unsigned char)s->data8[chan[i].dac.pos]^0x80];
|
||||||
chan[i].dac.out=MAX(0,dacData-(31-chan[i].outVol));
|
chan[i].dac.out=(chan[i].active && !isMuted[i])?MAX(0,dacData-(31-chan[i].outVol)):0;
|
||||||
if (prevOut!=chan[i].dac.out) {
|
if (prevOut!=chan[i].dac.out) {
|
||||||
prevOut=chan[i].dac.out;
|
prevOut=chan[i].dac.out;
|
||||||
changed=true;
|
changed=true;
|
||||||
|
@ -254,7 +254,7 @@ void DivPlatformAY8930::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
if (chan[i].std.wave.had) {
|
if (chan[i].std.wave.had) {
|
||||||
if (!chan[i].psgMode.dac) {
|
if (!chan[i].psgMode.dac) {
|
||||||
chan[i].psgMode=(chan[i].std.wave.val+1)&7;
|
chan[i].psgMode.val=(chan[i].std.wave.val+1)&7;
|
||||||
if (isMuted[i]) {
|
if (isMuted[i]) {
|
||||||
rWrite(0x08+i,0);
|
rWrite(0x08+i,0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -333,12 +333,16 @@ void DivPlatformAY8930::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
if (chan[i].freq>65535) chan[i].freq=65535;
|
if (chan[i].freq>65535) chan[i].freq=65535;
|
||||||
if (chan[i].keyOn) {
|
if (chan[i].keyOn) {
|
||||||
|
if (chan[i].psgMode.val==0) {
|
||||||
|
chan[i].psgMode.val=1;
|
||||||
|
}
|
||||||
if (chan[i].insChanged) {
|
if (chan[i].insChanged) {
|
||||||
if (!chan[i].std.ex1.will) immWrite(0x16+i,chan[i].duty);
|
if (!chan[i].std.ex1.will) immWrite(0x16+i,chan[i].duty);
|
||||||
chan[i].insChanged=false;
|
chan[i].insChanged=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chan[i].keyOff) {
|
if (chan[i].keyOff) {
|
||||||
|
chan[i].psgMode.val=0;
|
||||||
rWrite(0x08+i,0);
|
rWrite(0x08+i,0);
|
||||||
}
|
}
|
||||||
rWrite((i)<<1,chan[i].freq&0xff);
|
rWrite((i)<<1,chan[i].freq&0xff);
|
||||||
|
@ -537,7 +541,7 @@ int DivPlatformAY8930::dispatch(DivCommand c) {
|
||||||
case DIV_CMD_STD_NOISE_MODE:
|
case DIV_CMD_STD_NOISE_MODE:
|
||||||
if (c.value<0x10) {
|
if (c.value<0x10) {
|
||||||
if (!chan[c.chan].psgMode.dac) {
|
if (!chan[c.chan].psgMode.dac) {
|
||||||
chan[c.chan].psgMode=(c.value+1)&7;
|
chan[c.chan].psgMode.val=(c.value+1)&7;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(0x08+c.chan,0);
|
rWrite(0x08+c.chan,0);
|
||||||
} else if (chan[c.chan].active) {
|
} else if (chan[c.chan].active) {
|
||||||
|
|
|
@ -40,10 +40,15 @@ class DivPlatformAY8930: public DivDispatch {
|
||||||
} envelope;
|
} envelope;
|
||||||
|
|
||||||
struct PSGMode {
|
struct PSGMode {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
unsigned char tone: 1;
|
unsigned char tone: 1;
|
||||||
unsigned char noise: 1;
|
unsigned char noise: 1;
|
||||||
unsigned char envelope: 1;
|
unsigned char envelope: 1;
|
||||||
unsigned char dac: 1;
|
unsigned char dac: 1;
|
||||||
|
};
|
||||||
|
unsigned char val=1;
|
||||||
|
};
|
||||||
|
|
||||||
unsigned char getTone() {
|
unsigned char getTone() {
|
||||||
return dac?0:(tone<<0);
|
return dac?0:(tone<<0);
|
||||||
|
@ -57,19 +62,8 @@ class DivPlatformAY8930: public DivDispatch {
|
||||||
return dac?0:(envelope<<2);
|
return dac?0:(envelope<<2);
|
||||||
}
|
}
|
||||||
|
|
||||||
PSGMode& operator=(unsigned char s) {
|
|
||||||
tone=(s>>0)&1;
|
|
||||||
noise=(s>>1)&1;
|
|
||||||
envelope=(s>>2)&1;
|
|
||||||
dac=(s>>3)&1;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSGMode():
|
PSGMode():
|
||||||
tone(1),
|
val(1) {}
|
||||||
noise(0),
|
|
||||||
envelope(0),
|
|
||||||
dac(0) {}
|
|
||||||
} psgMode;
|
} psgMode;
|
||||||
|
|
||||||
struct DAC {
|
struct DAC {
|
||||||
|
|
|
@ -617,7 +617,7 @@ struct DivSong {
|
||||||
e1e2StopOnSameNote(false),
|
e1e2StopOnSameNote(false),
|
||||||
brokenPortaArp(false),
|
brokenPortaArp(false),
|
||||||
snNoLowPeriods(false),
|
snNoLowPeriods(false),
|
||||||
disableSampleMacro(true),
|
disableSampleMacro(false),
|
||||||
autoSystem(true) {
|
autoSystem(true) {
|
||||||
for (int i=0; i<32; i++) {
|
for (int i=0; i<32; i++) {
|
||||||
system[i]=DIV_SYSTEM_NULL;
|
system[i]=DIV_SYSTEM_NULL;
|
||||||
|
|
Loading…
Reference in New Issue