moa/emulator/systems/macintosh/src/system.rs
transistor 7c279613cc Moved AddressRepeater to core, and renamed AddressAdapter
AddressRepeater now takes the range it should repeat over, which only
really affects its reported size.

AddressAdapter is now AddressRightShifter, which is literally the operation
it performs, where the input is still the bits to shift the address right by
2022-10-01 21:01:56 -07:00

129 lines
5.0 KiB
Rust

use moa_core::{System, Error, MemoryBlock, BusPort, Debuggable, wrap_transmutable};
use moa_core::host::Host;
use moa_m68k::{M68k, M68kType};
use crate::peripherals::video::MacVideo;
use crate::peripherals::mainboard::Mainboard;
pub fn build_macintosh_512k<H: Host>(host: &mut H) -> Result<System, Error> {
let mut system = System::new();
/*
use crate::peripherals::mos6522::Mos6522;
use crate::peripherals::z8530::Z8530;
use crate::peripherals::macintosh::iwm::IWM;
let mut ram = MemoryBlock::new(vec![0; 0x00100000]);
ram.load_at(0, "binaries/macintosh/Macintosh 128k.rom")?;
let boxed_ram = wrap_transmutable(ram);
//system.add_addressable_device(0x00000000, boxed_ram.clone())?;
//system.add_addressable_device(0x00600000, boxed_ram)?;
let mut rom = MemoryBlock::load("binaries/macintosh/Macintosh 128k.rom")?;
rom.read_only();
let boxed_rom = wrap_transmutable(rom);
//system.add_addressable_device(0x00400000, wrap_transmutable(rom))?;
// The ROM accesses 0xf80000 to look for the debugger, and then accesses 0xf0000 which is the phase area
let misc = MemoryBlock::new(vec![0; 0x100000]);
system.add_addressable_device(0x00f00000, wrap_transmutable(misc))?;
let video = MacVideo::create(host)?;
system.add_device("video", wrap_transmutable(video)).unwrap();
let scc1 = Z8530::new();
//launch_terminal_emulator(serial.port_a.connect(Box::new(SimplePty::open()?))?);
//launch_slip_connection(serial.port_b.connect(Box::new(SimplePty::open()?))?);
system.add_addressable_device(0x009FFFF0, wrap_transmutable(scc1))?;
let scc2 = Z8530::new();
//launch_terminal_emulator(serial.port_a.connect(Box::new(SimplePty::open()?))?);
//launch_slip_connection(serial.port_b.connect(Box::new(SimplePty::open()?))?);
system.add_addressable_device(0x00BFFFF0, wrap_transmutable(scc2))?;
let iwm = IWM::new();
let adapter = AddressRightShifter::new(wrap_transmutable(iwm), 9);
system.add_addressable_device(0x00DFE1FF, wrap_transmutable(adapter))?;
//let via = wrap_transmutable(Mos6522::new());
let mainboard = Mainboard::new(boxed_ram, boxed_rom);
system.add_addressable_device(0x00000000, mainboard.bus.clone())?;
let mainboard_boxed = wrap_transmutable(mainboard);
system.add_device("via", mainboard_boxed.clone())?;
let adapter = AddressRightShifter::new(mainboard_boxed, 9);
system.add_addressable_device(0x00EFE000, wrap_transmutable(adapter))?;
*/
let ram = MemoryBlock::new(vec![0; 0x00080000]);
let mut rom = MemoryBlock::load("binaries/macintosh/Macintosh 512k.rom")?;
rom.read_only();
let video = MacVideo::create(host)?;
system.add_device("video", wrap_transmutable(video)).unwrap();
let mainboard = Mainboard::create(wrap_transmutable(ram), wrap_transmutable(rom))?;
system.add_addressable_device(0x00000000, wrap_transmutable(mainboard))?;
let mut cpu = M68k::new(M68kType::MC68000, 7_833_600, BusPort::new(0, 24, 16, system.bus.clone()));
//cpu.enable_tracing();
//system.enable_debugging();
//cpu.add_breakpoint(0x10781a);
//cpu.add_breakpoint(0x40002a);
//cpu.add_breakpoint(0x400694); // Ram Test
//cpu.add_breakpoint(0x400170); // Failed, loops infinitely
cpu.add_breakpoint(0x4000f4); // Failed, should show the sad mac
//cpu.add_breakpoint(0x4006ae);
//cpu.add_breakpoint(0x400706);
//cpu.add_breakpoint(0x400722); // end of ram test
//cpu.add_breakpoint(0x40026c); // System Initialization
//cpu.add_breakpoint(0x402adc);
//cpu.add_breakpoint(0x40078e);
//cpu.add_breakpoint(0x40080a);
//cpu.add_breakpoint(0x400448);
//cpu.add_breakpoint(0x40040a); // InitROMCore (set up trap dispatch table)
//cpu.add_breakpoint(0x402acc); // InitMem
//cpu.add_breakpoint(0x40045c);
//cpu.add_breakpoint(0x400614); // Start of InitIO
cpu.add_breakpoint(0x40062a); // Loop in InitIO
//cpu.add_breakpoint(0x400648);
//cpu.add_breakpoint(0x40064c);
//cpu.add_breakpoint(0x4014a6); // DrvrInstall
//cpu.add_breakpoint(0x401262); // $A000 handler, which is where the rom write happens
//cpu.add_breakpoint(0x4012ec);
//cpu.add_breakpoint(0x40133a);
// Issue of writing to 0x100000 which doesn't exist
cpu.add_breakpoint(0x400d62);
cpu.add_breakpoint(0x400464); // Boot Screen
/*
use crate::devices::Addressable;
use crate::cpus::m68k::state::M68kState;
for i in 0..=65535 {
cpu.state = M68kState::new();
system.get_bus().write_beu16(0, i).unwrap();
match cpu.decode_next(&system) {
Ok(()) => { println!("TestCase {{ cpu: M68kType::MC68000, data: &[{:#06X}]\tins: Some({:?}) }},", i, cpu.decoder.instruction); },
Err(_) => { println!("TestCase {{ cpu: M68kType::MC68000, data: &[{:#06X}]\tins: None }},", i); },
}
}
panic!("");
*/
system.add_interruptable_device("cpu", wrap_transmutable(cpu))?;
Ok(system)
}