diff --git a/include/PSX/Audio/CDXA.hpp b/include/PSX/Audio/CDXA.hpp index d89a506f..d4506b5d 100644 --- a/include/PSX/Audio/CDXA.hpp +++ b/include/PSX/Audio/CDXA.hpp @@ -3,11 +3,12 @@ namespace JabyEngine { namespace CDXA { - struct CDFile { - uint8_t rel_lba_idx; - }; - - void play(const volatile AutoLBAEntry* lba, const CDFile& file, uint8_t channel); + void play(const volatile AutoLBAEntry* lba, uint8_t rel_lba_idx, uint8_t channel, bool double_speed); void stop(); + + void set_channel(uint8_t channel); + + void push_play(); + void pop_play(); } } \ No newline at end of file diff --git a/include/PSX/System/IOPorts/cd_io.hpp b/include/PSX/System/IOPorts/cd_io.hpp index 021ca914..bb98e61e 100644 --- a/include/PSX/System/IOPorts/cd_io.hpp +++ b/include/PSX/System/IOPorts/cd_io.hpp @@ -157,6 +157,7 @@ namespace JabyEngine { static constexpr Desc ReadN{0x06, Interrupt::Type::DataReady}; static constexpr Desc Pause{0x09, Interrupt::Type::Complete}; static constexpr Desc Init{0x0A, Interrupt::Type::Complete}; + 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 GetLocP{0x11, Interrupt::Type::Acknowledge}; diff --git a/src/Library/internal-include/CD/cd_internal.hpp b/src/Library/internal-include/CD/cd_internal.hpp index e6070ea4..640f8c2f 100644 --- a/src/Library/internal-include/CD/cd_internal.hpp +++ b/src/Library/internal-include/CD/cd_internal.hpp @@ -43,10 +43,10 @@ namespace JabyEngine { } void read_file(AutoLBAEntry file_info, const SectorBufferAllocator& buffer_allocator); + void read_xa(uint32_t lba); void continue_reading(); - void read_n(uint32_t lba); - void read_s(uint32_t lba); + CDTimeStamp get_lock(); void enable_CDDA(); void enable_CDXA(bool double_speed); diff --git a/src/Library/internal-include/CD/cd_types.hpp b/src/Library/internal-include/CD/cd_types.hpp index 287e3748..499fef17 100644 --- a/src/Library/internal-include/CD/cd_types.hpp +++ b/src/Library/internal-include/CD/cd_types.hpp @@ -11,6 +11,8 @@ namespace JabyEngine { Ready = 0, Done = 0, + XAMode, + Reading, BufferFull, Error, diff --git a/src/Library/src/Audio/CDDA.cpp b/src/Library/src/Audio/CDDA.cpp index ed556bf5..79b657fa 100644 --- a/src/Library/src/Audio/CDDA.cpp +++ b/src/Library/src/Audio/CDDA.cpp @@ -43,17 +43,7 @@ namespace JabyEngine { void push_play() { stop(); - CD::Command::wait_completed(); - CD::Command::send_wait(CD_IO::Command::GetLocP); - - const auto track = CD_IO::PortIndex0::ResponseFifo.read().raw; // track number (AAh=Lead-out area) (FFh=unknown, toc, none?) - const auto index = CD_IO::PortIndex0::ResponseFifo.read().raw; // index number (Usually 01h) - const auto mm = CD_IO::PortIndex0::ResponseFifo.read().raw; // minute number within track (00h and up) - const auto ss = CD_IO::PortIndex0::ResponseFifo.read().raw; // second number within track (00h to 59h) - const auto sect = CD_IO::PortIndex0::ResponseFifo.read().raw; // sector number within track (00h to 74h) - last_track.min = CD_IO::PortIndex0::ResponseFifo.read().raw; // minute number on entire disk (00h and up) - last_track.sec = CD_IO::PortIndex0::ResponseFifo.read().raw; // second number on entire disk (00h to 59h) - last_track.sector = CD_IO::PortIndex0::ResponseFifo.read().raw; // sector number on entire disk (00h to 74h) + last_track = CD::get_lock(); } void pop_play() { diff --git a/src/Library/src/Audio/CDXA.cpp b/src/Library/src/Audio/CDXA.cpp index 2c38cd6c..eecf2780 100644 --- a/src/Library/src/Audio/CDXA.cpp +++ b/src/Library/src/Audio/CDXA.cpp @@ -4,17 +4,37 @@ namespace JabyEngine { namespace CDXA { namespace CD = JabyEngine::CD::internal; + + static constexpr uint8_t File = 1; - void play(const volatile AutoLBAEntry* lba, const CDFile& file, uint8_t channel) { - static constexpr uint8_t File = 0; + static CD::CDTimeStamp last_track; - CD::enable_CDXA(false); + void play(const volatile AutoLBAEntry* lba, uint8_t rel_lba_idx, uint8_t channel, bool double_speed) { + + + CD::enable_CDXA(double_speed); CD::Command::send_wait(CD_IO::Command::Filter, File, channel); - CD::read_s(lba[file.rel_lba_idx].get_lba()); + CD::read_xa(lba[rel_lba_idx].get_lba()); } void stop() { CD::pause(); } + + void set_channel(uint8_t channel) { + CD::Command::send(CD_IO::Command::Filter, File, channel); + } + + void push_play() { + /*stop(); + last_track = CD::get_lock();*/ + } + + void pop_play() { + /*CD::Command::wait_completed(); + CD::enable_CDDA(); // < Command waits + CD::Command::send_wait(CD_IO::Command::SetLoc, last_track.min, last_track.sec, last_track.sector); + CD::Command::send(CD_IO::Command::Play);*/ + } } } \ No newline at end of file diff --git a/src/Library/src/BootLoader/cd_boot.cpp b/src/Library/src/BootLoader/cd_boot.cpp index 73cfcf6c..9af68f7a 100644 --- a/src/Library/src/BootLoader/cd_boot.cpp +++ b/src/Library/src/BootLoader/cd_boot.cpp @@ -47,7 +47,7 @@ namespace JabyEngine { __debug_boot_color_at(::JabyEngine::GPU::Color24::Yellow(), DebugX, DebugY, DebugScale); Command::send_wait(CD_IO::PortIndex0::CommandFifo, CD_IO::PortIndex0::ParameterFifo, CD_IO::Command::Init); - // Demute? + Command::send(CD_IO::Command::Demute); } } } diff --git a/src/Library/src/CD/cd.cpp b/src/Library/src/CD/cd.cpp index aa88bc73..7147a5ae 100644 --- a/src/Library/src/CD/cd.cpp +++ b/src/Library/src/CD/cd.cpp @@ -27,11 +27,15 @@ namespace JabyEngine { }; // Requires Index0 - static void read_cd(uint32_t lba, CD_IO::Command::Desc desc) { + static void send_read_cmd(uint32_t lba, CD_IO::Command::Desc desc) { const auto loc = CDTimeStamp::from(lba); Command::send_wait(CD_IO::Command::SetLoc, loc.get_min_cd(), loc.get_sec_cd(), loc.get_sector_cd()); Command::send(desc); + } + + static void send_read_n(uint32_t lba) { + send_read_cmd(lba, CD_IO::Command::ReadN); current_state = State::Reading; } @@ -84,7 +88,9 @@ namespace JabyEngine { cmd_interrupt_bit = bit::clear(cmd_interrupt_bit, cur_irq); - if(!CD_IO::IndexStatus.read().is_set(CD_IO::IndexStatus::HasXAFifoData)) { + if(current_state != State::XAMode) { + printf("Wuff %i (%i)\n", cur_irq, current_state); + switch(cur_irq) { case CD_IO::Interrupt::DataReady: { // Obtain sector content here @@ -144,22 +150,36 @@ namespace JabyEngine { CD_IO::PortIndex0::change_to(); Command::send_wait(CD_IO::Command::SetMode, DataSectorMode); - read_n(cur_lba); + send_read_n(cur_lba); + } + + void read_xa(uint32_t lba) { + send_read_cmd(lba, CD_IO::Command::ReadS); + current_state = State::XAMode; } void continue_reading() { if(current_state == State::BufferFull) { Command::wait_completed(); - read_n(cur_lba); + send_read_n(cur_lba); } } - void read_n(uint32_t lba) { - read_cd(lba, CD_IO::Command::ReadN); - } + CDTimeStamp get_lock() { + Command::wait_completed(); + Command::send_wait(CD_IO::Command::GetLocP); - void read_s(uint32_t lba) { - read_cd(lba, CD_IO::Command::ReadS); + const auto track = CD_IO::PortIndex0::ResponseFifo.read().raw; // track number (AAh=Lead-out area) (FFh=unknown, toc, none?) + const auto index = CD_IO::PortIndex0::ResponseFifo.read().raw; // index number (Usually 01h) + const auto mm = CD_IO::PortIndex0::ResponseFifo.read().raw; // minute number within track (00h and up) + const auto ss = CD_IO::PortIndex0::ResponseFifo.read().raw; // second number within track (00h to 59h) + const auto sect = CD_IO::PortIndex0::ResponseFifo.read().raw; // sector number within track (00h to 74h) + + return CDTimeStamp{ + .min = CD_IO::PortIndex0::ResponseFifo.read().raw, // minute number on entire disk (00h and up) + .sec = CD_IO::PortIndex0::ResponseFifo.read().raw, // second number on entire disk (00h to 59h) + .sector = CD_IO::PortIndex0::ResponseFifo.read().raw, // sector number on entire disk (00h to 74h) + }; } void enable_CDDA() {