From 6a4a5c7a43b257d68b26b327caa22954b6ee0e00 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 31 Jan 2021 00:31:05 +1000 Subject: [PATCH] Decompile osContStartQuery --- src/include/PR/os_cont.h | 37 +++++++++++++++++++++-- src/lib/ultra/io/contquery.c | 57 +++++++++++++----------------------- 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/src/include/PR/os_cont.h b/src/include/PR/os_cont.h index 2754f2504..4e1324d34 100644 --- a/src/include/PR/os_cont.h +++ b/src/include/PR/os_cont.h @@ -21,7 +21,7 @@ /*---------------------------------------------------------------------* Copyright (C) 1998 Nintendo. (Originated by SGI) - + $RCSfile: os_cont.h,v $ $Revision: 1.1 $ $Date: 1998/10/09 08:01:05 $ @@ -47,7 +47,7 @@ extern "C" { */ /* - * Structure for controllers + * Structure for controllers */ typedef struct { @@ -96,7 +96,7 @@ typedef struct { #ifdef _HW_VERSION_1 #define CONT_FRAME_ERROR 0x2 #define CONT_COLLISION_ERROR 0x1 -#endif +#endif /* Controller type */ @@ -162,6 +162,37 @@ typedef struct { #define CONT_ERR_VOICE_WORD 14 #define CONT_ERR_VOICE_NO_RESPONSE 15 +#define CONT_CMD_REQUEST_STATUS 0 +#define CONT_CMD_READ_BUTTON 1 +#define CONT_CMD_READ_MEMPACK 2 +#define CONT_CMD_WRITE_MEMPACK 3 +#define CONT_CMD_READ_EEPROM 4 +#define CONT_CMD_WRITE_EEPROM 5 +#define CONT_CMD_RESET 0xff + +#define CONT_CMD_REQUEST_STATUS_TX 1 +#define CONT_CMD_READ_BUTTON_TX 1 +#define CONT_CMD_READ_MEMPACK_TX 3 +#define CONT_CMD_WRITE_MEMPACK_TX 35 +#define CONT_CMD_READ_EEPROM_TX 2 +#define CONT_CMD_WRITE_EEPROM_TX 10 +#define CONT_CMD_RESET_TX 1 + +#define CONT_CMD_REQUEST_STATUS_RX 3 +#define CONT_CMD_READ_BUTTON_RX 4 +#define CONT_CMD_READ_MEMPACK_RX 33 +#define CONT_CMD_WRITE_MEMPACK_RX 1 +#define CONT_CMD_READ_EEPROM_RX 8 +#define CONT_CMD_WRITE_EEPROM_RX 1 +#define CONT_CMD_RESET_RX 3 + +#define CONT_CMD_NOP 0xff +#define CONT_CMD_END 0xfe //indicates end of a command +#define CONT_CMD_EXE 1 //set pif ram status byte to this to do a command + +#define DIR_STATUS_EMPTY 0 +#define DIR_STATUS_UNKNOWN 1 +#define DIR_STATUS_OCCUPIED 2 #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) diff --git a/src/lib/ultra/io/contquery.c b/src/lib/ultra/io/contquery.c index bf3b8fb94..6c76f5ffc 100644 --- a/src/lib/ultra/io/contquery.c +++ b/src/lib/ultra/io/contquery.c @@ -1,42 +1,25 @@ #include +#include "gvars/gvars.h" -GLOBAL_ASM( -glabel osContStartQuery -/* 4f350: 27bdffe0 */ addiu $sp,$sp,-32 -/* 4f354: afbf0014 */ sw $ra,0x14($sp) -/* 4f358: afa40020 */ sw $a0,0x20($sp) -/* 4f35c: 0c012a18 */ jal __osSiGetAccess -/* 4f360: afa0001c */ sw $zero,0x1c($sp) -/* 4f364: 3c0e800a */ lui $t6,%hi(__osContLastCmd) -/* 4f368: 91cec820 */ lbu $t6,%lo(__osContLastCmd)($t6) -/* 4f36c: 11c0000c */ beqz $t6,.L0004f3a0 -/* 4f370: 00000000 */ nop -/* 4f374: 0c012af0 */ jal __osPackRequestData -/* 4f378: 00002025 */ or $a0,$zero,$zero -/* 4f37c: 3c05800a */ lui $a1,%hi(__osContPifRam) -/* 4f380: 24a5c7e0 */ addiu $a1,$a1,%lo(__osContPifRam) -/* 4f384: 0c012a34 */ jal __osSiRawStartDma -/* 4f388: 24040001 */ addiu $a0,$zero,0x1 -/* 4f38c: afa2001c */ sw $v0,0x1c($sp) -/* 4f390: 8fa40020 */ lw $a0,0x20($sp) -/* 4f394: 00002825 */ or $a1,$zero,$zero -/* 4f398: 0c0121bc */ jal osRecvMesg -/* 4f39c: 24060001 */ addiu $a2,$zero,0x1 -.L0004f3a0: -/* 4f3a0: 3c05800a */ lui $a1,%hi(__osContPifRam) -/* 4f3a4: 24a5c7e0 */ addiu $a1,$a1,%lo(__osContPifRam) -/* 4f3a8: 0c012a34 */ jal __osSiRawStartDma -/* 4f3ac: 00002025 */ or $a0,$zero,$zero -/* 4f3b0: 3c01800a */ lui $at,%hi(__osContLastCmd) -/* 4f3b4: afa2001c */ sw $v0,0x1c($sp) -/* 4f3b8: 0c012a29 */ jal __osSiRelAccess -/* 4f3bc: a020c820 */ sb $zero,%lo(__osContLastCmd)($at) -/* 4f3c0: 8fbf0014 */ lw $ra,0x14($sp) -/* 4f3c4: 8fa2001c */ lw $v0,0x1c($sp) -/* 4f3c8: 27bd0020 */ addiu $sp,$sp,0x20 -/* 4f3cc: 03e00008 */ jr $ra -/* 4f3d0: 00000000 */ nop -); +s32 osContStartQuery(OSMesgQueue *mq) +{ + s32 ret; + ret = 0; + + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_REQUEST_STATUS) { + __osPackRequestData(CONT_CMD_REQUEST_STATUS); + ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + + ret = __osSiRawStartDma(OS_READ, &__osContPifRam); + __osContLastCmd = CONT_CMD_REQUEST_STATUS; + __osSiRelAccess(); + + return ret; +} void osContGetQuery(OSContStatus *data) {