nes-emu
Version:
A NES emulator
78 lines (72 loc) • 2.29 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 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;