Improve simulator debugging output + refactor debugging code

This commit is contained in:
n loewen 2023-08-02 15:08:33 +01:00
parent 9f04c4d314
commit 4183b7c38e
1 changed files with 30 additions and 33 deletions

View File

@ -25,41 +25,41 @@ const CPU = {
const Instructions = { const Instructions = {
end: () => { end: () => {
console.log('END'); CPU.currentInstruction.mnemonic = 'END';
CPU.running = false; CPU.running = false;
}, },
store_lit: (lit) => { store_lit: (lit) => {
console.log('STO lit#'); CPU.currentInstruction.mnemonic = 'STO lit';
CPU.memory[lit] = CPU.Acc; CPU.memory[lit] = CPU.Acc;
CPU.IP = CPU.IP += 2; CPU.IP = CPU.IP += 2;
}, },
store_addr: (addr) => { store_addr: (addr) => {
console.log('STO addr'); CPU.currentInstruction.mnemonic = 'STO addr';
CPU.memory[CPU.memory[addr]] = CPU.Acc; CPU.memory[CPU.memory[addr]] = CPU.Acc;
CPU.IP = CPU.IP += 2; CPU.IP = CPU.IP += 2;
}, },
load_lit: (lit) => { load_lit: (lit) => {
console.log('LDA lit#'); CPU.currentInstruction.mnemonic = 'LDA lit';
CPU.Acc = lit; CPU.Acc = lit;
CPU.IP = CPU.IP += 2; CPU.IP = CPU.IP += 2;
}, },
load_addr: (addr) => { load_addr: (addr) => {
console.log('LDA addr'); CPU.currentInstruction.mnemonic = 'LDA addr';
console.log('mem at addr: ', CPU.memory[addr]); console.log('mem at addr: ', CPU.memory[addr]);
CPU.Acc = CPU.memory[addr]; CPU.Acc = CPU.memory[addr];
CPU.IP = CPU.IP += 2; CPU.IP = CPU.IP += 2;
}, },
add_lit: (lit) => { add_lit: (lit) => {
console.log("ADD lit"); CPU.currentInstruction.mnemonic = 'ADD lit';
let sum = CPU.Acc + lit; let sum = CPU.Acc + lit;
if (sum > 15) { if (sum > 255) {
CPU.CF = 1; CPU.CF = 1;
CPU.Acc = (sum % 15) - 1; CPU.Acc = (sum % 255) - 1;
} else { } else {
CPU.CF = 0; CPU.CF = 0;
CPU.Acc = sum; CPU.Acc = sum;
@ -68,7 +68,7 @@ const Instructions = {
}, },
add_addr: (addr) => { add_addr: (addr) => {
console.log("ADD addr"); CPU.currentInstruction.mnemonic = 'ADD addr';
let sum = CPU.Acc + CPU.memory[addr]; let sum = CPU.Acc + CPU.memory[addr];
if (sum > 15) { if (sum > 15) {
CPU.CF = 1; CPU.CF = 1;
@ -80,8 +80,8 @@ const Instructions = {
CPU.IP = CPU.IP += 2; CPU.IP = CPU.IP += 2;
}, },
sub_lit: (lit) => { // TODO: carry flag sub_lit: (lit) => {
console.log("SUB lit"); CPU.currentInstruction.mnemonic = 'SUB lit';
let sum = CPU.Acc - lit; let sum = CPU.Acc - lit;
if (sum < 0) { if (sum < 0) {
CPU.CF = 1; CPU.CF = 1;
@ -100,8 +100,7 @@ const Instructions = {
}, },
hop_lit: (lit) => { hop_lit: (lit) => {
console.log("HOP lit"); CPU.currentInstruction.mnemonic = `HOP lit \n ↳ Memory at IP+2 and +3: ${CPU.memory[CPU.IP+2]}, ${CPU.memory[CPU.IP+3]}`;
console.log(` ↳ Memory at IP+2 and +3: ${CPU.memory[CPU.IP+2]}, ${CPU.memory[CPU.IP+3]}`);
if (CPU.Acc === lit) { if (CPU.Acc === lit) {
CPU.IP += 4; CPU.IP += 4;
} else { } else {
@ -110,7 +109,7 @@ const Instructions = {
}, },
hop_addr: (addr) => { hop_addr: (addr) => {
console.log("HOP addr"); CPU.currentInstruction.mnemonic = 'HOP addr';
if (CPU.Acc === CPU.memory[addr]) { if (CPU.Acc === CPU.memory[addr]) {
CPU.IP += 4; CPU.IP += 4;
} else { } else {
@ -119,24 +118,23 @@ const Instructions = {
}, },
jump_lit: (lit) => { jump_lit: (lit) => {
console.log("JMP lit"); CPU.currentInstruction.mnemonic = 'JMP lit';
CPU.IP = lit; CPU.IP = lit;
}, },
jump_addr: (addr) => { jump_addr: (addr) => {
console.log("JMP addr"); CPU.currentInstruction.mnemonic = 'JMP addr';
CPU.IP = CPU.memory[addr]; CPU.IP = CPU.memory[addr];
}, },
carry_clear: () => { carry_clear: () => {
console.log("CFC"); CPU.currentInstruction.mnemonic = 'CFC';
CPU.CF = 0; CPU.CF = 0;
CPU.IP += 2; CPU.IP += 2;
}, },
carry_hop: () => { carry_hop: () => {
console.log("CHP"); CPU.currentInstruction.mnemonic = `CHP \n ↳ Memory at IP+2 and +3: ${CPU.memory[CPU.IP+2]}, ${CPU.memory[CPU.IP+3]}`;
console.log(` ↳ Memory at IP+2 and +3: ${CPU.memory[CPU.IP+2]}, ${CPU.memory[CPU.IP+3]}`);
if (CPU.CF != 0) { if (CPU.CF != 0) {
CPU.IP += 4; CPU.IP += 4;
} else { } else {
@ -164,23 +162,16 @@ const opcodes2mnemonics = {
}; };
function stepCPU() { function stepCPU() {
console.group(`IP: ${CPU.IP}`); CPU.currentInstruction.opcode = CPU.memory[CPU.IP];
let opcode = CPU.memory[CPU.IP]; CPU.currentInstruction.argument = CPU.memory[CPU.IP+1];
let argument = CPU.memory[CPU.IP+1]; let executeInstruction = opcodes2mnemonics[CPU.currentInstruction.opcode];
console.log(`OP: ${opcode} ARG: ${argument}`); executeInstruction(CPU.currentInstruction.argument);
let instruction = opcodes2mnemonics[opcode];
instruction(argument);
logCPUState();
console.groupEnd(`IP:`);
} }
exports.runProgram = async (code, debug = false) => { exports.runProgram = async (code, debug = false) => {
if (debug) logRunningHeader(); if (debug) logRunningHeader();
CPU.loadMemory(code); CPU.loadMemory(code);
if (debug) logCPUState();
CPU.running = true; CPU.running = true;
let step = 0; let step = 0;
while (true) { while (true) {
@ -189,12 +180,15 @@ exports.runProgram = async (code, debug = false) => {
if (!CPU.running) break; if (!CPU.running) break;
if (CPU.IP >= CPU.memory.length) break; if (CPU.IP >= CPU.memory.length) break;
stepCPU();
console.group(`Step`);
if (!debug) console.clear(); if (!debug) console.clear();
console.group('Display')
display.printDisplay(CPU.memory); display.printDisplay(CPU.memory);
console.groupEnd('Display');
logCPUState(); logCPUState();
if (!debug) await new Promise(resolve => setTimeout(resolve, 75)); if (!debug) await new Promise(resolve => setTimeout(resolve, 75));
console.groupEnd('Step');
}; };
} }
@ -202,6 +196,9 @@ exports.runProgram = async (code, debug = false) => {
// FUNCTIONS THAT PULL INFO FROM STATE TO DISPLAY // FUNCTIONS THAT PULL INFO FROM STATE TO DISPLAY
function logCPUState() { function logCPUState() {
console.log();
console.log('Mnemonic:', CPU.currentInstruction.mnemonic);
console.log(`Machine: $${num2hex(CPU.currentInstruction.opcode)} $${num2hex(CPU.currentInstruction.argument)}`);
console.log(); console.log();
console.log( `IP: $${num2hex(CPU.IP)} Acc: $${num2hex(CPU.Acc)} CF: ${CPU.CF}  ${CPU.running ? "running" : "halted" }` ); console.log( `IP: $${num2hex(CPU.IP)} Acc: $${num2hex(CPU.Acc)} CF: ${CPU.CF}  ${CPU.running ? "running" : "halted" }` );
console.log(); console.log();