From fbda5ce927e5f93a11b10ed7778b7ac71f01ae4d Mon Sep 17 00:00:00 2001 From: n loewen Date: Mon, 28 Aug 2023 23:09:51 -0400 Subject: [PATCH] cardiograph - WIP - Create minimal version of `cardiograph` file to act as CLI entrypoint to simulator --- src/cardiograph.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/cardiograph.js diff --git a/src/cardiograph.js b/src/cardiograph.js new file mode 100644 index 0000000..c227129 --- /dev/null +++ b/src/cardiograph.js @@ -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); + }); +} \ No newline at end of file