From 74179a237ee30f498561bab9f191d2eee0f4f0f3 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 25 Mar 2021 12:55:55 +1000 Subject: [PATCH] Decompile __osContRamWrite --- Makefile | 1 + src/include/PR/os_pfs.h | 1 + src/lib/ultra/io/contramwrite.c | 230 ++++++++++---------------------- 3 files changed, 70 insertions(+), 162 deletions(-) diff --git a/Makefile b/Makefile index 6f8be4000..a04b0a4a2 100644 --- a/Makefile +++ b/Makefile @@ -68,6 +68,7 @@ $(B_DIR)/lib/ultra/io/conteepread.o: LOOPUNROLL := $(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/pfschecker.o: LOOPUNROLL := $(B_DIR)/lib/ultra/io/pfsgetstatus.o: LOOPUNROLL := diff --git a/src/include/PR/os_pfs.h b/src/include/PR/os_pfs.h index 4e3a456de..4a912a284 100644 --- a/src/include/PR/os_pfs.h +++ b/src/include/PR/os_pfs.h @@ -97,6 +97,7 @@ typedef struct { #define BLOCKSIZE 32 /* bytes */ #define PFS_ONE_PAGE 8 /* blocks */ #define PFS_MAX_BANKS 62 +#define PFS_LABEL_AREA 7 #define PFS_READ 0 #define PFS_WRITE 1 diff --git a/src/lib/ultra/io/contramwrite.c b/src/lib/ultra/io/contramwrite.c index 90647e322..ee53fb546 100644 --- a/src/lib/ultra/io/contramwrite.c +++ b/src/lib/ultra/io/contramwrite.c @@ -1,165 +1,71 @@ #include +#include "bss.h" #include "data.h" -GLOBAL_ASM( -glabel __osContRamWrite -/* 4b610: 27bdff98 */ addiu $sp,$sp,-104 -/* 4b614: 8faf0078 */ lw $t7,0x78($sp) -/* 4b618: afb5002c */ sw $s5,0x2c($sp) -/* 4b61c: afb40028 */ sw $s4,0x28($sp) -/* 4b620: afb1001c */ sw $s1,0x1c($sp) -/* 4b624: afa60070 */ sw $a2,0x70($sp) -/* 4b628: 30ceffff */ andi $t6,$a2,0xffff -/* 4b62c: 24010001 */ addiu $at,$zero,0x1 -/* 4b630: 01c03025 */ or $a2,$t6,$zero -/* 4b634: 00a08825 */ or $s1,$a1,$zero -/* 4b638: 0080a825 */ or $s5,$a0,$zero -/* 4b63c: afbf003c */ sw $ra,0x3c($sp) -/* 4b640: afbe0038 */ sw $s8,0x38($sp) -/* 4b644: afb70034 */ sw $s7,0x34($sp) -/* 4b648: afb60030 */ sw $s6,0x30($sp) -/* 4b64c: afb30024 */ sw $s3,0x24($sp) -/* 4b650: afb20020 */ sw $s2,0x20($sp) -/* 4b654: afb00018 */ sw $s0,0x18($sp) -/* 4b658: afa70074 */ sw $a3,0x74($sp) -/* 4b65c: 11e10008 */ beq $t7,$at,.L0004b680 -/* 4b660: 24140002 */ addiu $s4,$zero,0x2 -/* 4b664: 29c10007 */ slti $at,$t6,0x7 -/* 4b668: 50200006 */ beqzl $at,.L0004b684 -/* 4b66c: 00c08025 */ or $s0,$a2,$zero -/* 4b670: 51c00004 */ beqzl $t6,.L0004b684 -/* 4b674: 00c08025 */ or $s0,$a2,$zero -/* 4b678: 1000006c */ b .L0004b82c -/* 4b67c: 00001025 */ or $v0,$zero,$zero -.L0004b680: -/* 4b680: 00c08025 */ or $s0,$a2,$zero -.L0004b684: -/* 4b684: 0c012a18 */ jal __osSiGetAccess -/* 4b688: a7a60072 */ sh $a2,0x72($sp) -/* 4b68c: 0010c0c3 */ sra $t8,$s0,0x3 -/* 4b690: 0010c940 */ sll $t9,$s0,0x5 -/* 4b694: 3c178006 */ lui $s7,%hi(__osPfsLastChannel) -/* 4b698: 3c16800a */ lui $s6,%hi(__osContLastCmd) -/* 4b69c: 3c138009 */ lui $s3,%hi(__osPfsPifRam) -/* 4b6a0: 26730a20 */ addiu $s3,$s3,%lo(__osPfsPifRam) -/* 4b6a4: 26d6c820 */ addiu $s6,$s6,%lo(__osContLastCmd) -/* 4b6a8: 26f70970 */ addiu $s7,$s7,%lo(__osPfsLastChannel) -/* 4b6ac: afb90040 */ sw $t9,0x40($sp) -/* 4b6b0: afb80044 */ sw $t8,0x44($sp) -/* 4b6b4: 241e0003 */ addiu $s8,$zero,0x3 -.L0004b6b8: -/* 4b6b8: 92c80000 */ lbu $t0,0x0($s6) -/* 4b6bc: 24010003 */ addiu $at,$zero,0x3 -/* 4b6c0: 02608025 */ or $s0,$s3,$zero -/* 4b6c4: 15010004 */ bne $t0,$at,.L0004b6d8 -/* 4b6c8: 00001025 */ or $v0,$zero,$zero -/* 4b6cc: 8ee90000 */ lw $t1,0x0($s7) -/* 4b6d0: 52290022 */ beql $s1,$t1,.L0004b75c -/* 4b6d4: 02718021 */ addu $s0,$s3,$s1 -.L0004b6d8: -/* 4b6d8: a2de0000 */ sb $s8,0x0($s6) -/* 4b6dc: 1a200010 */ blez $s1,.L0004b720 -/* 4b6e0: aef10000 */ sw $s1,0x0($s7) -/* 4b6e4: 32240003 */ andi $a0,$s1,0x3 -/* 4b6e8: 10800006 */ beqz $a0,.L0004b704 -/* 4b6ec: 00801825 */ or $v1,$a0,$zero -.L0004b6f0: -/* 4b6f0: 24420001 */ addiu $v0,$v0,0x1 -/* 4b6f4: a2000000 */ sb $zero,0x0($s0) -/* 4b6f8: 1462fffd */ bne $v1,$v0,.L0004b6f0 -/* 4b6fc: 26100001 */ addiu $s0,$s0,0x1 -/* 4b700: 10510007 */ beq $v0,$s1,.L0004b720 -.L0004b704: -/* 4b704: 24420004 */ addiu $v0,$v0,0x4 -/* 4b708: a2000000 */ sb $zero,0x0($s0) -/* 4b70c: a2000001 */ sb $zero,0x1($s0) -/* 4b710: a2000002 */ sb $zero,0x2($s0) -/* 4b714: a2000003 */ sb $zero,0x3($s0) -/* 4b718: 1451fffa */ bne $v0,$s1,.L0004b704 -/* 4b71c: 26100004 */ addiu $s0,$s0,0x4 -.L0004b720: -/* 4b720: 240a0001 */ addiu $t2,$zero,0x1 -/* 4b724: ae6a003c */ sw $t2,0x3c($s3) -/* 4b728: 240b00ff */ addiu $t3,$zero,0xff -/* 4b72c: 240c0023 */ addiu $t4,$zero,0x23 -/* 4b730: 240d0001 */ addiu $t5,$zero,0x1 -/* 4b734: 240e00ff */ addiu $t6,$zero,0xff -/* 4b738: 240f00fe */ addiu $t7,$zero,0xfe -/* 4b73c: a20b0000 */ sb $t3,0x0($s0) -/* 4b740: a20c0001 */ sb $t4,0x1($s0) -/* 4b744: a20d0002 */ sb $t5,0x2($s0) -/* 4b748: a21e0003 */ sb $s8,0x3($s0) -/* 4b74c: a20e0026 */ sb $t6,0x26($s0) -/* 4b750: 10000002 */ b .L0004b75c -/* 4b754: a20f0027 */ sb $t7,0x27($s0) -/* 4b758: 02718021 */ addu $s0,$s3,$s1 -.L0004b75c: -/* 4b75c: 8fb80044 */ lw $t8,0x44($sp) -/* 4b760: a2180004 */ sb $t8,0x4($s0) -/* 4b764: 0c014754 */ jal __osContAddressCrc -/* 4b768: 97a40072 */ lhu $a0,0x72($sp) -/* 4b76c: 8fb90040 */ lw $t9,0x40($sp) -/* 4b770: 26050006 */ addiu $a1,$s0,0x6 -/* 4b774: 24060020 */ addiu $a2,$zero,0x20 -/* 4b778: 00594025 */ or $t0,$v0,$t9 -/* 4b77c: a2080005 */ sb $t0,0x5($s0) -/* 4b780: 0c012c5c */ jal bcopy -/* 4b784: 8fa40074 */ lw $a0,0x74($sp) -/* 4b788: 24040001 */ addiu $a0,$zero,0x1 -/* 4b78c: 0c012a34 */ jal __osSiRawStartDma -/* 4b790: 02602825 */ or $a1,$s3,$zero -/* 4b794: 0c014788 */ jal __osContDataCrc -/* 4b798: 8fa40074 */ lw $a0,0x74($sp) -/* 4b79c: 305200ff */ andi $s2,$v0,0xff -/* 4b7a0: 02a02025 */ or $a0,$s5,$zero -/* 4b7a4: 00002825 */ or $a1,$zero,$zero -/* 4b7a8: 0c0121bc */ jal osRecvMesg -/* 4b7ac: 24060001 */ addiu $a2,$zero,0x1 -/* 4b7b0: 00002025 */ or $a0,$zero,$zero -/* 4b7b4: 0c012a34 */ jal __osSiRawStartDma -/* 4b7b8: 02602825 */ or $a1,$s3,$zero -/* 4b7bc: 02a02025 */ or $a0,$s5,$zero -/* 4b7c0: 00002825 */ or $a1,$zero,$zero -/* 4b7c4: 0c0121bc */ jal osRecvMesg -/* 4b7c8: 24060001 */ addiu $a2,$zero,0x1 -/* 4b7cc: 92030002 */ lbu $v1,0x2($s0) -/* 4b7d0: 306900c0 */ andi $t1,$v1,0xc0 -/* 4b7d4: 00091903 */ sra $v1,$t1,0x4 -/* 4b7d8: 5460000c */ bnezl $v1,.L0004b80c -/* 4b7dc: 24030001 */ addiu $v1,$zero,0x1 -/* 4b7e0: 920b0026 */ lbu $t3,0x26($s0) -/* 4b7e4: 02a02025 */ or $a0,$s5,$zero -/* 4b7e8: 51720009 */ beql $t3,$s2,.L0004b810 -/* 4b7ec: 24010004 */ addiu $at,$zero,0x4 -/* 4b7f0: 0c012ea4 */ jal __osPfsGetStatus -/* 4b7f4: 02202825 */ or $a1,$s1,$zero -/* 4b7f8: 14400009 */ bnez $v0,.L0004b820 -/* 4b7fc: 00401825 */ or $v1,$v0,$zero -/* 4b800: 10000002 */ b .L0004b80c -/* 4b804: 24030004 */ addiu $v1,$zero,0x4 -/* 4b808: 24030001 */ addiu $v1,$zero,0x1 -.L0004b80c: -/* 4b80c: 24010004 */ addiu $at,$zero,0x4 -.L0004b810: -/* 4b810: 14610003 */ bne $v1,$at,.L0004b820 -/* 4b814: 2a820000 */ slti $v0,$s4,0x0 -/* 4b818: 1040ffa7 */ beqz $v0,.L0004b6b8 -/* 4b81c: 2694ffff */ addiu $s4,$s4,-1 -.L0004b820: -/* 4b820: 0c012a29 */ jal __osSiRelAccess -/* 4b824: afa30064 */ sw $v1,0x64($sp) -/* 4b828: 8fa20064 */ lw $v0,0x64($sp) -.L0004b82c: -/* 4b82c: 8fbf003c */ lw $ra,0x3c($sp) -/* 4b830: 8fb00018 */ lw $s0,0x18($sp) -/* 4b834: 8fb1001c */ lw $s1,0x1c($sp) -/* 4b838: 8fb20020 */ lw $s2,0x20($sp) -/* 4b83c: 8fb30024 */ lw $s3,0x24($sp) -/* 4b840: 8fb40028 */ lw $s4,0x28($sp) -/* 4b844: 8fb5002c */ lw $s5,0x2c($sp) -/* 4b848: 8fb60030 */ lw $s6,0x30($sp) -/* 4b84c: 8fb70034 */ lw $s7,0x34($sp) -/* 4b850: 8fbe0038 */ lw $s8,0x38($sp) -/* 4b854: 03e00008 */ jr $ra -/* 4b858: 27bd0068 */ addiu $sp,$sp,0x68 -); +s32 __osContRamWrite(OSMesgQueue* mq, s32 channel, u16 address, u8* buffer, s32 force) +{ + s32 ret = 0; + s32 i; + u8* ptr; + s32 retry = 2; + u8 crc; + + if (force != 1 && address < PFS_LABEL_AREA && address != 0) { + return 0; + } + + __osSiGetAccess(); + + do { + ptr = (u8*)(&__osPfsPifRam); + + if (__osContLastCmd != CONT_CMD_WRITE_MEMPACK || __osPfsLastChannel != channel) { + __osContLastCmd = CONT_CMD_WRITE_MEMPACK; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = 0; } + + __osPfsPifRam.pifstatus = 1; + + ((__OSContRamReadFormat*)ptr)->dummy = 255; + ((__OSContRamReadFormat*)ptr)->txsize = 35; + ((__OSContRamReadFormat*)ptr)->rxsize = 1; + ((__OSContRamReadFormat*)ptr)->cmd = CONT_CMD_WRITE_MEMPACK; + ((__OSContRamReadFormat*)ptr)->datacrc = 0xff; + + ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; + } else { + ptr += channel; + } + + ((__OSContRamReadFormat*)ptr)->hi = address >> 3; + ((__OSContRamReadFormat*)ptr)->lo = ((address << 5) | __osContAddressCrc(address)); + + bcopy(buffer, ((__OSContRamReadFormat*)ptr)->data, BLOCKSIZE); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + crc = __osContDataCrc(buffer); + osRecvMesg(mq, (OSMesg*)NULL, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, (OSMesg*)NULL, OS_MESG_BLOCK); + + ret = ((((__OSContRamReadFormat*)ptr)->rxsize & 0xC0) >> 4); + + if (!ret) { + if (crc != ((__OSContRamReadFormat*)ptr)->datacrc) { + if ((ret = __osPfsGetStatus(mq, channel))) { + break; + } + + ret = PFS_ERR_CONTRFAIL; + } + } else { + ret = PFS_ERR_NOPACK; + } + } while (ret == PFS_ERR_CONTRFAIL && retry-- >= 0); + + __osSiRelAccess(); + + return ret; +}