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