broken-neees
Version:
A really broken NEEES emulator that introduces glitches and random bugs on purpose!
70 lines (65 loc) • 3.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _Mapper = _interopRequireDefault(require("../lib/Mapper"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
* 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 ROM bank
*/
class CNROM extends _Mapper.default {
onLoad() {
this._state = {
page: 0
};
}
cpuRead(address) {
if (address >= 0x4020 && address <= 0x7fff) {
// Unused
return 0;
} else if (address >= 0x8000 && address <= 0xbfff) {
// CPU $8000-$BFFF: First 16 KB of PRG-ROM
return this.$getPrgPage(0)[address - 0x8000];
} else if (address >= 0xc000 && address <= 0xffff) {
// CPU $C000-$FFFF: Last 16 KB of PRG-ROM (or mirror of $8000-$BFFF)
return this.$getPrgPage(1)[address - 0xc000];
}
}
cpuWrite(address, value) {
if (address >= 0x8000) this._state.page = value;
}
ppuRead(address) {
// PPU $0000-$1FFF: 8 KB switchable CHR ROM bank
return this.$getChrPage(this._state.page)[address];
}
ppuWrite(address, value) {
if (!this.cartridge.header.usesChrRam) {
return; // (only CHR-RAM is writable)
}
// [!!!]
if (this.cartridge.isBroken) address += 3;
// PPU $0000-$1FFF: 8 KB switchable CHR ROM bank
this.$getChrPage(this._state.page)[address] = value;
}
/** Returns a snapshot of the current state. */
getSaveState() {
return _objectSpread(_objectSpread({}, super.getSaveState()), {}, {
page: this._state.page
});
}
/** Restores state from a snapshot. */
setSaveState(saveState) {
super.setSaveState(saveState);
this._state.page = saveState.page;
}
}
exports.default = CNROM;