nes-emu
Version:
A NES emulator
77 lines (71 loc) • 2.35 kB
JavaScript
;
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;