Better structure
This commit is contained in:
@@ -0,0 +1,22 @@
|
|||||||
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum Instruction {
|
||||||
|
HLT,
|
||||||
|
REG(u8, usize),
|
||||||
|
ADD(u8, u8, u8),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Instruction {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"{}",
|
||||||
|
match self {
|
||||||
|
Instruction::HLT => format!("HLT"),
|
||||||
|
Instruction::REG(a, b) => format!("REG {a}, {b}"),
|
||||||
|
Instruction::ADD(a, b, c) => format!("ADD {a}, {b}, {c}"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
-24
@@ -1,16 +1,11 @@
|
|||||||
|
pub mod instruction;
|
||||||
|
pub mod registry;
|
||||||
|
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
use osui::state::{DependencyHandler, State};
|
use osui::state::{DependencyHandler, State};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
use crate::emulator::{instruction::Instruction, registry::Registry};
|
||||||
pub struct Registry(pub State<[usize; 8]>);
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub enum Instruction {
|
|
||||||
HLT,
|
|
||||||
REG(u8, usize),
|
|
||||||
ADD(u8, u8, u8),
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Emulator {
|
pub struct Emulator {
|
||||||
pub pc: State<usize>,
|
pub pc: State<usize>,
|
||||||
@@ -22,7 +17,7 @@ pub struct Emulator {
|
|||||||
impl Emulator {
|
impl Emulator {
|
||||||
pub fn run(&self) {
|
pub fn run(&self) {
|
||||||
loop {
|
loop {
|
||||||
std::thread::sleep(std::time::Duration::from_millis(300));
|
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||||
let mut pc = self.pc.get();
|
let mut pc = self.pc.get();
|
||||||
if let Some(inst) = self.instructions.get(**pc) {
|
if let Some(inst) = self.instructions.get(**pc) {
|
||||||
**self.inst.get() = inst.clone();
|
**self.inst.get() = inst.clone();
|
||||||
@@ -85,17 +80,3 @@ impl DependencyHandler for Registry {
|
|||||||
self.0.check()
|
self.0.check()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for Instruction {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(
|
|
||||||
f,
|
|
||||||
"{}",
|
|
||||||
match self {
|
|
||||||
Instruction::HLT => format!("HLT"),
|
|
||||||
Instruction::REG(a, b) => format!("REG {a}, {b}"),
|
|
||||||
Instruction::ADD(a, b, c) => format!("ADD {a}, {b}, {c}"),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
use osui::state::State;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Registry(pub State<[usize; 8]>);
|
||||||
+2
-2
@@ -6,7 +6,7 @@ use std::sync::Arc;
|
|||||||
|
|
||||||
use osui::prelude::*;
|
use osui::prelude::*;
|
||||||
|
|
||||||
use crate::emulator::{Instruction, Registry};
|
use crate::emulator::{instruction::Instruction, registry::Registry};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let screen = Screen::new();
|
let screen = Screen::new();
|
||||||
@@ -21,7 +21,7 @@ fn main() {
|
|||||||
screen.run().unwrap();
|
screen.run().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn app(_screen: &Arc<Screen>, instructions: Vec<emulator::Instruction>) -> Rsx {
|
fn app(_screen: &Arc<Screen>, instructions: Vec<Instruction>) -> Rsx {
|
||||||
let pc = use_state::<usize>(0);
|
let pc = use_state::<usize>(0);
|
||||||
let inst = use_state::<Instruction>(Instruction::HLT);
|
let inst = use_state::<Instruction>(Instruction::HLT);
|
||||||
let registers = Registry(use_state([0; 8]));
|
let registers = Registry(use_state([0; 8]));
|
||||||
|
|||||||
Reference in New Issue
Block a user