UNPKG

nes-emu

Version:

A NES emulator

113 lines (112 loc) 4.52 kB
"use strict"; var _ = _interopRequireDefault(require("..")); var _createTestContext = _interopRequireDefault(require("../../../helpers/createTestContext")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const should = require("chai").Should(); describe("addressings", () => { let cpu, memory, context; beforeEach(() => { ({ cpu, memory, context } = (0, _createTestContext.default)()); }); const testExtraCycle = (register, addressing, base1, offset1, base2, offset2) => { describe("when the operation can take extra cycles", () => { it("adds a cycle if a page-crossed event occurs", () => { cpu.registers[register].value = offset1; _.default[addressing].getAddress(context, base1, true); cpu.extraCycles.should.equal(1); }); it("doesnt add a cycle if no page-crossed event occurs", () => { cpu.registers[register].value = offset2; _.default[addressing].getAddress(context, base2, true); cpu.extraCycles.should.equal(0); }); }); }; ["x", "y"].forEach(register => { const name = register.toUpperCase(); describe("indexedAbsolute".concat(name), () => { it("returns the address + ".concat(name), () => { cpu.registers[register].value = 180; _.default["INDEXED_ABSOLUTE_".concat(name)].getAddress(context, 1000).should.equal(1180); }); it("cannot cross the limit of memory", () => { cpu.registers[register].value = 2; _.default["INDEXED_ABSOLUTE_".concat(name)].getAddress(context, 0xffff).should.equal(0x0001); }); testExtraCycle(register, "INDEXED_ABSOLUTE_".concat(name), 1000, 180, 900, 20); }); }); ["x", "y"].forEach(register => { const name = register.toUpperCase(); describe("indexedZeroPage".concat(name), () => { it("returns the address + ".concat(name), () => { cpu.registers[register].value = 20; _.default["INDEXED_ZERO_PAGE_".concat(name)].getAddress(context, 130).should.equal(150); }); it("cannot cross the first page", () => { cpu.registers[register].value = 200; _.default["INDEXED_ZERO_PAGE_".concat(name)].getAddress(context, 130).should.equal(74); }); }); }); describe("indexedIndirectX", () => { it("dereferences the address + X", () => { cpu.registers.x.value = 180; memory.writeAt(195, 0x12); memory.writeAt(196, 0xfe); _.default.INDEXED_INDIRECT_X.getAddress(context, 15).should.equal(0xfe12); }); it("cannot cross the first page", () => { cpu.registers.x.value = 255; memory.writeAt(0, 0x12); memory.writeAt(1, 0xfe); _.default.INDEXED_INDIRECT_X.getAddress(context, 1).should.equal(0xfe12); }); it("cannot dereference the address outside the first page", () => { cpu.registers.x.value = 254; memory.writeAt(255, 0x12); memory.writeAt(0, 0xfe); _.default.INDEXED_INDIRECT_X.getAddress(context, 1).should.equal(0xfe12); }); }); describe("indexedIndirectY", () => { it("dereferences the address and then adds Y", () => { cpu.registers.y.value = 0xb4; memory.writeAt(130, 0x12); memory.writeAt(131, 0xfe); _.default.INDEXED_INDIRECT_Y.getAddress(context, 130).should.equal(0xfec6); }); it("cannot cross the limit of memory", () => { cpu.registers.y.value = 3; memory.writeAt(130, 0xff); memory.writeAt(131, 0xff); _.default.INDEXED_INDIRECT_Y.getAddress(context, 130).should.equal(2); }); it("cannot dereference the address outside the first page", () => { cpu.registers.y.value = 3; memory.writeAt(0xff, 0x12); memory.writeAt(0x00, 0xfe); _.default.INDEXED_INDIRECT_Y.getAddress(context, 0xff).should.equal(0xfe15); }); describe("when the operation can take extra cycles", () => { it("adds a cycle if a page-crossed event occurs", () => { cpu.registers.y.value = 0xfc; memory.writeAt(130, 0x12); memory.writeAt(131, 0xfa); _.default.INDEXED_INDIRECT_Y.getAddress(context, 130, true); cpu.extraCycles.should.equal(1); }); it("doesnt add a cycle if no page-crossed event occurs", () => { cpu.registers.y.value = 0xb4; memory.writeAt(130, 0x12); memory.writeAt(131, 0xfe); _.default.INDEXED_INDIRECT_Y.getAddress(context, 130, true); cpu.extraCycles.should.equal(0); }); }); }); });