VNMulator is 64-bit Von Neumann Machine emulator written in C++.
$ git init
$ git clone https://github.com/keiferchiang/VNMulator.git
$ cd VNMulator
$ ./compile
$ ./vnm [program.vnm]
VNMulator operates on a few x86 8086 inspired instructions. The following instructions are supported:
OP | Num | Description | Notes |
---|---|---|---|
ADD | 0x00 | $r[A] := $r[A] + $r[B] | |
AND | 0x01 | $r[A] := $r[A] & $r[B] | |
CALL | 0x02 | jump to $r[A]; start call procedure | |
CMP | 0x03 | compare $r[A] and $r[B]; set flags | sets $E, $G, and/or $L flags |
DEC | 0x04 | $r[A] := $r[A] - 1 | |
DIV | 0x05 | $r[A] := $r[A] / $r[B] | unsigned integer division |
HLT | 0x06 | halt | |
IDIV | 0x07 | $r[A] := $r[A] / $r[B] | signed integer division |
IMUL | 0x08 | $r[A] := $r[A] * $r[B] | signed integer multiplication |
IN | 0x09 | $r[A] := char from stdin | |
INC | 0x0A | $r[A] := $r[A] + 1 | |
Jcc | 0x0B | jump to $r[A] if flags are set | supports JE, JNE, JGE, JG, JLE, and JL |
JMP | 0x0C | jump to $r[A] | |
LEA | 0x0D | $r[A] := &($r[B]) | |
MOD | 0x0F | $r[A] := $r[A] % $r[B] | |
MOV | 0x10 | $r[A] := $r[B] | |
MUL | 0x11 | $r[A] := $r[A] * $r[B] | unsigned integer multiplication |
NAND | 0x12 | $r[A] := ~($r[A] & $r[B]) | |
NEG | 0x13 | $r[A] := -$r[A] | two's complement |
NOP | 0x14 | no operation | |
NOT | 0x15 | $r[A] := ~$r[A] | one's complement |
OR | 0x16 | $r[A] := $r[A] | $r[B] | |
OUT | 0x17 | stdout := $r[A] | |
POP | 0x18 | $r[A] := top of stack; pop stack | |
POPF | 0x19 | set flag(s) from stack; pop stack | |
PUSH | 0x1A | push $r[A] on stack | |
PUSHF | 0x1B | push flag(s) on stack | |
RET | 0x1C | calls next instruction | |
SAL | 0x1D | $r[A] := $r[A] << $r[B] | signed shift left |
SAR | 0x1E | $r[A] := $r[A] >> $r[B] | signed shift right |
SHL | 0x1F | $r[A] := $r[A] << $r[B] | unsigned shift left |
SHR | 0x20 | $r[A] := $r[A] >> $r[B] | unsigned shift right |
SUB | 0x21 | $r[A] := $r[A] - $r[B] | |
TEST | 0x22 | set $S flag if $r[A] < 0 | |
XOR | 0x23 | $r[A] := $r[A] ^ $r[B] |
char flags = 0b00000000
^^^^
SEGL
- $S: signed flag
- $E: equality flag
- $G: greater-than flag
- $L: less-than flag
For more information, see ./design/DESIGN.md
Process/Module | Implementation Status | Interface | Implementation |
---|---|---|---|
Design | In progress | n/a | n/a |
Main | Waiting | n/a | src/main.cpp |
VNMulator | Waiting | include/vnmulator.h | src/vnmulator.cpp |
CPU | Waiting | include/cpu.h | src/modules/cpu.cpp |
Cache | Waiting | include/cache.h | src/modules/cpu/cache.cpp |
L1d | Waiting | include/l1d.h | src/modules/cpu/cache/l1d.cpp |
L1i | Waiting | include/l1i.h | src/modules/cpu/cache/l1i.cpp |
L2 | Waiting | include/l2.h | src/modules/cpu/cache/l2.cpp |
L3 | Waiting | include/l3.h | src/modules/cpu/cache/l3.cpp |
Core | Waiting | include/core.h | src/modules/cpu/core.cpp |
ALU | Waiting | include/alu.h | src/modules/cpu/core/alu.cpp |
CU | Waiting | include/cu.h | src/modules/cpu/core/cu.cpp |
Registers | Waiting | include/registers.h | src/modules/cpu/core/registers.cpp |
Memory | Waiting | include/memory.h | src/modules/memory.cpp |
RAM | Waiting | include/ram.h | src/modules/memory/ram.cpp |
Segment | Waiting | include/segment.h | src/modules/memory/ram/segment.cpp |
ROM | Waiting | n/a | src/modules/memory/ROM |
I/O | Waiting | include/io.h | src/modules/io.cpp |
Data Compressor | Waiting | include/compressor.h | src/modules/compressor.cpp |
Storage | Waiting | n/a | src/modules/storage |
- VNMulator currently does not support IEEE floating-point representations
- RAM module design supports concurrency
- OS
- Config CLI
- IEEE floating-point arithmetic
- Assembler