use std::time::Duration;
use color_eyre::eyre::Result;
use probe_rs::{MemoryInterface, Session};
use crate::render::step;
pub const CHUNK_WORDS: usize = 0x4000;
pub fn ensure_halted(s: &mut Session) -> Result<()> {
let mut core = s.core(0)?;
if !core.core_halted()? {
core.halt(Duration::from_secs(1))?;
}
Ok(())
}
pub fn reset_and_halt(s: &mut Session) -> Result<()> {
let mut core = s.core(0)?;
core.reset_and_halt(Duration::from_secs(2))?;
Ok(())
}
pub fn read_words(s: &mut Session, start: u32, n_words: usize) -> Result<Vec<u32>> {
step("reading back");
let mut buf = vec![0u32; n_words];
let mut core = s.core(0)?;
for (i, chunk) in buf.chunks_mut(CHUNK_WORDS).enumerate() {
let addr = start as u64 + (i * CHUNK_WORDS * 4) as u64;
core.read_32(addr, chunk)?;
}
Ok(buf)
}
pub fn write_words(s: &mut Session, start: u32, words: &[u32]) -> Result<()> {
ensure_halted(s)?;
let mut core = s.core(0)?;
for (i, chunk) in words.chunks(CHUNK_WORDS).enumerate() {
let addr = start as u64 + (i * CHUNK_WORDS * 4) as u64;
core.write_32(addr, chunk)?;
}
Ok(())
}