cardiograph - WIP - Create minimal version of `cardiograph` file to act as CLI entrypoint to simulator

This commit is contained in:
n loewen 2023-08-28 23:09:51 -04:00
parent 18d77086df
commit fbda5ce927
1 changed files with 80 additions and 0 deletions

80
src/cardiograph.js Normal file
View File

@ -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);
});
}