summary refs log tree commit diff
path: root/src/pico1541.c
diff options
context:
space:
mode:
authorMaxwell Beck <max@rastertail.net>2024-12-28 19:09:06 -0600
committerMaxwell Beck <max@rastertail.net>2024-12-28 19:09:06 -0600
commitbc3fbeb48dea39d7213fb257a56e35bcacba9e8d (patch)
tree9b0f0bbad177e4f73c8a6074e79b5a8f0332b63a /src/pico1541.c
parentdbe367d5a302300e598187eaf4c369eb06f5ec48 (diff)
Use multicore to meet timing
Diffstat (limited to 'src/pico1541.c')
-rw-r--r--src/pico1541.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/pico1541.c b/src/pico1541.c
index f76d8c3..266bfd7 100644
--- a/src/pico1541.c
+++ b/src/pico1541.c
@@ -1,6 +1,7 @@
 #include <hardware/clocks.h>
 #include <hardware/gpio.h>
 #include <hardware/timer.h>
+#include <pico/multicore.h>
 
 #include "6502.h"
 #include "6522.h"
@@ -16,14 +17,14 @@ const uint8_t DEVICE = 8;
 
 static uint8_t ram[2048];
 extern uint8_t _binary__Users_max_Documents_c64_roms_dos1541_start[16384];
-extern uint8_t _binary__Users_max_Downloads_blackbird_1_2_Blackbird_1_2_d64_start[174848];
-// extern uint8_t _binary__Users_max_Downloads_3sira_still_human_by_arise_3sira_by_arise_A_d64_start[174848];
+// extern uint8_t _binary__Users_max_Downloads_blackbird_1_2_Blackbird_1_2_d64_start[174848];
+extern uint8_t _binary__Users_max_Downloads_Bloodsuckers_StillRising_BSK_StillRising_disk1_d64_start[174848];
 
-static uint32_t ts;
-static cpu_t cpu;
+uint32_t ts;
+cpu_t cpu;
 static via_t via1;
 static via_t via2;
-static drive_t drive;
+drive_t drive;
 
 int8_t track_step;
 
@@ -135,8 +136,22 @@ void atn_irq_callback(uint pin, uint32_t flags) {
 	}
 }
 
+void drive_thread() {
+	drive_init(&drive);
+	drive.image = _binary__Users_max_Downloads_Bloodsuckers_StillRising_BSK_StillRising_disk1_d64_start;
+	multicore_fifo_push_blocking(1);
+
+	while (true) {
+		uint32_t cycles = multicore_fifo_pop_blocking_inline();
+		if (drive_cycle(&drive, cycles, true) && (via2.pcr & 0b1110) == 0b1110) {
+			cpu.flags |= 1 << FLAG_V_BIT;
+		}
+	}
+}
+
 int main() {
 	set_sys_clock_khz(250000, true);
+	multicore_launch_core1(drive_thread);
 
 	gpio_init(GPIO_CLK);
 	gpio_init(GPIO_DATA);
@@ -163,8 +178,7 @@ int main() {
 	gpio_set_irq_enabled_with_callback(GPIO_ATN, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &atn_irq_callback);
 
 	track_step = 0;
-	drive_init(&drive);
-	drive.image = _binary__Users_max_Downloads_blackbird_1_2_Blackbird_1_2_d64_start;
+	multicore_fifo_pop_blocking();
 
 	cpu_reset(&cpu);
 	via_init(&via1);
@@ -173,25 +187,20 @@ int main() {
 	ts = time_us_32();
 	uint16_t osc2 = 0xffff;
 	while (!cpu.jammed) {
-		if (ts + 100 < time_us_32()) {
+		if (ts < time_us_32()) {
 			break;
 		}
 
 		uint8_t cycles = cpu_step(&cpu);
+		multicore_fifo_push_blocking_inline((uint32_t)cycles);
 
 		via_cycle(&via1, cycles);
 		via_cycle(&via2, cycles);
 		cpu.irq = via_irq(&via1) | via_irq(&via2);
 
-		if (drive_cycle(&drive, cycles, true) && (via2.pcr & 0b1110) == 0b1110) {
-			cpu.flags |= 1 << FLAG_V_BIT;
-		}
-
 		ts += cycles;
 		while (ts > time_us_32()) {}
 	}
 
-	gpio_put(GPIO_LED, 1);
-
 	return 0;
 }