Compare commits

...

3 Commits

3 changed files with 32 additions and 32 deletions

View File

@ -150,8 +150,8 @@ impl Backplane {
pub fn read_word(&self, address: u32) -> Result<u16, BusError> {
self.mem_helper(
address,
|mut card| card.read_word(address),
|mut card| card.read_word_io(address as u8),
|address, mut card| card.read_word(address),
|address, mut card| card.read_word_io(address as u8),
false,
false,
)
@ -160,8 +160,8 @@ impl Backplane {
pub fn read_byte(&self, address: u32) -> Result<u8, BusError> {
self.mem_helper(
address,
|mut card| card.read_byte(address),
|mut card| card.read_byte_io(address as u8),
|address, mut card| card.read_byte(address),
|address, mut card| card.read_byte_io(address as u8),
false,
false,
)
@ -170,8 +170,8 @@ impl Backplane {
pub fn write_word(&self, address: u32, data: u16) -> Result<(), BusError> {
self.mem_helper(
address,
|mut card| card.write_word(address, data),
|mut card| card.write_word_io(address as u8, data),
|address, mut card| card.write_word(address, data),
|address, mut card| card.write_word_io(address as u8, data),
false,
true,
)
@ -180,8 +180,8 @@ impl Backplane {
pub fn write_byte(&self, address: u32, data: u8) -> Result<(), BusError> {
self.mem_helper(
address,
|mut card| card.write_byte(address, data),
|mut card| card.write_byte_io(address as u8, data),
|address, mut card| card.write_byte(address, data),
|address, mut card| card.write_byte_io(address as u8, data),
false,
true,
)
@ -190,8 +190,8 @@ impl Backplane {
pub fn read_word_phys(&self, address: u32) -> Result<u16, BusError> {
self.mem_helper(
address,
|mut card| card.read_word(address),
|mut card| card.read_word_io(address as u8),
|address, mut card| card.read_word(address),
|address, mut card| card.read_word_io(address as u8),
true,
false,
)
@ -201,8 +201,8 @@ impl Backplane {
pub fn read_byte_phys(&self, address: u32) -> Result<u8, BusError> {
self.mem_helper(
address,
|mut card| card.read_byte(address),
|mut card| card.read_byte_io(address as u8),
|address, mut card| card.read_byte(address),
|address, mut card| card.read_byte_io(address as u8),
true,
false,
)
@ -212,8 +212,8 @@ impl Backplane {
pub fn write_word_phys(&self, address: u32, data: u16) -> Result<(), BusError> {
self.mem_helper(
address,
|mut card| card.write_word(address, data),
|mut card| card.write_word_io(address as u8, data),
|address, mut card| card.write_word(address, data),
|address, mut card| card.write_word_io(address as u8, data),
true,
true,
)
@ -223,8 +223,8 @@ impl Backplane {
pub fn write_byte_phys(&self, address: u32, data: u8) -> Result<(), BusError> {
self.mem_helper(
address,
|mut card| card.write_byte(address, data),
|mut card| card.write_byte_io(address as u8, data),
|address, mut card| card.write_byte(address, data),
|address, mut card| card.write_byte_io(address as u8, data),
true,
true,
)
@ -239,8 +239,8 @@ impl Backplane {
write: bool,
) -> Result<T, BusError>
where
M: FnMut(RefMut<'_, dyn Card>) -> NullableResult<T, BusError>,
I: FnMut(RefMut<'_, dyn Card>) -> NullableResult<T, BusError>,
M: FnMut(u32, RefMut<'_, dyn Card>) -> NullableResult<T, BusError>,
I: FnMut(u32, RefMut<'_, dyn Card>) -> NullableResult<T, BusError>,
{
let address = if bypass_mmu {
address
@ -262,14 +262,14 @@ impl Backplane {
(0..=0x00fe_ffff) | (0x0100_0000..=0xffff_ffff) => self
.cards
.iter()
.try_find_map(|card| mem_func(card.borrow_mut()))
.try_find_map(|card| mem_func(address, card.borrow_mut()))
.result(BusError),
(0x00ff_0000..=0x00ff_00ff) => Ok(T::default()),
(0x00ff_0100..=0x00ff_ffff) => self
.cards
.get(((address >> 8) as u8 - 1) as usize)
.map_or(Ok(T::default()), |card| {
io_func(card.borrow_mut())
io_func(address, card.borrow_mut())
.optional_result()
.unwrap_or(Ok(T::default()))
}),

View File

@ -88,7 +88,6 @@ fn main() -> Result<(), anyhow::Error> {
last_peek_format: (peek::Format::Hex, peek::Size::Byte),
};
if args.run {
let mut out = String::new();
while !state.cpu.stopped {
match state.cpu.step() {
Ok(()) => (),
@ -98,11 +97,7 @@ fn main() -> Result<(), anyhow::Error> {
}
}
}
out += &format!("{}\n", state.cpu);
let pc = state.cpu.pc();
out += &disas_fmt(&mut state.cpu, pc, &state.symbol_tables).0;
out.pop(); // Remove trailing newline
println!("{out}");
println!("CPU stopped at PC {:#x}\n{}", state.cpu.pc(), state.cpu);
return Ok(());
}
Repl::<_, anyhow::Error>::new(state)
@ -239,9 +234,14 @@ fn main() -> Result<(), anyhow::Error> {
}
}
}
if state.cpu.stopped {
out += &format!("CPU stopped at PC {:#x}\n", state.cpu.pc());
}
out += &format!("{}\n", state.cpu);
let pc = state.cpu.pc();
out += &disas_fmt(&mut state.cpu, pc, &state.symbol_tables).0;
if !state.cpu.stopped {
let pc = state.cpu.pc();
out += &disas_fmt(&mut state.cpu, pc, &state.symbol_tables).0;
}
out.pop(); // Remove trailing newline
Ok(Some(out))
},

View File

@ -54,10 +54,10 @@ impl Card for Rom {
return NullableResult::Null;
}
let address = address as u16;
if address < 0x4000 {
if address < 0x8000 {
self.data.get(address as usize).copied().into()
} else {
self.ram.get((address - 0x4000) as usize).copied().into()
self.ram.get((address - 0x8000) as usize).copied().into()
}
}
@ -65,8 +65,8 @@ impl Card for Rom {
if !self.enabled | ((address >> 16) as u16 != self.start) {
return NullableResult::Null;
}
let address = (address as u16).checked_sub(0x4000)?;
if address > self.data.len() as u16 {
let address = (address as u16).checked_sub(0x8000)?;
if address > self.ram.len() as u16 {
return NullableResult::Null;
}
self.ram[address as usize] = data;