summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrozlette <uberpanzermensch@gmail.com>2020-01-11 08:54:07 -0600
committerrozlette <uberpanzermensch@gmail.com>2020-01-11 08:54:07 -0600
commitbb9de27a16fcfa731c96ae552eecdb7a60ee8e91 (patch)
treeac9a3118c8f3319dfeaa6628d37233c55aa8e456 /src
parent727a546fcf1894061f3ec4295fa7c80083768aba (diff)
Decomp controller.c
Diffstat (limited to 'src')
-rw-r--r--src/boot_O2_g3/CIC6105.c6
-rw-r--r--src/libultra/io/contquery.c16
-rw-r--r--src/libultra/io/controller.c88
-rw-r--r--src/libultra/io/controller.h60
4 files changed, 99 insertions, 71 deletions
diff --git a/src/boot_O2_g3/CIC6105.c b/src/boot_O2_g3/CIC6105.c
index 5080aff92..e52bc7542 100644
--- a/src/boot_O2_g3/CIC6105.c
+++ b/src/boot_O2_g3/CIC6105.c
@@ -6,9 +6,9 @@ void CIC6105_Nop80081820(void) {}
void CIC6105_Nop80081828(void) {}
void CIC6105_PrintRomInfo(void) {
- FaultDraw_DrawText(80, 200, &D_80098280, (UNK_PTR)(*(u32*)0xA4040010));
- FaultDraw_DrawText(40, 184, &D_80098290, &D_800994D0);
- FaultDraw_DrawText(56, 192, &D_800982A4, &D_800994DC);
+ FaultDraw_DrawText(80, 200, D_80098280, (UNK_PTR)(*(u32*)0xA4040010));
+ FaultDraw_DrawText(40, 184, D_80098290, &D_800994D0);
+ FaultDraw_DrawText(56, 192, D_800982A4, &D_800994DC);
}
void CIC6105_AddRomInfoFaultPage(void) {
diff --git a/src/libultra/io/contquery.c b/src/libultra/io/contquery.c
index 5d520d1e4..fa6cf4926 100644
--- a/src/libultra/io/contquery.c
+++ b/src/libultra/io/contquery.c
@@ -1,32 +1,32 @@
#include <osint.h>
-#include "controller.h"
+#include "io/controller.h"
#include "siint.h"
s32 osContStartQuery(OSMesgQueue* mq)
{
s32 ret;
-
+
__osSiGetAccess();
-
+
if (__osContLastCmd != 0) {
__osPackRequestData(0);
__osSiRawStartDma(1, &__osContPifRam);
osRecvMesg(mq, NULL, 1);
}
-
+
ret = __osSiRawStartDma(0, &__osContPifRam);
-
+
__osContLastCmd = 0;
-
+
__osSiRelAccess();
-
+
return ret;
}
void osContGetQuery(OSContStatus* data)
{
u8 pattern;
-
+
__osContGetInitData(&pattern, data);
}
diff --git a/src/libultra/io/controller.c b/src/libultra/io/controller.c
new file mode 100644
index 000000000..da7e41e33
--- /dev/null
+++ b/src/libultra/io/controller.c
@@ -0,0 +1,88 @@
+#include <ultra64.h>
+#include <global.h>
+
+s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) {
+ OSMesg dummy;
+ s32 ret = 0;
+ OSTime t;
+ OSTimer mytimer;
+ OSMesgQueue timerMesgQueue;
+
+ if (D_80097E40 != 0) {
+ return 0;
+ }
+
+ D_80097E40 = 1;
+
+ t = osGetTime();
+ if (t < 0x165A0BC) {
+ osCreateMesgQueue(&timerMesgQueue, &dummy, 1);
+ osSetTimer(&mytimer, 0x165A0BC - t, 0, &timerMesgQueue, &dummy);
+ osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK);
+ }
+
+ __osMaxControllers = 4;
+
+ __osPackRequestData(0);
+
+ ret = __osSiRawStartDma(1, &__osContPifRam);
+ osRecvMesg(mq, &dummy, 1);
+
+ ret = __osSiRawStartDma(0, &__osContPifRam);
+ osRecvMesg(mq, &dummy, 1);
+
+ __osContGetInitData(bitpattern, data);
+ __osContLastCmd = 0;
+ __osSiCreateAccessQueue();
+ osCreateMesgQueue(&D_8009CF38, D_8009CF50, 1);
+
+ return ret;
+}
+
+void __osContGetInitData(u8* pattern, OSContStatus* data) {
+ u8* ptr;
+ __OSContRequesFormat requestformat;
+ int i;
+ u8 bits;
+
+ bits = 0;
+ ptr = (u8*)__osContPifRam.ramarray;
+ for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestformat), data++) {
+ requestformat = *(__OSContRequesFormat*)ptr;
+ data->errno = (requestformat.rxsize & 0xc0) >> 4;
+ if (data->errno == 0) {
+ data->type = requestformat.typel << 8 | requestformat.typeh;
+ data->status = requestformat.status;
+
+ bits |= 1 << i;
+ }
+ }
+ *pattern = bits;
+}
+
+void __osPackRequestData(u8 cmd) {
+ u8* ptr;
+ __OSContRequesFormat requestformat;
+ int i;
+
+ for (i = 0; i < 0xF; i++) {
+ __osContPifRam.ramarray[i] = 0;
+ }
+
+ __osContPifRam.pifstatus = 1;
+ ptr = (u8*)__osContPifRam.ramarray;
+ requestformat.dummy = 255;
+ requestformat.txsize = 1;
+ requestformat.rxsize = 3;
+ requestformat.cmd = cmd;
+ requestformat.typeh = 255;
+ requestformat.typel = 255;
+ requestformat.status = 255;
+ requestformat.dummy1 = 255;
+
+ for (i = 0; i < __osMaxControllers; i++) {
+ *(__OSContRequesFormat*)ptr = requestformat;
+ ptr += sizeof(requestformat);
+ }
+ *ptr = 254;
+}
diff --git a/src/libultra/io/controller.h b/src/libultra/io/controller.h
deleted file mode 100644
index b76c4cbf7..000000000
--- a/src/libultra/io/controller.h
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef _CONTROLLER_H_
-#define _CONTROLLER_H_
-
-typedef struct {
- /* 0x00 */ u32 ramarray[15];
- /* 0x3C */ u32 pifstatus;
-} OSPifRam;
-
-
-typedef struct {
- /* 0x0 */ u8 dummy;
- /* 0x1 */ u8 txsize;
- /* 0x2 */ u8 rxsize;
- /* 0x3 */ u8 cmd;
- /* 0x4 */ u16 button;
- /* 0x6 */ s8 stick_x;
- /* 0x7 */ s8 stick_y;
-} __OSContReadFormat;
-
-
-typedef struct {
- /* 0x0 */ u8 dummy;
- /* 0x1 */ u8 txsize;
- /* 0x2 */ u8 rxsize;
- /* 0x3 */ u8 cmd;
- /* 0x4 */ u8 typeh;
- /* 0x5 */ u8 typel;
- /* 0x6 */ u8 status;
- /* 0x7 */ u8 dummy1;
-} __OSContRequesFormat;
-
-
-typedef struct {
- /* 0x00 */ u8 dummy;
- /* 0x01 */ u8 txsize;
- /* 0x02 */ u8 rxsize;
- /* 0x03 */ u8 cmd;
- /* 0x04 */ u16 address;
- /* 0x06 */ u8 data[32];
- /* 0x26 */ u8 datacrc;
-} __OSContRamReadFormat;
-
-
-typedef struct {
- /* 0x00 */ u16 company_code;
- /* 0x02 */ u16 game_code;
- /* 0x04 */ u8 start_page;
- /* 0x05 */ u8 status;
- /* 0x06 */ u16 data_sum;
- /* 0x08 */ unsigned char ext_name[4];
- /* 0x0C */ unsigned char game_name[16];
- /* 0x1C */ s32 reserved;
-} __OSDir;
-
-
-typedef struct {
- /* 0x0 */ u8 inode_page[256];
-} __OSInode;
-
-#endif