diff --git a/include/PSX/GPU/GPU_Types.hpp b/include/PSX/GPU/GPU_Types.hpp new file mode 100644 index 00000000..fc62f09d --- /dev/null +++ b/include/PSX/GPU/GPU_Types.hpp @@ -0,0 +1,29 @@ +#ifndef __JABYENGINE_GPU_TYPES_HPP__ +#define __JABYENGINE_GPU_TYPES_HPP__ +#include "../jabyengine_defines.h" + +namespace GPU { + struct __no_align Color3 { + uint8_t blue; + uint8_t green; + uint8_t red; + + static constexpr Color3 black() { + return {0x0, 0x0, 0x0}; + } + + static constexpr Color3 rgb(uint8_t r, uint8_t g, uint8_t b) { + return {b, g, r}; + } + }; + + struct __no_align Color { + uint8_t reserved; + Color3 color_data; + + constexpr Color(Color3 color) : reserved(0), color_data(color) { + } + }; +} + +#endif //!__JABYENGINE_GPU_TYPES_HPP__ \ No newline at end of file diff --git a/include/PSX/System/IOPorts/DMA_IO.hpp b/include/PSX/System/IOPorts/DMA_IO.hpp index dec0cf13..e5fc47e1 100644 --- a/include/PSX/System/IOPorts/DMA_IO.hpp +++ b/include/PSX/System/IOPorts/DMA_IO.hpp @@ -7,20 +7,20 @@ namespace DMA { struct __no_align MADR : public ComplexBitMap { __io_port_inherit_complex_bit_map(MADR); - static constexpr BitRange MemoryAdr = BitRange::from_to(0, 23); + static constexpr auto MemoryAdr = BitRange::from_to(0, 23); }; struct __no_align BCR : public ComplexBitMap { __io_port_inherit_complex_bit_map(BCR); struct __no_align SyncMode0 { - static constexpr BitRange NumberOfWords = BitRange::from_to(0, 15); - static constexpr Bit CD_OneBlock = 16; + static constexpr auto NumberOfWords = BitRange::from_to(0, 15); + static constexpr auto CD_OneBlock = Bit(16); }; struct __no_align SyncMode1 { - static constexpr BitRange BlockSize = BitRange::from_to(0, 15); - static constexpr BitRange BlockAmount = BitRange::from_to(16, 31); + static constexpr auto BlockSize = BitRange::from_to(0, 15); + static constexpr auto BlockAmount = BitRange::from_to(16, 31); }; struct __no_align SyncMode2 { @@ -36,26 +36,26 @@ namespace DMA { Sync2 = 2, //Linked List }; - static constexpr Bit ManualStart = 28; + static constexpr auto ManualStart = Bit(28); - static constexpr Bit Start = 24; - static constexpr auto Busy = Start; + static constexpr auto Start = Bit(24); + static constexpr auto Busy = Start; - static constexpr BitRange ChoppingCPUWindowSize = BitRange::from_to(20, 22); - static constexpr BitRange ChoppingDMAWindowSize = BitRange::from_to(16, 18); + static constexpr auto ChoppingCPUWindowSize = BitRange::from_to(20, 22); + static constexpr auto ChoppingDMAWindowSize = BitRange::from_to(16, 18); - static constexpr BitRange<_SyncMode> SyncMode = BitRange<_SyncMode>::from_to(9, 10); - static constexpr auto UseSyncMode0 = (SyncMode << Sync0); - static constexpr auto UseSyncMode1 = (SyncMode << Sync1); - static constexpr auto UseSyncMode2 = (SyncMode << Sync2); + static constexpr auto SyncMode = BitRange<_SyncMode>::from_to(9, 10); + static constexpr auto UseSyncMode0 = SyncMode.with(Sync0); + static constexpr auto UseSyncMode1 = SyncMode.with(Sync1); + static constexpr auto UseSyncMode2 = SyncMode.with(Sync2); - static constexpr Bit UseChopping = 8; + static constexpr auto UseChopping = Bit(8); - static constexpr Bit MemoryAdrDecreaseBy4 = 1; - static constexpr auto MemoryAdrIncreaseBy4 = !MemoryAdrDecreaseBy4; + static constexpr auto MemoryAdrDecreaseBy4 = Bit(1); + static constexpr auto MemoryAdrIncreaseBy4 = !MemoryAdrDecreaseBy4; - static constexpr Bit FromMainRAM = 0; - static constexpr auto ToMainRAM = !FromMainRAM; + static constexpr auto FromMainRAM = Bit(0); + static constexpr auto ToMainRAM = !FromMainRAM; static constexpr CHCHR StartMDECin() { return CHCHR(0x01000201); @@ -96,36 +96,36 @@ namespace DMA { struct __no_align DMAControlRegister : public ComplexBitMap { __io_port_inherit_complex_bit_map(DMAControlRegister); - static constexpr Bit OTCEnable = 27; - static constexpr BitRange OTCPriority = BitRange::from_to(24, 26); + static constexpr auto OTCEnable = Bit(27); + static constexpr auto OTCPriority = BitRange::from_to(24, 26); - static constexpr Bit PIOEnable = 23; - static constexpr BitRange PIOPriority = BitRange::from_to(20, 22); + static constexpr auto PIOEnable = Bit(23); + static constexpr auto PIOPriority = BitRange::from_to(20, 22); - static constexpr Bit SPUEnable = 19; - static constexpr BitRange SPUPriority = BitRange::from_to(16, 18); + static constexpr auto SPUEnable = Bit(19); + static constexpr auto SPUPriority = BitRange::from_to(16, 18); - static constexpr Bit CDROMEnable = 15; - static constexpr BitRange CDROMPriority = BitRange::from_to(12, 14); + static constexpr auto CDROMEnable = Bit(15); + static constexpr auto CDROMPriority = BitRange::from_to(12, 14); - static constexpr Bit GPUEnable = 11; - static constexpr BitRange GPUPriority = BitRange::from_to(8, 10); + static constexpr auto GPUEnable = Bit(11); + static constexpr auto GPUPriority = BitRange::from_to(8, 10); - static constexpr Bit MDECoutEnable = 7; - static constexpr BitRange MDECoutPriority = BitRange::from_to(4, 6); + static constexpr auto MDECoutEnable = Bit(7); + static constexpr auto MDECoutPriority = BitRange::from_to(4, 6); - static constexpr Bit MDECinEnable = 3; - static constexpr BitRange MDECinPriority = BitRange::from_to(0, 2); + static constexpr auto MDECinEnable = Bit(3); + static constexpr auto MDECinPriority = BitRange::from_to(0, 2); }; struct __no_align DMAInterruptRegister : public ComplexBitMap { __io_port_inherit_complex_bit_map(DMAInterruptRegister); - static constexpr Bit MasterEnable = 31; - static constexpr BitRange Flags = BitRange::from_to(24, 30); - static constexpr Bit MasterEnableDPCR = 23; - static constexpr BitRange EnableDPCR = BitRange::from_to(16, 22); - static constexpr Bit ForceIRQ = 15; + static constexpr auto MasterEnable = Bit(31); + static constexpr auto Flags = BitRange::from_to(24, 30); + static constexpr auto MasterEnableDPCR = Bit(23); + static constexpr auto EnableDPCR = BitRange::from_to(16, 22); + static constexpr auto ForceIRQ = Bit(15); }; __declare_io_port_global(Registers, MDECin, 0x1F801080); diff --git a/include/PSX/System/IOPorts/GPU_IO.hpp b/include/PSX/System/IOPorts/GPU_IO.hpp index 27236b98..439c8e36 100644 --- a/include/PSX/System/IOPorts/GPU_IO.hpp +++ b/include/PSX/System/IOPorts/GPU_IO.hpp @@ -4,9 +4,71 @@ namespace GPU { namespace Port { - struct __no_align Command : public ComplexBitMap { - + enum struct SemiTransparency { + B_Half_add_F_Half = 0, + B_add_F = 1, + B_sub_F = 2, + B_add_F_Quarter = 3, }; + + enum struct TexturePageColor { + _4bit = 0, + _8bit = 1, + _15bit = 2, + }; + + enum struct HorizontalResolution { + _256 = 0, + _320 = 1, + _512 = 2, + _640 = 3, + }; + + enum struct VerticalResolution { + _240 = 0, + _480 = 1 + }; + + enum struct DMADirection { + Off = 0, + Unknown = 1, + CPU2GPU = 2, + GPU2CPU = 3, + }; + + struct __no_align Command : public ComplexBitMap { + }; + + struct __no_align GPUStatusRegister : public ComplexBitMap { + static constexpr auto DrawingOddLinesInterlaced = Bit(31); + static constexpr auto DMADirectionValue = BitRange::from_to(29, 30); + static constexpr auto DMAReady = Bit(28); + static constexpr auto VRAMtoCPUtransferReay = Bit(27); + static constexpr auto GP0ReadyForCMD = Bit(26); + static constexpr auto FifoNotFull = Bit(25); // Only for Fifo + static constexpr auto InterruptRequest = Bit(24); + static constexpr auto DisplayDisabled = Bit(23); + static constexpr auto VerticalInterlaceOn = Bit(22); + static constexpr auto DisplayAreaColorDepth24bit = Bit(21); + static constexpr auto VideoModePal = Bit(20); + static constexpr auto VerticalResolutionValue = BitRange::from_to(19, 19); + static constexpr auto HorizontalResolutionValue = BitRange::from_to(17, 18); + static constexpr auto HorizontalResolution368 = Bit(16); + static constexpr auto TexturesDisabled = Bit(15); + static constexpr auto NotDrawingMaskedPixels = Bit(12); + static constexpr auto MaskBitSetDuringDrawEnabled = Bit(11); + static constexpr auto DrawingToDisplayAreadAllowed = Bit(10); + static constexpr auto DitherEnabled = Bit(9); + static constexpr auto TexturePageColorValue = BitRange::from_to(7, 8); + static constexpr auto SemiTransparencyValue = BitRange::from_to(5, 6); + static constexpr auto TexturePageY = BitRange::from_to(4, 4); // N*256 + static constexpr auto TexturePageX = BitRange::from_to(0, 3); // N*64 + + static constexpr auto VerticalResolution480 = Bit(19); + static constexpr auto TexturePageY256 = Bit(4); + }; + + __declare_io_port_global_const(GPUStatusRegister, GPUSTAT, 0x1F801814); } } diff --git a/include/PSX/System/IOPorts/IOPort.hpp b/include/PSX/System/IOPorts/IOPort.hpp index 56c9760d..9e9d6ad2 100644 --- a/include/PSX/System/IOPorts/IOPort.hpp +++ b/include/PSX/System/IOPorts/IOPort.hpp @@ -251,8 +251,10 @@ struct __no_align ubus32_t { }; static constexpr uintptr_t IO_Base_Mask = 0xF0000000; static constexpr uintptr_t IO_Base_Adr = 0x10000000; +#define __declare_io_port_global_raw(cv, type, name, adr) static __always_inline cv auto& name = *reinterpret_cast*>((IO_Base_Adr + (adr & ~IO_Base_Mask))) -#define __declare_io_port_global(type, name, adr) static __always_inline auto& name = *reinterpret_cast*>((IO_Base_Adr + (adr & ~IO_Base_Mask))) +#define __declare_io_port_global(type, name, adr) __declare_io_port_global_raw(, type, name, adr) +#define __declare_io_port_global_const(type, name, adr) __declare_io_port_global_raw(const, type, name, adr) #define __declare_io_port_global_array(type, name, adr, size) static __always_inline auto& name = reinterpret_cast(*reinterpret_cast((IO_Base_Adr + (adr & ~IO_Base_Mask)))); #define __io_port_inherit_complex_bit_map(name) \ using ComplexBitMap::operator=; \ diff --git a/include/PSX/System/IOPorts/SPU_IO.hpp b/include/PSX/System/IOPorts/SPU_IO.hpp index cf5a5db2..3a669cd3 100644 --- a/include/PSX/System/IOPorts/SPU_IO.hpp +++ b/include/PSX/System/IOPorts/SPU_IO.hpp @@ -40,37 +40,37 @@ namespace SPU { __io_port_inherit_complex_bit_map(SweepVolume); // For Volume Mode - static constexpr Bit SweepEnable = 15; // 0 Volume Mode; 1 Sweep Mode - static constexpr auto VolumeEnable = !SweepEnable; - static constexpr BitRange Volume = BitRange::from_to(0, 14); + static constexpr auto SweepEnable = Bit(15); + static constexpr auto VolumeEnable = !SweepEnable; + static constexpr auto Volume = BitRange::from_to(0, 14); // For Sweep Mode - static constexpr Bit SweepMode = 14; - static constexpr Bit SweepDirection = 13; - static constexpr Bit SweepPhase = 12; - static constexpr BitRange SweepShift = BitRange::from_to(2, 6); - static constexpr BitRange SweepStep = BitRange::from_to(0, 1); + static constexpr auto SweepMode = Bit(14); + static constexpr auto SweepDirection = Bit(13); + static constexpr auto SweepPhase = Bit(12); + static constexpr auto SweepShift = BitRange::from_to(2, 6); + static constexpr auto SweepStep = BitRange::from_to(0, 1); }; struct __no_align SR : public ComplexBitMap { __io_port_inherit_complex_bit_map(SR); - static constexpr Bit SustainMode = (31 - 16); - static constexpr Bit SustainDirection = (30 - 16); - static constexpr BitRange SustainShift = BitRange::from_to((24 - 16), (28 - 16)); - static constexpr BitRange SustainStep = BitRange::from_to((22 - 16), (23 - 16)); - static constexpr Bit ReleaseMode = (21 - 16); - static constexpr BitRange ReleaseShift = BitRange::from_to((16 - 16), (20 - 16)); + static constexpr auto SustainMode = Bit(31 - 16); + static constexpr auto SustainDirection = Bit(30 - 16); + static constexpr auto SustainShift = BitRange::from_to((24 - 16), (28 - 16)); + static constexpr auto SustainStep = BitRange::from_to((22 - 16), (23 - 16)); + static constexpr auto ReleaseMode = Bit(21 - 16); + static constexpr auto ReleaseShift = BitRange::from_to((16 - 16), (20 - 16)); }; struct __no_align AD : public ComplexBitMap { __io_port_inherit_complex_bit_map(AD); - static constexpr Bit AttackMode = 15; - static constexpr BitRange AttackShift = BitRange::from_to(10, 14); - static constexpr BitRange AttackStep = BitRange::from_to(8, 9); - static constexpr BitRange DecayShift = BitRange::from_to(4, 7); - static constexpr BitRange SustainLevel = BitRange::from_to(0, 3); + static constexpr auto AttackMode = Bit(15); + static constexpr auto AttackShift = BitRange::from_to(10, 14); + static constexpr auto AttackStep = BitRange::from_to(8, 9); + static constexpr auto DecayShift = BitRange::from_to(4, 7); + static constexpr auto SustainLevel = BitRange::from_to(0, 3); }; struct __no_align Voice { @@ -94,17 +94,17 @@ namespace SPU { DMARead = 3 }; - static constexpr Bit Enable = 15; - static constexpr Bit Unmute = 14; - static constexpr BitRange NoiseFrequcenyShift = BitRange::from_to(10, 13); - static constexpr BitRange NoiseFrequcenyStep = BitRange::from_to(8, 9); - static constexpr Bit ReverbMasterEnable = 7; - static constexpr Bit IRQ9Enable = 6; - static constexpr BitRange TransferMode = BitRange::from_to(4, 5); - static constexpr Bit ExternalAudioReverb = 3; - static constexpr Bit CDAudioReverb = 2; - static constexpr Bit ExternalAudioEnable = 1; - static constexpr Bit CDAudioEnable = 0; + static constexpr auto Enable = Bit(15); + static constexpr auto Unmute = Bit(14); + static constexpr auto NoiseFrequcenyShift = BitRange::from_to(10, 13); + static constexpr auto NoiseFrequcenyStep = BitRange::from_to(8, 9); + static constexpr auto ReverbMasterEnable = Bit(7); + static constexpr auto IRQ9Enable = Bit(6); + static constexpr auto TransferMode = BitRange::from_to(4, 5); + static constexpr auto ExternalAudioReverb = Bit(3); + static constexpr auto CDAudioReverb = Bit(2); + static constexpr auto ExternalAudioEnable = Bit(1); + static constexpr auto CDAudioEnable = Bit(0); }; struct __no_align PitchModFlags : public ComplexBitMap { diff --git a/src/Library/src/BootLoader/boot_gpu.cpp b/src/Library/src/BootLoader/gpu_boot.cpp similarity index 53% rename from src/Library/src/BootLoader/boot_gpu.cpp rename to src/Library/src/BootLoader/gpu_boot.cpp index 0f2f3e71..575d6fd3 100644 --- a/src/Library/src/BootLoader/boot_gpu.cpp +++ b/src/Library/src/BootLoader/gpu_boot.cpp @@ -1,5 +1,7 @@ +#include + namespace GPU { void setup() { - + } } \ No newline at end of file diff --git a/src/Library/src/BootLoader/spu_boot.cpp b/src/Library/src/BootLoader/spu_boot.cpp index 9446b243..7ef4a13b 100644 --- a/src/Library/src/BootLoader/spu_boot.cpp +++ b/src/Library/src/BootLoader/spu_boot.cpp @@ -1,5 +1,6 @@ #include #include +#include namespace SPU { using namespace Port;