From 2e4106436d910080e784ddced5611dc682a7b30f Mon Sep 17 00:00:00 2001 From: Jaby Date: Fri, 6 Jan 2023 22:15:03 +0100 Subject: [PATCH] Save progress --- include/PSX/System/IOPorts/interrupt_io.hpp | 12 ++++++++++ include/PSX/System/IOPorts/timer_io.hpp | 5 ++-- include/PSX/System/syscalls.h | 26 +++++++++++---------- src/Library/src/BootLoader/start_boot.cpp | 1 + src/Library/src/BootLoader/timer_boot.cpp | 21 +++++++++++------ src/Library/src/Timer/timer.cpp | 18 ++++++++++---- 6 files changed, 57 insertions(+), 26 deletions(-) diff --git a/include/PSX/System/IOPorts/interrupt_io.hpp b/include/PSX/System/IOPorts/interrupt_io.hpp index 7f4616a1..a31717bf 100644 --- a/include/PSX/System/IOPorts/interrupt_io.hpp +++ b/include/PSX/System/IOPorts/interrupt_io.hpp @@ -19,6 +19,18 @@ namespace JabyEngine { __declare_io_port_global(ComplexBitMap, Status, 0x1F801070); __declare_io_port_global(ComplexBitMap, Mask, 0x1F801074); + + static bool is_irq(Bit irq) { + return Status.read().is_bit_set(irq); + } + + static void ack_irg(Bit irq) { + //Status.write(Status.read().clear_bit(irq)); + } + + static void enable_irq(Bit irq) { + //Mask.write(Mask.read().set_bit(irq)); + } } } diff --git a/include/PSX/System/IOPorts/timer_io.hpp b/include/PSX/System/IOPorts/timer_io.hpp index 14845672..0fec7860 100644 --- a/include/PSX/System/IOPorts/timer_io.hpp +++ b/include/PSX/System/IOPorts/timer_io.hpp @@ -10,14 +10,15 @@ namespace JabyEngine { __io_port_inherit_complex_bit_map(CounterMode); static constexpr auto SyncEnable = Bit(0); + static constexpr auto FreeRun = !SyncEnable; static constexpr auto SyncMode = BitRange::from_to(1, 2); static constexpr auto ResetAfterTarget = Bit(3); static constexpr auto IRQAtTarget = Bit(4); static constexpr auto IRQAtMax = Bit(5); - static constexpr auto IRQOneShot = !Bit(6); static constexpr auto IRQEveryTime = Bit(6); - static constexpr auto IRQPulse = !Bit(7); + static constexpr auto IRQOneShot = !IRQEveryTime; static constexpr auto IRQToggle = Bit(7); + static constexpr auto IRQPulse = !IRQToggle; static constexpr auto ClockSource = BitRange::from_to(8, 9); static constexpr auto HasIRQRequest = Bit(10); static constexpr auto IsTargetReached = Bit(11); diff --git a/include/PSX/System/syscalls.h b/include/PSX/System/syscalls.h index 072510b1..f3d50605 100644 --- a/include/PSX/System/syscalls.h +++ b/include/PSX/System/syscalls.h @@ -37,17 +37,19 @@ enum __syscall_PriorityChain { DefInt = 3 }; -static __constexpr const uint32_t SkipHandler = 0; -static __constexpr const uint32_t ExecuteHandler = 1; +enum InterruptVerifierResult { + SkipHandler = 0, + ExecuteHandler = 1 +}; -typedef uint32_t (*InterruptVerifier)(); +typedef InterruptVerifierResult (*InterruptVerifier)(); typedef uint32_t (*InterruptHandler)(uint32_t); -struct __no_align __syscall_InterruptElement { - struct __syscall_InterruptElement* next; - InterruptHandler handler_function; - InterruptVerifier verifier_function; - uint32_t notUsed; +struct __no_align InterrupCallback { + struct InterrupCallback* next; + InterruptHandler handler_function; + InterruptVerifier verifier_function; + uint32_t notUsed; }; #ifdef __cplusplus @@ -99,18 +101,18 @@ static __always_inline void __syscall_ReturnFromException() { __syscall_function_cast(__syscall_Table_B, void(*)())(); } -static __always_inline int __syscall_SysEnqIntRP(enum __syscall_PriorityChain prio, struct __syscall_InterruptElement* interElm) { +static __always_inline int __syscall_SysEnqIntRP(enum __syscall_PriorityChain prio, struct InterrupCallback* interElm) { register uint32_t FuncID asm("t1") = 0x02; __asm__ volatile("" : "=r"(FuncID) : "r"(FuncID)); - return __syscall_function_cast(__syscall_Table_C, int(*)(enum __syscall_PriorityChain prio, struct __syscall_InterruptElement *interElm))(prio, interElm); + return __syscall_function_cast(__syscall_Table_C, int(*)(enum __syscall_PriorityChain prio, struct InterrupCallback *interElm))(prio, interElm); } -static __always_inline int __syscall_SysDeqIntRP(enum __syscall_PriorityChain prio, struct __syscall_InterruptElement *interElm) { +static __always_inline int __syscall_SysDeqIntRP(enum __syscall_PriorityChain prio, struct InterrupCallback *interElm) { register uint32_t FuncID asm("t1") = 0x03; __asm__ volatile("" : "=r"(FuncID) : "r"(FuncID)); - return __syscall_function_cast(__syscall_Table_C, int(*)(enum __syscall_PriorityChain prio, struct __syscall_InterruptElement *interElm))(prio, interElm); + return __syscall_function_cast(__syscall_Table_C, int(*)(enum __syscall_PriorityChain prio, struct InterrupCallback *interElm))(prio, interElm); } static __always_inline uint32_t __syscall_EnterCriticalSection() { diff --git a/src/Library/src/BootLoader/start_boot.cpp b/src/Library/src/BootLoader/start_boot.cpp index 9c2d2597..0c044cb4 100644 --- a/src/Library/src/BootLoader/start_boot.cpp +++ b/src/Library/src/BootLoader/start_boot.cpp @@ -12,6 +12,7 @@ namespace JabyEngine { enable_DMA(); SPU::stop_voices(); + Timer::setup(); GPU::setup(); GPU::display_logo(); diff --git a/src/Library/src/BootLoader/timer_boot.cpp b/src/Library/src/BootLoader/timer_boot.cpp index 544e4ae0..8c987b71 100644 --- a/src/Library/src/BootLoader/timer_boot.cpp +++ b/src/Library/src/BootLoader/timer_boot.cpp @@ -1,14 +1,21 @@ +#include #include - +#include + namespace JabyEngine { namespace Timer { - void setup() { - // Just testing around - static constexpr auto wuff = CounterMode::with(CounterMode::IRQAtMax, Counter0::SyncMode::Zero_At_Hblank); + extern InterrupCallback IRQCallback; - Counter[0].mode = wuff; - Counter[0].mode = wuff; - Counter[0].mode = wuff; + void setup() { + static constexpr auto Mode = CounterMode::with(CounterMode::FreeRun, Counter2::SyncMode::Freerun, CounterMode::ResetAfterTarget, CounterMode::IRQAtTarget, CounterMode::IRQEveryTime, Counter2::Source::System_Clock_Div_8); + static constexpr uint16_t Target = 0x1234; + + //Counter[2].target.ref().set(CounterTarget::CounterTargetValue.with(Target)); + + __syscall_EnterCriticalSection(); + __syscall_SysEnqIntRP(Timer2Irq, &IRQCallback); + __syscall_ExitCriticalSection(); + Interrupt::enable_irq(Interrupt::Timer2); } } } \ No newline at end of file diff --git a/src/Library/src/Timer/timer.cpp b/src/Library/src/Timer/timer.cpp index 1b40e9e8..98fefa2e 100644 --- a/src/Library/src/Timer/timer.cpp +++ b/src/Library/src/Timer/timer.cpp @@ -8,21 +8,29 @@ namespace JabyEngine { size_t GlobalTime :: global_counter = 0; namespace Timer { - uint32_t interrupt_verifier() { + InterruptVerifierResult interrupt_verifier() { const auto irq_status = Interrupt::Status.read(); - if(irq_status.is_bit_set(Interrupt::Timer0)) { - return ExecuteHandler; + if(Interrupt::is_irq(Interrupt::Timer2)) { + return InterruptVerifierResult::ExecuteHandler; } else { - return SkipHandler; + return InterruptVerifierResult::SkipHandler; } } uint32_t interrupt_handler(uint32_t) { GlobalTime::global_counter++; - return 0; + + Interrupt::ack_irg(Interrupt::Timer2); + __syscall_ReturnFromException(); } + + InterrupCallback IRQCallback = { + .next = nullptr, + .handler_function = interrupt_handler, + .verifier_function = interrupt_verifier + }; } } \ No newline at end of file