diff --git a/Makefile b/Makefile index 2f6eb32fc..ea2cad6b4 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/ld/libfiles.ntsc-beta.inc b/ld/libfiles.ntsc-beta.inc index 020c1f0ff..9f5d0fd21 100644 --- a/ld/libfiles.ntsc-beta.inc +++ b/ld/libfiles.ntsc-beta.inc @@ -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); \ diff --git a/ld/libfiles.ntsc-final.inc b/ld/libfiles.ntsc-final.inc index 7ce9f3d19..67d21d306 100644 --- a/ld/libfiles.ntsc-final.inc +++ b/ld/libfiles.ntsc-final.inc @@ -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); \ diff --git a/ld/libfiles.pal-final.inc b/ld/libfiles.pal-final.inc index aef0de77f..339eda91d 100644 --- a/ld/libfiles.pal-final.inc +++ b/ld/libfiles.pal-final.inc @@ -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); \ diff --git a/src/game/pak/pak.c b/src/game/pak/pak.c index db6a0ea85..a409124c9 100644 --- a/src/game/pak/pak.c +++ b/src/game/pak/pak.c @@ -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) diff --git a/src/include/PR/os_pfs.h b/src/include/PR/os_pfs.h index 47da29fbf..8b7afac5f 100644 --- a/src/include/PR/os_pfs.h +++ b/src/include/PR/os_pfs.h @@ -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 diff --git a/src/include/lib/lib_4f5e0.h b/src/include/lib/lib_4f5e0.h deleted file mode 100644 index f0bfc6743..000000000 --- a/src/include/lib/lib_4f5e0.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _IN_LIB_LIB_4F5E0_H -#define _IN_LIB_LIB_4F5E0_H -#include -#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 diff --git a/src/include/lib/lib_4f9b0.h b/src/include/lib/lib_4f9b0.h new file mode 100644 index 000000000..1f215a211 --- /dev/null +++ b/src/include/lib/lib_4f9b0.h @@ -0,0 +1,11 @@ +#ifndef _IN_LIB_LIB_4F9B0_H +#define _IN_LIB_LIB_4F9B0_H +#include +#include "data.h" +#include "types.h" + +u32 func0004f9b0(void); +u32 func0004fbc0(void); +u32 func0004fbf0(void); + +#endif diff --git a/src/lib/joy.c b/src/lib/joy.c index ade1b56dd..f6baec10a 100644 --- a/src/lib/joy.c +++ b/src/lib/joy.c @@ -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) diff --git a/src/lib/lib_16110.c b/src/lib/lib_16110.c index 656737810..a8eac8550 100644 --- a/src/lib/lib_16110.c +++ b/src/lib/lib_16110.c @@ -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" diff --git a/src/lib/lib_17ce0.c b/src/lib/lib_17ce0.c index f36c220be..24e16571c 100644 --- a/src/lib/lib_17ce0.c +++ b/src/lib/lib_17ce0.c @@ -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" diff --git a/src/lib/lib_184d0.c b/src/lib/lib_184d0.c index d0d76e4d0..1f99a9a63 100644 --- a/src/lib/lib_184d0.c +++ b/src/lib/lib_184d0.c @@ -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" diff --git a/src/lib/lib_4f5e0.c b/src/lib/lib_4f9b0.c similarity index 80% rename from src/lib/lib_4f5e0.c rename to src/lib/lib_4f9b0.c index bd7b5df35..f0f799e37 100644 --- a/src/lib/lib_4f5e0.c +++ b/src/lib/lib_4f9b0.c @@ -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 diff --git a/src/lib/model.c b/src/lib/model.c index 034b8e5ce..08cf59bf3 100644 --- a/src/lib/model.c +++ b/src/lib/model.c @@ -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" diff --git a/src/lib/ultra/io/motor.c b/src/lib/ultra/io/motor.c new file mode 100644 index 000000000..6baa64b82 --- /dev/null +++ b/src/lib/ultra/io/motor.c @@ -0,0 +1,142 @@ +#include +#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; +}