Fixed mis-numbering of opcodes

This bug was intentionally kept in order to make sure everything ran flawlessly regardless.
This commit is contained in:
Anthony Foxclaw 2020-02-07 01:01:39 -05:00
parent d63bedda7c
commit 75465c6a20
3 changed files with 37 additions and 36 deletions

View file

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

View file

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

View file

@ -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);
} }