diff --git a/include/PR/controller.h b/include/PR/controller.h index 51ca97e6..d2b0b812 100644 --- a/include/PR/controller.h +++ b/include/PR/controller.h @@ -46,5 +46,6 @@ extern OSMesgQueue __osEepromTimerQ; extern OSMesg __osEepromTimerMsg; void __osPackRequestData(u8 poll); +void __osContGetInitData(u8* pattern, OSContStatus* data); #endif diff --git a/src/libultra/io/controller.c b/src/libultra/io/controller.c index 923ffc57..90bf1169 100644 --- a/src/libultra/io/controller.c +++ b/src/libultra/io/controller.c @@ -38,7 +38,26 @@ s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) { return ret; } -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/io/controller/__osContGetInitData.s") +void __osContGetInitData(u8* pattern, OSContStatus* data) { + u8* ptr; + __OSContRequestHeader requestHeader; + s32 i; + u8 bits; + + bits = 0; + ptr = (u8*)__osContPifRam.ramarray; + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestHeader), data++) { + requestHeader = *(__OSContRequestHeader*)ptr; + data->errno = (requestHeader.rxsize & 0xC0) >> 4; + if (data->errno == 0) { + data->type = requestHeader.typel << 8 | requestHeader.typeh; + data->status = requestHeader.status; + + bits |= 1 << i; + } + } + *pattern = bits; +} void __osPackRequestData(u8 poll) { u8* ptr;