UNPKG

nes-emu

Version:

A NES emulator

77 lines (71 loc) 2.35 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 capabilities, just by writing a byte to any address on PRG ROM space. * CPU $8000-$BFFF: 16 KB switchable PRG ROM bank * CPU $C000-$FFFF: 16 KB PRG ROM bank, fixed to the last page * The CHR memory is usually RAM, mapped at PPU addresses $0000-$1FFF. */ class UxROM extends _Mapper.default { static get id() { return 2; } /** Creates a memory segment for CPU range $4020-$FFFF. */ createCPUSegment() { const unused = new _memory.MemoryPadding(0x3fe0); const prgRomSelectedPage = this._newPrgBank(); const prgRomLastPage = this._newPrgBank(this.prgPages.length - 1); this._prgRomSwitchableBank = prgRomSelectedPage; this._state = { page: 0 }; return _memory.WithCompositeMemory.createSegment([ // Address range Size Description unused, // $4020-$7FFF $3FE0 Unused space prgRomSelectedPage, // $8000-$BFFF $4000 PRG ROM (switchable) prgRomLastPage // $C000-$FFFF $4000 PRG ROM (fixed to last bank) ]); } /** Creates a memory segment for PPU range $0000-$1FFF. */ createPPUSegment(_ref) { let { cartridge } = _ref; 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(); this.segments.ppu.bytes = this._getChrPage(0); } _loadBanks() { this._prgRomSwitchableBank.bytes = this._getPrgPage(this._state.page); } } exports.default = UxROM;