UNPKG

broken-neees

Version:

A really broken NEEES emulator that introduces glitches and random bugs on purpose!

247 lines (243 loc) 24.1 kB
"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; } };