#pragma once #include "cd_types.hpp" namespace JabyEngine { namespace CD { namespace internal { extern State current_state; extern uint8_t cmd_interrupt_bit; struct Command { static void wait_completed() { while(const_cast(cmd_interrupt_bit) > 0); } template static void send(IOPort& cmd_fifo, IOPort& parameter_fifo, CD_IO::Command::Desc cmd, ARGS...args) { while(CD_IO::IndexStatus.read().is_set(CD_IO::IndexStatus::IsTransmissionBusy)); ((parameter_fifo.write(CD_IO::ParameterFifo{args})),...); cmd_fifo.write(CD_IO::CommandFifo {cmd.id}); cmd_interrupt_bit = bit::set(0, cmd.complete_irq); } template static void send(CD_IO::Command::Desc cmd, ARGS...args) { send(T::CommandFifo, T::ParameterFifo, cmd, args...); } template static void send_wait(IOPort& cmd_fifo, IOPort& parameter_fifo, CD_IO::Command::Desc cmd, ARGS...args) { send(cmd_fifo, parameter_fifo, cmd, args...); wait_completed(); } template static void send_wait(CD_IO::Command::Desc cmd, ARGS...args) { send_wait(T::CommandFifo, T::ParameterFifo, cmd, args...); } }; static State read_current_state() { return const_cast(current_state); } void read_file(AutoLBAEntry file_info, const SectorBufferAllocator& buffer_allocator); void read_xa(uint32_t lba); void continue_reading(); CDTimeStamp get_lock(); void enable_CDDA(); void enable_CDXA(bool double_speed); static void pause() { CD_IO::PortIndex0::change_to(); Command::send(CD_IO::Command::Pause); } } } }