From 77bdb81abf9106568e2ce3ea9f1bb0d54bb935ef Mon Sep 17 00:00:00 2001 From: Austin Adams Date: Wed, 3 Jun 2020 21:36:56 -0700 Subject: Improve register displaying --- .../novice-web/components/GuiDebugger.tsx | 28 ++++++++++++++++++---- packages/novice-web/style.css | 18 +++++++++++++- packages/novice/novice/index.ts | 7 +++--- packages/novice/novice/util.ts | 24 +++++++++++++------ tsconfig.json | 3 +++ 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/packages/novice-web/novice-web/components/GuiDebugger.tsx b/packages/novice-web/novice-web/components/GuiDebugger.tsx index 9894281..6d5ac28 100644 --- a/packages/novice-web/novice-web/components/GuiDebugger.tsx +++ b/packages/novice-web/novice-web/components/GuiDebugger.tsx @@ -1,4 +1,5 @@ -import { FullMachineState, getIsa, Isa, fmtHex, Symbols, BaseSymbols } from 'novice'; +import { FullMachineState, getIsa, Isa, fmtBinOrHex, fmtHex, range, Symbols, + BaseSymbols } from 'novice'; import * as React from 'react'; import { VariableSizeGrid as Grid } from 'react-window'; import { AssemblerFrontendMessage, AssemblerWorkerMessage } from '../workers/assembler'; @@ -58,7 +59,7 @@ export class GuiDebugger extends React.Component { + let values; + + if (reg.kind === 'reg-range') { + values = range(reg.count).map(i => (
{ + reg.prefix + i + ': ' + fmtBinOrHex(this.state.state.regs.range[reg.prefix][i], reg.bits) + }
)); + } else if (reg.kind === 'reg') { + values =
{reg.name + ': ' + fmtBinOrHex(this.state.state.regs.solo[reg.name], reg.bits)}
; + } else { + const _: never = reg; + } + + return (
{values}
); + }); + const rowHeight = 20; const cols = [20, 80, 80, 80, 200]; const colVal: ((addr: number) => string)[] = [ - addr => (this.state.state.pc == addr)? '►' : '', + addr => (this.state.state.pc === addr)? '►' : '', addr => this.fmtAddr(addr), addr => this.fmtWord(this.isa.stateLoad(this.state.state, addr)), addr => this.isa.stateLoad(this.state.state, addr).toString(10), @@ -118,7 +135,10 @@ export class GuiDebugger extends React.Component -
+
+
+ {registers} +
cols[i]} rowCount={Math.pow(2, this.isa.spec.mem.space)} diff --git a/packages/novice-web/style.css b/packages/novice-web/style.css index 7cb8c5e..9ace8ca 100644 --- a/packages/novice-web/style.css +++ b/packages/novice-web/style.css @@ -7,9 +7,25 @@ html, body { margin: 0 auto; } -.memory-view { +.state-view { display: inline-block; font-family: monospace; + width: 500px; +} + +.state-view .register-view { + display: block; + margin: 0 0 16px 0; +} + +.state-view .register-view .reg-family { + display: block; + margin: 0 0 4px 0; +} + +.state-view .register-view .reg { + display: inline-block; + margin: 0 8px 0 0; } .assemble-form { diff --git a/packages/novice/novice/index.ts b/packages/novice/novice/index.ts index 241a07b..ed4301b 100644 --- a/packages/novice/novice/index.ts +++ b/packages/novice/novice/index.ts @@ -7,8 +7,8 @@ import { AliasContext, AliasFields, AliasSpec, Assembly, BaseSymbols, Fields, RegIdentifier, RegisterOperand, Section, StringOperand, Symbols, SymbTable } from './isa'; import { Debugger, Memory, Simulator } from './simulator'; -import { forceUnsigned, maskTo, maxUnsignedVal, padStr, sextTo, - fmtHex } from './util'; +import { forceUnsigned, maskTo, maxUnsignedVal, padStr, range, sextTo, + fmtBin, fmtBinOrHex, fmtHex } from './util'; export { //// assembler Assembler, AssemblerConfig, getParser, getGenerator, getOpSpec, @@ -30,4 +30,5 @@ export { //// assembler //// simulator Debugger, Simulator, Memory, //// util - forceUnsigned, maskTo, maxUnsignedVal, sextTo, padStr, fmtHex }; + forceUnsigned, maskTo, maxUnsignedVal, range, sextTo, padStr, + fmtBin, fmtBinOrHex, fmtHex }; diff --git a/packages/novice/novice/util.ts b/packages/novice/novice/util.ts index b069fc2..8a8dc6f 100644 --- a/packages/novice/novice/util.ts +++ b/packages/novice/novice/util.ts @@ -1,14 +1,14 @@ -function maskTo(val: number, bits: number): number { +export function maskTo(val: number, bits: number): number { return val & ((bits === 32) ? -1 : ~(-1 << bits)); } -function sextTo(val: number, bits: number): number { +export function sextTo(val: number, bits: number): number { return (bits === 32 || (val & (1 << (bits - 1))) === 0) ? val : val | (-1 << bits); } -function maxUnsignedVal(bits: number): number { +export function maxUnsignedVal(bits: number): number { // Need to do this instead of using bitwise operators to get around // the fact that js bitwise operators work on 32-bit two's complement ints return Math.pow(2, bits) - 1; @@ -17,11 +17,11 @@ function maxUnsignedVal(bits: number): number { // 0x80000001 & 0xffffffff = -0x7fffffff in js. This is pretty confusing // behavior when dealing with 32-bit addresses, so get the expected // value by clearing the MSB and then adding 2^31 to set it again. -function forceUnsigned(val: number, bits: number): number { +export function forceUnsigned(val: number, bits: number): number { return (bits < 32 || !(val & (1 << 31))) ? val : (val & ~(1 << 31)) + Math.pow(2, 31); } -function padStr(str: string, to: number, withChar: string, right?: boolean) { +export function padStr(str: string, to: number, withChar: string, right?: boolean) { const need = to - str.length; for (let i = 0; i < need; i++) { str = right ? str + withChar : withChar + str; @@ -29,9 +29,19 @@ function padStr(str: string, to: number, withChar: string, right?: boolean) { return str; } -function fmtHex(val: number, bits: number): string { +export function fmtHex(val: number, bits: number): string { return '0x' + padStr(forceUnsigned(val, bits).toString(16), Math.ceil(bits / 4), '0'); } -export { forceUnsigned, maskTo, maxUnsignedVal, sextTo, padStr, fmtHex }; +export function fmtBin(val: number, bits: number): string { + return '0b' + padStr(forceUnsigned(val, bits).toString(2), bits, '0'); +} + +export function fmtBinOrHex(val: number, bits: number): string { + return (bits <= 4) ? fmtBin(val, bits) : fmtHex(val, bits); +} + +export function range(n: number): number[] { + return [...new Array(n).keys()]; +} diff --git a/tsconfig.json b/tsconfig.json index c4c9394..4ac378c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,8 @@ { "compilerOptions": { + "target": "ES6", + "module": "CommonJS", + "moduleResolution": "Node", "strict": true, "lib": ["ES6"] } -- cgit v1.0-2-geb64