2021-09-28 23:09:38 +00:00
|
|
|
|
2023-04-23 22:46:47 +00:00
|
|
|
use moa_core::{System, Error, Frequency, Debuggable, MemoryBlock, BusPort, wrap_transmutable};
|
2022-09-25 06:14:03 +00:00
|
|
|
use moa_core::host::Host;
|
2021-10-20 22:53:25 +00:00
|
|
|
|
2022-09-25 06:14:03 +00:00
|
|
|
use moa_m68k::{M68k, M68kType};
|
|
|
|
use moa_peripherals_generic::AtaDevice;
|
|
|
|
use moa_peripherals_motorola::MC68681;
|
2021-10-19 18:33:51 +00:00
|
|
|
|
2021-10-22 04:55:27 +00:00
|
|
|
|
|
|
|
pub fn build_computie<H: Host>(host: &H) -> Result<System, Error> {
|
2023-03-06 04:19:49 +00:00
|
|
|
let mut system = System::default();
|
2021-10-06 23:14:56 +00:00
|
|
|
|
2021-10-28 04:04:24 +00:00
|
|
|
let monitor = MemoryBlock::load("binaries/computie/monitor.bin")?;
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00000000, wrap_transmutable(monitor))?;
|
2021-09-28 23:09:38 +00:00
|
|
|
|
2021-10-03 16:55:20 +00:00
|
|
|
let mut ram = MemoryBlock::new(vec![0; 0x00100000]);
|
2021-10-28 04:04:24 +00:00
|
|
|
ram.load_at(0, "binaries/computie/kernel.bin")?;
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00100000, wrap_transmutable(ram))?;
|
2021-09-28 23:09:38 +00:00
|
|
|
|
2023-03-06 04:19:49 +00:00
|
|
|
let mut ata = AtaDevice::default();
|
2021-10-28 04:04:24 +00:00
|
|
|
ata.load("binaries/computie/disk-with-partition-table.img")?;
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00600000, wrap_transmutable(ata))?;
|
2021-10-04 20:02:58 +00:00
|
|
|
|
2023-03-06 04:19:49 +00:00
|
|
|
let mut serial = MC68681::default();
|
2023-05-04 05:42:24 +00:00
|
|
|
launch_terminal_emulator(serial.port_a.connect(host.add_pty()?)?);
|
|
|
|
launch_slip_connection(serial.port_b.connect(host.add_pty()?)?);
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00700000, wrap_transmutable(serial))?;
|
2021-10-06 23:14:56 +00:00
|
|
|
|
2021-09-30 04:52:38 +00:00
|
|
|
|
2023-04-23 22:46:47 +00:00
|
|
|
let mut cpu = M68k::new(M68kType::MC68010, Frequency::from_hz(10_000_000), BusPort::new(0, 24, 16, system.bus.clone()));
|
2021-10-20 22:53:25 +00:00
|
|
|
|
|
|
|
//cpu.enable_tracing();
|
2021-11-07 04:44:25 +00:00
|
|
|
//cpu.add_breakpoint(0x10781a);
|
2021-10-20 22:53:25 +00:00
|
|
|
//cpu.add_breakpoint(0x10bc9c);
|
|
|
|
//cpu.add_breakpoint(0x106a94);
|
|
|
|
//cpu.add_breakpoint(0x1015b2);
|
|
|
|
//cpu.add_breakpoint(0x103332);
|
|
|
|
//cpu.decoder.dump_disassembly(&mut system, 0x100000, 0x2000);
|
|
|
|
//cpu.decoder.dump_disassembly(&mut system, 0x2ac, 0x200);
|
|
|
|
|
2021-10-30 23:16:09 +00:00
|
|
|
cpu.add_breakpoint(0);
|
|
|
|
|
2021-11-01 23:51:45 +00:00
|
|
|
system.add_interruptable_device("cpu", wrap_transmutable(cpu))?;
|
2021-10-22 04:55:27 +00:00
|
|
|
|
|
|
|
Ok(system)
|
2021-10-20 22:53:25 +00:00
|
|
|
}
|
|
|
|
|
2021-10-22 04:55:27 +00:00
|
|
|
pub fn build_computie_k30<H: Host>(host: &H) -> Result<System, Error> {
|
2023-03-06 04:19:49 +00:00
|
|
|
let mut system = System::default();
|
2021-10-20 22:53:25 +00:00
|
|
|
|
2021-10-28 04:04:24 +00:00
|
|
|
let monitor = MemoryBlock::load("binaries/computie/monitor-68030.bin")?;
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00000000, wrap_transmutable(monitor))?;
|
2021-10-20 22:53:25 +00:00
|
|
|
|
|
|
|
let mut ram = MemoryBlock::new(vec![0; 0x00100000]);
|
2021-10-28 04:04:24 +00:00
|
|
|
ram.load_at(0, "binaries/computie/kernel-68030.bin")?;
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00100000, wrap_transmutable(ram))?;
|
2021-10-20 22:53:25 +00:00
|
|
|
|
2023-03-06 04:19:49 +00:00
|
|
|
let mut ata = AtaDevice::default();
|
2021-10-28 04:04:24 +00:00
|
|
|
ata.load("binaries/computie/disk-with-partition-table.img")?;
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00600000, wrap_transmutable(ata))?;
|
2021-10-20 22:53:25 +00:00
|
|
|
|
2023-03-06 04:19:49 +00:00
|
|
|
let mut serial = MC68681::default();
|
2023-05-04 05:42:24 +00:00
|
|
|
launch_terminal_emulator(serial.port_a.connect(host.add_pty()?)?);
|
|
|
|
//launch_slip_connection(serial.port_b.connect(host.add_pty()?)?);
|
2021-10-23 02:36:05 +00:00
|
|
|
system.add_addressable_device(0x00700000, wrap_transmutable(serial))?;
|
2021-10-20 22:53:25 +00:00
|
|
|
|
|
|
|
|
2023-04-23 22:46:47 +00:00
|
|
|
let cpu = M68k::new(M68kType::MC68030, Frequency::from_hz(10_000_000), BusPort::new(0, 32, 32, system.bus.clone()));
|
Added MUL, DIV, NEG, DBcc, and Scc instructions, and fixed issue with ADD/SUB flags
With ADDA, SUBA, and ADDQ/SUBQ when the target is an address register, the condition
flags should not be changed, but the code was changing them, which caused problems.
I've fixed it by making the ADD/SUB executions check for an address target and
will not update flags in that case. This should only occur when the actual instruction
was an ADDA or ADDQ with an address register target
2021-10-03 04:59:28 +00:00
|
|
|
|
2021-10-06 02:58:22 +00:00
|
|
|
//cpu.enable_tracing();
|
2021-10-08 17:52:15 +00:00
|
|
|
//cpu.add_breakpoint(0x10781a);
|
|
|
|
//cpu.add_breakpoint(0x10bc9c);
|
|
|
|
//cpu.add_breakpoint(0x106a94);
|
2021-10-19 18:33:51 +00:00
|
|
|
//cpu.add_breakpoint(0x1015b2);
|
|
|
|
//cpu.add_breakpoint(0x103332);
|
2021-10-15 18:12:47 +00:00
|
|
|
//cpu.decoder.dump_disassembly(&mut system, 0x100000, 0x2000);
|
2021-10-15 21:37:31 +00:00
|
|
|
//cpu.decoder.dump_disassembly(&mut system, 0x2ac, 0x200);
|
2021-10-02 05:06:53 +00:00
|
|
|
|
2021-11-01 23:51:45 +00:00
|
|
|
system.add_interruptable_device("cpu", wrap_transmutable(cpu))?;
|
2021-10-22 04:55:27 +00:00
|
|
|
|
|
|
|
Ok(system)
|
2021-09-28 23:09:38 +00:00
|
|
|
}
|
|
|
|
|
2021-10-10 00:35:23 +00:00
|
|
|
pub fn launch_terminal_emulator(name: String) {
|
2021-10-19 18:33:51 +00:00
|
|
|
use std::thread;
|
|
|
|
use std::time::Duration;
|
2021-10-10 00:35:23 +00:00
|
|
|
use std::process::Command;
|
|
|
|
|
|
|
|
Command::new("x-terminal-emulator").arg("-e").arg(&format!("pyserial-miniterm {}", name)).spawn().unwrap();
|
2021-10-19 18:33:51 +00:00
|
|
|
thread::sleep(Duration::from_secs(1));
|
2021-10-10 00:35:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn launch_slip_connection(name: String) {
|
|
|
|
use std::process::Command;
|
|
|
|
|
|
|
|
Command::new("sudo").args(["slattach", "-s", "38400", "-p", "slip", &name]).spawn().unwrap();
|
|
|
|
Command::new("sudo").args(["ifconfig", "sl0", "192.168.1.2", "pointopoint", "192.168.1.200", "up"]).status().unwrap();
|
|
|
|
Command::new("sudo").args(["arp", "-Ds", "192.168.1.200", "enp4s0", "pub"]).status().unwrap();
|
|
|
|
Command::new("sudo").args(["iptables", "-A", "FORWARD", "-i", "sl0", "-j", "ACCEPT"]).status().unwrap();
|
|
|
|
Command::new("sudo").args(["iptables", "-A", "FORWARD", "-o", "sl0", "-j", "ACCEPT"]).status().unwrap();
|
|
|
|
Command::new("sudo").args(["sh", "-c", "echo 1 > /proc/sys/net/ipv4/ip_forward"]).status().unwrap();
|
|
|
|
}
|
|
|
|
|