73 lines
1.3 KiB
Rust
73 lines
1.3 KiB
Rust
#![allow(dead_code)]
|
|
#![allow(unused_variables)]
|
|
|
|
use crate::vm::vm::VM;
|
|
|
|
enum Opcode {
|
|
BR = 0,
|
|
ADD,
|
|
LD,
|
|
ST,
|
|
JSR,
|
|
AND,
|
|
LDR,
|
|
STR,
|
|
RTI,
|
|
NOT,
|
|
LDI,
|
|
STI,
|
|
JMP,
|
|
RES,
|
|
LEA,
|
|
TRAP,
|
|
NOOP,
|
|
}
|
|
|
|
fn get_opcode(instr: u16) -> Opcode {
|
|
match instr >> 12 {
|
|
0 => Opcode::BR,
|
|
1 => Opcode::ADD,
|
|
2 => Opcode::LD,
|
|
3 => Opcode::ST,
|
|
4 => Opcode::JSR,
|
|
5 => Opcode::AND,
|
|
6 => Opcode::LDR,
|
|
7 => Opcode::STR,
|
|
8 => Opcode::RTI,
|
|
9 => Opcode::NOT,
|
|
10 => Opcode::LDI,
|
|
11 => Opcode::STI,
|
|
12 => Opcode::JMP,
|
|
13 => Opcode::RES,
|
|
14 => Opcode::LEA,
|
|
15 => Opcode::TRAP,
|
|
_ => Opcode::NOOP,
|
|
}
|
|
}
|
|
|
|
pub fn execute_opcode(vm: &mut VM) {
|
|
let instr = vm.memory.get(vm.registers.pc);
|
|
let opcode = get_opcode(instr);
|
|
match opcode {
|
|
Opcode::ADD => noop(instr, vm),
|
|
Opcode::AND => noop(instr, vm),
|
|
Opcode::NOT => noop(instr, vm),
|
|
Opcode::BR => noop(instr, vm),
|
|
Opcode::JMP => noop(instr, vm),
|
|
Opcode::JSR => noop(instr, vm),
|
|
Opcode::LD => noop(instr, vm),
|
|
Opcode::LDI => noop(instr, vm),
|
|
Opcode::LDR => noop(instr, vm),
|
|
Opcode::LEA => noop(instr, vm),
|
|
Opcode::ST => noop(instr, vm),
|
|
Opcode::STI => noop(instr, vm),
|
|
Opcode::STR => noop(instr, vm),
|
|
Opcode::TRAP => noop(instr, vm),
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
fn noop(instr: u16, vm: &mut VM) {}
|
|
|
|
|