From 0380a7eae9d84ae2720180848d549b06f0ef76ee Mon Sep 17 00:00:00 2001 From: Jaby Date: Wed, 29 May 2024 21:25:52 +0200 Subject: [PATCH] Fix GPU freeze --- src/Library/internal-include/CD/cd_internal.hpp | 1 - src/Library/internal-include/CD/cd_types.hpp | 2 -- src/Library/src/CD/cd.cpp | 17 ++++++++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Library/internal-include/CD/cd_internal.hpp b/src/Library/internal-include/CD/cd_internal.hpp index ad9d2924..95c044a2 100644 --- a/src/Library/internal-include/CD/cd_internal.hpp +++ b/src/Library/internal-include/CD/cd_internal.hpp @@ -63,7 +63,6 @@ namespace JabyEngine { void enable_CDXA(bool double_speed); static void pause() { - CD_IO::PortIndex0::change_to(); Command::send(CD_IO::Command::Pause); } } diff --git a/src/Library/internal-include/CD/cd_types.hpp b/src/Library/internal-include/CD/cd_types.hpp index f3f6aa31..5600a4f2 100644 --- a/src/Library/internal-include/CD/cd_types.hpp +++ b/src/Library/internal-include/CD/cd_types.hpp @@ -29,8 +29,6 @@ namespace JabyEngine { struct XASectorHeader { Header header; SubHeader sub_header; - SubHeader copy_subheader; - uint32_t part_data; }; class SectorBufferAllocator { diff --git a/src/Library/src/CD/cd.cpp b/src/Library/src/CD/cd.cpp index 9a8bd3a5..90581106 100644 --- a/src/Library/src/CD/cd.cpp +++ b/src/Library/src/CD/cd.cpp @@ -87,8 +87,10 @@ namespace JabyEngine { } static void read_sector_to(uint32_t* dst, size_t bytes) { - CD_IO::PortIndex0::change_to(); CD_IO::PortIndex0::Request.write(CD_IO::Request::want_data()); + CD_IO::PortIndex1::change_to(); + CD_IO::Interrupt::ack_extended(CD_IO::PortIndex1::InterruptFlag); + CD_IO::PortIndex0::change_to(); // We only support DMA rn read_sector_dma(dst, bytes); @@ -125,7 +127,7 @@ namespace JabyEngine { CD_IO::PortIndex1::change_to(); const auto cur_irq = CD_IO::Interrupt::get_type(CD_IO::PortIndex1::InterruptFlag); - CD_IO::Interrupt::ack_extended(CD_IO::PortIndex1::InterruptFlag); + CD_IO::PortIndex0::change_to(); cmd_interrupt_bit = bit::clear(cmd_interrupt_bit, cur_irq); @@ -142,6 +144,8 @@ namespace JabyEngine { current_state = State::Done; pause(); } + + goto skip_ack; } else { @@ -172,6 +176,7 @@ namespace JabyEngine { resume_at(cur_cfg.xa.start_time); Command::send(CD_IO::Command::ReadS); } + goto skip_ack; } break; case CD_IO::Interrupt::DiskError: { @@ -179,6 +184,11 @@ namespace JabyEngine { } break; }; } + + CD_IO::PortIndex1::change_to(); + CD_IO::Interrupt::ack_extended(CD_IO::PortIndex1::InterruptFlag); + skip_ack: + CD_IO::PortIndex0::change_to(); // No masking required because we can only write bit 0 - 2 CD_IO::IndexStatus.write(old_status); @@ -193,7 +203,6 @@ namespace JabyEngine { sector_allocator = buffer_allocator; Command::wait_completed(); - CD_IO::PortIndex0::change_to(); Command::send_wait(CD_IO::Command::SetMode, DataSectorMode); send_read_n(cur_cfg.file.cur_lba); @@ -235,7 +244,6 @@ namespace JabyEngine { void enable_CDDA() { Command::wait_completed(); - CD_IO::PortIndex0::change_to(); Command::send_wait(CD_IO::Command::SetMode, AudioSectorMode); } @@ -246,7 +254,6 @@ namespace JabyEngine { const uint8_t mode = XAAudioSectorMode.raw | (double_speed ? DoubleSpeedBit : SingleSpeedBit); Command::wait_completed(); - CD_IO::PortIndex0::change_to(); Command::send_wait(CD_IO::Command::SetMode, mode); } }