From 3295a04f071f4663d81b90067711fd7aaaed6963 Mon Sep 17 00:00:00 2001 From: Jaby Date: Wed, 19 Jun 2024 21:17:55 +0200 Subject: [PATCH] Support XEBRA; Slightly --- include/PSX/System/IOPorts/cd_io.hpp | 1 + src/Library/internal-include/CD/cd_types.hpp | 4 ++++ src/Library/src/Audio/CDXA.cpp | 18 +++++++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/PSX/System/IOPorts/cd_io.hpp b/include/PSX/System/IOPorts/cd_io.hpp index be52884a..fbf95f37 100644 --- a/include/PSX/System/IOPorts/cd_io.hpp +++ b/include/PSX/System/IOPorts/cd_io.hpp @@ -165,6 +165,7 @@ namespace JabyEngine { static constexpr Desc Demute{0x0C, Interrupt::Type::Acknowledge}; static constexpr Desc Filter{0x0D, Interrupt::Type::Acknowledge}; static constexpr Desc SetMode{0x0E, Interrupt::Type::Acknowledge}; + static constexpr Desc GetLocL{0x10, Interrupt::Type::Acknowledge}; static constexpr Desc GetLocP{0x11, Interrupt::Type::Acknowledge}; static constexpr Desc GetTN{0x13, Interrupt::Type::Acknowledge}; static constexpr Desc GetTD{0x14, Interrupt::Type::Acknowledge}; diff --git a/src/Library/internal-include/CD/cd_types.hpp b/src/Library/internal-include/CD/cd_types.hpp index 18401420..58d8aa11 100644 --- a/src/Library/internal-include/CD/cd_types.hpp +++ b/src/Library/internal-include/CD/cd_types.hpp @@ -83,6 +83,10 @@ namespace JabyEngine { return BCDTimeStamp::from_time(min, sec, sectors); } + + constexpr bool is_zero() const { + return this->min == 0 && this->sec == 0 && this->sector == 0; + } }; } } diff --git a/src/Library/src/Audio/CDXA.cpp b/src/Library/src/Audio/CDXA.cpp index 393ea802..30e21450 100644 --- a/src/Library/src/Audio/CDXA.cpp +++ b/src/Library/src/Audio/CDXA.cpp @@ -10,6 +10,7 @@ namespace JabyEngine { CD::BCDTimeStamp start_loc; CD::BCDTimeStamp last_loc; bool double_speed; + bool get_loc_functional; //< TODO: Really wanna use that? uint8_t channel; } setting; @@ -25,6 +26,14 @@ namespace JabyEngine { CD::IRQ::resume_at0(setting.start_loc); CD::NewCommand::send(CD_IO::Command::ReadS); } + + else { + if(!setting.get_loc_functional) { + setting.last_loc.min = xa_file.header.minute; + setting.last_loc.sec = xa_file.header.second; + setting.last_loc.sector = xa_file.header.sector; + } + } } break; case CD_IO::Interrupt::DiskError: @@ -34,8 +43,9 @@ namespace JabyEngine { } void play(const volatile AutoLBAEntry* lba, uint8_t rel_lba_idx, uint8_t channel, bool double_speed) { - setting.start_loc = CD::BCDTimeStamp::from(lba[rel_lba_idx].get_lba()); - setting.double_speed = double_speed; + setting.start_loc = CD::BCDTimeStamp::from(lba[rel_lba_idx].get_lba()); + setting.double_speed = double_speed; + setting.get_loc_functional = !CD::get_loc().is_zero(); CD::enable_CDXA(double_speed); //< Activates PortIndex0 set_channel(channel); @@ -56,7 +66,9 @@ namespace JabyEngine { void push_play() { stop(); - setting.last_loc = CD::get_loc(); + if(setting.get_loc_functional) { + setting.last_loc = CD::get_loc(); + } CD::current_state = CD::State::Ready; }