UNPKG

nes-emu

Version:

A NES emulator

78 lines (72 loc) 2.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Mapper = _interopRequireDefault(require("./Mapper")); var _memory = require("../../memory"); var _lodash = _interopRequireDefault(require("lodash")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * It provides bank-switching for CHR ROM only. * CPU $8000-$BFFF: 16 KB PRG ROM, fixed to the first page * CPU $C000-$FFFF: 16 KB PRG ROM, fixed to the second page (or mirror) * PPU $0000-$1FFF: 8 KB switchable CHR bank */ class CNROM extends _Mapper.default { static get id() { return 3; } /** Creates a memory segment for CPU range $4020-$FFFF. */ createCPUSegment(_ref) { let { cartridge } = _ref; const unused = new _memory.MemoryPadding(0x3fe0); const prgRomFirstPage = this._newPrgBank(); const prgRomLastPage = cartridge.header.prgRomPages === 2 ? this._newPrgBank(1) : new _memory.MemoryMirror(prgRomFirstPage, 0x4000); this._state = { page: 0 }; return _memory.WithCompositeMemory.createSegment([ // Address range Size Description unused, // $4020-$7FFF $3FE0 Unused space prgRomFirstPage, // $8000-$BFFF $4000 PRG ROM (first 16KB of ROM) prgRomLastPage // $C000-$FFFF $4000 PRG ROM (second 16KB of ROM or mirror) ]); } /** Creates a memory segment for PPU range $0000-$1FFF. */ createPPUSegment(_ref2) { let { cartridge } = _ref2; return this._newChrBank(cartridge); } /** Maps a CPU write operation. */ cpuWriteAt(address, byte) { if (address >= 0x8000) { this._state.page = byte; this._loadBanks(); return; } this.context.cpu.memory.writeAt(address, byte); } /** Returns a snapshot of the current state. */ getSaveState() { return _lodash.default.assign(super.getSaveState(), { page: this._state.page }); } /** Restores state from a snapshot. */ setSaveState(saveState) { super.setSaveState(saveState); this._state.page = saveState.page; this._loadBanks(); } _loadBanks() { this.segments.ppu.bytes = this._getChrPage(this._state.page); } } exports.default = CNROM;