arbritrary read on the bus

This commit is contained in:
Benjamin Kyd
2023-05-25 00:59:50 +01:00
parent f41bd7970b
commit 1f03f4ce84
3 changed files with 40 additions and 25 deletions

View File

@@ -55,6 +55,8 @@ impl VMRV32I {
}
println!("VM > Program loaded to 0x{:08x}", self.pc);
println!("VM > WORD at 0x80000000: 0x{:04x}", self.bus.memory.read::<rv32::Word>(0x80000000))
}
fn init_cpu(&mut self) {

View File

@@ -1,3 +1,4 @@
use crate::bus;
use crate::rv32;
pub const DRAM_SIZE: u32 = 1 * 1024 * 1024 * 1024; // 1GB
@@ -13,19 +14,26 @@ impl RAM {
self.0.len()
}
//fn read<T>(&mut self, address: XLen as usize) -> T {
//let memory = &self.0;
//let shift: T;
//// Little endian!!!
//match T {
////QuadWord:
////DoubleWord:
//Word => shift = (memory[address] as T)
//| ((memory[address] as T) << 8)
//| ((memory[address] as T) << 16)
//| ((memory[address] as T) << 24)
////HalfWord:
////Byte:
//}
//}
pub fn read<T>(&mut self, address: rv32::XLen) -> T
where
T: std::ops::Shl<Output = T>
+ std::ops::BitOr<Output = T>
+ From<rv32::Byte>
+ From<rv32::HalfWord>
+ From<rv32::Word>
//+ From<rv32::DoubleWord>
+ Default
{
let address: usize = (address - bus::DRAM_BASE) as usize;
let memory = &self.0;
(address..)
.take(core::mem::size_of::<T>())
.enumerate()
.fold(T::default(), |acc, (i, x)| acc | (memory[x] << (i * 8)).into())
}
pub fn write<T>(&mut self, address: rv32::XLen, data: T) {
}
}

View File

@@ -1,17 +1,22 @@
pub const XLEN: usize = 32;
pub type XLen = u32;
// define words as byte fraction
//const QUADWORD: usize = 16;
//const DOUBLEWORD: usize = 8;
//const WORD: usize = 4;
//const HALFWORD: usize = 2;
//const BYTE: usize = 1;
enum Data {
QuadWord(u128),
DoubleWord(u64),
Word(u32),
HalfWord(u16),
Byte(u8),
}
pub type QuadWord = u128;
pub type DoubleWord = u64;
// define words as byte fraction
//pub const QUADWORD: usize = 16;
pub const DOUBLEWORD: usize = 8;
pub const WORD: usize = 4;
pub const HALFWORD: usize = 2;
pub const BYTE: usize = 1;
//pub type DoubleWord = u64;
pub type Word = u32;
pub type HalfWord = u16;
pub type Byte = u8;