diff --git a/include/functions.h b/include/functions.h index 0970b330c5..56be51a78f 100644 --- a/include/functions.h +++ b/include/functions.h @@ -478,7 +478,7 @@ float __ull_to_f(unsigned long long l); // void osVoiceControlGain(void); // void osVoiceStartReadData(void); void* osViGetCurrentFramebuffer(void); -s32 __osSpSetPc(void* data); +s32 __osSpSetPc(void* pc); // void __osVoiceContWrite4(void); void __osGetHWIntrRoutine(s32 idx, OSMesgQueue** outQueue, OSMesg* outMsg); void __osSetHWIntrRoutine(s32 idx, OSMesgQueue* queue, OSMesg msg); diff --git a/src/libultra/io/spsetpc.c b/src/libultra/io/spsetpc.c index d87302bc22..2c3cc32ba0 100644 --- a/src/libultra/io/spsetpc.c +++ b/src/libultra/io/spsetpc.c @@ -1,3 +1,13 @@ #include "global.h" -#pragma GLOBAL_ASM("asm/non_matchings/boot/spsetpc/__osSpSetPc.s") +s32 __osSpSetPc(void* pc) { + register u32 spStatus = HW_REG(SP_STATUS_REG, u32); + + if (!(spStatus & SP_STATUS_HALT)) { + return -1; + } else { + HW_REG(SP_PC_REG, void*) = pc; + } + + return 0; +}