cardiograph - WIP - Create minimal version of `cardiograph` file to act as CLI entrypoint to simulator
This commit is contained in:
parent
18d77086df
commit
fbda5ce927
|
|
@ -0,0 +1,80 @@
|
||||||
|
const CFG = require('./machine.config');
|
||||||
|
const CPU = require('./cpu.lib.js');
|
||||||
|
|
||||||
|
const { num2hex, bool2bit } = require('./logging.js');
|
||||||
|
const display = require('./display.js');
|
||||||
|
|
||||||
|
// TODO TEMPORARY - replace with reading STDIN:
|
||||||
|
const assembler = require('./assembler.js');
|
||||||
|
const fs = require('fs');
|
||||||
|
const { log } = require('console');
|
||||||
|
|
||||||
|
|
||||||
|
const filename = process.argv[2];
|
||||||
|
const inputFile_str = fs.readFileSync(filename, 'utf8');
|
||||||
|
let assemblerOutput = assembler.assemble(inputFile_str);
|
||||||
|
|
||||||
|
let cpu = new CPU(CFG.INITIAL_IP_ADDRESS, CFG.DEFAULT_CYCLE_LIMIT);
|
||||||
|
|
||||||
|
cpu.loadMemory(assemblerOutput.machineCode); // TODO
|
||||||
|
cpu.loadSourceInfo(assemblerOutput.debugInfo); // TODO
|
||||||
|
|
||||||
|
cpu.onCycleEnd(tick);
|
||||||
|
cpu.onCycleEnd(logDisplay);
|
||||||
|
cpu.onCycleEnd(logCPUState);
|
||||||
|
|
||||||
|
cpu.start();
|
||||||
|
cpu.step();
|
||||||
|
|
||||||
|
async function tick() {
|
||||||
|
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
|
||||||
|
await sleep(100);
|
||||||
|
cpu.step();
|
||||||
|
if (!cpu.running) {
|
||||||
|
console.log('Halted');
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function logDisplay() {
|
||||||
|
display.show(cpu.memory, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function logCPUState() {
|
||||||
|
let lineInfo = cpu.dbg.sourceInfo[cpu.dbg.previousIP];
|
||||||
|
console.group(`Step ${cpu.dbg.cycleCounter}`);
|
||||||
|
console.log();
|
||||||
|
if (lineInfo) {
|
||||||
|
console.log(`Line ${lineInfo.lineNumber}: ${lineInfo.source}`);
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
console.log('Mnemonic:', cpu.dbg.currentMnemonic);
|
||||||
|
console.log(`Machine: $${num2hex(cpu.instruction.opcode)} $${num2hex(cpu.instruction.operand)}`);
|
||||||
|
console.log();
|
||||||
|
console.log(`IP: $${num2hex(cpu.IP)} Acc: $${num2hex(cpu.acc)} ONZC ${bool2bit(cpu.flags.O)}${bool2bit(cpu.flags.N)}${bool2bit(cpu.flags.Z)}${bool2bit(cpu.flags.C)}`);
|
||||||
|
// TODO:
|
||||||
|
// console.log(`KEY: $${num2hex(cpu.state.memory[KEYPAD_ADDR])} ${cpu.state.running ? "state.running" : "halted" }`);
|
||||||
|
console.log();
|
||||||
|
console.log();
|
||||||
|
console.groupEnd();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
(async function() {
|
||||||
|
let input = await getInput();
|
||||||
|
console.log(input);
|
||||||
|
})()
|
||||||
|
*/
|
||||||
|
|
||||||
|
async function getInput() {
|
||||||
|
// https://wellingguzman.com/notes/node-pipe-input
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
const stdin = process.stdin;
|
||||||
|
stdin.setEncoding('utf8');
|
||||||
|
let data = '';
|
||||||
|
stdin.on('data', function (chunk) { data += chunk; });
|
||||||
|
stdin.on('end', function () { resolve(data); });
|
||||||
|
stdin.on('error', reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue