diff --git a/include/PSX/GPU/gpu.hpp b/include/PSX/GPU/gpu.hpp index 5952091a..6f026a8f 100644 --- a/include/PSX/GPU/gpu.hpp +++ b/include/PSX/GPU/gpu.hpp @@ -22,11 +22,11 @@ namespace JabyEngine { #endif static void enable() { - GPU_IO::GP1 = *GPU_IO::Command::SetDisplayState(GPU_IO::DisplayState::On); + GPU_IO::GP1 = GPU_IO::Command::SetDisplayState(GPU_IO::DisplayState::On); } static void disable() { - GPU_IO::GP1 = *GPU_IO::Command::SetDisplayState(GPU_IO::DisplayState::Off); + GPU_IO::GP1 = GPU_IO::Command::SetDisplayState(GPU_IO::DisplayState::Off); } }; diff --git a/include/PSX/System/IOPorts/cd_io.hpp b/include/PSX/System/IOPorts/cd_io.hpp index 1f4d0198..9e3ba268 100644 --- a/include/PSX/System/IOPorts/cd_io.hpp +++ b/include/PSX/System/IOPorts/cd_io.hpp @@ -95,7 +95,7 @@ namespace JabyEngine { } static void enable_extended(InterruptEnable_v& port) { - port = *InterruptEnable_t::from(InterruptEnable_t::InterruptTypValue.range_max(), InterruptEnable_t::UnknownIRQ, InterruptEnable_t::CommandStartIRQ); + port = InterruptEnable_t::from(InterruptEnable_t::InterruptTypValue.range_max(), InterruptEnable_t::UnknownIRQ, InterruptEnable_t::CommandStartIRQ); } static Type get_type(const InterruptFlag_v& port) { @@ -107,7 +107,7 @@ namespace JabyEngine { } static void ack_extended(InterruptFlag_v& port) { - port = *InterruptFlag_v::from(InterruptFlag_v::InterruptTypValue.range_max(), InterruptEnable_v::UnknownIRQ, InterruptEnable_v::CommandStartIRQ); + port = InterruptFlag_v::from(InterruptFlag_v::InterruptTypValue.range_max(), InterruptEnable_v::UnknownIRQ, InterruptEnable_v::CommandStartIRQ); } }; diff --git a/include/PSX/System/IOPorts/gpu_io.hpp b/include/PSX/System/IOPorts/gpu_io.hpp index 9e21b3a3..b4ede548 100644 --- a/include/PSX/System/IOPorts/gpu_io.hpp +++ b/include/PSX/System/IOPorts/gpu_io.hpp @@ -163,7 +163,7 @@ namespace JabyEngine { } static constexpr GP1_t DisplayMode(DisplayMode_t mode) { - return {Helper::construct_cmd(0x08, *mode)}; + return {Helper::construct_cmd(0x08, mode)}; } }; diff --git a/include/PSX/System/IOPorts/ioport.hpp b/include/PSX/System/IOPorts/ioport.hpp index 657c6d29..6719a2c2 100644 --- a/include/PSX/System/IOPorts/ioport.hpp +++ b/include/PSX/System/IOPorts/ioport.hpp @@ -47,15 +47,21 @@ namespace JabyEngine { } }; - template - struct NormalValue { - typedef T Value; - }; + namespace IOPort { + struct IOValueType { + template + struct Normal { + typedef T Value; + typedef T UnderlyingValue; + }; - template - struct VolatileValue { - typedef volatile T Value; - }; + template + struct Volatile { + typedef volatile T Value; + typedef T UnderlyingValue; + }; + }; + } #define __declare_new_named_io_port(type, name, adr) \ static inline auto& name = *reinterpret_cast(adr) @@ -69,73 +75,77 @@ namespace JabyEngine { #define __declare_new_io_port_array(name, adr, size) \ static inline auto& name = reinterpret_cast(*reinterpret_cast(adr)) - #define __declare_io_type(name, type, ...) \ - template typename T> \ - struct name##_io_base { \ - T::Value raw_value = 0; \ - typedef name##_io_base Self; \ - \ - __VA_ARGS__ \ - template \ - static constexpr name##_io_base from(const ARGS&...args) { \ - return name##_io_base().set_va(args...); \ - } \ - constexpr name##_io_base& set(IOBitSet bit) { \ - this->raw_value = bit::set(this->raw_value, bit.pos); \ - return *this; \ - } \ - \ - constexpr name##_io_base& set(IOBitUnset bit) { \ - this->raw_value = bit::clear(this->raw_value, bit.pos); \ - return *this; \ - } \ - \ - constexpr name##_io_base& set(IOValueSet bits, type value) { \ - this->raw_value = bit::value::set_normalized(this->raw_value, value, bits.pos, bits.length); \ - return *this; \ - } \ - \ - template \ - constexpr name##_io_base& set(const IOValueSet::IOValueSetPair& value) { \ - this->set(value.first, static_cast(value.second)); \ - return *this; \ - } \ - \ - template \ - constexpr name##_io_base& set_va(const S& head) { \ - return this->set(head); \ - } \ - template \ - constexpr name##_io_base& set_va(const S& head, const ARGS&...tail) { \ - return this->set(head).set_va(tail...); \ - } \ - constexpr type get(IOValueSet bits) const { \ - return bit::value::get_normalized(this->raw_value, bits.pos, bits.length); \ - } \ - \ - \ - constexpr name##_io_base& clear(IOBitSet bit) { \ - this->raw_value = bit::clear(this->raw_value, bit.pos); \ - return *this; \ - } \ - \ - \ - constexpr bool is_set(IOBitSet bit) const { \ - return bit::is_set(this->raw_value, bit.pos); \ - } \ - \ - \ - constexpr void operator=(type value) { \ - this->raw_value = value; \ - } \ - \ - constexpr type operator*() const { \ - return this->raw_value; \ - } \ - }; \ - \ - typedef name##_io_base name##_v; \ - typedef name##_io_base name##_t \ + #define __declare_io_type(name, type, ...) \ + /*We need this type to be a POD sadly*/ \ + template typename T> \ + struct name##_io_base { \ + typedef T::UnderlyingValue UnderlyingValue; \ + typedef name##_io_base Self; \ + \ + T::Value raw_value = 0; \ + \ + __VA_ARGS__ \ + \ + template \ + static constexpr Self from(const ARGS&...args) { \ + return Self().set_va(args...); \ + } \ + \ + constexpr Self& set(IOBitSet bit) { \ + this->raw_value = bit::set(this->raw_value, bit.pos); \ + return *this; \ + } \ + \ + constexpr Self& set(IOBitUnset bit) { \ + this->raw_value = bit::clear(this->raw_value, bit.pos); \ + return *this; \ + } \ + \ + constexpr Self& set(IOValueSet bits, UnderlyingValue value) { \ + this->raw_value = bit::value::set_normalized(this->raw_value, value, bits.pos, bits.length); \ + return *this; \ + } \ + \ + template \ + constexpr Self& set(const IOValueSet::IOValueSetPair& value) { \ + this->set(value.first, static_cast(value.second)); \ + return *this; \ + } \ + \ + template \ + constexpr Self& set_va(const S& head) { \ + return this->set(head); \ + } \ + \ + template \ + constexpr Self& set_va(const S& head, const ARGS&...tail) { \ + return this->set(head).set_va(tail...); \ + } \ + \ + constexpr UnderlyingValue get(IOValueSet bits) const { \ + return bit::value::get_normalized(this->raw_value, bits.pos, bits.length); \ + } \ + \ + constexpr Self& clear(IOBitSet bit) { \ + this->raw_value = bit::clear(this->raw_value, bit.pos); \ + return *this; \ + } \ + \ + constexpr bool is_set(IOBitSet bit) const { \ + return bit::is_set(this->raw_value, bit.pos); \ + } \ + \ + constexpr void operator=(UnderlyingValue value) { \ + this->raw_value = value; \ + } \ + \ + constexpr operator UnderlyingValue() const { \ + return this->raw_value; \ + } \ + }; \ + \ + typedef name##_io_base name##_v; \ + typedef name##_io_base name##_t template struct VolatilePOD { @@ -196,8 +206,8 @@ namespace JabyEngine { } constexpr operator uint32_t() const { - const uint32_t high = *this->high; - const uint32_t low = *this->low; + const uint32_t high = this->high; + const uint32_t low = this->low; return ((high << 16) | low); } diff --git a/include/PSX/System/IOPorts/timer_io.hpp b/include/PSX/System/IOPorts/timer_io.hpp index 8343f70b..3962f3be 100644 --- a/include/PSX/System/IOPorts/timer_io.hpp +++ b/include/PSX/System/IOPorts/timer_io.hpp @@ -47,7 +47,7 @@ namespace JabyEngine { } constexpr void set_mode(CounterMode_t mode) { - this->mode = *mode; + this->mode = mode; } }; diff --git a/src/Library/include/GPU/gpu_internal.hpp b/src/Library/include/GPU/gpu_internal.hpp index 0978f497..9903400b 100644 --- a/src/Library/include/GPU/gpu_internal.hpp +++ b/src/Library/include/GPU/gpu_internal.hpp @@ -14,12 +14,12 @@ namespace JabyEngine { #ifdef JABYENGINE_PAL static constexpr uint16_t FirstVisiblePixelV = 0xA3; - GPU_IO::GP1 = *GPU_IO::Command::DisplayMode(GPU_IO::DisplayMode_t::PAL()); + GPU_IO::GP1 = GPU_IO::Command::DisplayMode(GPU_IO::DisplayMode_t::PAL()); GPU::Screen::set_offset(0, 0); #else static constexpr uint16_t FirstVisiblePixelV = 0x88; - GPU_IO::GP1 = *GPU_IO::Command::DisplayMode(GPU_IO::DisplayMode_t::NTSC()); + GPU_IO::GP1 = GPU_IO::Command::DisplayMode(GPU_IO::DisplayMode_t::NTSC()); GPU::Screen::set_offset(0, 5); //< Random values #endif } @@ -28,18 +28,18 @@ namespace JabyEngine { }; static void set_draw_area(uint16_t x, uint16_t y) { - GPU_IO::GP0 = *GPU_IO::Command::DrawAreaTopLeft(x, y); - GPU_IO::GP0 = *GPU_IO::Command::DrawAreaBottomRight((x + Display::Width), (y + Display::Height)); + GPU_IO::GP0 = GPU_IO::Command::DrawAreaTopLeft(x, y); + GPU_IO::GP0 = GPU_IO::Command::DrawAreaBottomRight((x + Display::Width), (y + Display::Height)); } static void quick_fill_fast(const Color24& color, const PositionU16& pos, const SizeU16& size) { - GPU_IO::GP0 = *GPU_IO::Command::QuickFill(color); - GPU_IO::GP0 = *GPU_IO::Command::TopLeftPosition(pos.x, pos.y); - GPU_IO::GP0 = *GPU_IO::Command::WidthHeight(size.width, size.height); + GPU_IO::GP0 = GPU_IO::Command::QuickFill(color); + GPU_IO::GP0 = GPU_IO::Command::TopLeftPosition(pos.x, pos.y); + GPU_IO::GP0 = GPU_IO::Command::WidthHeight(size.width, size.height); } static void reset_cmd_buffer() { - GPU_IO::GP1 = *GPU_IO::Command::ResetCMDBufer(); + GPU_IO::GP1 = GPU_IO::Command::ResetCMDBufer(); } static void wait_ready_for_CMD() { @@ -57,7 +57,7 @@ namespace JabyEngine { namespace Receive { static void prepare() { - GPU_IO::GP1 = *GPU_IO::Command::DMADirection(GPU_IO::DMADirection::CPU2GPU); + GPU_IO::GP1 = GPU_IO::Command::DMADirection(GPU_IO::DMADirection::CPU2GPU); reset_cmd_buffer(); } @@ -67,16 +67,16 @@ namespace JabyEngine { static void set_dst(const PositionU16& position, const SizeU16& size) { wait_ready_for_CMD(); - GPU_IO::GP0 = *GPU_IO::Command::CPU2VRAM_Blitting(); - GPU_IO::GP0 = *GPU_IO::Command::TopLeftPosition(position.x, position.y); - GPU_IO::GP0 = *GPU_IO::Command::WidthHeight(size.width, size.height); + GPU_IO::GP0 = GPU_IO::Command::CPU2VRAM_Blitting(); + GPU_IO::GP0 = GPU_IO::Command::TopLeftPosition(position.x, position.y); + GPU_IO::GP0 = GPU_IO::Command::WidthHeight(size.width, size.height); } static void start(uint16_t blockCount, uint16_t wordsPerBlock = 0x10) { typedef DMA_IO::BCR_t::SyncMode1 SyncMode1; - DMA_IO::GPU.block_ctrl = *DMA_IO::BCR_t::from(SyncMode1::BlockSize.with(wordsPerBlock), SyncMode1::BlockAmount.with(blockCount)); - DMA_IO::GPU.channel_ctrl = *DMA_IO::CHCHR_t::StartGPUReceive(); + DMA_IO::GPU.block_ctrl = DMA_IO::BCR_t::from(SyncMode1::BlockSize.with(wordsPerBlock), SyncMode1::BlockAmount.with(blockCount)); + DMA_IO::GPU.channel_ctrl = DMA_IO::CHCHR_t::StartGPUReceive(); } } } diff --git a/src/Library/src/BootLoader/gpu_boot.cpp b/src/Library/src/BootLoader/gpu_boot.cpp index 064961f8..c682a2b6 100644 --- a/src/Library/src/BootLoader/gpu_boot.cpp +++ b/src/Library/src/BootLoader/gpu_boot.cpp @@ -49,7 +49,7 @@ namespace JabyEngine { } void setup() { - GPU_IO::GP1 = *GPU_IO::Command::Reset(); + GPU_IO::GP1 = GPU_IO::Command::Reset(); internal::Screen::configurate(); internal::Screen::exchange_buffer_and_display(); diff --git a/src/Library/src/BootLoader/spu_boot.cpp b/src/Library/src/BootLoader/spu_boot.cpp index b3f779b4..bff3a1d8 100644 --- a/src/Library/src/BootLoader/spu_boot.cpp +++ b/src/Library/src/BootLoader/spu_boot.cpp @@ -11,8 +11,8 @@ namespace JabyEngine { static void clear_main_volume() { static constexpr auto StartVol = SweepVolume_t::from(SweepVolume_t::VolumeEnable, SweepVolume_t::Volume.with(static_cast(I16_MAX >> 2))); - MainVolume::Left = *StartVol; - MainVolume::Right = *StartVol; + MainVolume::Left = StartVol; + MainVolume::Right = StartVol; } static void clear_cd_and_ext_audio_volume() { @@ -29,11 +29,11 @@ namespace JabyEngine { static void clear_voice() { for(auto& voice : SPU_IO::Voice) { - voice.volumeLeft = *SweepVolume_t(); - voice.volumeRight = *SweepVolume_t(); - voice.sampleRate = *SampleRate_t(); - voice.ad = *AD_t(); - voice.sr = *SR_t(); + voice.volumeLeft = SweepVolume_t(); + voice.volumeRight = SweepVolume_t(); + voice.sampleRate = SampleRate_t(); + voice.ad = AD_t(); + voice.sr = SR_t(); voice.currentVolume = 0; voice.adr = 0x200; @@ -42,12 +42,12 @@ namespace JabyEngine { } static void clear_pmon() { - SPU_IO::PMON = *PMON_t(); + SPU_IO::PMON = PMON_t(); } static void clear_noise_and_echo() { - SPU_IO::NON = *NON_t(); - SPU_IO::EON = *EON_t(); + SPU_IO::NON = NON_t(); + SPU_IO::EON = EON_t(); } static void clear_reverb() { @@ -59,7 +59,7 @@ namespace JabyEngine { static void setup_control_register() { static constexpr auto SetupValue = ControlRegister_t::from(ControlRegister_t::Enable, ControlRegister_t::Unmute, ControlRegister_t::CDAudioEnable); - SPU_IO::ControlRegister = *SetupValue; + SPU_IO::ControlRegister = SetupValue; } static void setup_data_transfer_control() { diff --git a/src/Library/src/BootLoader/start_boot.cpp b/src/Library/src/BootLoader/start_boot.cpp index 625ed582..1745006c 100644 --- a/src/Library/src/BootLoader/start_boot.cpp +++ b/src/Library/src/BootLoader/start_boot.cpp @@ -9,8 +9,8 @@ namespace JabyEngine { namespace boot { namespace Start { static void enable_DMA() { - const auto dpcr = DMA_IO::DPCR_t(*DMA_IO::DPCR).set(DMA_IO::DPCR_t::SPUEnable).set(DMA_IO::DPCR_t::GPUEnable); - DMA_IO::DPCR = *dpcr; + const auto dpcr = DMA_IO::DPCR_t(DMA_IO::DPCR).set(DMA_IO::DPCR_t::SPUEnable).set(DMA_IO::DPCR_t::GPUEnable); + DMA_IO::DPCR = dpcr; } JabyEngine::NextRoutine setup() { diff --git a/src/Library/src/CD/cd.cpp b/src/Library/src/CD/cd.cpp index e015bda8..d6497a07 100644 --- a/src/Library/src/CD/cd.cpp +++ b/src/Library/src/CD/cd.cpp @@ -31,7 +31,7 @@ namespace JabyEngine { }; if(Interrupt::is_irq(Interrupt::CDROM)) { - const uint8_t old_idx = (*CD_IO::IndexStatus & 0x3); + const uint8_t old_idx = (CD_IO::IndexStatus & 0x3); CD_IO::PortIndex1::change_to(); const auto cur_irq = CD_IO::Interrupt::get_type(CD_IO::PortIndex1::InterruptFlag); diff --git a/src/Library/src/GPU/gpu.cpp b/src/Library/src/GPU/gpu.cpp index 6474edf0..de902fd1 100644 --- a/src/Library/src/GPU/gpu.cpp +++ b/src/Library/src/GPU/gpu.cpp @@ -16,7 +16,7 @@ namespace JabyEngine { void Screen :: exchange_buffer_and_display() { GPU::internal::set_draw_area(0, (Display::Height*PublicScreenClass::CurrentDisplayAreaID)); PublicScreenClass::CurrentDisplayAreaID ^= 1; - GPU_IO::GP1 = *GPU_IO::Command::DisplayArea(0, (Display::Height*PublicScreenClass::CurrentDisplayAreaID)); + GPU_IO::GP1 = GPU_IO::Command::DisplayArea(0, (Display::Height*PublicScreenClass::CurrentDisplayAreaID)); } } @@ -25,13 +25,13 @@ namespace JabyEngine { x += 78; y += 43; - GPU_IO::GP1 = *GPU_IO::Command::HorizontalDisplayRange((x << 3), (x + Display::Width) << 3); - GPU_IO::GP1 = *GPU_IO::Command::VerticalDisplayRange(y, y + Display::Height); + GPU_IO::GP1 = GPU_IO::Command::HorizontalDisplayRange((x << 3), (x + Display::Width) << 3); + GPU_IO::GP1 = GPU_IO::Command::VerticalDisplayRange(y, y + Display::Height); } #else void Screen :: set_offset(uint16_t x, uint16_t y) { - GPU_IO::GP1 = *GPU_IO::Command::HorizontalDisplayRange(x, (x + Display::Width*8)); - GPU_IO::GP1 = *GPU_IO::Command::VerticalDisplayRange(y - (ScanlinesV/2), y + (ScanlinesV/2)); + GPU_IO::GP1 = GPU_IO::Command::HorizontalDisplayRange(x, (x + Display::Width*8)); + GPU_IO::GP1 = GPU_IO::Command::VerticalDisplayRange(y - (ScanlinesV/2), y + (ScanlinesV/2)); } #endif //USE_NO$PSX }