#pragma once #include "threads.hpp" namespace JabyEngine { namespace Callback { namespace internal { static void execute_callback(Thread::Handle thread_handle, uint32_t parm) { if(CurrentThread::is_me(MainThread::Handle)) { CurrentThread::replace_with(thread_handle); CurrentThread::force_a0(parm); } SysCall::ReturnFromException(); } static uint32_t resume_callback(Thread::Handle handle) { SysCall::ChangeThread(handle); asm("sw $a0, %0" : "=m"(handle)); return handle; } namespace VSync { static constexpr size_t StackSize = 64; extern SysCall::ThreadHandle thread_handle; extern uint32_t stack[StackSize]; void routine(); static void [[deprecated("Currently not in use")]] execute() { execute_callback(VSync::thread_handle, 0); } } namespace CD { static constexpr size_t StackSize = 256; extern Thread::Handle thread_handle; extern uint32_t stack[StackSize]; static void execute(uint32_t parm) { execute_callback(CD::thread_handle, parm); } static uint32_t resume() { return resume_callback(MainThread::Handle); } } } } }