1
0
mirror of https://github.com/livingcomputermuseum/UniBone.git synced 2026-05-01 05:49:51 +00:00

Rewrote lower-level DMA and IRQ handling: DMA and IRQ requests are now queued and will run to completion on their own

without help from the device code (just call request_DMA and when it returns the DMA transfer is complete.)  Fixed
request_DMA to chunk DMA transfers larger than 1024 bytes to avoid overrunning the mailbox's shared memory.  Fixed
concurrency issues with DMA requests -- a race condition could cause DMA request data to get clobbered.

RT-11 now boots, MSCP behavior is now very reliable.
This commit is contained in:
Josh Dersch
2019-05-04 03:30:26 +02:00
parent e0aabf2197
commit 8eff2a4e10
10 changed files with 484 additions and 298 deletions

View File

@@ -72,10 +72,10 @@ void menus_c::menu_devices(void) {
unibus->emulation_logic_start(); // PRU is active UNIBUS node
// 2 demo controller
demo_io_c demo_io;
//demo_io_c demo_io;
//demo_regs_c demo_regs; // mem at 160000: RT11 crashes?
cpu_c cpu;
// cpu_c cpu;
// create RL11 + drives
RL11_c RL11; // instantiates also 4 RL01/02 drives
@@ -89,8 +89,8 @@ void menus_c::menu_devices(void) {
// Create UDA50
uda_c UDA50;
demo_io.install();
demo_io.worker_start();
// demo_io.install();
//demo_io.worker_start();
//demo_regs.install();
//demo_regs.worker_start();
@@ -105,8 +105,8 @@ void menus_c::menu_devices(void) {
UDA50.install();
UDA50.worker_start();
cpu.install();
cpu.worker_start();
// cpu.install();
// cpu.worker_start();
while (!ready) {
@@ -337,24 +337,24 @@ void menus_c::menu_devices(void) {
cout << "Error : " << e.what() << "\n";
}
} // ready
cpu.worker_stop();
cpu.uninstall();
// cpu.worker_stop();
// cpu.uninstall();
RL11.worker_stop();
RL11.disconnect_from_panel();
RL11.uninstall();
//RL11.worker_stop();
//RL11.disconnect_from_panel();
//RL11.uninstall();
RK05.worker_stop();
RK05.uninstall();
UDA50.worker_stop();
UDA50.uninstall();
// UDA50.worker_stop();
// UDA50.uninstall();
//demo_regs.worker_stop();
//demo_regs.uninstall();
demo_io.worker_stop();
demo_io.uninstall();
// demo_io.worker_stop();
// demo_io.uninstall();
if (unibus->arbitration_active)
unibus->emulation_logic_stop(); // undo