nes-emu
Version:
A NES emulator
41 lines (39 loc) • 1.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _registers = require("../../registers");
/** Enables or disables APU channels. */
class APUControl extends _registers.WriteOnlyInMemoryRegister {
constructor() {
super();
this.addReadOnlyField("enablePulse1", 0).addReadOnlyField("enablePulse2", 1).addReadOnlyField("enableTriangle", 2).addReadOnlyField("enableNoise", 3).addReadOnlyField("enableDMC", 4);
}
/** When a channel is disabled, it resets its length counters. */
writeAt(__, byte) {
const {
channels
} = this.context.apu;
this.setValue(byte);
const {
enablePulse1,
enablePulse2,
enableTriangle,
enableNoise,
enableDMC
} = this;
if (!enablePulse1) channels.pulses[0].lengthCounter.counter = 0;
if (!enablePulse2) channels.pulses[1].lengthCounter.counter = 0;
if (!enableTriangle) {
channels.triangle.lengthCounter.counter = 0;
channels.triangle.linearLengthCounter.counter = 0;
channels.triangle.linearLengthCounter.reload = 0;
channels.triangle.linearLengthCounter.reloadFlag = false;
}
if (!enableNoise) channels.noise.lengthCounter.counter = 0;
if (!enableDMC) channels.dmc.stopDPCM();else if (channels.dmc.remainingBytes === 0) channels.dmc.startDPCM();
this.context.apu.registers.dmc.irqEnable = 0;
}
}
exports.default = APUControl;