First up, my VON2 disassembly:
- Code: Select all
*******************************************************************************
"Initializing..." Sequence
*******************************************************************************
const uint8_t _1240 = 0; // does not change as far as I can tell
uint32_t _375bc0[];
//uint32_t *sp
void sub684dc()
{
uint32_t r29 = _375bc0[_1240];
uint8_t r27 = read_crom_bank();
set_crom_bank(6);
// clear cr1[eq]
uint32_t r31 = 0
uint32_t r28 = _375be0;
// r30 = sp + 8
top:
for (uint32_t r31 = 0; r31 <= 12; r31++)
{
uint32_t r0 = r31 * 16;
uint32_t r9 = &_375be0[r31 * 16];
uint32_t r3 = _375be0[r0];
r0 = read32(r9+4);
uint32_t r11 = read32(r9+8);
r9 = read32(r9+12);
*(sp+2) = r3;
*(r30+1) = r0;
*(r30+2) = r11;
*(r30+3) = r9; // store to r30+0x0c==sp+0x14
r0 = *(sp+5) // read from sp+0x14
/*
* r9 = r0 - 1; // xer[ca] <- 1 if r0 != 0 else 0
* r11 = r0 + ~r9 + xer[ca] // r11 = r0 - r9 if r0 !=0 else r11 = r0 - (r9 + 1)
* r0 ^= 2
* r9 = r0 - 1; // xer[ca] <- 1 if r0 != 0 else 0
* r0 = r0 + ~r9 + xer[ca] // r0 = r0 - r9 if r0 != 0 else r0 = r0 - (r9 + 1)
* r9 = r11 & r0;
*
* More succinctly:
*
* r9 = ((r0 & 1) ? 1 : 0) & ((r0 & 2) ? 0 : 1); // r9 = true if bit 0 = 1 and bit 1 = 0
*/
r11 = r0 ? 1 : 0;
r0 = (r0 ^ 2) ? 1 : 0;
r9 = r11 & r0;
uint32_t r3;
if (r9 != 0)
{
uint32_t r4 = *(sp+3); //TODO: confirm that this is equivalent to *(r30+1)
uint32_t r5 = *(sp+4);
sub18409c();
r3 = 0;
sub184090();
r0 = r31 * 4;
r3 = read32(r29+r0);
r4 = 0;
sub181bfc();
}
_685a4:
r31++;
}
r3 = 1;
r4 = 0x1e;
r5 = 8;
sub18409c();
r3 = 0;
sub184090();
{
uint32_t *r29 = _375bd0[_1240 * 4];
uint32_t r3 = r29[0x30/4];
uint32_t r4 = 0;
sub181bfc();
set_crom_bank(7);
r3 = 0;
r4 = 0;
r5 = 0;
sub18409c();
r3 = 0x20fc48
r4 = 0;
sub1846dc();
set_crom_bank(r27); // restore crom bank
r3 = 0;
r4 = 0;
r5 = 0;
sub18409c();
set_crom_bank(1);
r3 = 0x210a3c;
r4 = 0;
sub1846dc();
r3 = 0;
r4 = 0;
r5 = 0;
sub18409c();
set_crom_bank(1);
r3 = 0x2105d0;
r4 = 0;
sub1846dc();
}
}
0x000684DC: 0x9421FFD0 stwu r1,-0x30(r1)
0x000684E0: 0x7C0802A6 mfspr r0,lr
0x000684E4: 0x9361001C stw r27,0x1C(r1)
0x000684E8: 0x93810020 stw r28,0x20(r1)
0x000684EC: 0x93A10024 stw r29,0x24(r1)
0x000684F0: 0x93C10028 stw r30,0x28(r1)
0x000684F4: 0x93E1002C stw r31,0x2C(r1)
0x000684F8: 0x90010034 stw r0,0x34(r1)
0x000684FC: 0x3D200000 li r9,0x00000000
0x00068500: 0x88091240 lbz r0,0x1240(r9)
0x00068504: 0x3D200037 li r9,0x00370000
0x00068508: 0x39295BC0 addi r9,r9,0x5BC0
0x0006850C: 0x5400103A rlwinm r0,r0,2,0xFFFFFFFC
0x00068510: 0x7FA9002E lwzx r29,r9,r0
0x00068514: 0x4BF98329 bl read_crom_bank
0x00068518: 0x7C7B1B78 mr r27,r3
0x0006851C: 0x38600006 li r3,0x00000006
0x00068520: 0x4CC63182 crxor cr1[eq],cr1[eq],cr1[eq]
0x00068524: 0x4BF982E1 bl set_crom_bank
0x00068528: 0x3BE00000 li r31,0x00000000
0x0006852C: 0x3D200037 li r9,0x00370000
0x00068530: 0x3B895BE0 addi r28,r9,0x5BE0
0x00068534: 0x3BC10008 addi r30,r1,0x08
0x00068538: 0x57E02036 rlwinm r0,r31,4,0xFFFFFFF0
0x0006853C: 0x7D20E214 add r9,r0,r28
0x00068540: 0x7C7C002E lwzx r3,r28,r0 ;<--
0x00068544: 0x80090004 lwz r0,0x04(r9)
0x00068548: 0x81690008 lwz r11,0x08(r9)
0x0006854C: 0x8129000C lwz r9,0x0C(r9)
0x00068550: 0x90610008 stw r3,0x08(r1)
0x00068554: 0x901E0004 stw r0,0x04(r30)
0x00068558: 0x917E0008 stw r11,0x08(r30)
0x0006855C: 0x913E000C stw r9,0x0C(r30)
0x00068560: 0x80010014 lwz r0,0x14(r1) ;<--
0x00068564: 0x3120FFFF addic r9,r0,-0x01 ;<--
0x00068568: 0x7D690110 subfe r11,r9,r0
0x0006856C: 0x68000002 xori r0,r0,0x0002
0x00068570: 0x3120FFFF addic r9,r0,-0x01
0x00068574: 0x7C090110 subfe r0,r9,r0
0x00068578: 0x7D690039 and. r9,r11,r0 ;<--
0x0006857C: 0x41820028 bt cr0[eq],0x000685A4
0x00068580: 0x8081000C lwz r4,0x0C(r1)
0x00068584: 0x80A10010 lwz r5,0x10(r1)
0x00068588: 0x4811BB15 bl 0x0018409C
0x0006858C: 0x38600000 li r3,0x00000000
0x00068590: 0x4811BB01 bl 0x00184090
0x00068594: 0x57E0103A rlwinm r0,r31,2,0xFFFFFFFC
0x00068598: 0x7C7D002E lwzx r3,r29,r0
0x0006859C: 0x38800000 li r4,0x00000000
0x000685A0: 0x4811965D bl 0x00181BFC
0x000685A4: 0x3BFF0001 addi r31,r31,0x01
0x000685A8: 0x2C9F000C cmpi cr1,0,r31,0x0C
0x000685AC: 0x4085FF8C bf cr1[gt],0x00068538
0x000685B0: 0x38600001 li r3,0x00000001 <--
0x000685B4: 0x3880001E li r4,0x0000001E
0x000685B8: 0x38A00008 li r5,0x00000008
0x000685BC: 0x4811BAE1 bl 0x0018409C
0x000685C0: 0x38600000 li r3,0x00000000
0x000685C4: 0x4811BACD bl 0x00184090 <--
0x000685C8: 0x3D200000 li r9,0x00000000
0x000685CC: 0x88091240 lbz r0,0x1240(r9)
0x000685D0: 0x3D200037 li r9,0x00370000
0x000685D4: 0x39295BD0 addi r9,r9,0x5BD0
0x000685D8: 0x5400103A rlwinm r0,r0,2,0xFFFFFFFC
0x000685DC: 0x7FA9002E lwzx r29,r9,r0 <--
0x000685E0: 0x807D0030 lwz r3,0x30(r29)
0x000685E4: 0x38800000 li r4,0x00000000
0x000685E8: 0x48119615 bl 0x00181BFC
0x000685EC: 0x38600007 li r3,0x00000007
0x000685F0: 0x4CC63182 crxor cr1[eq],cr1[eq],cr1[eq]
0x000685F4: 0x4BF98211 bl set_crom_bank
0x000685F8: 0x38600000 li r3,0x00000000
0x000685FC: 0x38800000 li r4,0x00000000
0x00068600: 0x38A00000 li r5,0x00000000
0x00068604: 0x4811BA99 bl 0x0018409C
0x00068608: 0x3C600021 li r3,0x00210000
0x0006860C: 0x3863FC48 addi r3,r3,-0x3B8
0x00068610: 0x38800000 li r4,0x00000000
0x00068614: 0x4811C0C9 bl 0x001846DC
0x00068618: 0x7F63DB78 mr r3,r27
0x0006861C: 0x4CC63182 crxor cr1[eq],cr1[eq],cr1[eq]
0x00068620: 0x4BF981E5 bl set_crom_bank
0x00068624: 0x38600000 li r3,0x00000000
0x00068628: 0x38800000 li r4,0x00000000
0x0006862C: 0x38A00000 li r5,0x00000000
0x00068630: 0x4811BA6D bl 0x0018409C
0x00068634: 0x38600001 li r3,0x00000001
0x00068638: 0x4CC63182 crxor cr1[eq],cr1[eq],cr1[eq]
0x0006863C: 0x4BF981C9 bl set_crom_bank
0x00068640: 0x3C600021 li r3,0x00210000
0x00068644: 0x38630A3C addi r3,r3,0xA3C
0x00068648: 0x38800000 li r4,0x00000000
0x0006864C: 0x4811C091 bl 0x001846DC
0x00068650: 0x38600000 li r3,0x00000000
0x00068654: 0x38800000 li r4,0x00000000
0x00068658: 0x38A00000 li r5,0x00000000
0x0006865C: 0x4811BA41 bl 0x0018409C
0x00068660: 0x38600001 li r3,0x00000001
0x00068664: 0x4CC63182 crxor cr1[eq],cr1[eq],cr1[eq]
0x00068668: 0x4BF9819D bl set_crom_bank
0x0006866C: 0x3C600021 li r3,0x00210000
0x00068670: 0x386305D0 addi r3,r3,0x5D0
0x00068674: 0x38800000 li r4,0x00000000
0x00068678: 0x4811C065 bl 0x001846DC
0x0006867C: 0x80010034 lwz r0,0x34(r1)
0x00068680: 0x7C0803A6 mtspr lr,r0
0x00068684: 0x8361001C lwz r27,0x1C(r1)
0x00068688: 0x83810020 lwz r28,0x20(r1)
0x0006868C: 0x83A10024 lwz r29,0x24(r1)
0x00068690: 0x83C10028 lwz r30,0x28(r1)
0x00068694: 0x83E1002C lwz r31,0x2C(r1)
0x00068698: 0x38210030 addi r1,r1,0x30
0x0006869C: 0x4E800020 bclr 0x14,0
uint8_t read_crom_bank() // 83c
{
return ~read8(0xfe100008) & 7;
}
0x0000083C: 0x3C60FE10 li r3,0xFE100000
0x00000840: 0x88630008 lbz r3,0x08(r3)
0x00000844: 0x7C6318F8 not r3,r3
0x00000848: 0x70630007 andi. r3,r3,0x0007
0x0000084C: 0x4E800020 bclr 0x14,0
uint8_t _7f8; // relative to r2, which seems to be 0
void set_crom_bank(uint8_t bank) // 804
{
bank = (~bank & 7) | 8;
uint8_t bank_reg_value = bank | (_7f8[6] & 0xf0);
_7f8[6] = bank_reg_value;
write8(0xfe100008, bank_reg_value);
while (read8(0xfe100008) != bank_reg_value)
;
}
0x00000804: 0x388207F8 addi r4,r2,0x7F8
0x00000808: 0x88A40006 lbz r5,0x06(r4)
0x0000080C: 0x3CC0FE10 li r6,0xFE100000
0x00000810: 0x70A500F0 andi. r5,r5,0x00F0
0x00000814: 0x7C6318F8 not r3,r3
0x00000818: 0x70630007 andi. r3,r3,0x0007
0x0000081C: 0x60630008 ori r3,r3,0x0008
0x00000820: 0x7CA51B78 or r5,r5,r3
0x00000824: 0x98A40006 stb r5,0x06(r4)
0x00000828: 0x98A60008 stb r5,0x08(r6)
0x0000082C: 0x88660008 lbz r3,0x08(r6)
0x00000830: 0x7C251800 cmp cr0,1,r5,r3
0x00000834: 0x4082FFF8 bf cr0[eq],0x0000082C
0x00000838: 0x4E800020 bclr 0x14,0
*******************************************************************************
void sub184090(uint32_t param)
{
_4444b8 = param;
}
void sub18409c(uint32_t param1, uint32_t param2, uint32_t param3)
{
_4444b0 = param1;
_4444bc = param2;
_4444b4 = param3;
}
0x00184090: 0x3D200044 li r9,0x00440000
0x00184094: 0x906944B8 stw r3,0x44B8(r9)
0x00184098: 0x4E800020 bclr 0x14,0
0x0018409C: 0x3D200044 li r9,0x00440000
0x001840A0: 0x906944B0 stw r3,0x44B0(r9)
0x001840A4: 0x3D200044 li r9,0x00440000
0x001840A8: 0x908944BC stw r4,0x44BC(r9)
0x001840AC: 0x3D200044 li r9,0x00440000
0x001840B0: 0x90A944B4 stw r5,0x44B4(r9)
0x001840B4: 0x4E800020 bclr 0x14,0
*******************************************************************************
void sub181bfc(uint32_t *r3, uint32_t r4)
{
uint32_t *r30 = r3;
uint32_t r27 = r4;
sub18904c();
uint32_t r0 = *r30;
if (r0 == r27)
goto _181cc0;
uint32_t r26 = 0x440000;
_181c3c:
r3 = r30;
r4 = 1;
sub1819c4();
uint32_t r28 = r30;
r30 = r3; //return value from above?
sub189264();
uint32_t r29 = r3;
r3 = 0
sub17ee40();
r0 = read32(r30);
if (r0 == r27)
goto _181cc0;
r31 = 0;
_181c70:
sub18904c();
r0 = read32(r27+0x44a8)
if (r0 != 0)
{
r3 = 0; // params
r4 = r28;
cr[eq] = 0;
(*r0)(r3,r4);
if (r3 != 0)
goto _181cc0;
}
sub189264();
r31 += 1;
if (r29 != r3)
goto _181cb4
if (r31 <= 1)
goto _181c70;
_181cb4:
if (read32(r0) != r27)
goto _181c3c;
_181cc0:
sub18904c();
_4444b4 = 0; // 32-bit
_4444bc = 0;
_4444b0 = 0;
}
0x00181BFC: 0x9421FFE0 stwu r1,-0x20(r1)
0x00181C00: 0x7C0802A6 mfspr r0,lr
0x00181C04: 0x93410008 stw r26,0x08(r1)
0x00181C08: 0x9361000C stw r27,0x0C(r1)
0x00181C0C: 0x93810010 stw r28,0x10(r1)
0x00181C10: 0x93A10014 stw r29,0x14(r1)
0x00181C14: 0x93C10018 stw r30,0x18(r1)
0x00181C18: 0x93E1001C stw r31,0x1C(r1)
0x00181C1C: 0x90010024 stw r0,0x24(r1)
0x00181C20: 0x7C7E1B78 mr r30,r3
0x00181C24: 0x7C9B2378 mr r27,r4
0x00181C28: 0x48007425 bl 0x0018904C
0x00181C2C: 0x801E0000 lwz r0,0x00(r30)
0x00181C30: 0x7C80D800 cmp cr1,0,r0,r27
0x00181C34: 0x4186008C bt cr1[eq],0x00181CC0
0x00181C38: 0x3F400044 li r26,0x00440000
0x00181C3C: 0x7FC3F378 mr r3,r30
0x00181C40: 0x38800001 li r4,0x00000001
0x00181C44: 0x4BFFFD81 bl 0x001819C4
0x00181C48: 0x7FDCF378 mr r28,r30
0x00181C4C: 0x7C7E1B78 mr r30,r3
0x00181C50: 0x48007615 bl 0x00189264
0x00181C54: 0x7C7D1B78 mr r29,r3
0x00181C58: 0x38600000 li r3,0x00000000
0x00181C5C: 0x4BFFD1E5 bl 0x0017EE40
0x00181C60: 0x801E0000 lwz r0,0x00(r30)
0x00181C64: 0x7C80D800 cmp cr1,0,r0,r27
0x00181C68: 0x41860058 bt cr1[eq],0x00181CC0
0x00181C6C: 0x3BE00000 li r31,0x00000000
0x00181C70: 0x480073DD bl 0x0018904C
0x00181C74: 0x801A44A8 lwz r0,0x44A8(r26)
0x00181C78: 0x2C800000 cmpi cr1,0,r0,0x00
0x00181C7C: 0x41860020 bt cr1[eq],0x00181C9C
0x00181C80: 0x7C0803A6 mtspr lr,r0
0x00181C84: 0x38600000 li r3,0x00000000
0x00181C88: 0x7F84E378 mr r4,r28
0x00181C8C: 0x4CC63182 crxor cr1[eq],cr1[eq],cr1[eq]
0x00181C90: 0x4E800021 bclrl 0x14,0
0x00181C94: 0x2C830000 cmpi cr1,0,r3,0x00
0x00181C98: 0x40860028 bf cr1[eq],0x00181CC0
0x00181C9C: 0x480075C9 bl 0x00189264
0x00181CA0: 0x7C9D1800 cmp cr1,0,r29,r3
0x00181CA4: 0x3BFF0001 addi r31,r31,0x01
0x00181CA8: 0x4086000C bf cr1[eq],0x00181CB4
0x00181CAC: 0x289F0001 cmpli cr1,0,r31,0x0001
0x00181CB0: 0x4085FFC0 bf cr1[gt],0x00181C70
0x00181CB4: 0x801E0000 lwz r0,0x00(r30)
0x00181CB8: 0x7C80D800 cmp cr1,0,r0,r27
0x00181CBC: 0x4086FF80 bf cr1[eq],0x00181C3C
_181cc0:
0x00181CC0: 0x4800738D bl 0x0018904C
0x00181CC4: 0x3D200044 li r9,0x00440000
0x00181CC8: 0x38000000 li r0,0x00000000
0x00181CCC: 0x900944B4 stw r0,0x44B4(r9)
0x00181CD0: 0x3D200044 li r9,0x00440000
0x00181CD4: 0x900944BC stw r0,0x44BC(r9)
0x00181CD8: 0x3D200044 li r9,0x00440000
0x00181CDC: 0x900944B0 stw r0,0x44B0(r9)
0x00181CE0: 0x80010024 lwz r0,0x24(r1)
0x00181CE4: 0x7C0803A6 mtspr lr,r0
0x00181CE8: 0x83410008 lwz r26,0x08(r1)
0x00181CEC: 0x8361000C lwz r27,0x0C(r1)
0x00181CF0: 0x83810010 lwz r28,0x10(r1)
0x00181CF4: 0x83A10014 lwz r29,0x14(r1)
0x00181CF8: 0x83C10018 lwz r30,0x18(r1)
0x00181CFC: 0x83E1001C lwz r31,0x1C(r1)
0x00181D00: 0x38210020 addi r1,r1,0x20
0x00181D04: 0x4E800020 bclr 0x14,0
*******************************************************************************
void (*_4d1ca0)();
void (*_4d1ca8)();
uint16_t _6ee;
uint8_t _6ec;
uint8_t _6ed;
uint32_t _7f4;
void sub18904c()
{
write32(0xf118000c, sub304(7));
tbl = 0;
uint32_t r30 = (uint32_t) _6ee;
int8_t *r31 = 0x6ec;
int32_t r0;
uint16_t x;
do
{
(*_4d1ca0)();
r0 = (int32_t) (int8_t) r31[1]; // sign extend
x = *(uint16_t *) r31[2];
} while (r0 > 0 || x == r30);
_6ed = _6ec;
sub188e90();
if ((_7f4 & 0x10000000) != 0)
{
_7f4 = (_7f4 & 0xefffffff) | 0x40000000;
(*_4d1ca8)();
sub584();
}
return read_tbl();
}
0x001890D0: 0x3D600000 li r11,0x00000000
0x001890D4: 0x812B07F4 lwz r9,0x7F4(r11)
0x001890D8: 0x75201000 andi. r0,r9,0x10000000
0x001890DC: 0x41820024 bt cr0[eq],0x00189100
0x001890E0: 0x55200104 and r0,r9,0xEFFFFFFF
0x001890E4: 0x64004000 ori r0,r0,0x40000000
0x001890E8: 0x900B07F4 stw r0,0x7F4(r11)
0x001890EC: 0x3D20004D li r9,0x004D0000
0x001890F0: 0x80091CA8 lwz r0,0x1CA8(r9)
0x001890F4: 0x7C0803A6 mtspr lr,r0
0x001890F8: 0x4E800021 bclrl 0x14,0
0x001890FC: 0x4BE77489 bl 0x00000584
--
0x00189100: 0x7C6C42E6 mftb r3,tbl
0x00189104: 0x80010024 lwz r0,0x24(r1)
0x00189108: 0x7C0803A6 mtspr lr,r0
0x0018904C: 0x9421FFE0 stwu r1,-0x20(r1)
0x00189050: 0x7C0802A6 mfspr r0,lr
0x00189054: 0x93A10014 stw r29,0x14(r1)
0x00189058: 0x93C10018 stw r30,0x18(r1)
0x0018905C: 0x93E1001C stw r31,0x1C(r1)
0x00189060: 0x90010024 stw r0,0x24(r1)
0x00189064: 0x38600007 li r3,0x00000007
0x00189068: 0x4BE7729D bl 0x00000304
0x0018906C: 0x3D20F118 li r9,0xF1180000
0x00189070: 0x6129000C ori r9,r9,0x000C
0x00189074: 0x90690000 stw r3,0x00(r9)
0x00189078: 0x39400000 li r10,0x00000000
0x0018907C: 0x7D5C43A6 mtspr 284,r10
0x00189080: 0x3D200000 li r9,0x00000000
0x00189084: 0xA3C906EE lhz r30,0x6EE(r9)
0x00189088: 0x3FA0004D li r29,0x004D0000
0x0018908C: 0x3D200000 li r9,0x00000000
0x00189090: 0x3BE906EC addi r31,r9,0x6EC
0x00189094: 0x801D1CA0 lwz r0,0x1CA0(r29)
0x00189098: 0x7C0803A6 mtspr lr,r0
0x0018909C: 0x4E800021 bclrl 0x14,0
0x001890A0: 0x881F0001 lbz r0,0x01(r31)
0x001890A4: 0x7C000774 extsb r0,r0
0x001890A8: 0x2C800000 cmpi cr1,0,r0,0x00
0x001890AC: 0x4185FFE8 bt cr1[gt],0x00189094
0x001890B0: 0xA01F0002 lhz r0,0x02(r31)
0x001890B4: 0x7C80F000 cmp cr1,0,r0,r30
0x001890B8: 0x4186FFDC bt cr1[eq],0x00189094
0x001890BC: 0x3D200000 li r9,0x00000000
0x001890C0: 0x396906EC addi r11,r9,0x6EC
0x001890C4: 0x880906EC lbz r0,0x6EC(r9)
0x001890C8: 0x980B0001 stb r0,0x01(r11)
0x001890CC: 0x4BFFFDC5 bl 0x00188E90
0x001890D0: 0x3D600000 li r11,0x00000000
0x001890D4: 0x812B07F4 lwz r9,0x7F4(r11)
0x001890D8: 0x75201000 andi. r0,r9,0x10000000
0x001890DC: 0x41820024 bt cr0[eq],0x00189100
0x001890E0: 0x55200104 and r0,r9,0xEFFFFFFF
0x001890E4: 0x64004000 ori r0,r0,0x40000000
0x001890E8: 0x900B07F4 stw r0,0x7F4(r11)
0x001890EC: 0x3D20004D li r9,0x004D0000
0x001890F0: 0x80091CA8 lwz r0,0x1CA8(r9)
0x001890F4: 0x7C0803A6 mtspr lr,r0
0x001890F8: 0x4E800021 bclrl 0x14,0
0x001890FC: 0x4BE77489 bl 0x00000584
0x00189100: 0x7C6C42E6 mftb r3,tbl
0x00189104: 0x80010024 lwz r0,0x24(r1)
0x00189108: 0x7C0803A6 mtspr lr,r0
0x0018910C: 0x83A10014 lwz r29,0x14(r1)
0x00189110: 0x83C10018 lwz r30,0x18(r1)
0x00189114: 0x83E1001C lwz r31,0x1C(r1)
0x00189118: 0x38210020 addi r1,r1,0x20
0x0018911C: 0x4E800020 bclr 0x14,0