statusnext = 0;
lfocount = 0;
status = 0;
+ dac_enabled = false;
+ dac_data = 0;
UpdateStatus();
}
if (activech & 0x010) (*dest[2] += ch[2].CalcL());
if (activech & 0x040) (*dest[3] += ch[3].CalcL());
if (activech & 0x100) (*dest[4] += ch[4].CalcL());
- if (activech & 0x400) (*dest[5] += ch[5].CalcL());
+ if (activech & 0x400) {
+ if ((dac_enabled)) {
+ (*dest[5] += dac_data);
+ } else {
+ (*dest[5] += ch[5].CalcL());
+ }
+ }
}
inline void OPN2Base::MixSubS(int activech, ISample** dest)
if (activech & 0x010) (*dest[2] += ch[2].Calc());
if (activech & 0x040) (*dest[3] += ch[3].Calc());
if (activech & 0x100) (*dest[4] += ch[4].Calc());
- if (activech & 0x400) (*dest[5] += ch[5].Calc());
+ if (activech & 0x400) {
+ if ((dac_enabled)) {
+ (*dest[5] += dac_data);
+ } else {
+ (*dest[5] += ch[5].Calc());
+ }
+ }
}
// ---------------------------------------------------------------------------
idest[3] = &ibuf[pan[3]];
idest[4] = &ibuf[pan[4]];
idest[5] = &ibuf[pan[5]];
-
Sample* limit = buffer + nsamples * 2;
for (Sample* dest = buffer; dest < limit; dest+=2)
{
reg29 = data;
// UpdateStatus(); //?
break;
-
+ case 0x2a:
+ {
+ int32 tmp;
+ data &= 0xff;
+ tmp = (data >= 0x80) ? (-(0x100 - data)) : data;
+ dac_data = tmp << 6;
+ }
+ break;
+ case 0x2b:
+ dac_enabled = ((data & 0x80) != 0);
+ break;
default:
OPN2Base::SetReg(addr, data);
break;