mirror of
https://github.com/pnx/m16vm
synced 2026-06-16 03:44:55 +02:00
81 lines
1.1 KiB
Text
81 lines
1.1 KiB
Text
|
|
* 8 16-bit registers
|
|
|
|
* Memory
|
|
4096 bytes. address aligned by 2 bytes (16 bit)
|
|
|
|
|
|
* instruction set (16 bit)
|
|
|
|
0001 - add
|
|
0010 - movl (move low byte)
|
|
0011 - movh (move high byte)
|
|
0100 - load word
|
|
0101 - store word
|
|
0110 - beq
|
|
0111 - jmp
|
|
1000 - jr (jump register)
|
|
|
|
1111 - I/O Write
|
|
|
|
I/O = only 8 bits, syscall?
|
|
|
|
--- Format ---
|
|
|
|
Register operation format (R):
|
|
|
|
opcode (4) | rs (4) | r0 (4) | r1 (4)
|
|
|
|
r0,r1 - Operand registers.
|
|
rs - save register
|
|
|
|
Register operation format (RI):
|
|
|
|
opcode (4) | rs (4) | r0 (4) | offset (signed 4)
|
|
|
|
r0 - Operand registers.
|
|
offset - constant offset from r0 value.
|
|
rs - save register
|
|
|
|
Constant operation format (I):
|
|
|
|
opcode (4) | reg (4) | data (signed 8)
|
|
|
|
reg - Register
|
|
data - Constant data to insert into reg.
|
|
|
|
Jump format (J):
|
|
|
|
opcode (4) | addr (signed 12)
|
|
|
|
|
|
|
|
* load ascii hex from file.
|
|
* jump, branch instructions
|
|
|
|
start:
|
|
add r0, r4 # r4 = 1
|
|
|
|
beq r0, r1
|
|
jmp 2
|
|
jmp 3
|
|
load r3
|
|
jr r3
|
|
write r0
|
|
|
|
|
|
if (r0 == r1)
|
|
jmp(b1);
|
|
else
|
|
jmp(b2);
|
|
b1:
|
|
load(r3);
|
|
jmpl(r3);
|
|
b2:
|
|
write(r0);
|
|
|
|
|
|
while (r0 == r1)
|
|
r0++;
|
|
|
|
beq r0 r1 #
|