UNPKG

broken-neees

Version:

A really broken NEEES emulator that introduces glitches and random bugs on purpose!

129 lines (128 loc) 4.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _byte = _interopRequireDefault(require("../lib/byte")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var unsupported = function unsupported() { throw new Error("Unsupported."); }; function read(cpu, argument, hasPageCrossPenalty) { return cpu.memory.read(this.getAddress(cpu, argument, hasPageCrossPenalty)); } var addressingModes = { IMPLICIT: { inputSize: 0, getAddress: function getAddress() { return null; }, getValue: unsupported }, IMMEDIATE: { inputSize: 1, getAddress: unsupported, getValue: function getValue(cpu, value) { return value; } }, ABSOLUTE: { inputSize: 2, getAddress: function getAddress(cpu, address) { return address; }, getValue: read }, ZERO_PAGE: { inputSize: 1, getAddress: function getAddress(cpu, zeroPageAddress) { return zeroPageAddress; }, getValue: read }, RELATIVE: { inputSize: 1, getAddress: function getAddress(cpu, offset, hasPageCrossPenalty) { var address = cpu.pc.getValue(); var newAddress = address + _byte.default.toS8(offset); var pageCrossed = _byte.default.highByteOf(address) !== _byte.default.highByteOf(newAddress); if (pageCrossed && hasPageCrossPenalty) cpu.extraCycles += 2; return _byte.default.toU16(newAddress); }, getValue: unsupported }, INDIRECT: { inputSize: 2, getAddress: function getAddress(cpu, absoluteAddress) { var msb = _byte.default.highByteOf(absoluteAddress); var lsb = _byte.default.lowByteOf(absoluteAddress); var low = cpu.memory.read(absoluteAddress); var high = cpu.memory.read(lsb === 0xff ? _byte.default.buildU16(msb, 0x00) : absoluteAddress + 1); return _byte.default.buildU16(high, low); }, getValue: unsupported }, INDEXED_ZERO_PAGE_X: { inputSize: 1, getAddress: function getAddress(cpu, zeroPageAddress) { return _byte.default.toU8(zeroPageAddress + cpu.x.getValue()); }, getValue: read }, INDEXED_ZERO_PAGE_Y: { inputSize: 1, getAddress: function getAddress(cpu, zeroPageAddress) { return _byte.default.toU8(zeroPageAddress + cpu.y.getValue()); }, getValue: read }, INDEXED_ABSOLUTE_X: { inputSize: 2, getAddress: function getAddress(cpu, absoluteAddress, hasPageCrossPenalty) { var address = absoluteAddress; var newAddress = address + cpu.x.getValue(); var pageCrossed = _byte.default.highByteOf(address) !== _byte.default.highByteOf(newAddress); if (pageCrossed && hasPageCrossPenalty) cpu.extraCycles += 1; return _byte.default.toU16(newAddress); }, getValue: read }, INDEXED_ABSOLUTE_Y: { inputSize: 2, getAddress: function getAddress(cpu, absoluteAddress, hasPageCrossPenalty) { var address = absoluteAddress; var newAddress = address + cpu.y.getValue(); var pageCrossed = _byte.default.highByteOf(address) !== _byte.default.highByteOf(newAddress); if (pageCrossed && hasPageCrossPenalty) cpu.extraCycles += 1; return _byte.default.toU16(newAddress); }, getValue: read }, INDEXED_INDIRECT: { inputSize: 1, getAddress: function getAddress(cpu, zeroPageAddress) { var start = _byte.default.toU8(zeroPageAddress + cpu.x.getValue()); var end = _byte.default.toU8(start + 1); return _byte.default.buildU16(cpu.memory.read(end), cpu.memory.read(start)); }, getValue: read }, INDIRECT_INDEXED: { inputSize: 1, getAddress: function getAddress(cpu, zeroPageAddress, hasPageCrossPenalty) { var start = _byte.default.toU8(zeroPageAddress); var end = _byte.default.toU8(start + 1); var address = _byte.default.buildU16(cpu.memory.read(end), cpu.memory.read(start)); var newAddress = address + cpu.y.getValue(); var pageCrossed = _byte.default.highByteOf(address) !== _byte.default.highByteOf(newAddress); if (pageCrossed && hasPageCrossPenalty) cpu.extraCycles += 1; return _byte.default.toU16(newAddress); }, getValue: read } }; for (var key in addressingModes) { addressingModes[key].id = key; } var _default = addressingModes; exports.default = _default;