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
}
}
}
|