From 15cf1eb439e8a942f3cbdee03a15ffccaf8f3153 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 29 Jan 2021 18:48:01 +1000 Subject: [PATCH] Decompile osRecvMesg --- Makefile | 1 + src/lib/ultra/os/recvmesg.c | 123 ++++++++++-------------------------- 2 files changed, 33 insertions(+), 91 deletions(-) diff --git a/Makefile b/Makefile index 5592bf733..1864eff48 100644 --- a/Makefile +++ b/Makefile @@ -80,6 +80,7 @@ $(B_DIR)/lib/ultra/io/vigetnextframebuf.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/visetevent.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/destroythread.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/jammesg.o: OPT_LVL := -O1 +$(B_DIR)/lib/ultra/os/recvmesg.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/resetglobalintmask.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/sendmesg.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/setthreadpri.o: OPT_LVL := -O1 diff --git a/src/lib/ultra/os/recvmesg.c b/src/lib/ultra/os/recvmesg.c index 88aaf1b8f..b89f194f6 100644 --- a/src/lib/ultra/os/recvmesg.c +++ b/src/lib/ultra/os/recvmesg.c @@ -1,93 +1,34 @@ #include +#include "game/data/data_000000.h" -GLOBAL_ASM( -glabel osRecvMesg -/* 486f0: 27bdffd8 */ addiu $sp,$sp,-40 -/* 486f4: afbf001c */ sw $ra,0x1c($sp) -/* 486f8: afa40028 */ sw $a0,0x28($sp) -/* 486fc: afa5002c */ sw $a1,0x2c($sp) -/* 48700: afa60030 */ sw $a2,0x30($sp) -/* 48704: afb10018 */ sw $s1,0x18($sp) -/* 48708: 0c01256c */ jal __osDisableInt -/* 4870c: afb00014 */ sw $s0,0x14($sp) -/* 48710: 8fae0028 */ lw $t6,0x28($sp) -/* 48714: 00408025 */ or $s0,$v0,$zero -/* 48718: 8dcf0008 */ lw $t7,0x8($t6) -/* 4871c: 15e00012 */ bnez $t7,.L00048768 -/* 48720: 00000000 */ nop -.L00048724: -/* 48724: 8fb80030 */ lw $t8,0x30($sp) -/* 48728: 17000005 */ bnez $t8,.L00048740 -/* 4872c: 00000000 */ nop -/* 48730: 0c012588 */ jal __osRestoreInt -/* 48734: 02002025 */ or $a0,$s0,$zero -/* 48738: 10000036 */ b .L00048814 -/* 4873c: 2402ffff */ addiu $v0,$zero,-1 -.L00048740: -/* 48740: 3c088006 */ lui $t0,%hi(__osRunningThread) -/* 48744: 8d080940 */ lw $t0,%lo(__osRunningThread)($t0) -/* 48748: 24190008 */ addiu $t9,$zero,0x8 -/* 4874c: a5190010 */ sh $t9,0x10($t0) -/* 48750: 0c000ee8 */ jal __osEnqueueAndYield -/* 48754: 8fa40028 */ lw $a0,0x28($sp) -/* 48758: 8fa90028 */ lw $t1,0x28($sp) -/* 4875c: 8d2a0008 */ lw $t2,0x8($t1) -/* 48760: 1140fff0 */ beqz $t2,.L00048724 -/* 48764: 00000000 */ nop -.L00048768: -/* 48768: 8fab002c */ lw $t3,0x2c($sp) -/* 4876c: 11600008 */ beqz $t3,.L00048790 -/* 48770: 00000000 */ nop -/* 48774: 8fac0028 */ lw $t4,0x28($sp) -/* 48778: 8d8e000c */ lw $t6,0xc($t4) -/* 4877c: 8d8d0014 */ lw $t5,0x14($t4) -/* 48780: 000e7880 */ sll $t7,$t6,0x2 -/* 48784: 01afc021 */ addu $t8,$t5,$t7 -/* 48788: 8f190000 */ lw $t9,0x0($t8) -/* 4878c: ad790000 */ sw $t9,0x0($t3) -.L00048790: -/* 48790: 8fa80028 */ lw $t0,0x28($sp) -/* 48794: 8d09000c */ lw $t1,0xc($t0) -/* 48798: 8d0c0010 */ lw $t4,0x10($t0) -/* 4879c: 252a0001 */ addiu $t2,$t1,0x1 -/* 487a0: 014c001a */ div $zero,$t2,$t4 -/* 487a4: 00007010 */ mfhi $t6 -/* 487a8: ad0e000c */ sw $t6,0xc($t0) -/* 487ac: 8fad0028 */ lw $t5,0x28($sp) -/* 487b0: 15800002 */ bnez $t4,.L000487bc -/* 487b4: 00000000 */ nop -/* 487b8: 0007000d */ break 0x7 -.L000487bc: -/* 487bc: 2401ffff */ addiu $at,$zero,-1 -/* 487c0: 15810004 */ bne $t4,$at,.L000487d4 -/* 487c4: 3c018000 */ lui $at,0x8000 -/* 487c8: 15410002 */ bne $t2,$at,.L000487d4 -/* 487cc: 00000000 */ nop -/* 487d0: 0006000d */ break 0x6 -.L000487d4: -/* 487d4: 8daf0008 */ lw $t7,0x8($t5) -/* 487d8: 25f8ffff */ addiu $t8,$t7,-1 -/* 487dc: adb80008 */ sw $t8,0x8($t5) -/* 487e0: 8fb90028 */ lw $t9,0x28($sp) -/* 487e4: 8f2b0004 */ lw $t3,0x4($t9) -/* 487e8: 8d690000 */ lw $t1,0x0($t3) -/* 487ec: 11200006 */ beqz $t1,.L00048808 -/* 487f0: 00000000 */ nop -/* 487f4: 0c000f40 */ jal __osPopThread -/* 487f8: 27240004 */ addiu $a0,$t9,0x4 -/* 487fc: 00408825 */ or $s1,$v0,$zero -/* 48800: 0c01207c */ jal osStartThread -/* 48804: 02202025 */ or $a0,$s1,$zero -.L00048808: -/* 48808: 0c012588 */ jal __osRestoreInt -/* 4880c: 02002025 */ or $a0,$s0,$zero -/* 48810: 00001025 */ or $v0,$zero,$zero -.L00048814: -/* 48814: 8fbf001c */ lw $ra,0x1c($sp) -/* 48818: 8fb00014 */ lw $s0,0x14($sp) -/* 4881c: 8fb10018 */ lw $s1,0x18($sp) -/* 48820: 03e00008 */ jr $ra -/* 48824: 27bd0028 */ addiu $sp,$sp,0x28 -/* 48828: 00000000 */ nop -/* 4882c: 00000000 */ nop -); +s32 osRecvMesg(OSMesgQueue *mq, OSMesg *msg, s32 flags) +{ + register u32 saveMask; + + saveMask = __osDisableInt(); + + while (MQ_IS_EMPTY(mq)) { + if (flags == OS_MESG_NOBLOCK) { + __osRestoreInt(saveMask); + return -1; + } + + __osRunningThread->state = OS_STATE_WAITING; + __osEnqueueAndYield(&mq->mtqueue); + } + + if (msg != NULL) { + *msg = mq->msg[mq->first]; + } + + mq->first = (mq->first + 1) % mq->msgCount; + mq->validCount--; + + if (mq->fullqueue->next != NULL) { + osStartThread(__osPopThread(&mq->fullqueue)); + } + + __osRestoreInt(saveMask); + + return 0; +}