Files
riscy-rust/src/ram.rs
Benjamin Kyd a0046bd58d Bus mastering
2023-05-25 18:37:21 +01:00

82 lines
2.6 KiB
Rust

use crate::bus;
use crate::rv32;
pub const DRAM_SIZE: u32 = 1 * 1024 * 1024 * 1024; // 1GB
pub struct RAM(pub Vec<rv32::Byte>);
impl RAM {
pub fn new() -> RAM {
RAM(vec![0; DRAM_SIZE as usize])
}
pub fn len(&mut self) -> usize {
self.0.len()
}
pub fn read_8(&mut self, address: rv32::XLen) -> rv32::Byte {
let memory = &self.0;
let address = (address - bus::DRAM_BASE) as usize;
memory[address]
}
pub fn read_16(&mut self, address: rv32::XLen) -> rv32::HalfWord {
let memory = &self.0;
let address = (address - bus::DRAM_BASE) as usize;
let ret: rv32::HalfWord =
memory[address] as rv32::HalfWord | (memory[address + 1] as rv32::HalfWord) << 8;
ret
}
pub fn read_32(&mut self, address: rv32::XLen) -> rv32::Word {
let memory = &self.0;
let address = (address - bus::DRAM_BASE) as usize;
let ret: rv32::Word = memory[address] as rv32::Word
| (memory[address + 1] as rv32::Word) << 8
| (memory[address + 2] as rv32::Word) << 16
| (memory[address + 3] as rv32::Word) << 24;
ret
}
pub fn read_64(&mut self, address: rv32::XLen) -> rv32::DoubleWord {
let memory = &self.0;
let address = (address - bus::DRAM_BASE) as usize;
let ret: rv32::DoubleWord = memory[address] as rv32::DoubleWord
| (memory[address + 1] as rv32::DoubleWord) << 8
| (memory[address + 2] as rv32::DoubleWord) << 16
| (memory[address + 3] as rv32::DoubleWord) << 24
| (memory[address + 4] as rv32::DoubleWord) << 32
| (memory[address + 5] as rv32::DoubleWord) << 40
| (memory[address + 6] as rv32::DoubleWord) << 48
| (memory[address + 7] as rv32::DoubleWord) << 56;
ret
}
//pub fn read<T>(&mut self, address: rv32::XLen) -> T
//where
//T: num::Num
//+ num::ToPrimitive
//+ Default
//+ std::fmt::LowerHex
//+ std::ops::Shl<T, Output = T>
//+ std::ops::BitOr<T, Output = T>
//+ num::cast::NumCast,
//{
//let address: usize = (address - bus::DRAM_BASE) as usize;
//let memory = &self.0;
//(address..)
//.take(core::mem::size_of::<T>())
//.enumerate()
//.fold(T::default(), |mut acc, (i, x)| {
//println!("VM > Reading from 0x{:08x} to 0x{:08x}", x, acc);
//println!("VM > Memory: 0x{:02x}", memory[x]);
//println!("VM > Now Shift: {}", i * 8);
//acc << u32::from(i as u32 * 8) | memory[x].from()
//})
//}
//pub fn write<T>(&mut self, address: rv32::XLen, data: T) {}
}