summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxwell Beck <max@rastertail.net>2024-12-30 17:44:29 -0600
committerMaxwell Beck <max@rastertail.net>2024-12-30 17:44:29 -0600
commitd48c0668da0f319b57b1fb47f93843a851d49339 (patch)
tree88c8df53e4bee3667b28f4b2a0d6ca993ee7039e /src
parent2a3984933e9b39cd37a136dd2a95645bff0d3774 (diff)
Fix byte ready to CPU overflow flag sync
Diffstat (limited to 'src')
-rw-r--r--src/drive.c21
-rw-r--r--src/drive.h3
-rw-r--r--src/pico1541.c16
3 files changed, 21 insertions, 19 deletions
diff --git a/src/drive.c b/src/drive.c
index 64b765a..5bc2e3b 100644
--- a/src/drive.c
+++ b/src/drive.c
@@ -47,7 +47,7 @@ void drive_init(drive_t *drive) {
drive->current_idx = 0;
drive->lookahead_idx = 0;
- drive_cycle(drive, 0, false);
+ drive_cycle(drive);
}
void drive_step_up(drive_t *drive) {
@@ -68,16 +68,19 @@ void drive_step_down(drive_t *drive) {
}
}
-bool drive_cycle(drive_t *drive, uint8_t cycles, bool advance) {
+bool drive_advance(drive_t *drive, uint8_t cycles) {
bool byte_ready = false;
- if (advance) {
- for (uint8_t i = 0; i < cycles; i++) {
- uint8_t j = (i + drive->current_idx) & (DRIVE_LOOKAHEAD - 1);
- byte_ready |= drive->byte_ready[j];
- }
- drive->current_idx = (drive->current_idx + cycles) & (DRIVE_LOOKAHEAD - 1);
+
+ for (uint8_t i = 0; i < cycles; i++) {
+ uint8_t j = (i + drive->current_idx) & (DRIVE_LOOKAHEAD - 1);
+ byte_ready |= drive->byte_ready[j];
}
+ drive->current_idx = (drive->current_idx + cycles) & (DRIVE_LOOKAHEAD - 1);
+ return byte_ready;
+}
+
+void drive_cycle(drive_t *drive) {
while (drive->lookahead_idx != ((drive->current_idx - 1) & (DRIVE_LOOKAHEAD - 1))) {
uint8_t j = (drive->lookahead_idx + 1) & (DRIVE_LOOKAHEAD - 1);
uint8_t timer_next = drive->timer + BITRATE_PER_TRACK[drive->track];
@@ -194,6 +197,4 @@ bool drive_cycle(drive_t *drive, uint8_t cycles, bool advance) {
drive->lookahead_idx = j;
drive->timer = timer_next;
}
-
- return byte_ready;
}
diff --git a/src/drive.h b/src/drive.h
index e131c5c..aa72f60 100644
--- a/src/drive.h
+++ b/src/drive.h
@@ -42,6 +42,7 @@ typedef struct drive_s {
void drive_init(drive_t *drive);
void drive_step_up(drive_t *drive);
void drive_step_down(drive_t *drive);
-bool drive_cycle(drive_t *drive, uint8_t cycles, bool advance);
+bool drive_advance(drive_t *drive, uint8_t cycles);
+void drive_cycle(drive_t *drive);
#endif \ No newline at end of file
diff --git a/src/pico1541.c b/src/pico1541.c
index 3489fee..fec76a3 100644
--- a/src/pico1541.c
+++ b/src/pico1541.c
@@ -18,7 +18,7 @@ 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_Bloodsuckers_StillRising_BSK_StillRising_disk1_d64_start[174848];
+extern uint8_t _binary__Users_max_Downloads_MementoMori_GP_MementoMori_GP_Disk1_d64_start[174848];
uint32_t ts;
cpu_t cpu;
@@ -138,14 +138,11 @@ 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;
+ drive.image = _binary__Users_max_Downloads_MementoMori_GP_MementoMori_GP_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;
- }
+ while (multicore_fifo_pop_blocking_inline()) {
+ drive_cycle(&drive);
}
}
@@ -192,7 +189,10 @@ int main() {
}
uint8_t cycles = cpu_step(&cpu);
- multicore_fifo_push_blocking_inline((uint32_t)cycles);
+ if (drive_advance(&drive, cycles) && (via2.pcr & 0b1110) == 0b1110) {
+ cpu.flags |= 1 << FLAG_V_BIT;
+ }
+ multicore_fifo_push_blocking_inline(1);
via_cycle(&via1, cycles);
via_cycle(&via2, cycles);