summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authortaitep <taitep@taitep.se>2025-11-18 20:58:49 +0100
committertaitep <taitep@taitep.se>2025-11-18 20:58:49 +0100
commit6b49b34cc5218d1cedb5aaec6614e5de68ed4889 (patch)
tree2ceedb61dec0f495be136bc5c82db9cd80b63c31 /src/main.rs
parent9c4e2d17a2fda196cb5e936ae0693cdc1ee0b2f1 (diff)
rename to TRVE
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..6a234cf
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,139 @@
+use std::{
+ error::Error,
+ fs::File,
+ io::{self, Read},
+ sync::Arc,
+};
+
+use trve::{
+ consts::{Byte, DWord, HWord, Word},
+ core::Core,
+ mem::{DeviceEntry, MemAccessFault, MemConfig, MemDeviceInterface, PageNum, Ram},
+};
+
+fn read_file_to_buffer(path: &str, buffer: &mut [u8]) -> io::Result<usize> {
+ let mut file = File::open(path)?;
+ let mut total_read = 0;
+
+ while total_read < buffer.len() {
+ let n = file.read(&mut buffer[total_read..])?;
+ if n == 0 {
+ return Ok(total_read);
+ }
+ total_read += n;
+ }
+
+ let mut tmp = [0u8; 1];
+ if file.read(&mut tmp)? != 0 {
+ return Err(io::Error::other("RAM too small for file"));
+ }
+
+ Ok(total_read)
+}
+
+fn main() -> Result<(), Box<dyn Error>> {
+ let mut ram = Ram::try_new(1024 * 1024 / 4096)?;
+ let buf = ram.buf_mut();
+ read_file_to_buffer("./img", buf)?;
+
+ let mem_cfg = MemConfig {
+ ram: Arc::new(ram),
+ ram_start: 0x8000_0000 / 4096,
+ devices: Box::new([DeviceEntry {
+ base: 0,
+ size: 1,
+ interface: Arc::new(DbgOut),
+ }]),
+ };
+
+ let mut core = Core::new(mem_cfg);
+ core.reset(0x8000_0000);
+ core.run();
+
+ Ok(())
+}
+
+struct DbgOut;
+
+impl MemDeviceInterface for DbgOut {
+ fn write_dword(
+ &self,
+ page: PageNum,
+ offset: u16,
+ value: DWord,
+ ) -> Result<(), trve::mem::MemAccessFault> {
+ eprintln!(
+ "Wrote DWord {value:016x} to Debug-Out page {page}, offset {offset} (byte {})",
+ offset * 8
+ );
+ Ok(())
+ }
+
+ fn write_word(
+ &self,
+ page: PageNum,
+ offset: u16,
+ value: Word,
+ ) -> Result<(), trve::mem::MemAccessFault> {
+ eprintln!(
+ "Wrote Word {value:08x} to Debug-Out page {page}, offset {offset} (byte {})",
+ offset * 4
+ );
+ Ok(())
+ }
+
+ fn write_hword(
+ &self,
+ page: PageNum,
+ offset: u16,
+ value: HWord,
+ ) -> Result<(), trve::mem::MemAccessFault> {
+ eprintln!(
+ "Wrote HWord {value:04x} to Debug-Out page {page}, offset {offset} (byte {})",
+ offset * 2
+ );
+ Ok(())
+ }
+
+ fn write_byte(
+ &self,
+ page: PageNum,
+ offset: u16,
+ value: Byte,
+ ) -> Result<(), trve::mem::MemAccessFault> {
+ eprintln!("Wrote Byte {value:02x} to Debug-Out page {page}, offset {offset}");
+ Ok(())
+ }
+
+ fn read_dword(&self, page: PageNum, offset: u16) -> Result<DWord, trve::mem::MemAccessFault> {
+ Err(MemAccessFault)
+ }
+
+ fn read_word(&self, page: PageNum, offset: u16) -> Result<Word, trve::mem::MemAccessFault> {
+ Err(MemAccessFault)
+ }
+
+ fn read_hword(&self, page: PageNum, offset: u16) -> Result<HWord, trve::mem::MemAccessFault> {
+ Err(MemAccessFault)
+ }
+
+ fn read_byte(&self, page: PageNum, offset: u16) -> Result<Byte, trve::mem::MemAccessFault> {
+ Err(MemAccessFault)
+ }
+
+ fn get_atomic_word(
+ &self,
+ page: PageNum,
+ offset: u16,
+ ) -> Result<&std::sync::atomic::AtomicU32, trve::mem::MemAccessFault> {
+ Err(MemAccessFault)
+ }
+
+ fn get_atomic_dword(
+ &self,
+ page: PageNum,
+ offset: u16,
+ ) -> Result<&std::sync::atomic::AtomicU64, trve::mem::MemAccessFault> {
+ Err(MemAccessFault)
+ }
+}