diff --git a/include/PSX/System/IOPorts/cd_io.hpp b/include/PSX/System/IOPorts/cd_io.hpp index c95c1d7a..19f46d5a 100644 --- a/include/PSX/System/IOPorts/cd_io.hpp +++ b/include/PSX/System/IOPorts/cd_io.hpp @@ -31,6 +31,7 @@ namespace JabyEngine { struct InterruptEnable : public ComplexBitMap { static constexpr auto InterruptTypValue = BitRange::from_to(0, 2); + static constexpr auto InterruptExtended = BitRange::from_to(0, 4); static constexpr auto UnknownIRQ = Bit(3); static constexpr auto CommandStartIRQ = Bit(4); }; @@ -57,7 +58,11 @@ namespace JabyEngine { }; struct Interrupt { - static void enable_all(VolatileBitMapPOD& port) { + static void enable(VolatileBitMapPOD& port) { + port.write(InterruptEnable::InterruptTypValue.max()); + } + + static void enable_extended(VolatileBitMapPOD& port) { port.write({InterruptEnable::with(InterruptEnable::InterruptTypValue.max(), InterruptEnable::UnknownIRQ, InterruptEnable::CommandStartIRQ)}); } @@ -68,6 +73,10 @@ namespace JabyEngine { static void ack(VolatileBitMapPOD& port) { port.write(InterruptFlag::InterruptTypValue.max()); } + + static void ack_extended(VolatileBitMapPOD& port) { + port.write({InterruptFlag::with(InterruptFlag::InterruptTypValue.max(), InterruptEnable::UnknownIRQ, InterruptEnable::CommandStartIRQ)}); + } }; __declare_io_port_global(IndexStatus_t, IndexStatus, 0x1F801800); diff --git a/include/PSX/System/IOPorts/memory_io.hpp b/include/PSX/System/IOPorts/memory_io.hpp new file mode 100644 index 00000000..104b8d5f --- /dev/null +++ b/include/PSX/System/IOPorts/memory_io.hpp @@ -0,0 +1,24 @@ +#ifndef __JABYENGINE_MEMORY_IO_HPP__ +#define __JABYENGINE_MEMORY_IO_HPP__ +#include "ioport.hpp" + +namespace JabyEngine { + namespace Memory_IO { + struct COM_DELAY { + typedef uint32_t Type; + + static constexpr uint32_t SetupValue = 0x1325; + }; + + struct CD_DELAY { + typedef uint32_t Type; + + static constexpr uint32_t SetupValue = 0x20943; + }; + + __declare_io_port_global_simple(COM_DELAY::Type, COM_DELAY, 0x1F801020); + __declare_io_port_global_simple(CD_DELAY::Type, CD_DELAY, 0x1F801018); + } +} + +#endif //!__JABYENGINE_MEMORY_IO_HPP__ \ 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 a03e9c6e..e4c44fb7 100644 --- a/src/Library/src/BootLoader/cd_boot.cpp +++ b/src/Library/src/BootLoader/cd_boot.cpp @@ -1,13 +1,26 @@ #include "../../include/BootLoader/boot_loader.hpp" #include +#include +#include +#include namespace JabyEngine { namespace boot { namespace CD { void setup() { - CD_IO::PortIndex0::change_to(); - CD_IO::PortIndex0::DataFifo.read(); - CD_IO::PortIndex0::DataFifo16.read(); + __syscall_EnterCriticalSection(); + Memory_IO::COM_DELAY.write(Memory_IO::COM_DELAY::SetupValue); + Memory_IO::CD_DELAY.write(Memory_IO::CD_DELAY::SetupValue); + + //Equeue Callback? + + CD_IO::PortIndex1::change_to(); + CD_IO::Interrupt::ack_extended(CD_IO::PortIndex1::InterruptFlagRegister); + CD_IO::Interrupt::enable(CD_IO::PortIndex1::InterruptEnableRegister); + + Interrupt::ack_irq(Interrupt::CDROM); + Interrupt::enable_irq(Interrupt::CDROM); + __syscall_ExitCriticalSection(); } } } diff --git a/src/Library/src/BootLoader/start_boot.cpp b/src/Library/src/BootLoader/start_boot.cpp index 7638f1ce..6d6e183e 100644 --- a/src/Library/src/BootLoader/start_boot.cpp +++ b/src/Library/src/BootLoader/start_boot.cpp @@ -15,6 +15,8 @@ namespace JabyEngine { enable_DMA(); SPU::stop_voices(); + + CD::setup(); Timer::setup(); const auto start = HighResTime::get_time_stamp();