Save progress

This commit is contained in:
Jaby 2023-01-06 22:15:03 +01:00
parent ec6b93942c
commit 7824a2d916
6 changed files with 57 additions and 26 deletions

View File

@ -19,6 +19,18 @@ namespace JabyEngine {
__declare_io_port_global(ComplexBitMap<uint32_t>, Status, 0x1F801070);
__declare_io_port_global(ComplexBitMap<uint32_t>, Mask, 0x1F801074);
static bool is_irq(Bit<uint32_t> irq) {
return Status.read().is_bit_set(irq);
}
static void ack_irg(Bit<uint32_t> irq) {
//Status.write(Status.read().clear_bit(irq));
}
static void enable_irq(Bit<uint32_t> irq) {
//Mask.write(Mask.read().set_bit(irq));
}
}
}

View File

@ -10,14 +10,15 @@ namespace JabyEngine {
__io_port_inherit_complex_bit_map(CounterMode);
static constexpr auto SyncEnable = Bit<uint32_t>(0);
static constexpr auto FreeRun = !SyncEnable;
static constexpr auto SyncMode = BitRange<uint32_t>::from_to(1, 2);
static constexpr auto ResetAfterTarget = Bit<uint32_t>(3);
static constexpr auto IRQAtTarget = Bit<uint32_t>(4);
static constexpr auto IRQAtMax = Bit<uint32_t>(5);
static constexpr auto IRQOneShot = !Bit<uint32_t>(6);
static constexpr auto IRQEveryTime = Bit<uint32_t>(6);
static constexpr auto IRQPulse = !Bit<uint32_t>(7);
static constexpr auto IRQOneShot = !IRQEveryTime;
static constexpr auto IRQToggle = Bit<uint32_t>(7);
static constexpr auto IRQPulse = !IRQToggle;
static constexpr auto ClockSource = BitRange<uint32_t>::from_to(8, 9);
static constexpr auto HasIRQRequest = Bit<uint32_t>(10);
static constexpr auto IsTargetReached = Bit<uint32_t>(11);

View File

@ -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() {

View File

@ -12,6 +12,7 @@ namespace JabyEngine {
enable_DMA();
SPU::stop_voices();
Timer::setup();
GPU::setup();
GPU::display_logo();

View File

@ -1,14 +1,21 @@
#include <PSX/System/IOPorts/interrupt_io.hpp>
#include <PSX/System/IOPorts/timer_io.hpp>
#include <PSX/System/syscalls.h>
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);
}
}
}

View File

@ -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
};
}
}