broken-neees
Version:
A really broken NEEES emulator that introduces glitches and random bugs on purpose!
247 lines (243 loc) • 24.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
/** Save states unit. */
var _default = exports.default = {
getSaveState(neees) {
var _neees$ppu$registers, _neees$ppu$registers2, _neees$ppu$registers3, _neees$ppu$registers4, _neees$ppu$registers5, _neees$ppu$registers6, _neees$ppu$registers7, _neees$ppu$registers8, _neees$ppu$registers9, _neees$apu$registers, _neees$apu$registers2, _neees$apu$registers3, _neees$apu$registers4, _neees$apu$registers5, _neees$apu$registers6, _neees$apu$registers7, _neees$apu$registers8, _neees$apu$registers9, _neees$apu$registers0, _neees$apu$registers1, _neees$apu$registers10, _neees$apu$registers11, _neees$apu$registers12, _neees$apu$registers13, _neees$apu$registers14, _neees$apu$registers15, _neees$apu$registers16, _neees$apu$registers17, _neees$apu$registers18, _neees$ppu$memory, _neees$ppu$memory2, _neees$ppu$memory3, _neees$ppu$memory4, _neees$ppu$loopy, _neees$apu$frameSeque;
return {
cpu: {
pc: neees.cpu.pc.getValue(),
sp: neees.cpu.sp.getValue(),
flags: neees.cpu.flags.getValue(),
cycle: neees.cpu.cycle,
a: neees.cpu.a.getValue(),
x: neees.cpu.x.getValue(),
y: neees.cpu.y.getValue(),
memory: {
ram: Array.from(neees.cpu.memory.ram),
ppuRegisters: [(_neees$ppu$registers = neees.ppu.registers) === null || _neees$ppu$registers === void 0 ? void 0 : _neees$ppu$registers.ppuCtrl.value, (_neees$ppu$registers2 = neees.ppu.registers) === null || _neees$ppu$registers2 === void 0 ? void 0 : _neees$ppu$registers2.ppuMask.value, (_neees$ppu$registers3 = neees.ppu.registers) === null || _neees$ppu$registers3 === void 0 ? void 0 : _neees$ppu$registers3.ppuStatus.value, (_neees$ppu$registers4 = neees.ppu.registers) === null || _neees$ppu$registers4 === void 0 ? void 0 : _neees$ppu$registers4.oamAddr.value, (_neees$ppu$registers5 = neees.ppu.registers) === null || _neees$ppu$registers5 === void 0 ? void 0 : _neees$ppu$registers5.oamData.value, (_neees$ppu$registers6 = neees.ppu.registers) === null || _neees$ppu$registers6 === void 0 ? void 0 : _neees$ppu$registers6.ppuScroll.value, (_neees$ppu$registers7 = neees.ppu.registers) === null || _neees$ppu$registers7 === void 0 ? void 0 : _neees$ppu$registers7.ppuAddr.value, (_neees$ppu$registers8 = neees.ppu.registers) === null || _neees$ppu$registers8 === void 0 ? void 0 : _neees$ppu$registers8.ppuData.value, (_neees$ppu$registers9 = neees.ppu.registers) === null || _neees$ppu$registers9 === void 0 ? void 0 : _neees$ppu$registers9.oamDma.value],
apuRegisters: [(_neees$apu$registers = neees.apu.registers) === null || _neees$apu$registers === void 0 ? void 0 : _neees$apu$registers.pulses[0].control.value, (_neees$apu$registers2 = neees.apu.registers) === null || _neees$apu$registers2 === void 0 ? void 0 : _neees$apu$registers2.pulses[0].sweep.value, (_neees$apu$registers3 = neees.apu.registers) === null || _neees$apu$registers3 === void 0 ? void 0 : _neees$apu$registers3.pulses[0].timerLow.value, (_neees$apu$registers4 = neees.apu.registers) === null || _neees$apu$registers4 === void 0 ? void 0 : _neees$apu$registers4.pulses[0].timerHighLCL.value, (_neees$apu$registers5 = neees.apu.registers) === null || _neees$apu$registers5 === void 0 ? void 0 : _neees$apu$registers5.pulses[1].control.value, (_neees$apu$registers6 = neees.apu.registers) === null || _neees$apu$registers6 === void 0 ? void 0 : _neees$apu$registers6.pulses[1].sweep.value, (_neees$apu$registers7 = neees.apu.registers) === null || _neees$apu$registers7 === void 0 ? void 0 : _neees$apu$registers7.pulses[1].timerLow.value, (_neees$apu$registers8 = neees.apu.registers) === null || _neees$apu$registers8 === void 0 ? void 0 : _neees$apu$registers8.pulses[1].timerHighLCL.value, (_neees$apu$registers9 = neees.apu.registers) === null || _neees$apu$registers9 === void 0 ? void 0 : _neees$apu$registers9.triangle.lengthControl.value, 0, (_neees$apu$registers0 = neees.apu.registers) === null || _neees$apu$registers0 === void 0 ? void 0 : _neees$apu$registers0.triangle.timerLow.value, (_neees$apu$registers1 = neees.apu.registers) === null || _neees$apu$registers1 === void 0 ? void 0 : _neees$apu$registers1.triangle.timerHighLCL.value, (_neees$apu$registers10 = neees.apu.registers) === null || _neees$apu$registers10 === void 0 ? void 0 : _neees$apu$registers10.noise.control.value, 0, (_neees$apu$registers11 = neees.apu.registers) === null || _neees$apu$registers11 === void 0 ? void 0 : _neees$apu$registers11.noise.form.value, (_neees$apu$registers12 = neees.apu.registers) === null || _neees$apu$registers12 === void 0 ? void 0 : _neees$apu$registers12.noise.lcl.value, (_neees$apu$registers13 = neees.apu.registers) === null || _neees$apu$registers13 === void 0 ? void 0 : _neees$apu$registers13.dmc.control.value, (_neees$apu$registers14 = neees.apu.registers) === null || _neees$apu$registers14 === void 0 ? void 0 : _neees$apu$registers14.dmc.load.value, (_neees$apu$registers15 = neees.apu.registers) === null || _neees$apu$registers15 === void 0 ? void 0 : _neees$apu$registers15.dmc.sampleAddress.value, (_neees$apu$registers16 = neees.apu.registers) === null || _neees$apu$registers16 === void 0 ? void 0 : _neees$apu$registers16.dmc.sampleLength.value],
apuControl: (_neees$apu$registers17 = neees.apu.registers) === null || _neees$apu$registers17 === void 0 ? void 0 : _neees$apu$registers17.apuControl.value,
apuFrameCounter: (_neees$apu$registers18 = neees.apu.registers) === null || _neees$apu$registers18 === void 0 ? void 0 : _neees$apu$registers18.apuFrameCounter.value
}
},
ppu: {
frame: neees.ppu.frame,
scanline: neees.ppu.scanline,
cycle: neees.ppu.cycle,
memory: {
vram: Array.from(((_neees$ppu$memory = neees.ppu.memory) === null || _neees$ppu$memory === void 0 ? void 0 : _neees$ppu$memory.vram) || []),
paletteRam: Array.from(((_neees$ppu$memory2 = neees.ppu.memory) === null || _neees$ppu$memory2 === void 0 ? void 0 : _neees$ppu$memory2.paletteRam) || []),
oamRam: Array.from(((_neees$ppu$memory3 = neees.ppu.memory) === null || _neees$ppu$memory3 === void 0 ? void 0 : _neees$ppu$memory3.oamRam) || []),
mirroringId: (_neees$ppu$memory4 = neees.ppu.memory) === null || _neees$ppu$memory4 === void 0 ? void 0 : _neees$ppu$memory4.mirroringId
},
loopy: (_neees$ppu$loopy = neees.ppu.loopy) === null || _neees$ppu$loopy === void 0 ? void 0 : _neees$ppu$loopy.getSaveState()
},
apu: {
sampleCounter: neees.apu.sampleCounter,
frameSequencerCounter: ((_neees$apu$frameSeque = neees.apu.frameSequencer) === null || _neees$apu$frameSeque === void 0 ? void 0 : _neees$apu$frameSeque.counter) || 0,
sample: neees.apu.sample,
pulse1: this._getAPUPulse(neees, 0),
pulse2: this._getAPUPulse(neees, 1),
triangle: this._getAPUTriangle(neees),
noise: this._getAPUNoise(neees),
dmc: this._getAPUDMC(neees)
},
mapper: neees.context.mapper.getSaveState(),
saveFile: neees.getSaveFile()
};
},
setSaveState(neees, saveState) {
var _neees$ppu$registers0, _neees$ppu$registers1, _neees$ppu$registers10, _neees$ppu$registers11, _neees$ppu$registers12, _neees$ppu$registers13, _neees$ppu$registers14, _neees$ppu$registers15, _neees$ppu$registers16, _neees$apu$registers19, _neees$apu$registers20, _neees$apu$registers21, _neees$apu$registers22, _neees$apu$registers23, _neees$apu$registers24, _neees$apu$registers25, _neees$apu$registers26, _neees$apu$registers27, _neees$apu$registers28, _neees$apu$registers29, _neees$apu$registers30, _neees$apu$registers31, _neees$apu$registers32, _neees$apu$registers33, _neees$apu$registers34, _neees$apu$registers35, _neees$apu$registers36, _neees$apu$registers37, _neees$apu$registers38, _neees$apu$registers39, _neees$apu$registers40, _neees$ppu$memory5, _neees$ppu$memory5$vr, _neees$ppu$memory6, _neees$ppu$memory6$pa, _neees$ppu$memory7, _neees$ppu$memory7$oa, _neees$ppu$memory8, _neees$ppu$memory8$ch, _neees$ppu$loopy2, _neees$ppu$loopy2$set;
// CPU
neees.cpu.pc.setValue(saveState.cpu.pc);
neees.cpu.sp.setValue(saveState.cpu.sp);
neees.cpu.flags.setValue(saveState.cpu.flags);
neees.cpu.cycle = saveState.cpu.cycle;
neees.cpu.a.setValue(saveState.cpu.a);
neees.cpu.x.setValue(saveState.cpu.x);
neees.cpu.y.setValue(saveState.cpu.y);
neees.cpu.memory.ram.set(saveState.cpu.memory.ram);
[(_neees$ppu$registers0 = neees.ppu.registers) === null || _neees$ppu$registers0 === void 0 ? void 0 : _neees$ppu$registers0.ppuCtrl, (_neees$ppu$registers1 = neees.ppu.registers) === null || _neees$ppu$registers1 === void 0 ? void 0 : _neees$ppu$registers1.ppuMask, (_neees$ppu$registers10 = neees.ppu.registers) === null || _neees$ppu$registers10 === void 0 ? void 0 : _neees$ppu$registers10.ppuStatus, (_neees$ppu$registers11 = neees.ppu.registers) === null || _neees$ppu$registers11 === void 0 ? void 0 : _neees$ppu$registers11.oamAddr, (_neees$ppu$registers12 = neees.ppu.registers) === null || _neees$ppu$registers12 === void 0 ? void 0 : _neees$ppu$registers12.oamData, (_neees$ppu$registers13 = neees.ppu.registers) === null || _neees$ppu$registers13 === void 0 ? void 0 : _neees$ppu$registers13.ppuScroll, (_neees$ppu$registers14 = neees.ppu.registers) === null || _neees$ppu$registers14 === void 0 ? void 0 : _neees$ppu$registers14.ppuAddr, (_neees$ppu$registers15 = neees.ppu.registers) === null || _neees$ppu$registers15 === void 0 ? void 0 : _neees$ppu$registers15.ppuData, (_neees$ppu$registers16 = neees.ppu.registers) === null || _neees$ppu$registers16 === void 0 ? void 0 : _neees$ppu$registers16.oamDma].forEach((register, i) => {
register === null || register === void 0 ? void 0 : register.setValue(saveState.cpu.memory.ppuRegisters[i]);
});
[(_neees$apu$registers19 = neees.apu.registers) === null || _neees$apu$registers19 === void 0 ? void 0 : _neees$apu$registers19.pulses[0].control, (_neees$apu$registers20 = neees.apu.registers) === null || _neees$apu$registers20 === void 0 ? void 0 : _neees$apu$registers20.pulses[0].sweep, (_neees$apu$registers21 = neees.apu.registers) === null || _neees$apu$registers21 === void 0 ? void 0 : _neees$apu$registers21.pulses[0].timerLow, (_neees$apu$registers22 = neees.apu.registers) === null || _neees$apu$registers22 === void 0 ? void 0 : _neees$apu$registers22.pulses[0].timerHighLCL, (_neees$apu$registers23 = neees.apu.registers) === null || _neees$apu$registers23 === void 0 ? void 0 : _neees$apu$registers23.pulses[1].control, (_neees$apu$registers24 = neees.apu.registers) === null || _neees$apu$registers24 === void 0 ? void 0 : _neees$apu$registers24.pulses[1].sweep, (_neees$apu$registers25 = neees.apu.registers) === null || _neees$apu$registers25 === void 0 ? void 0 : _neees$apu$registers25.pulses[1].timerLow, (_neees$apu$registers26 = neees.apu.registers) === null || _neees$apu$registers26 === void 0 ? void 0 : _neees$apu$registers26.pulses[1].timerHighLCL, (_neees$apu$registers27 = neees.apu.registers) === null || _neees$apu$registers27 === void 0 ? void 0 : _neees$apu$registers27.triangle.lengthControl, null, (_neees$apu$registers28 = neees.apu.registers) === null || _neees$apu$registers28 === void 0 ? void 0 : _neees$apu$registers28.triangle.timerLow, (_neees$apu$registers29 = neees.apu.registers) === null || _neees$apu$registers29 === void 0 ? void 0 : _neees$apu$registers29.triangle.timerHighLCL, (_neees$apu$registers30 = neees.apu.registers) === null || _neees$apu$registers30 === void 0 ? void 0 : _neees$apu$registers30.noise.control, null, (_neees$apu$registers31 = neees.apu.registers) === null || _neees$apu$registers31 === void 0 ? void 0 : _neees$apu$registers31.noise.form, (_neees$apu$registers32 = neees.apu.registers) === null || _neees$apu$registers32 === void 0 ? void 0 : _neees$apu$registers32.noise.lcl, (_neees$apu$registers33 = neees.apu.registers) === null || _neees$apu$registers33 === void 0 ? void 0 : _neees$apu$registers33.dmc.control, (_neees$apu$registers34 = neees.apu.registers) === null || _neees$apu$registers34 === void 0 ? void 0 : _neees$apu$registers34.dmc.load, (_neees$apu$registers35 = neees.apu.registers) === null || _neees$apu$registers35 === void 0 ? void 0 : _neees$apu$registers35.dmc.sampleAddress, (_neees$apu$registers36 = neees.apu.registers) === null || _neees$apu$registers36 === void 0 ? void 0 : _neees$apu$registers36.dmc.sampleLength].forEach((register, i) => {
register === null || register === void 0 ? void 0 : register.setValue(saveState.cpu.memory.apuRegisters[i]);
});
(_neees$apu$registers37 = neees.apu.registers) === null || _neees$apu$registers37 === void 0 ? void 0 : (_neees$apu$registers38 = _neees$apu$registers37.apuControl) === null || _neees$apu$registers38 === void 0 ? void 0 : _neees$apu$registers38.setValue(saveState.cpu.memory.apuControl);
(_neees$apu$registers39 = neees.apu.registers) === null || _neees$apu$registers39 === void 0 ? void 0 : (_neees$apu$registers40 = _neees$apu$registers39.apuFrameCounter) === null || _neees$apu$registers40 === void 0 ? void 0 : _neees$apu$registers40.setValue(saveState.cpu.memory.apuFrameCounter);
// PPU
neees.ppu.frame = saveState.ppu.frame;
neees.ppu.scanline = saveState.ppu.scanline;
neees.ppu.cycle = saveState.ppu.cycle;
(_neees$ppu$memory5 = neees.ppu.memory) === null || _neees$ppu$memory5 === void 0 ? void 0 : (_neees$ppu$memory5$vr = _neees$ppu$memory5.vram) === null || _neees$ppu$memory5$vr === void 0 ? void 0 : _neees$ppu$memory5$vr.set(saveState.ppu.memory.vram);
(_neees$ppu$memory6 = neees.ppu.memory) === null || _neees$ppu$memory6 === void 0 ? void 0 : (_neees$ppu$memory6$pa = _neees$ppu$memory6.paletteRam) === null || _neees$ppu$memory6$pa === void 0 ? void 0 : _neees$ppu$memory6$pa.set(saveState.ppu.memory.paletteRam);
(_neees$ppu$memory7 = neees.ppu.memory) === null || _neees$ppu$memory7 === void 0 ? void 0 : (_neees$ppu$memory7$oa = _neees$ppu$memory7.oamRam) === null || _neees$ppu$memory7$oa === void 0 ? void 0 : _neees$ppu$memory7$oa.set(saveState.ppu.memory.oamRam);
if (saveState.ppu.memory.mirroringId != null) (_neees$ppu$memory8 = neees.ppu.memory) === null || _neees$ppu$memory8 === void 0 ? void 0 : (_neees$ppu$memory8$ch = _neees$ppu$memory8.changeNameTableMirroringTo) === null || _neees$ppu$memory8$ch === void 0 ? void 0 : _neees$ppu$memory8$ch.call(_neees$ppu$memory8, saveState.ppu.memory.mirroringId);
if (saveState.ppu.loopy != null) (_neees$ppu$loopy2 = neees.ppu.loopy) === null || _neees$ppu$loopy2 === void 0 ? void 0 : (_neees$ppu$loopy2$set = _neees$ppu$loopy2.setSaveState) === null || _neees$ppu$loopy2$set === void 0 ? void 0 : _neees$ppu$loopy2$set.call(_neees$ppu$loopy2, saveState.ppu.loopy);
// APU
neees.apu.sampleCounter = saveState.apu.sampleCounter;
if (neees.apu.frameSequencer != null) neees.apu.frameSequencer.counter = saveState.apu.frameSequencerCounter;
neees.apu.sample = saveState.apu.sample;
this._setAPUPulse(neees, 0, "pulse1", saveState);
this._setAPUPulse(neees, 1, "pulse2", saveState);
if (saveState.apu.triangle != null) this._setAPUTriangle(neees, saveState);
if (saveState.apu.noise != null) this._setAPUNoise(neees, saveState);
if (saveState.apu.dmc != null) this._setAPUDMC(neees, saveState);
// Mapper
neees.context.mapper.setSaveState(saveState.mapper);
},
_getAPUPulse(neees, index) {
var _neees$apu$channels;
const channel = (_neees$apu$channels = neees.apu.channels) === null || _neees$apu$channels === void 0 ? void 0 : _neees$apu$channels.pulses[index];
if (!channel) return null;
return {
outputSample: channel.outputSample || 0,
oscillator: channel.oscillator != null ? {
frequency: channel.oscillator.frequency,
dutyCycle: channel.oscillator.dutyCycle,
volume: channel.oscillator.volume
} : null,
lengthCounter: channel.lengthCounter != null ? {
counter: channel.lengthCounter.counter
} : null,
volumeEnvelope: channel.volumeEnvelope != null ? this._getAPUEnvelope(channel.volumeEnvelope) : null,
frequencySweep: channel.frequencySweep != null ? {
startFlag: channel.frequencySweep.startFlag,
dividerCount: channel.frequencySweep.dividerCount,
sweepDelta: channel.frequencySweep.sweepDelta,
mute: channel.frequencySweep.mute
} : null,
timer: channel.timer || 0
};
},
_setAPUPulse(neees, index, name, saveState) {
var _neees$apu$channels2;
const channel = (_neees$apu$channels2 = neees.apu.channels) === null || _neees$apu$channels2 === void 0 ? void 0 : _neees$apu$channels2.pulses[index];
const pulseState = saveState.apu[name];
if (channel == null || pulseState == null) return;
channel.outputSample = pulseState.outputSample;
if (pulseState.oscillator != null && channel.oscillator != null) {
channel.oscillator.frequency = pulseState.oscillator.frequency;
channel.oscillator.dutyCycle = pulseState.oscillator.dutyCycle;
channel.oscillator.volume = pulseState.oscillator.volume;
}
if (pulseState.lengthCounter != null && channel.lengthCounter != null) channel.lengthCounter.counter = pulseState.lengthCounter.counter;
if (pulseState.volumeEnvelope != null && channel.volumeEnvelope != null) this._setAPUEnvelope(channel.volumeEnvelope, pulseState.volumeEnvelope);
if (pulseState.frequencySweep != null && channel.frequencySweep != null) {
channel.frequencySweep.startFlag = pulseState.frequencySweep.startFlag;
channel.frequencySweep.dividerCount = pulseState.frequencySweep.dividerCount;
channel.frequencySweep.sweepDelta = pulseState.frequencySweep.sweepDelta;
channel.frequencySweep.mute = pulseState.frequencySweep.mute;
}
channel.timer = pulseState.timer;
},
_getAPUTriangle(neees) {
var _neees$apu$channels3;
const channel = (_neees$apu$channels3 = neees.apu.channels) === null || _neees$apu$channels3 === void 0 ? void 0 : _neees$apu$channels3.triangle;
if (!channel) return null;
return {
outputSample: channel.outputSample || 0,
oscillator: channel.oscillator != null ? {
frequency: channel.oscillator.frequency
} : null,
lengthCounter: channel.lengthCounter != null ? {
counter: channel.lengthCounter.counter
} : null,
linearLengthCounter: channel.linearLengthCounter != null ? {
counter: channel.linearLengthCounter.counter,
reload: channel.linearLengthCounter.reload,
reloadFlag: channel.linearLengthCounter.reloadFlag
} : null
};
},
_setAPUTriangle(neees, saveState) {
var _neees$apu$channels4;
const channel = (_neees$apu$channels4 = neees.apu.channels) === null || _neees$apu$channels4 === void 0 ? void 0 : _neees$apu$channels4.triangle;
const triangleState = saveState.apu.triangle;
if (channel == null || triangleState == null) return;
channel.outputSample = triangleState.outputSample;
if (triangleState.oscillator != null && channel.oscillator != null) channel.oscillator.frequency = triangleState.oscillator.frequency;
if (triangleState.lengthCounter != null && channel.lengthCounter != null) channel.lengthCounter.counter = triangleState.lengthCounter.counter;
if (triangleState.linearLengthCounter != null && channel.linearLengthCounter != null) {
channel.linearLengthCounter.counter = triangleState.linearLengthCounter.counter;
channel.linearLengthCounter.reload = triangleState.linearLengthCounter.reload;
channel.linearLengthCounter.reloadFlag = triangleState.linearLengthCounter.reloadFlag;
}
},
_getAPUNoise(neees) {
var _neees$apu$channels5;
const channel = (_neees$apu$channels5 = neees.apu.channels) === null || _neees$apu$channels5 === void 0 ? void 0 : _neees$apu$channels5.noise;
if (!channel) return null;
return {
outputSample: channel.outputSample || 0,
lengthCounter: channel.lengthCounter != null ? {
counter: channel.lengthCounter.counter
} : null,
volumeEnvelope: channel.volumeEnvelope != null ? this._getAPUEnvelope(channel.volumeEnvelope) : null,
shift: channel.shift || 1,
dividerCount: channel.dividerCount || 0
};
},
_setAPUNoise(neees, saveState) {
var _neees$apu$channels6;
const channel = (_neees$apu$channels6 = neees.apu.channels) === null || _neees$apu$channels6 === void 0 ? void 0 : _neees$apu$channels6.noise;
const noiseState = saveState.apu.noise;
if (channel == null || noiseState == null) return;
channel.outputSample = noiseState.outputSample;
if (noiseState.lengthCounter != null && channel.lengthCounter != null) channel.lengthCounter.counter = noiseState.lengthCounter.counter;
if (noiseState.volumeEnvelope != null && channel.volumeEnvelope != null) this._setAPUEnvelope(channel.volumeEnvelope, noiseState.volumeEnvelope);
channel.shift = noiseState.shift;
channel.dividerCount = noiseState.dividerCount;
},
_getAPUDMC(neees) {
var _neees$apu$channels7, _channel$dpcm, _channel$dpcm2, _channel$dpcm3, _channel$dpcm4, _channel$dpcm5, _channel$dpcm6, _channel$dpcm7, _channel$dpcm8, _channel$dpcm9;
const channel = (_neees$apu$channels7 = neees.apu.channels) === null || _neees$apu$channels7 === void 0 ? void 0 : _neees$apu$channels7.dmc;
if (!channel) return null;
return {
outputSample: channel.outputSample || 0,
startFlag: ((_channel$dpcm = channel.dpcm) === null || _channel$dpcm === void 0 ? void 0 : _channel$dpcm.startFlag) || false,
isActive: ((_channel$dpcm2 = channel.dpcm) === null || _channel$dpcm2 === void 0 ? void 0 : _channel$dpcm2.isActive) || false,
buffer: (_channel$dpcm3 = channel.dpcm) === null || _channel$dpcm3 === void 0 ? void 0 : _channel$dpcm3.buffer,
cursorByte: ((_channel$dpcm4 = channel.dpcm) === null || _channel$dpcm4 === void 0 ? void 0 : _channel$dpcm4.cursorByte) || 0,
cursorBit: ((_channel$dpcm5 = channel.dpcm) === null || _channel$dpcm5 === void 0 ? void 0 : _channel$dpcm5.cursorBit) || 0,
dividerPeriod: ((_channel$dpcm6 = channel.dpcm) === null || _channel$dpcm6 === void 0 ? void 0 : _channel$dpcm6.dividerPeriod) || 0,
dividerCount: ((_channel$dpcm7 = channel.dpcm) === null || _channel$dpcm7 === void 0 ? void 0 : _channel$dpcm7.dividerCount) || 0,
sampleAddress: ((_channel$dpcm8 = channel.dpcm) === null || _channel$dpcm8 === void 0 ? void 0 : _channel$dpcm8.sampleAddress) || 0,
sampleLength: ((_channel$dpcm9 = channel.dpcm) === null || _channel$dpcm9 === void 0 ? void 0 : _channel$dpcm9.sampleLength) || 0
};
},
_setAPUDMC(neees, saveState) {
var _neees$apu$channels8;
const channel = (_neees$apu$channels8 = neees.apu.channels) === null || _neees$apu$channels8 === void 0 ? void 0 : _neees$apu$channels8.dmc;
const dmcState = saveState.apu.dmc;
if (channel == null || dmcState == null) return;
channel.outputSample = dmcState.outputSample;
if (channel.dpcm != null) {
channel.dpcm.startFlag = dmcState.startFlag;
channel.dpcm.isActive = dmcState.isActive;
channel.dpcm.buffer = dmcState.buffer;
channel.dpcm.cursorByte = dmcState.cursorByte;
channel.dpcm.cursorBit = dmcState.cursorBit;
channel.dpcm.dividerPeriod = dmcState.dividerPeriod;
channel.dpcm.dividerCount = dmcState.dividerCount;
channel.dpcm.sampleAddress = dmcState.sampleAddress;
channel.dpcm.sampleLength = dmcState.sampleLength;
}
},
_getAPUEnvelope(envelope) {
return {
startFlag: envelope.startFlag,
dividerCount: envelope.dividerCount,
volume: envelope.volume
};
},
_setAPUEnvelope(envelope, envelopeState) {
envelope.startFlag = envelopeState.startFlag;
envelope.dividerCount = envelopeState.dividerCount;
envelope.volume = envelopeState.volume;
}
};