Decompile osEepromRead

This commit is contained in:
Ryan Dwyer 2021-03-17 17:54:36 +10:00
parent 575028ca70
commit 2696836a28
2 changed files with 77 additions and 127 deletions

View File

@ -71,7 +71,7 @@ extern u8 __osMaxControllers;
extern u32 __osEepromTimer;
extern OSMesgQueue __osEepromTimerQ;
extern OSMesg __osEepromTimerMsg;
extern u32 __osEepPifRam;
extern OSPifRam __osEepPifRam;
extern u32 var8009ca84;
extern void *var8009cac0;
extern void *var8009cac4;

View File

@ -1,4 +1,5 @@
#include <libultra_internal.h>
#include "bss.h"
#include "data.h"
OSPifRam __osEepPifRam;
@ -10,132 +11,81 @@ u32 var8009d010pf[4];
void *var8009cac0;
void *var8009cac4;
GLOBAL_ASM(
glabel osEepromRead
/* 501a0: 27bdffb0 */ addiu $sp,$sp,-80
/* 501a4: afb1001c */ sw $s1,0x1c($sp)
/* 501a8: afbf0024 */ sw $ra,0x24($sp)
/* 501ac: afb20020 */ sw $s2,0x20($sp)
/* 501b0: afb00018 */ sw $s0,0x18($sp)
/* 501b4: 3c11800a */ lui $s1,%hi(__osEepPifRam)
/* 501b8: 00c08025 */ or $s0,$a2,$zero
/* 501bc: 00809025 */ or $s2,$a0,$zero
/* 501c0: afa50054 */ sw $a1,0x54($sp)
/* 501c4: 0c012a18 */ jal __osSiGetAccess
/* 501c8: 2631ca80 */ addiu $s1,$s1,%lo(__osEepPifRam)
/* 501cc: 02402025 */ or $a0,$s2,$zero
/* 501d0: 0c012fb9 */ jal __osEepStatus
/* 501d4: 27a5003c */ addiu $a1,$sp,0x3c
/* 501d8: 14400015 */ bnez $v0,.L00050230
/* 501dc: 00402025 */ or $a0,$v0,$zero
/* 501e0: 97ae003c */ lhu $t6,0x3c($sp)
/* 501e4: 34018000 */ dli $at,0x8000
/* 501e8: 93b80057 */ lbu $t8,0x57($sp)
/* 501ec: 31cfc000 */ andi $t7,$t6,0xc000
/* 501f0: 11e10005 */ beq $t7,$at,.L00050208
/* 501f4: 3401c000 */ dli $at,0xc000
/* 501f8: 11e10008 */ beq $t7,$at,.L0005021c
/* 501fc: 93b90057 */ lbu $t9,0x57($sp)
/* 50200: 1000000b */ b .L00050230
/* 50204: 24040008 */ addiu $a0,$zero,0x8
.L00050208:
/* 50208: 2b010040 */ slti $at,$t8,0x40
/* 5020c: 14200008 */ bnez $at,.L00050230
/* 50210: 00000000 */ nop
/* 50214: 10000006 */ b .L00050230
/* 50218: 2404ffff */ addiu $a0,$zero,-1
.L0005021c:
/* 5021c: 2b210100 */ slti $at,$t9,0x100
/* 50220: 14200003 */ bnez $at,.L00050230
/* 50224: 00000000 */ nop
/* 50228: 10000001 */ b .L00050230
/* 5022c: 2404ffff */ addiu $a0,$zero,-1
.L00050230:
/* 50230: 10800005 */ beqz $a0,.L00050248
/* 50234: 93a8003e */ lbu $t0,0x3e($sp)
/* 50238: 0c012a29 */ jal __osSiRelAccess
/* 5023c: afa4004c */ sw $a0,0x4c($sp)
/* 50240: 10000042 */ b .L0005034c
/* 50244: 8fa2004c */ lw $v0,0x4c($sp)
.L00050248:
/* 50248: 31090080 */ andi $t1,$t0,0x80
/* 5024c: 11200007 */ beqz $t1,.L0005026c
/* 50250: 02402025 */ or $a0,$s2,$zero
.L00050254:
/* 50254: 0c012fb9 */ jal __osEepStatus
/* 50258: 27a5003c */ addiu $a1,$sp,0x3c
/* 5025c: 93aa003e */ lbu $t2,0x3e($sp)
/* 50260: 314b0080 */ andi $t3,$t2,0x80
/* 50264: 5560fffb */ bnezl $t3,.L00050254
/* 50268: 02402025 */ or $a0,$s2,$zero
.L0005026c:
/* 5026c: 0c0140d9 */ jal __osPackEepReadData
/* 50270: 93a40057 */ lbu $a0,0x57($sp)
/* 50274: 3c05800a */ lui $a1,%hi(__osEepPifRam)
/* 50278: 24a5ca80 */ addiu $a1,$a1,%lo(__osEepPifRam)
/* 5027c: 0c012a34 */ jal __osSiRawStartDma
/* 50280: 24040001 */ addiu $a0,$zero,0x1
/* 50284: 02402025 */ or $a0,$s2,$zero
/* 50288: 00002825 */ or $a1,$zero,$zero
/* 5028c: 0c0121bc */ jal osRecvMesg
/* 50290: 24060001 */ addiu $a2,$zero,0x1
/* 50294: 3c05800a */ lui $a1,%hi(__osEepPifRam)
/* 50298: 24a5ca80 */ addiu $a1,$a1,%lo(__osEepPifRam)
/* 5029c: 0c012a34 */ jal __osSiRawStartDma
/* 502a0: 00002025 */ or $a0,$zero,$zero
/* 502a4: 240c0004 */ addiu $t4,$zero,0x4
/* 502a8: 3c01800a */ lui $at,%hi(__osContLastCmd)
/* 502ac: a02cc820 */ sb $t4,%lo(__osContLastCmd)($at)
/* 502b0: 02402025 */ or $a0,$s2,$zero
/* 502b4: 00002825 */ or $a1,$zero,$zero
/* 502b8: 0c0121bc */ jal osRecvMesg
/* 502bc: 24060001 */ addiu $a2,$zero,0x1
/* 502c0: 00001825 */ or $v1,$zero,$zero
.L000502c4:
/* 502c4: 24630001 */ addiu $v1,$v1,0x1
/* 502c8: 28610004 */ slti $at,$v1,0x4
/* 502cc: 1420fffd */ bnez $at,.L000502c4
/* 502d0: 26310001 */ addiu $s1,$s1,0x1
/* 502d4: 8a210000 */ lwl $at,0x0($s1)
/* 502d8: 9a210003 */ lwr $at,0x3($s1)
/* 502dc: 27ad0030 */ addiu $t5,$sp,0x30
/* 502e0: 27a30038 */ addiu $v1,$sp,0x38
/* 502e4: ada10000 */ sw $at,0x0($t5)
/* 502e8: 8a2f0004 */ lwl $t7,0x4($s1)
/* 502ec: 9a2f0007 */ lwr $t7,0x7($s1)
/* 502f0: adaf0004 */ sw $t7,0x4($t5)
/* 502f4: 8a210008 */ lwl $at,0x8($s1)
/* 502f8: 9a21000b */ lwr $at,0xb($s1)
/* 502fc: ada10008 */ sw $at,0x8($t5)
/* 50300: 93a20031 */ lbu $v0,0x31($sp)
/* 50304: 305800c0 */ andi $t8,$v0,0xc0
/* 50308: 00182103 */ sra $a0,$t8,0x4
/* 5030c: 1480000c */ bnez $a0,.L00050340
/* 50310: 27a20030 */ addiu $v0,$sp,0x30
.L00050314:
/* 50314: 90480004 */ lbu $t0,0x4($v0)
/* 50318: 24420004 */ addiu $v0,$v0,0x4
/* 5031c: 26100004 */ addiu $s0,$s0,0x4
/* 50320: a208fffc */ sb $t0,-0x4($s0)
/* 50324: 90490001 */ lbu $t1,0x1($v0)
/* 50328: a209fffd */ sb $t1,-0x3($s0)
/* 5032c: 904a0002 */ lbu $t2,0x2($v0)
/* 50330: a20afffe */ sb $t2,-0x2($s0)
/* 50334: 904b0003 */ lbu $t3,0x3($v0)
/* 50338: 1443fff6 */ bne $v0,$v1,.L00050314
/* 5033c: a20bffff */ sb $t3,-0x1($s0)
.L00050340:
/* 50340: 0c012a29 */ jal __osSiRelAccess
/* 50344: afa4004c */ sw $a0,0x4c($sp)
/* 50348: 8fa2004c */ lw $v0,0x4c($sp)
.L0005034c:
/* 5034c: 8fbf0024 */ lw $ra,0x24($sp)
/* 50350: 8fb00018 */ lw $s0,0x18($sp)
/* 50354: 8fb1001c */ lw $s1,0x1c($sp)
/* 50358: 8fb20020 */ lw $s2,0x20($sp)
/* 5035c: 03e00008 */ jr $ra
/* 50360: 27bd0050 */ addiu $sp,$sp,0x50
);
void __osPackEepReadData(u8 address);
s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer)
{
s32 ret;
int i;
u16 type;
u8 *ptr;
OSContStatus sdata;
__OSContEepromFormat eepromformat;
ret = 0;
i = 0;
ptr = (u8 *)&__osEepPifRam.ramarray;
__osSiGetAccess();
ret = __osEepStatus(mq, &sdata);
if (ret == 0) {
type = sdata.type & (CONT_EEPROM | CONT_EEP16K);
switch (type) {
case CONT_EEPROM:
// @bug: Should be > EEPROM_MAXBLOCKS
if (address >= EEPROM_MAXBLOCKS) {
ret = -1;
}
break;
case CONT_EEPROM | CONT_EEP16K:
// @bug: Should be > EEP16K_MAXBLOCKS
if (address >= EEP16K_MAXBLOCKS) {
ret = -1;
}
break;
default:
if (1);
ret = CONT_NO_RESPONSE_ERROR;
break;
}
}
if (ret != 0) {
__osSiRelAccess();
return ret;
}
while (sdata.status & CONT_EEPROM_BUSY) {
__osEepStatus(mq, &sdata);
}
__osPackEepReadData(address);
ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
__osContLastCmd = CONT_CMD_READ_EEPROM;
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
for (i = 0; i < 4; i++) {
ptr++;
}
eepromformat = *(__OSContEepromFormat *)ptr;
ret = CHNL_ERR(eepromformat);
if (ret == 0) {
for (i = 0; i < ARRLEN(eepromformat.data); i++) {
*buffer++ = eepromformat.data[i];
}
}
__osSiRelAccess();
return ret;
}
void __osPackEepReadData(u8 address)
{