fox32: Add 3 extra bytes at the end of fast and shared memory
Because Operand::ImmediatePtr always reads 4 bytes (even if the instruction size is smaller), attempting to read the last byte of memory through a pointer would cause fox32 to warn about reading unmapped memory. Adding 3 extra bytes to the end of memory prevents this.
This commit is contained in:
parent
29d6690d97
commit
fe476414b7
12
src/main.rs
12
src/main.rs
|
@ -66,21 +66,25 @@ fn main() {
|
||||||
let mouse = Arc::new(Mutex::new(Mouse::new()));
|
let mouse = Arc::new(Mutex::new(Mouse::new()));
|
||||||
|
|
||||||
// 32 MiB of shared memory
|
// 32 MiB of shared memory
|
||||||
let shared_memory = Arc::new(Mutex::new(vec![0u8; 0x02000000]));
|
// plus 3 bytes at the end to allow for reading the last byte of memory as an immediate pointer
|
||||||
|
// Operand::ImmediatePtr always reads 4 bytes
|
||||||
|
let shared_memory = Arc::new(Mutex::new(vec![0u8; 0x02000003]));
|
||||||
|
|
||||||
let mut cpu = {
|
let mut cpu = {
|
||||||
// 32 MiB of fast memory
|
// 32 MiB of fast memory
|
||||||
let cpu_fast_memory = vec![0; 0x02000000];
|
// plus 3 extra bytes at the end to allow for reading the last byte of memory as an immediate pointer
|
||||||
|
// Operand::ImmediatePtr always reads 4 bytes
|
||||||
|
let cpu_fast_memory = vec![0; 0x02000003];
|
||||||
let cpu_shared_memory = Arc::clone(&shared_memory);
|
let cpu_shared_memory = Arc::clone(&shared_memory);
|
||||||
let cpu_overlays = Arc::clone(&display.overlays);
|
let cpu_overlays = Arc::clone(&display.overlays);
|
||||||
let cpu_read_only_memory = read_rom();
|
let cpu_read_only_memory = read_rom();
|
||||||
|
|
||||||
let fast_size = cpu_fast_memory.len();
|
let fast_size = cpu_fast_memory.len() - 3;
|
||||||
let fast_bottom_address = 0x00000000;
|
let fast_bottom_address = 0x00000000;
|
||||||
let fast_top_address = fast_bottom_address + fast_size - 1;
|
let fast_top_address = fast_bottom_address + fast_size - 1;
|
||||||
println!("Fast: {:.2}MB mapped at {:#010X}-{:#010X}", fast_size / 1048576, fast_bottom_address, fast_top_address);
|
println!("Fast: {:.2}MB mapped at {:#010X}-{:#010X}", fast_size / 1048576, fast_bottom_address, fast_top_address);
|
||||||
|
|
||||||
let shared_size = { cpu_shared_memory.lock().unwrap().len() };
|
let shared_size = { cpu_shared_memory.lock().unwrap().len() - 3 };
|
||||||
let shared_bottom_address = 0x80000000;
|
let shared_bottom_address = 0x80000000;
|
||||||
let shared_top_address = shared_bottom_address + shared_size - 1;
|
let shared_top_address = shared_bottom_address + shared_size - 1;
|
||||||
println!("Shared: {:.2}MB mapped at {:#010X}-{:#010X}", shared_size / 1048576, shared_bottom_address, shared_top_address);
|
println!("Shared: {:.2}MB mapped at {:#010X}-{:#010X}", shared_size / 1048576, shared_bottom_address, shared_top_address);
|
||||||
|
|
|
@ -18,9 +18,10 @@ pub struct Memory {
|
||||||
|
|
||||||
impl Memory {
|
impl Memory {
|
||||||
pub fn new(fast_memory: Vec<u8>, shared_memory: Arc<Mutex<Vec<u8>>>, overlays: Arc<Mutex<Vec<Overlay>>>, rom: Vec<u8>) -> Self {
|
pub fn new(fast_memory: Vec<u8>, shared_memory: Arc<Mutex<Vec<u8>>>, overlays: Arc<Mutex<Vec<Overlay>>>, rom: Vec<u8>) -> Self {
|
||||||
let shared_memory_size = { shared_memory.lock().unwrap().len() };
|
// 3 extra bytes at the end to allow for reading the last byte of memory as an immediate pointer
|
||||||
|
let shared_memory_size = { shared_memory.lock().unwrap().len() - 3 };
|
||||||
Memory {
|
Memory {
|
||||||
fast_memory_size: fast_memory.len(),
|
fast_memory_size: fast_memory.len() - 3,
|
||||||
fast_memory,
|
fast_memory,
|
||||||
shared_memory_size,
|
shared_memory_size,
|
||||||
shared_memory,
|
shared_memory,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user