velxio/test/test_intel/test_buses/4002-ram.test.js

48 lines
1.5 KiB
JavaScript

/**
* Intel 4002 RAM — basic unit test.
*
* The 4002's full I/O cycle requires the 4004 to actually drive the
* SRC chip-select address during X2/X3 of the SRC instruction (which
* the current 4004.c stubs as a no-op). This test exercises only the
* pin contract and the chip's response to RESET — the canvas-level
* deliverable. Full SRC + WRM/RDM round-trip is tracked as a Phase D
* follow-up that requires modifying 4004.c.
*/
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import { BoardHarness } from '../src/BoardHarness.js';
import { chipWasmExists } from '../src/helpers.js';
const CHIP = '4002-ram';
const skip = !chipWasmExists(CHIP);
function pinMap() {
const m = {
SYNC: 'SYNC', CL: 'CL', RESET: 'RESET', CM: 'CM',
VDD: 'VDD', VSS: 'VSS',
};
for (let i = 0; i < 4; i++) m[`D${i}`] = `D${i}`;
for (let i = 0; i < 4; i++) m[`O${i}`] = `O${i}`;
return m;
}
describe(`${CHIP} chip`, () => {
let board;
beforeEach(() => { board = new BoardHarness(); });
afterEach(() => { board.dispose(); });
it.skipIf(skip)('registers all 14 logical pins', async () => {
await expect(board.addChip(CHIP, pinMap())).resolves.toBeDefined();
});
it.skipIf(skip)('after RESET output port reads zero', async () => {
await board.addChip(CHIP, pinMap());
board.setNet('RESET', true);
board.advanceNanos(50);
board.setNet('RESET', false);
board.advanceNanos(50);
let out = 0;
for (let i = 0; i < 4; i++) if (board.getNet(`O${i}`)) out |= (1 << i);
expect(out).toBe(0);
});
});