diff options
Diffstat (limited to 'pc-thing/pc.ts')
-rw-r--r-- | pc-thing/pc.ts | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/pc-thing/pc.ts b/pc-thing/pc.ts new file mode 100644 index 0000000..a007189 --- /dev/null +++ b/pc-thing/pc.ts @@ -0,0 +1,68 @@ +import * as lib from "./lib.ts"; +type Registers = [number, number, number, number] +export class PC { + registers: Registers = new Array<number>(4).fill(0) as Registers + regNames: string = 'abcd' + halted: boolean = false + mem = new Array<number>(2**16).fill(0) + getSegment: undefined | ((segment: number) => Uint16Array) = undefined; + getMem(addr: number): number { + if (addr < 0 || addr > 2**16) + throw 'invalid address'; + //TODO - memory mapping + return this.mem[addr]; + } + setMem(addr: number, data: number) { + if (this.getSegment && addr == 0x7cff) { + const segment = this.getSegment(data) + for (let i = 0; i < 512; i++) { + this.mem[0x7d00 + i] = segment.length > i ? segment[i] : 0; + } + return; + } + if (addr >= 0x7d00 && addr <= 0x7fff && this.getSegment) { + return; + } + this.mem[addr] = Math.floor(data) % 2**16 + } + programPointer: number = 0; + lib = lib + returnFlag = 0; + returnStack: number[] = [] + // the instruction set, in no particular order :3 + instructions: Record<number, string> = { + 0: 'mov', + 1: 'swp', + 2: 'ld', + 3: 'str', + 4: 'add', + 5: 'sub', + 6: 'mul', + 7: 'div', + 8: 'mod', + 9: 'shl', + 10: 'shr', + 11: 'cmp', + 12: 'cmr', + 13: 'and', + 14: 'or', + 15: 'xor', + 16: 'not', + 17: 'push', + 18: 'pop', + 19: 'halt', + 20: 'sys', // extra + 21: 'jmp', + 22: 'jnz', + 23: 'jz', + 24: 'jmr', + 25: 'ret', + + 31: 'end' + } + constructor(diskSupport = false) { + if (diskSupport) { + this.mem[0x7cff] = (2**16) - 1 + } + } +} \ No newline at end of file |