#ifndef __JABYENGINE_CD_IO_HPP__ #define __JABYENGINE_CD_IO_HPP__ #include "ioport.hpp" namespace JabyEngine { namespace CD_IO { enum struct Index { Index0 = 0, Index1 = 1, Index2 = 2, Index3 = 3, }; struct __no_align IndexStatus : public ComplexBitMap { __io_port_inherit_complex_bit_map(IndexStatus); static constexpr auto PortIndex = BitRange::from_to(0, 1); static constexpr auto HasXAFifoData = Bit(2); static constexpr auto IsParameterFifoEmpty = Bit(3); static constexpr auto HasParameterFifoSpace = Bit(4); static constexpr auto HasResponseFifoData = Bit(5); static constexpr auto HasDataFifoData = Bit(6); static constexpr auto IsTransmissionBusy = Bit(7); }; namespace Index0Types { struct __no_align IndexTriplet { // Replace with proper types later union __no_align { const IOPort response_fifo; IOPort command; }; union __no_align { const IOPort data_fifo; IOPort parameter_fifo; }; union __no_align { const IOPort irq_enable; IOPort irq_request; }; }; static_assert(sizeof(IndexTriplet) == 3); } __declare_io_port_global(struct IndexStatus, IndexStatus, 0x1F801800); namespace Helper { template static S& change_to(Index idx) { IndexStatus.write(ComplexBitMap(static_cast(idx))); return *reinterpret_cast(0x1F801801); } } static Index0Types::IndexTriplet& change_to_index0() { return Helper::change_to(Index::Index0); } } } #endif //!__JABYENGINE_CD_IO_HPP__