From bc3fbeb48dea39d7213fb257a56e35bcacba9e8d Mon Sep 17 00:00:00 2001 From: Maxwell Beck Date: Sat, 28 Dec 2024 19:09:06 -0600 Subject: Use multicore to meet timing --- src/pico1541.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'src/pico1541.c') 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 #include #include +#include #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; } -- cgit 1.4.1