Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit c7b61a2

Browse files
committed
feat: vm fetch/decode/execute structure
1 parent 9e2357c commit c7b61a2

File tree

9 files changed

+507
-31
lines changed

9 files changed

+507
-31
lines changed

Cargo.lock

Lines changed: 221 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,7 @@ edition = "2021"
77

88
[dev-dependencies]
99
pretty_assertions = "1.4.0"
10+
11+
[dependencies]
12+
env_logger = "0.11.3"
13+
log = "0.4.21"

src/interpreter/memory.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use log::trace;
2+
3+
pub struct Memory {
4+
pub data: Vec<u8>,
5+
}
6+
7+
impl Memory {
8+
pub fn new(size: usize) -> Self {
9+
Memory {
10+
data: vec![0; size],
11+
}
12+
}
13+
14+
pub fn from(data: Vec<u8>) -> Self {
15+
Memory { data }
16+
}
17+
18+
pub fn read(&self, address: u16) -> u8 {
19+
self.data[address as usize]
20+
}
21+
22+
pub fn read_word(&self, address: u16) -> u16 {
23+
u16::from_le_bytes([
24+
self.data[address as usize],
25+
self.data[(address + 1) as usize],
26+
])
27+
}
28+
29+
pub fn read_bytes(&self, address: u16, size: usize) -> &[u8] {
30+
&self.data[address as usize..(address as usize + size)]
31+
}
32+
33+
pub fn write(&mut self, address: u16, value: u8) {
34+
self.data[address as usize] = value;
35+
}
36+
37+
pub fn write_word(&mut self, address: u16, value: u16) {
38+
let bytes = value.to_le_bytes();
39+
self.data[address as usize] = bytes[0];
40+
self.data[(address + 1) as usize] = bytes[1];
41+
}
42+
43+
pub fn write_bytes(&mut self, address: u16, data: &[u8]) {
44+
trace!("WRITE[{:04X}]: {:?}", address, data);
45+
self.data[address as usize..(address as usize + data.len())].copy_from_slice(data);
46+
}
47+
48+
pub fn len(&self) -> usize {
49+
self.data.len()
50+
}
51+
}

src/interpreter/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
mod memory;
12
mod register_set;
23
mod vm;
4+
5+
pub use vm::Interpretable;

src/interpreter/register_set.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use std::collections::HashMap;
22

33
use crate::x86::Register;
4+
use log::trace;
45

56
#[derive(Debug)]
67
pub struct RegisterSet {
7-
registers: HashMap<Register, i32>,
8+
registers: HashMap<Register, i16>,
89
}
910

1011
impl RegisterSet {
@@ -16,12 +17,13 @@ impl RegisterSet {
1617
Self { registers }
1718
}
1819

19-
pub fn get(&self, reg: Register) -> Option<&i32> {
20-
self.registers.get(&reg)
20+
pub fn get(&self, reg: Register) -> i16 {
21+
*self.registers.get(&reg).expect("Unknown register")
2122
}
2223

23-
pub fn set(&mut self, reg: Register, value: i32) {
24+
pub fn set(&mut self, reg: Register, value: i16) {
2425
if let Some(val) = self.registers.get_mut(&reg) {
26+
trace!("Set {:?}: {} (previous: {})", reg, value, *val);
2527
*val = value;
2628
}
2729
}

0 commit comments

Comments
 (0)