i've read every doc i can find on it, but i can't seem to figure out the delta PCM stuff. that's the last thing my APU needs. here's my code written based on what i read.
this is in the function that handles APU register writes:
and this is code is run every 1/8th of the DMC period:
does anything look bad here? it plays sound, but it's not recognizable.
this is in the function that handles APU register writes:
Code:
case 0x4010: //DMC
if (value & 0x40) dmc.loopmode = 1;
else dmc.loopmode = 0;
dmc.period = dmc_period[value & 0x0F] >> 3;
break;
case 0x4011:
channels[4] = value & 0x7F;
break;
case 0x4012:
dmc.addressreg = value;
dmc.address = ((uint16_t)value << 6) | 0xC000;
break;
case 0x4013:
dmc.lengthreg = value;
dmc.bytesremain = ((uint16_t)value << 4) + 1;
break;
if (value & 0x40) dmc.loopmode = 1;
else dmc.loopmode = 0;
dmc.period = dmc_period[value & 0x0F] >> 3;
break;
case 0x4011:
channels[4] = value & 0x7F;
break;
case 0x4012:
dmc.addressreg = value;
dmc.address = ((uint16_t)value << 6) | 0xC000;
break;
case 0x4013:
dmc.lengthreg = value;
dmc.bytesremain = ((uint16_t)value << 4) + 1;
break;
and this is code is run every 1/8th of the DMC period:
Code:
if ((clockticks6502 - dmc.lasttick) >= (dmc.period >> 3)) {
if (dmc.enabled) {
if (dmc.sampleempty) {
dmc.sampleempty = 0;
dmc.bufferbit = 0;
dmc.samplebuffer = read6502(dmc.address++);
if (dmc.address < 0x8000) dmc.address = 0x8000;
dmc.bytesremain--;
if (dmc.bytesremain == 0) {
if (!dmc.loopmode) {
dmc.enabled = 0;
} else {
dmc.address = (dmc.addressreg << 6) | 0xC000;
dmc.bytesremain = (dmc.lengthreg << 4) + 1;
}
}
}
if (!dmc.sampleempty) {
if ((dmc.samplebuffer >> (dmc.bufferbit & 7)) & 1) {
if (channels[4] <= 0x7D) channels[4] += 2;
} else {
if (channels[4] >= 2) channels[4] -= 2;
}
if (++dmc.bufferbit == 8) {
dmc.sampleempty = 1;
}
}
} else channels[4] = 0;
dmc.lasttick = clockticks6502 - ((clockticks6502 - dmc.lasttick) - (dmc.period >> 3));
}
if (dmc.enabled) {
if (dmc.sampleempty) {
dmc.sampleempty = 0;
dmc.bufferbit = 0;
dmc.samplebuffer = read6502(dmc.address++);
if (dmc.address < 0x8000) dmc.address = 0x8000;
dmc.bytesremain--;
if (dmc.bytesremain == 0) {
if (!dmc.loopmode) {
dmc.enabled = 0;
} else {
dmc.address = (dmc.addressreg << 6) | 0xC000;
dmc.bytesremain = (dmc.lengthreg << 4) + 1;
}
}
}
if (!dmc.sampleempty) {
if ((dmc.samplebuffer >> (dmc.bufferbit & 7)) & 1) {
if (channels[4] <= 0x7D) channels[4] += 2;
} else {
if (channels[4] >= 2) channels[4] -= 2;
}
if (++dmc.bufferbit == 8) {
dmc.sampleempty = 1;
}
}
} else channels[4] = 0;
dmc.lasttick = clockticks6502 - ((clockticks6502 - dmc.lasttick) - (dmc.period >> 3));
}
does anything look bad here? it plays sound, but it's not recognizable.