Fixed mis-numbering of opcodes
This bug was intentionally kept in order to make sure everything ran flawlessly regardless.
This commit is contained in:
parent
d63bedda7c
commit
75465c6a20
3 changed files with 37 additions and 36 deletions
23
docs/spec.md
23
docs/spec.md
|
@ -13,15 +13,16 @@ Corten is based on Fletcher Haynes's [So you want to build a language VM](https:
|
||||||
| 2 | SUB |
|
| 2 | SUB |
|
||||||
| 3 | MUL |
|
| 3 | MUL |
|
||||||
| 4 | DIV |
|
| 4 | DIV |
|
||||||
| 6 | HLT | Halt |
|
| 5 | HLT | Halt |
|
||||||
| 5 | JMP | Jump |
|
| 6 | JMP | Jump |
|
||||||
| 8 | JMPF | Jump forward |
|
| 7 | JMPF | Jump forward |
|
||||||
| 9 | JMPB | Jump backward |
|
| 8 | JMPB | Jump backward |
|
||||||
| 10 | EQ | Equal |
|
| 9 | EQ | Equal |
|
||||||
| 11 | NEQ | Not equal |
|
| 10 | NEQ | Not equal |
|
||||||
| 12 | GTE | Greater then or equal to |
|
| 11 | GTE | Greater then or equal to |
|
||||||
| 13 | GT | Greater then |
|
| 12 | GT | Greater then |
|
||||||
| 14 | LTE | Less then or equal |
|
| 13 | LTE | Less then or equal |
|
||||||
| 15 | LT | Less then
|
| 14 | LT | Less then
|
||||||
| 16 | JMPE | Jump if equal |
|
| 15 | JMPE | Jump if equal |
|
||||||
|
| 16 | NOP |
|
||||||
| _ | IGL | Illegal action |
|
| _ | IGL | Illegal action |
|
|
@ -40,18 +40,18 @@ impl From<u8> for Opcode {
|
||||||
2 => Opcode::SUB,
|
2 => Opcode::SUB,
|
||||||
3 => Opcode::MUL,
|
3 => Opcode::MUL,
|
||||||
4 => Opcode::DIV,
|
4 => Opcode::DIV,
|
||||||
6 => Opcode::HLT,
|
5 => Opcode::HLT,
|
||||||
7 => Opcode::JMP,
|
6 => Opcode::JMP,
|
||||||
8 => Opcode::JMPF,
|
7 => Opcode::JMPF,
|
||||||
9 => Opcode::JMPB,
|
8 => Opcode::JMPB,
|
||||||
10 => Opcode::EQ,
|
9 => Opcode::EQ,
|
||||||
11 => Opcode::NEQ,
|
10 => Opcode::NEQ,
|
||||||
12 => Opcode::GTE,
|
11 => Opcode::GTE,
|
||||||
13 => Opcode::GT,
|
12 => Opcode::GT,
|
||||||
14 => Opcode::LTE,
|
13 => Opcode::LTE,
|
||||||
15 => Opcode::LT,
|
14 => Opcode::LT,
|
||||||
16 => Opcode::JMPE,
|
15 => Opcode::JMPE,
|
||||||
17 => Opcode::NOP,
|
16 => Opcode::NOP,
|
||||||
_ => Opcode::IGL,
|
_ => Opcode::IGL,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
26
src/vm.rs
26
src/vm.rs
|
@ -49,7 +49,7 @@ impl VM {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wraps the execuation in a loop so it will continue to run until done or
|
/// Wraps the execuation in a loop so it will continue to run until done or
|
||||||
/// there is an error executing the instructions.
|
/// there is an error executing the instructions.
|
||||||
pub fn run(&mut self) {
|
pub fn run(&mut self) {
|
||||||
let mut is_done = false;
|
let mut is_done = false;
|
||||||
while !is_done {
|
while !is_done {
|
||||||
|
@ -230,7 +230,7 @@ mod vm_tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_hlt_opcode() {
|
fn test_hlt_opcode() {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
let test_bytes = vec![6, 0, 0, 0];
|
let test_bytes = vec![5, 0, 0, 0];
|
||||||
vm.program = test_bytes;
|
vm.program = test_bytes;
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.pc, 1);
|
assert_eq!(vm.pc, 1);
|
||||||
|
@ -265,7 +265,7 @@ mod vm_tests {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 10;
|
vm.registers[0] = 10;
|
||||||
vm.registers[1] = 10;
|
vm.registers[1] = 10;
|
||||||
vm.program = vec![10, 0, 1, 0, 10, 0, 1, 0];
|
vm.program = vec![9, 0, 1, 0, 9, 0, 1, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.equal_flag, true);
|
assert_eq!(vm.equal_flag, true);
|
||||||
vm.registers[1] = 20;
|
vm.registers[1] = 20;
|
||||||
|
@ -278,7 +278,7 @@ mod vm_tests {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 10;
|
vm.registers[0] = 10;
|
||||||
vm.registers[1] = 20;
|
vm.registers[1] = 20;
|
||||||
vm.program = vec![11, 0, 1, 0, 11, 0, 1, 0];
|
vm.program = vec![10, 0, 1, 0, 10, 0, 1, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.equal_flag, true);
|
assert_eq!(vm.equal_flag, true);
|
||||||
vm.registers[1] = 10;
|
vm.registers[1] = 10;
|
||||||
|
@ -291,7 +291,7 @@ mod vm_tests {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 20;
|
vm.registers[0] = 20;
|
||||||
vm.registers[1] = 10;
|
vm.registers[1] = 10;
|
||||||
vm.program = vec![12, 0, 1, 0, 12, 0, 1, 0, 12, 0, 1, 0];
|
vm.program = vec![11, 0, 1, 0, 11, 0, 1, 0, 11, 0, 1, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.equal_flag, true);
|
assert_eq!(vm.equal_flag, true);
|
||||||
vm.registers[0] = 10;
|
vm.registers[0] = 10;
|
||||||
|
@ -307,7 +307,7 @@ mod vm_tests {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 20;
|
vm.registers[0] = 20;
|
||||||
vm.registers[1] = 10;
|
vm.registers[1] = 10;
|
||||||
vm.program = vec![13, 0, 1, 0, 13, 0, 1, 0, 13, 0, 1, 0];
|
vm.program = vec![12, 0, 1, 0, 12, 0, 1, 0, 12, 0, 1, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.equal_flag, true);
|
assert_eq!(vm.equal_flag, true);
|
||||||
vm.registers[0] = 10;
|
vm.registers[0] = 10;
|
||||||
|
@ -323,7 +323,7 @@ mod vm_tests {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 20;
|
vm.registers[0] = 20;
|
||||||
vm.registers[1] = 10;
|
vm.registers[1] = 10;
|
||||||
vm.program = vec![14, 0, 1, 0, 14, 0, 1, 0, 14, 0, 1, 0];
|
vm.program = vec![13, 0, 1, 0, 13, 0, 1, 0, 13, 0, 1, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.equal_flag, false);
|
assert_eq!(vm.equal_flag, false);
|
||||||
vm.registers[0] = 10;
|
vm.registers[0] = 10;
|
||||||
|
@ -339,7 +339,7 @@ mod vm_tests {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 20;
|
vm.registers[0] = 20;
|
||||||
vm.registers[1] = 10;
|
vm.registers[1] = 10;
|
||||||
vm.program = vec![15, 0, 1, 0, 15, 0, 1, 0, 15, 0, 1, 0];
|
vm.program = vec![14, 0, 1, 0, 14, 0, 1, 0, 14, 0, 1, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.equal_flag, false);
|
assert_eq!(vm.equal_flag, false);
|
||||||
vm.registers[0] = 10;
|
vm.registers[0] = 10;
|
||||||
|
@ -353,7 +353,7 @@ mod vm_tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_igl_opcode() {
|
fn test_igl_opcode() {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
let test_bytes = vec![200, 0, 0, 0];
|
let test_bytes = vec![254, 0, 0, 0];
|
||||||
vm.program = test_bytes;
|
vm.program = test_bytes;
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.pc, 1);
|
assert_eq!(vm.pc, 1);
|
||||||
|
@ -363,7 +363,7 @@ mod vm_tests {
|
||||||
fn test_jmp_opcode() {
|
fn test_jmp_opcode() {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 1;
|
vm.registers[0] = 1;
|
||||||
vm.program = vec![7, 0, 0, 0];
|
vm.program = vec![6, 0, 0, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.pc, 1);
|
assert_eq!(vm.pc, 1);
|
||||||
}
|
}
|
||||||
|
@ -372,7 +372,7 @@ mod vm_tests {
|
||||||
fn test_jmpf_opcode() {
|
fn test_jmpf_opcode() {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 2;
|
vm.registers[0] = 2;
|
||||||
vm.program = vec![8, 0, 0, 0, 6, 0, 0, 0];
|
vm.program = vec![7, 0, 0, 0, 5, 0, 0, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.pc, 4);
|
assert_eq!(vm.pc, 4);
|
||||||
}
|
}
|
||||||
|
@ -381,7 +381,7 @@ mod vm_tests {
|
||||||
fn test_jmpb_opcode() {
|
fn test_jmpb_opcode() {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[1] = 6;
|
vm.registers[1] = 6;
|
||||||
vm.program = vec![0, 0, 0, 10, 9, 1, 0, 0];
|
vm.program = vec![0, 0, 0, 10, 8, 1, 0, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.pc, 0);
|
assert_eq!(vm.pc, 0);
|
||||||
|
@ -392,7 +392,7 @@ mod vm_tests {
|
||||||
let mut vm = get_test_vm();
|
let mut vm = get_test_vm();
|
||||||
vm.registers[0] = 7;
|
vm.registers[0] = 7;
|
||||||
vm.equal_flag = true;
|
vm.equal_flag = true;
|
||||||
vm.program = vec![16, 0, 0, 0, 17, 0, 0, 0, 17, 0, 0, 0];
|
vm.program = vec![15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0];
|
||||||
vm.run_once();
|
vm.run_once();
|
||||||
assert_eq!(vm.pc, 7);
|
assert_eq!(vm.pc, 7);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue