summary refs log tree commit diff
path: root/pc-thing/pc.ts
blob: a0071893c954bd6b90245b45334eb5b70a8da3ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
        }
    }
}