Decompile osMotorProbe

This commit is contained in:
Ryan Dwyer 2021-03-25 19:11:08 +10:00
parent 34098d6f59
commit f47c37603f
15 changed files with 178 additions and 205 deletions

View File

@ -69,10 +69,10 @@ $(B_DIR)/lib/ultra/io/conteepwrite.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/contpfs.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/contramread.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/contramwrite.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/motor.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/pfschecker.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/pfsfreeblocks.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/pfsgetstatus.o: LOOPUNROLL :=
$(B_DIR)/lib/lib_4f5e0.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/libc/ll.o: MIPSISET := -mips3 -o32
$(B_DIR)/lib/ultra/libc/llcvt.o: MIPSISET := -mips3 -32

View File

@ -184,7 +184,8 @@
build/ROMID/lib/ultra/io/contquery.o (section); \
build/ROMID/lib/ultra/io/pfsisplug.o (section); \
build/ROMID/lib/ultra/io/contreaddata.o (section); \
build/ROMID/lib/lib_4f5e0.o (section); \
build/ROMID/lib/ultra/io/motor.o (section); \
build/ROMID/lib/lib_4f9b0.o (section); \
build/ROMID/lib/ultra/gu/ortho.o (section); \
build/ROMID/lib/ultra/gu/frustum.o (section); \
build/ROMID/lib/lib_4fff0.o (section); \

View File

@ -180,7 +180,8 @@
build/ROMID/lib/ultra/libc/xprintf.o (section); \
build/ROMID/lib/ultra/io/contquery.o (section); \
build/ROMID/lib/ultra/io/contreaddata.o (section); \
build/ROMID/lib/lib_4f5e0.o (section); \
build/ROMID/lib/ultra/io/motor.o (section); \
build/ROMID/lib/lib_4f9b0.o (section); \
build/ROMID/lib/ultra/gu/ortho.o (section); \
build/ROMID/lib/ultra/gu/frustum.o (section); \
build/ROMID/lib/lib_4fff0.o (section); \

View File

@ -180,7 +180,8 @@
build/ROMID/lib/ultra/libc/xprintf.o (section); \
build/ROMID/lib/ultra/io/contquery.o (section); \
build/ROMID/lib/ultra/io/contreaddata.o (section); \
build/ROMID/lib/lib_4f5e0.o (section); \
build/ROMID/lib/ultra/io/motor.o (section); \
build/ROMID/lib/lib_4f9b0.o (section); \
build/ROMID/lib/ultra/gu/ortho.o (section); \
build/ROMID/lib/ultra/gu/frustum.o (section); \
build/ROMID/lib/lib_4fff0.o (section); \

View File

@ -16,7 +16,6 @@
#include "lib/memory.h"
#include "lib/rng.h"
#include "lib/lib_4e090.h"
#include "lib/lib_4f5e0.h"
#include "lib/lib_50480.h"
#include "lib/lib_513b0.h"
#include "data.h"
@ -8805,7 +8804,7 @@ glabel func0f11ac7c
/* f11ade0: 018d2821 */ addu $a1,$t4,$t5
.L0f11ade4:
/* f11ade4: 02003025 */ or $a2,$s0,$zero
/* f11ade8: 0c013e15 */ jal func0004f854
/* f11ade8: 0c013e15 */ jal osMotorProbe
/* f11adec: afa30024 */ sw $v1,0x24($sp)
/* f11adf0: 00102e00 */ sll $a1,$s0,0x18
/* f11adf4: 00057603 */ sra $t6,$a1,0x18
@ -8997,7 +8996,7 @@ glabel func0f114c08nb
/* f114cec: 01092821 */ addu $a1,$t0,$t1
.NB0f114cf0:
/* f114cf0: 2484e5d8 */ addiu $a0,$a0,-6696
/* f114cf4: 0c01440d */ jal func0004f854
/* f114cf4: 0c01440d */ jal osMotorProbe
/* f114cf8: 02003025 */ or $a2,$s0,$zero
/* f114cfc: 00102e00 */ sll $a1,$s0,0x18
/* f114d00: 00055603 */ sra $t2,$a1,0x18
@ -9140,7 +9139,7 @@ glabel func0f114dd4nb
/* f114eec: 03282821 */ addu $a1,$t9,$t0
.NB0f114ef0:
/* f114ef0: 2484e5d8 */ addiu $a0,$a0,-6696
/* f114ef4: 0c01440d */ jal func0004f854
/* f114ef4: 0c01440d */ jal osMotorProbe
/* f114ef8: 02203025 */ or $a2,$s1,$zero
/* f114efc: 3c057f1b */ lui $a1,0x7f1b
/* f114f00: afa20020 */ sw $v0,0x20($sp)

View File

@ -106,8 +106,9 @@ typedef struct {
#define PFS_WRITE 1
#define PFS_CREATE 2
#define PFS_INITIALIZED 0x1
#define PFS_CORRUPTED 0x2
#define PFS_INITIALIZED 0x1
#define PFS_CORRUPTED 0x2
#define PFS_MOTOR_INITIALIZED 0x8
/**************************************************************************
*
@ -150,12 +151,16 @@ typedef struct {
*
*/
extern s32 osPfsIsPlug(OSMesgQueue *, u8 *);
s32 osPfsIsPlug(OSMesgQueue *, u8 *);
s32 osPfsAllocateFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 num_bytes, s32 *file_no);
s32 osPfsFindFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 *file_no);
s32 osPfsDeleteFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name);
s32 osPfsFileState(OSPfs *pfs, s32 file_no, OSPfsState *state);
s32 osMotorAccess(OSPfs *pfs, u32 vibrate);
void osSetUpMempakWrite(s32 channel, OSPifRam* buf);
s32 osMotorProbe(OSMesgQueue *mq, OSPfs *pfs, s32 channel);
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
#ifdef _LANGUAGE_C_PLUS_PLUS

View File

@ -1,14 +0,0 @@
#ifndef _IN_LIB_LIB_4F5E0_H
#define _IN_LIB_LIB_4F5E0_H
#include <ultra64.h>
#include "data.h"
#include "types.h"
s32 osMotorAccess(OSPfs *pfs, u32 vibrate);
void osSetUpMempakWrite(s32 channel, OSPifRam* buf);
bool func0004f854(OSMesgQueue *mq, OSPfs *pfs, s32 arg2);
u32 func0004f9b0(void);
u32 func0004fbc0(void);
u32 func0004fbf0(void);
#endif

View File

@ -0,0 +1,11 @@
#ifndef _IN_LIB_LIB_4F9B0_H
#define _IN_LIB_LIB_4F9B0_H
#include <ultra64.h>
#include "data.h"
#include "types.h"
u32 func0004f9b0(void);
u32 func0004fbc0(void);
u32 func0004fbf0(void);
#endif

View File

@ -4,7 +4,6 @@
#include "bss.h"
#include "lib/main.h"
#include "lib/joy.h"
#include "lib/lib_4f5e0.h"
#include "data.h"
#include "types.h"
@ -1312,7 +1311,7 @@ void joy0001519c(void)
osSetEventMesg(OS_EVENT_SI, &var80099e78, 0);
for (i = 0; i < 4; i++) {
if (!func0004f854(&var80099e78, PFS(i), i)) {
if (!osMotorProbe(&var80099e78, PFS(i), i)) {
osMotorAccess(PFS(i), 0);
osMotorAccess(PFS(i), 0);
osMotorAccess(PFS(i), 0);
@ -1351,7 +1350,7 @@ void joy000153c4(s8 arg0, s32 arg1)
joy000150e8();
}
if (func0004f854(&var80099e78, PFS(arg0), arg0) == 0) {
if (osMotorProbe(&var80099e78, PFS(arg0), arg0) == 0) {
osMotorAccess(PFS(arg0), 0);
osMotorAccess(PFS(arg0), 0);
osMotorAccess(PFS(arg0), 0);
@ -1429,7 +1428,7 @@ glabel joy000153c4
.NB00016370:
/* 16370: 2484e5d8 */ addiu $a0,$a0,-6696
/* 16374: 00e02825 */ or $a1,$a3,$zero
/* 16378: 0c01440d */ jal func0004f854
/* 16378: 0c01440d */ jal osMotorProbe
/* 1637c: afa60024 */ sw $a2,0x24($sp)
/* 16380: 14400032 */ bnez $v0,.NB0001644c
/* 16384: 8fa60024 */ lw $a2,0x24($sp)

View File

@ -5,7 +5,6 @@
#include "bss.h"
#include "lib/lib_159b0.h"
#include "lib/lib_16110.h"
#include "lib/lib_4f5e0.h"
#include "data.h"
#include "types.h"

View File

@ -5,7 +5,6 @@
#include "bss.h"
#include "lib/lib_159b0.h"
#include "lib/lib_16110.h"
#include "lib/lib_4f5e0.h"
#include "data.h"
#include "types.h"

View File

@ -5,7 +5,6 @@
#include "bss.h"
#include "lib/lib_159b0.h"
#include "lib/lib_16110.h"
#include "lib/lib_4f5e0.h"
#include "data.h"
#include "types.h"

View File

@ -2,11 +2,9 @@
#include "constants.h"
#include "bss.h"
#include "lib/lib_16110.h"
#include "lib/lib_4f5e0.h"
#include "data.h"
#include "types.h"
OSPifRam osPifBuffers[MAXCONTROLLERS];
u32 var8009ca70;
u32 var800609f0 = 0x00000032;
@ -524,176 +522,6 @@ u32 var800611ec = 0x7ffe7fff;
const u32 var70059fd0[] = {0x3c8efa35};
s32 osMotorAccess(OSPfs *pfs, u32 vibrate)
{
s32 i;
s32 ret;
u8* buf = (u8*)&osPifBuffers[pfs->channel];
if (!(pfs->status & 8)) {
return 5;
}
__osSiGetAccess();
osPifBuffers[pfs->channel].pifstatus = 1;
buf += pfs->channel;
for (i = 0; i < BLOCKSIZE; i++) {
((__OSContRamReadFormat*)buf)->data[i] = vibrate;
}
__osContLastCmd = CONT_CMD_END;
__osSiRawStartDma(OS_WRITE, &osPifBuffers[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
__osSiRawStartDma(OS_READ, &osPifBuffers[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
ret = ((__OSContRamReadFormat*)buf)->rxsize & 0xc0;
if (!ret) {
if (!vibrate) {
if (((__OSContRamReadFormat*)buf)->datacrc != 0) {
ret = PFS_ERR_CONTRFAIL;
}
} else {
if (((__OSContRamReadFormat*)buf)->datacrc != 0xeb) {
ret = PFS_ERR_CONTRFAIL;
}
}
}
__osSiRelAccess();
return ret;
}
void osSetUpMempakWrite(s32 channel, OSPifRam* buf)
{
u8* bufptr = (u8*)buf;
__OSContRamReadFormat mempakwr;
s32 i;
mempakwr.dummy = 0xff;
mempakwr.txsize = 0x23;
mempakwr.rxsize = 1;
mempakwr.cmd = 3;
mempakwr.hi = 0x600 >> 3;
mempakwr.lo = (u8)(__osContAddressCrc(0x600) | (0x600 << 5));
if (channel != 0) {
for (i = 0; i < channel; ++i) {
*bufptr++ = 0;
}
}
*(__OSContRamReadFormat*)bufptr = mempakwr;
bufptr += sizeof(mempakwr);
*bufptr = 0xfe;
}
GLOBAL_ASM(
glabel func0004f854
/* 4f854: 27bdffb8 */ addiu $sp,$sp,-72
/* 4f858: afbf001c */ sw $ra,0x1c($sp)
/* 4f85c: afb00018 */ sw $s0,0x18($sp)
/* 4f860: afa40048 */ sw $a0,0x48($sp)
/* 4f864: afa60050 */ sw $a2,0x50($sp)
/* 4f868: aca40004 */ sw $a0,0x4($a1)
/* 4f86c: 8faf0050 */ lw $t7,0x50($sp)
/* 4f870: 241800ff */ addiu $t8,$zero,0xff
/* 4f874: 00a08025 */ or $s0,$a1,$zero
/* 4f878: a0b80065 */ sb $t8,0x65($a1)
/* 4f87c: aca00000 */ sw $zero,0x0($a1)
/* 4f880: 00a02025 */ or $a0,$a1,$zero
/* 4f884: acaf0008 */ sw $t7,0x8($a1)
/* 4f888: 0c013378 */ jal __osPfsSelectBank
/* 4f88c: 240500fe */ addiu $a1,$zero,0xfe
/* 4f890: 24010002 */ addiu $at,$zero,0x2
/* 4f894: 14410005 */ bne $v0,$at,.L0004f8ac
/* 4f898: 00401825 */ or $v1,$v0,$zero
/* 4f89c: 02002025 */ or $a0,$s0,$zero
/* 4f8a0: 0c013378 */ jal __osPfsSelectBank
/* 4f8a4: 24050080 */ addiu $a1,$zero,0x80
/* 4f8a8: 00401825 */ or $v1,$v0,$zero
.L0004f8ac:
/* 4f8ac: 10400003 */ beqz $v0,.L0004f8bc
/* 4f8b0: 8fa40048 */ lw $a0,0x48($sp)
/* 4f8b4: 10000039 */ b .L0004f99c
/* 4f8b8: 00601025 */ or $v0,$v1,$zero
.L0004f8bc:
/* 4f8bc: 8fa50050 */ lw $a1,0x50($sp)
/* 4f8c0: 24060400 */ addiu $a2,$zero,0x400
/* 4f8c4: 0c012e18 */ jal __osContRamRead
/* 4f8c8: 27a70024 */ addiu $a3,$sp,0x24
/* 4f8cc: 24010002 */ addiu $at,$zero,0x2
/* 4f8d0: 14410002 */ bne $v0,$at,.L0004f8dc
/* 4f8d4: 00401825 */ or $v1,$v0,$zero
/* 4f8d8: 24030004 */ addiu $v1,$zero,0x4
.L0004f8dc:
/* 4f8dc: 10600003 */ beqz $v1,.L0004f8ec
/* 4f8e0: 93b90043 */ lbu $t9,0x43($sp)
/* 4f8e4: 1000002d */ b .L0004f99c
/* 4f8e8: 00601025 */ or $v0,$v1,$zero
.L0004f8ec:
/* 4f8ec: 240100fe */ addiu $at,$zero,0xfe
/* 4f8f0: 17210003 */ bne $t9,$at,.L0004f900
/* 4f8f4: 02002025 */ or $a0,$s0,$zero
/* 4f8f8: 10000028 */ b .L0004f99c
/* 4f8fc: 2402000b */ addiu $v0,$zero,0xb
.L0004f900:
/* 4f900: 0c013378 */ jal __osPfsSelectBank
/* 4f904: 24050080 */ addiu $a1,$zero,0x80
/* 4f908: 24010002 */ addiu $at,$zero,0x2
/* 4f90c: 14410002 */ bne $v0,$at,.L0004f918
/* 4f910: 00401825 */ or $v1,$v0,$zero
/* 4f914: 24030004 */ addiu $v1,$zero,0x4
.L0004f918:
/* 4f918: 10600003 */ beqz $v1,.L0004f928
/* 4f91c: 8fa40048 */ lw $a0,0x48($sp)
/* 4f920: 1000001e */ b .L0004f99c
/* 4f924: 00601025 */ or $v0,$v1,$zero
.L0004f928:
/* 4f928: 8fa50050 */ lw $a1,0x50($sp)
/* 4f92c: 24060400 */ addiu $a2,$zero,0x400
/* 4f930: 0c012e18 */ jal __osContRamRead
/* 4f934: 27a70024 */ addiu $a3,$sp,0x24
/* 4f938: 24010002 */ addiu $at,$zero,0x2
/* 4f93c: 14410002 */ bne $v0,$at,.L0004f948
/* 4f940: 00401825 */ or $v1,$v0,$zero
/* 4f944: 24030004 */ addiu $v1,$zero,0x4
.L0004f948:
/* 4f948: 10600003 */ beqz $v1,.L0004f958
/* 4f94c: 93a80043 */ lbu $t0,0x43($sp)
/* 4f950: 10000012 */ b .L0004f99c
/* 4f954: 00601025 */ or $v0,$v1,$zero
.L0004f958:
/* 4f958: 24010080 */ addiu $at,$zero,0x80
/* 4f95c: 51010004 */ beql $t0,$at,.L0004f970
/* 4f960: 8e090000 */ lw $t1,0x0($s0)
/* 4f964: 1000000d */ b .L0004f99c
/* 4f968: 2402000b */ addiu $v0,$zero,0xb
/* 4f96c: 8e090000 */ lw $t1,0x0($s0)
.L0004f970:
/* 4f970: 8fa40050 */ lw $a0,0x50($sp)
/* 4f974: 3c0d800a */ lui $t5,%hi(osPifBuffers)
/* 4f978: 312a0008 */ andi $t2,$t1,0x8
/* 4f97c: 15400004 */ bnez $t2,.L0004f990
/* 4f980: 00046180 */ sll $t4,$a0,0x6
/* 4f984: 25adc970 */ addiu $t5,$t5,%lo(osPifBuffers)
/* 4f988: 0c013dd2 */ jal osSetUpMempakWrite
/* 4f98c: 018d2821 */ addu $a1,$t4,$t5
.L0004f990:
/* 4f990: 240e0008 */ addiu $t6,$zero,0x8
/* 4f994: ae0e0000 */ sw $t6,0x0($s0)
/* 4f998: 00001025 */ or $v0,$zero,$zero
.L0004f99c:
/* 4f99c: 8fbf001c */ lw $ra,0x1c($sp)
/* 4f9a0: 8fb00018 */ lw $s0,0x18($sp)
/* 4f9a4: 27bd0048 */ addiu $sp,$sp,0x48
/* 4f9a8: 03e00008 */ jr $ra
/* 4f9ac: 00000000 */ nop
);
GLOBAL_ASM(
glabel func0004f9b0
/* 4f9b0: 27bdffd0 */ addiu $sp,$sp,-48
@ -809,6 +637,10 @@ glabel func0004f9b0
/* 4fb64: 27bd0030 */ addiu $sp,$sp,0x30
/* 4fb68: 03e00008 */ jr $ra
/* 4fb6c: 00000000 */ nop
);
GLOBAL_ASM(
glabel func0004fb70
/* 4fb70: 44856000 */ mtc1 $a1,$f12
/* 4fb74: 44867000 */ mtc1 $a2,$f14
/* 4fb78: 44878000 */ mtc1 $a3,$f16

View File

@ -13,7 +13,6 @@
#include "lib/lib_159b0.h"
#include "lib/lib_16110.h"
#include "lib/lib_233c0.h"
#include "lib/lib_4f5e0.h"
#include "lib/model.h"
#include "data.h"
#include "types.h"

142
src/lib/ultra/io/motor.c Normal file
View File

@ -0,0 +1,142 @@
#include <ultra64.h>
#include "constants.h"
#include "bss.h"
#include "lib/lib_16110.h"
#include "data.h"
#include "types.h"
OSPifRam osPifBuffers[MAXCONTROLLERS];
s32 osMotorAccess(OSPfs *pfs, u32 vibrate)
{
s32 i;
s32 ret;
u8* buf = (u8*)&osPifBuffers[pfs->channel];
if (!(pfs->status & 8)) {
return 5;
}
__osSiGetAccess();
osPifBuffers[pfs->channel].pifstatus = 1;
buf += pfs->channel;
for (i = 0; i < BLOCKSIZE; i++) {
((__OSContRamReadFormat*)buf)->data[i] = vibrate;
}
__osContLastCmd = CONT_CMD_END;
__osSiRawStartDma(OS_WRITE, &osPifBuffers[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
__osSiRawStartDma(OS_READ, &osPifBuffers[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
ret = ((__OSContRamReadFormat*)buf)->rxsize & 0xc0;
if (!ret) {
if (!vibrate) {
if (((__OSContRamReadFormat*)buf)->datacrc != 0) {
ret = PFS_ERR_CONTRFAIL;
}
} else {
if (((__OSContRamReadFormat*)buf)->datacrc != 0xeb) {
ret = PFS_ERR_CONTRFAIL;
}
}
}
__osSiRelAccess();
return ret;
}
void osSetUpMempakWrite(s32 channel, OSPifRam* buf)
{
u8* bufptr = (u8*)buf;
__OSContRamReadFormat mempakwr;
s32 i;
mempakwr.dummy = 0xff;
mempakwr.txsize = 0x23;
mempakwr.rxsize = 1;
mempakwr.cmd = 3;
mempakwr.hi = 0x600 >> 3;
mempakwr.lo = (u8)(__osContAddressCrc(0x600) | (0x600 << 5));
if (channel != 0) {
for (i = 0; i < channel; ++i) {
*bufptr++ = 0;
}
}
*(__OSContRamReadFormat*)bufptr = mempakwr;
bufptr += sizeof(mempakwr);
*bufptr = 0xfe;
}
s32 osMotorProbe(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel)
{
s32 ret;
u8 sp24[BLOCKSIZE];
pfs->queue = ctrlrqueue;
pfs->channel = channel;
pfs->activebank = 0xff;
pfs->status = 0;
ret = __osPfsSelectBank(pfs, 0xfe);
if (ret == PFS_ERR_NEW_PACK) {
ret = __osPfsSelectBank(pfs, 0x80);
}
if (ret != 0) {
return ret;
}
ret = __osContRamRead(ctrlrqueue, channel, 0x400, sp24);
if (ret == PFS_ERR_NEW_PACK) {
ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
if (sp24[BLOCKSIZE - 1] == 0xfe) {
return PFS_ERR_DEVICE;
}
ret = __osPfsSelectBank(pfs, 0x80);
if (ret == PFS_ERR_NEW_PACK) {
ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
ret = __osContRamRead(ctrlrqueue, channel, 0x400, sp24);
if (ret == PFS_ERR_NEW_PACK) {
ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
if (sp24[BLOCKSIZE - 1] != 0x80) {
return PFS_ERR_DEVICE;
}
if ((pfs->status & PFS_MOTOR_INITIALIZED) == 0) {
osSetUpMempakWrite(channel, &osPifBuffers[channel]);
}
pfs->status = PFS_MOTOR_INITIALIZED;
return 0;
}