Compare commits
3 Commits
8f91a1aa3e
...
cdb0f1d8d7
Author | SHA1 | Date | |
---|---|---|---|
cdb0f1d8d7 | |||
9cdbe2e071 | |||
0d5a20c22e |
@ -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()))
|
||||
}),
|
||||
|
16
src/main.rs
16
src/main.rs
@ -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))
|
||||
},
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user