#include <PSX/System/IOPorts/dma_io.hpp>
#include <PSX/System/syscalls.hpp>
#include <PSX/System/IOPorts/interrupt_io.hpp>

namespace JabyEngine {
    namespace boot {
        namespace DMA {
            void setup() {
                static constexpr auto EnableDMA = DMA_IO_Values::DPCR::from(
                    DMA_IO_Values::DPCR::SPU.turn_on(3), DMA_IO_Values::DPCR::GPU.turn_on(3), DMA_IO_Values::DPCR::CDROM.turn_on(3)
                );
                
                DMA_IO::DPCR.write(EnableDMA);
                DMA_IO::DICR.write(DMA_IO_Values::DICR::empty());
                // ACK IRQ
                DMA_IO::DICR.write(DMA_IO::DICR.read());

                SysCall::EnterCriticalSection();
                    Interrupt::disable_irq(Interrupt::DMA);
                    Interrupt::ack_irq(Interrupt::DMA);
                SysCall::ExitCriticalSection();
            }
        }
    }
}