From 1810f771e5756bebf1c317be35064f85e5c0b265 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Sat, 27 Feb 2021 00:48:36 +0100 Subject: [PATCH] gave names to functions and magic values --- .../{sub_080B16AC.inc => EEPROMWrite.inc} | 0 asm/non_matching/save/sub_0807D1D8.inc | 2 +- asm/non_matching/save/sub_0807D20C.inc | 4 +- asm/non_matching/save/sub_0807D24C.inc | 2 +- include/functions.h | 1 - include/gba/eeprom.h | 20 ++++ src/code_080B1520.c | 92 +++++++++++-------- src/save.c | 12 +-- 8 files changed, 82 insertions(+), 51 deletions(-) rename asm/non_matching/code_080B1520/{sub_080B16AC.inc => EEPROMWrite.inc} (100%) create mode 100644 include/gba/eeprom.h diff --git a/asm/non_matching/code_080B1520/sub_080B16AC.inc b/asm/non_matching/code_080B1520/EEPROMWrite.inc similarity index 100% rename from asm/non_matching/code_080B1520/sub_080B16AC.inc rename to asm/non_matching/code_080B1520/EEPROMWrite.inc diff --git a/asm/non_matching/save/sub_0807D1D8.inc b/asm/non_matching/save/sub_0807D1D8.inc index f9b81bde..88c30173 100644 --- a/asm/non_matching/save/sub_0807D1D8.inc +++ b/asm/non_matching/save/sub_0807D1D8.inc @@ -14,7 +14,7 @@ _0807D1E6: lsls r0, r5, #0x10 lsrs r0, r0, #0x10 adds r1, r6, #0 - bl sub_080B15E8 + bl EEPROMRead lsls r0, r0, #0x10 cmp r0, #0 beq _0807D1FA diff --git a/asm/non_matching/save/sub_0807D20C.inc b/asm/non_matching/save/sub_0807D20C.inc index 954ad823..7fd90a12 100644 --- a/asm/non_matching/save/sub_0807D20C.inc +++ b/asm/non_matching/save/sub_0807D20C.inc @@ -15,13 +15,13 @@ _0807D21A: lsrs r4, r0, #0x10 adds r0, r4, #0 adds r1, r7, #0 - bl sub_080B18DC + bl EEPROMWrite0_8k_Check lsls r0, r0, #0x10 cmp r0, #0 beq _0807D23C adds r0, r4, #0 ldr r1, _0807D238 @ =gUnk_0811E4B4 - bl sub_080B18DC + bl EEPROMWrite0_8k_Check movs r0, #0 b _0807D24A .align 2, 0 diff --git a/asm/non_matching/save/sub_0807D24C.inc b/asm/non_matching/save/sub_0807D24C.inc index 7761d787..6ec855ad 100644 --- a/asm/non_matching/save/sub_0807D24C.inc +++ b/asm/non_matching/save/sub_0807D24C.inc @@ -14,7 +14,7 @@ _0807D25A: lsls r0, r5, #0x10 lsrs r0, r0, #0x10 adds r1, r6, #0 - bl sub_080B180C + bl EEPROMCompare lsls r0, r0, #0x10 cmp r0, #0 beq _0807D26E diff --git a/include/functions.h b/include/functions.h index f3213239..58941869 100644 --- a/include/functions.h +++ b/include/functions.h @@ -213,7 +213,6 @@ extern void sub_0807CF48(u32); extern u32 sub_0807CF10(u8*); extern void sub_08056208(void); extern void sub_08050384(); -extern void sub_080B1520(u32); extern struct_0807D1C4* sub_0807D1C4(u32); extern u32 sub_0807D24C(u32, const char*, u32); extern void sub_0807CF68(u32); diff --git a/include/gba/eeprom.h b/include/gba/eeprom.h new file mode 100644 index 00000000..964f3c34 --- /dev/null +++ b/include/gba/eeprom.h @@ -0,0 +1,20 @@ +#ifndef GUARD_GBA_EEPROM +#define GUARD_GBA_EEPROM + +// error codes +#define EEPROM_OUT_OF_RANGE 0x80ff +#define EEPROM_COMPARE_FAILED 0x8000 +#define EEPROM_UNSUPPORTED_TYPE 0x8080 + +/** + * selects EEPROM type + * selects 512byte on invalid argument + * + * @param unk_1 4 for 512 byte, 0x40 for 8k + * @return 1 on invalid argument, 0 otherwise + */ +u32 EEPROMConfigure(u16 unk_1); +u16 EEPROMCompare(u16 address, u16* data); +u32 EEPROMWrite0_8k_Check(u16 address, u16* data); + +#endif // GUARD_GBA_EEPROM diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 69cdff2d..400145c0 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -1,4 +1,5 @@ #include "global.h" +#include "gba/eeprom.h" typedef struct EEPROMConfig { u32 unk_00; @@ -12,10 +13,9 @@ extern const EEPROMConfig* gEEPROMConfig; const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; +u16 EEPROMWrite(u16, u16*, u8); -u16 sub_080B16AC(u16, u16*, u8); - -u32 sub_080B1520(u16 unk_1) { +u32 EEPROMConfigure(u16 unk_1) { u32 ret; ret = 0; @@ -32,7 +32,7 @@ u32 sub_080B1520(u16 unk_1) { return ret; } -void DMA3Transfer(void* src, void* dest, u16 count) { +static void DMA3Transfer(void* src, void* dest, u16 count) { u32 temp; u16 IME_save; @@ -49,47 +49,61 @@ void DMA3Transfer(void* src, void* dest, u16 count) { REG_IME = IME_save; } -u32 sub_080B15E8(u16 unk_1, u16* unk_2) { - u16 stack[0x44]; +/** + * reads 64 bit (8 byte) from eeprom + * + * @param address 6/14 bit depending on eeprom size + * @param data u16[4] + * @return errorcode, 0 on success + */ +u32 EEPROMRead(u16 address, u16* data) { + u16 buffer[0x44]; u16* ptr; u8 t1, t2; u16 value; - if (unk_1 >= gEEPROMConfig->size) { - return 0x80ff; + if (address >= gEEPROMConfig->size) { + return EEPROM_OUT_OF_RANGE; } else { - ptr = stack; + ptr = buffer; + // setup address (u8*)ptr += (gEEPROMConfig->address_width << 1) + 1; ((u8*)ptr)++; for (t1 = 0; t1 < gEEPROMConfig->address_width; t1++) { - *(ptr--) = unk_1; - unk_1 >>= 1; + *(ptr--) = address; + address >>= 1; } + // read request *(ptr--) = 1; *ptr = 1; - DMA3Transfer(stack, (u16*)0xd000000, gEEPROMConfig->address_width + 3); - DMA3Transfer((u16*)0xd000000, stack, 0x44); - ptr = stack + 4; - unk_2 += 3; + // send address to eeprom + DMA3Transfer(buffer, (u16*)0xd000000, gEEPROMConfig->address_width + 3); + // recieve data + DMA3Transfer((u16*)0xd000000, buffer, 0x44); + // 4 bit junk + ptr = buffer + 4; + data += 3; + // copy data into output buffer for (t1 = 0; t1 < 4; t1++) { value = 0; for (t2 = 0; t2 < 0x10; t2++) { value <<= 1; value |= (*ptr++) & 1; } - *(unk_2--) = value; + *(data--) = value; } return 0; } } -u16 sub_080B1698(u16 unk_1, u16* unk_2) { - return sub_080B16AC(unk_1, unk_2, 1); +u16 EEPROMWrite1(u16 address, u16* data) { + return EEPROMWrite(address, data, 1); } // this is the furthest I could get -NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 unk_1, u16* unk_2, u8 unk_3)) { +// 0x080B16AC +NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 unk_1, u16* unk_2, u8 unk_3)) { u16 stack[0x52]; vu16 stack_a4; vu16 stack_a6; @@ -102,8 +116,8 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 u16* ptr; r1 = unk_1; - if (unk_1 < gEEPROMConfig->size) - return 0x80ff; + if (unk_1 >= gEEPROMConfig->size) + return EEPROM_OUT_OF_RANGE; ptr = stack + gEEPROMConfig->address_width + 0x42; *ptr = 0; @@ -178,23 +192,23 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 } END_NONMATCH -u16 sub_080B180C(u16 unk_1, u16* unk_2) { +u16 EEPROMCompare(u16 address, u16* data) { u16 ret; - u16 stack[4]; + u16 buffer[4]; u16* ptr; u8 i; ret = 0; - if (unk_1 >= gEEPROMConfig->size) { - return 0x80ff; + if (address >= gEEPROMConfig->size) { + return EEPROM_OUT_OF_RANGE; } - sub_080B15E8(unk_1, stack); - ptr = stack; - for (i = 0; i < ARRAY_COUNT(stack); i++) { - if (*unk_2++ != *ptr++) { - ret = 0x8000; + EEPROMRead(address, buffer); + ptr = buffer; + for (i = 0; i < ARRAY_COUNT(buffer); i++) { + if (*data++ != *ptr++) { + ret = EEPROM_COMPARE_FAILED; break; } } @@ -203,14 +217,14 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) { const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT"; -u32 sub_080B1864(u16 unk_1, u16* unk_2) { +u32 EEPROMWrite1_check(u16 address, u16* data) { u8 i; u32 ret; for (i = 0; i < 3; i++) { - ret = sub_080B1698(unk_1, unk_2); + ret = EEPROMWrite1(address, data); if (ret == 0) { - ret = sub_080B180C(unk_1, unk_2); + ret = EEPROMCompare(address, data); if (ret == 0) break; } @@ -218,25 +232,25 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2) { return ret; } -u16 sub_080B18A4(u16 unk_1, u16* unk_2) { +u16 EEPROMWrite0_8k(u16 address, u16* data) { u16 ret; if (gEEPROMConfig->unk_00 != 0x200) { - ret = sub_080B16AC(unk_1, unk_2, 0); + ret = EEPROMWrite(address, data, 0); } else { - ret = 0x8080; + ret = EEPROM_UNSUPPORTED_TYPE; } return ret; } -u32 sub_080B18DC(u16 unk_1, u16* unk_2) { +u32 EEPROMWrite0_8k_Check(u16 address, u16* data) { u8 i; u32 ret; for (i = 0; i < 3; i++) { - ret = sub_080B18A4(unk_1, unk_2); + ret = EEPROMWrite0_8k(address, data); if (ret == 0) { - ret = sub_080B180C(unk_1, unk_2); + ret = EEPROMCompare(address, data); if (ret == 0) { break; } diff --git a/src/save.c b/src/save.c index 281e54c5..da72267e 100644 --- a/src/save.c +++ b/src/save.c @@ -1,4 +1,5 @@ #include "save.h" +#include "gba/eeprom.h" typedef struct Thing { u16 unk_1; @@ -6,9 +7,6 @@ typedef struct Thing { u32 unk_3; } Thing; -extern u32 sub_080B180C(u32, const char*); -extern u16 sub_080B18DC(u16, const char*); - const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500, 0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 }; @@ -106,7 +104,7 @@ u32 sub_0807CE90(void) { int iVar2; int iVar3; - sub_080B1520(0x40); + EEPROMConfigure(0x40); puVar1 = sub_0807D1C4(4); iVar3 = 0; if (sub_0807D24C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 0) { @@ -343,8 +341,8 @@ NONMATCH("asm/non_matching/save/sub_0807D20C.inc", u32 sub_0807D20C(u32 unk_1, c unk_3 >>= 3; unk_1 >>= 3; while (unk_3-- > 0) { - if (sub_080B18DC(unk_1, unk_2)) { - sub_080B18DC(unk_1, gUnk_0811E4B4); + if (EEPROMWrite0_8k_Check(unk_1, (u16*)unk_2)) { + EEPROMWrite0_8k_Check(unk_1, (u16*)gUnk_0811E4B4); return 0; } unk_1++; @@ -358,7 +356,7 @@ NONMATCH("asm/non_matching/save/sub_0807D24C.inc", u32 sub_0807D24C(u32 unk_1, c unk_3 >>= 3; unk_1 >>= 3; while (unk_3-- > 0) { - if (sub_080B180C(unk_1, unk_2)) + if (EEPROMCompare(unk_1, (u16*)unk_2)) return 0; unk_1++; unk_2 += 8;