basic vm struct
This commit is contained in:
55
src/main.rs
55
src/main.rs
@ -1,11 +1,15 @@
|
|||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
mod mem;
|
mod mem;
|
||||||
use core::panic;
|
use core::panic;
|
||||||
use std::env;
|
// use std::env;
|
||||||
use std::fs;
|
// use std::fs;
|
||||||
use std::io;
|
// use std::io;
|
||||||
use std::io::Read;
|
// use std::io::Read;
|
||||||
use std::u16;
|
use std::u16;
|
||||||
|
|
||||||
|
use mem::Memory;
|
||||||
|
|
||||||
struct Registers {
|
struct Registers {
|
||||||
r0: u16,
|
r0: u16,
|
||||||
r1: u16,
|
r1: u16,
|
||||||
@ -19,6 +23,13 @@ struct Registers {
|
|||||||
cond: u16,
|
cond: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ConditionFlags {
|
||||||
|
// condition flags can only be set as nzp with a 1 in each position
|
||||||
|
POS = 1 << 0,
|
||||||
|
ZERO = 1 << 1,
|
||||||
|
NEG = 1 << 2,
|
||||||
|
}
|
||||||
|
|
||||||
impl Registers {
|
impl Registers {
|
||||||
fn new() -> Registers {
|
fn new() -> Registers {
|
||||||
Registers {
|
Registers {
|
||||||
@ -48,6 +59,8 @@ impl Registers {
|
|||||||
5 => &mut self.r5,
|
5 => &mut self.r5,
|
||||||
6 => &mut self.r6,
|
6 => &mut self.r6,
|
||||||
7 => &mut self.r7,
|
7 => &mut self.r7,
|
||||||
|
8 => &mut self.pc,
|
||||||
|
9 => &mut self.cond,
|
||||||
_ => panic!("not a register!"),
|
_ => panic!("not a register!"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -59,9 +72,43 @@ impl Registers {
|
|||||||
fn set_registers(&mut self, num : u16, value: u16) {
|
fn set_registers(&mut self, num : u16, value: u16) {
|
||||||
*self.return_register(num) = value;
|
*self.return_register(num) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_cond(&mut self, num : u16) {
|
||||||
|
if *self.return_register(num) > 0 {
|
||||||
|
self.cond = ConditionFlags::POS as u16;
|
||||||
|
} else if *self.return_register(num) == 0 {
|
||||||
|
self.cond = ConditionFlags::ZERO as u16;
|
||||||
|
} else {
|
||||||
|
self.cond = ConditionFlags::NEG as u16
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_reg_and_cond(&mut self, num : u16, value: u16) {
|
||||||
|
self.set_registers(num, value);
|
||||||
|
self.update_cond(num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum State {
|
||||||
|
Stopped = 0,
|
||||||
|
Running,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct VM {
|
||||||
|
memory: Memory,
|
||||||
|
registers: Registers,
|
||||||
|
state: State,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VM {
|
||||||
|
fn new() -> VM {
|
||||||
|
VM{
|
||||||
|
memory: Memory::new(),
|
||||||
|
registers: Registers::new(),
|
||||||
|
state: State::Stopped,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user