gave names to functions and magic values

This commit is contained in:
Henny022p 2021-02-27 00:48:36 +01:00
parent 2697b736e2
commit 1810f771e5
8 changed files with 82 additions and 51 deletions

View File

@ -14,7 +14,7 @@ _0807D1E6:
lsls r0, r5, #0x10 lsls r0, r5, #0x10
lsrs r0, r0, #0x10 lsrs r0, r0, #0x10
adds r1, r6, #0 adds r1, r6, #0
bl sub_080B15E8 bl EEPROMRead
lsls r0, r0, #0x10 lsls r0, r0, #0x10
cmp r0, #0 cmp r0, #0
beq _0807D1FA beq _0807D1FA

View File

@ -15,13 +15,13 @@ _0807D21A:
lsrs r4, r0, #0x10 lsrs r4, r0, #0x10
adds r0, r4, #0 adds r0, r4, #0
adds r1, r7, #0 adds r1, r7, #0
bl sub_080B18DC bl EEPROMWrite0_8k_Check
lsls r0, r0, #0x10 lsls r0, r0, #0x10
cmp r0, #0 cmp r0, #0
beq _0807D23C beq _0807D23C
adds r0, r4, #0 adds r0, r4, #0
ldr r1, _0807D238 @ =gUnk_0811E4B4 ldr r1, _0807D238 @ =gUnk_0811E4B4
bl sub_080B18DC bl EEPROMWrite0_8k_Check
movs r0, #0 movs r0, #0
b _0807D24A b _0807D24A
.align 2, 0 .align 2, 0

View File

@ -14,7 +14,7 @@ _0807D25A:
lsls r0, r5, #0x10 lsls r0, r5, #0x10
lsrs r0, r0, #0x10 lsrs r0, r0, #0x10
adds r1, r6, #0 adds r1, r6, #0
bl sub_080B180C bl EEPROMCompare
lsls r0, r0, #0x10 lsls r0, r0, #0x10
cmp r0, #0 cmp r0, #0
beq _0807D26E beq _0807D26E

View File

@ -213,7 +213,6 @@ extern void sub_0807CF48(u32);
extern u32 sub_0807CF10(u8*); extern u32 sub_0807CF10(u8*);
extern void sub_08056208(void); extern void sub_08056208(void);
extern void sub_08050384(); extern void sub_08050384();
extern void sub_080B1520(u32);
extern struct_0807D1C4* sub_0807D1C4(u32); extern struct_0807D1C4* sub_0807D1C4(u32);
extern u32 sub_0807D24C(u32, const char*, u32); extern u32 sub_0807D24C(u32, const char*, u32);
extern void sub_0807CF68(u32); extern void sub_0807CF68(u32);

20
include/gba/eeprom.h Normal file
View File

@ -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

View File

@ -1,4 +1,5 @@
#include "global.h" #include "global.h"
#include "gba/eeprom.h"
typedef struct EEPROMConfig { typedef struct EEPROMConfig {
u32 unk_00; u32 unk_00;
@ -12,10 +13,9 @@ extern const EEPROMConfig* gEEPROMConfig;
const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 };
const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe };
u16 EEPROMWrite(u16, u16*, u8);
u16 sub_080B16AC(u16, u16*, u8); u32 EEPROMConfigure(u16 unk_1) {
u32 sub_080B1520(u16 unk_1) {
u32 ret; u32 ret;
ret = 0; ret = 0;
@ -32,7 +32,7 @@ u32 sub_080B1520(u16 unk_1) {
return ret; return ret;
} }
void DMA3Transfer(void* src, void* dest, u16 count) { static void DMA3Transfer(void* src, void* dest, u16 count) {
u32 temp; u32 temp;
u16 IME_save; u16 IME_save;
@ -49,47 +49,61 @@ void DMA3Transfer(void* src, void* dest, u16 count) {
REG_IME = IME_save; 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; u16* ptr;
u8 t1, t2; u8 t1, t2;
u16 value; u16 value;
if (unk_1 >= gEEPROMConfig->size) { if (address >= gEEPROMConfig->size) {
return 0x80ff; return EEPROM_OUT_OF_RANGE;
} else { } else {
ptr = stack; ptr = buffer;
// setup address
(u8*)ptr += (gEEPROMConfig->address_width << 1) + 1; (u8*)ptr += (gEEPROMConfig->address_width << 1) + 1;
((u8*)ptr)++; ((u8*)ptr)++;
for (t1 = 0; t1 < gEEPROMConfig->address_width; t1++) { for (t1 = 0; t1 < gEEPROMConfig->address_width; t1++) {
*(ptr--) = unk_1; *(ptr--) = address;
unk_1 >>= 1; address >>= 1;
} }
// read request
*(ptr--) = 1; *(ptr--) = 1;
*ptr = 1; *ptr = 1;
DMA3Transfer(stack, (u16*)0xd000000, gEEPROMConfig->address_width + 3); // send address to eeprom
DMA3Transfer((u16*)0xd000000, stack, 0x44); DMA3Transfer(buffer, (u16*)0xd000000, gEEPROMConfig->address_width + 3);
ptr = stack + 4; // recieve data
unk_2 += 3; DMA3Transfer((u16*)0xd000000, buffer, 0x44);
// 4 bit junk
ptr = buffer + 4;
data += 3;
// copy data into output buffer
for (t1 = 0; t1 < 4; t1++) { for (t1 = 0; t1 < 4; t1++) {
value = 0; value = 0;
for (t2 = 0; t2 < 0x10; t2++) { for (t2 = 0; t2 < 0x10; t2++) {
value <<= 1; value <<= 1;
value |= (*ptr++) & 1; value |= (*ptr++) & 1;
} }
*(unk_2--) = value; *(data--) = value;
} }
return 0; return 0;
} }
} }
u16 sub_080B1698(u16 unk_1, u16* unk_2) { u16 EEPROMWrite1(u16 address, u16* data) {
return sub_080B16AC(unk_1, unk_2, 1); return EEPROMWrite(address, data, 1);
} }
// this is the furthest I could get // 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]; u16 stack[0x52];
vu16 stack_a4; vu16 stack_a4;
vu16 stack_a6; vu16 stack_a6;
@ -102,8 +116,8 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16
u16* ptr; u16* ptr;
r1 = unk_1; r1 = unk_1;
if (unk_1 < gEEPROMConfig->size) if (unk_1 >= gEEPROMConfig->size)
return 0x80ff; return EEPROM_OUT_OF_RANGE;
ptr = stack + gEEPROMConfig->address_width + 0x42; ptr = stack + gEEPROMConfig->address_width + 0x42;
*ptr = 0; *ptr = 0;
@ -178,23 +192,23 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16
} }
END_NONMATCH END_NONMATCH
u16 sub_080B180C(u16 unk_1, u16* unk_2) { u16 EEPROMCompare(u16 address, u16* data) {
u16 ret; u16 ret;
u16 stack[4]; u16 buffer[4];
u16* ptr; u16* ptr;
u8 i; u8 i;
ret = 0; ret = 0;
if (unk_1 >= gEEPROMConfig->size) { if (address >= gEEPROMConfig->size) {
return 0x80ff; return EEPROM_OUT_OF_RANGE;
} }
sub_080B15E8(unk_1, stack); EEPROMRead(address, buffer);
ptr = stack; ptr = buffer;
for (i = 0; i < ARRAY_COUNT(stack); i++) { for (i = 0; i < ARRAY_COUNT(buffer); i++) {
if (*unk_2++ != *ptr++) { if (*data++ != *ptr++) {
ret = 0x8000; ret = EEPROM_COMPARE_FAILED;
break; break;
} }
} }
@ -203,14 +217,14 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) {
const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT"; const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT";
u32 sub_080B1864(u16 unk_1, u16* unk_2) { u32 EEPROMWrite1_check(u16 address, u16* data) {
u8 i; u8 i;
u32 ret; u32 ret;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
ret = sub_080B1698(unk_1, unk_2); ret = EEPROMWrite1(address, data);
if (ret == 0) { if (ret == 0) {
ret = sub_080B180C(unk_1, unk_2); ret = EEPROMCompare(address, data);
if (ret == 0) if (ret == 0)
break; break;
} }
@ -218,25 +232,25 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2) {
return ret; return ret;
} }
u16 sub_080B18A4(u16 unk_1, u16* unk_2) { u16 EEPROMWrite0_8k(u16 address, u16* data) {
u16 ret; u16 ret;
if (gEEPROMConfig->unk_00 != 0x200) { if (gEEPROMConfig->unk_00 != 0x200) {
ret = sub_080B16AC(unk_1, unk_2, 0); ret = EEPROMWrite(address, data, 0);
} else { } else {
ret = 0x8080; ret = EEPROM_UNSUPPORTED_TYPE;
} }
return ret; return ret;
} }
u32 sub_080B18DC(u16 unk_1, u16* unk_2) { u32 EEPROMWrite0_8k_Check(u16 address, u16* data) {
u8 i; u8 i;
u32 ret; u32 ret;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
ret = sub_080B18A4(unk_1, unk_2); ret = EEPROMWrite0_8k(address, data);
if (ret == 0) { if (ret == 0) {
ret = sub_080B180C(unk_1, unk_2); ret = EEPROMCompare(address, data);
if (ret == 0) { if (ret == 0) {
break; break;
} }

View File

@ -1,4 +1,5 @@
#include "save.h" #include "save.h"
#include "gba/eeprom.h"
typedef struct Thing { typedef struct Thing {
u16 unk_1; u16 unk_1;
@ -6,9 +7,6 @@ typedef struct Thing {
u32 unk_3; u32 unk_3;
} Thing; } 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, const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500,
0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 }; 0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 };
@ -106,7 +104,7 @@ u32 sub_0807CE90(void) {
int iVar2; int iVar2;
int iVar3; int iVar3;
sub_080B1520(0x40); EEPROMConfigure(0x40);
puVar1 = sub_0807D1C4(4); puVar1 = sub_0807D1C4(4);
iVar3 = 0; iVar3 = 0;
if (sub_0807D24C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 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_3 >>= 3;
unk_1 >>= 3; unk_1 >>= 3;
while (unk_3-- > 0) { while (unk_3-- > 0) {
if (sub_080B18DC(unk_1, unk_2)) { if (EEPROMWrite0_8k_Check(unk_1, (u16*)unk_2)) {
sub_080B18DC(unk_1, gUnk_0811E4B4); EEPROMWrite0_8k_Check(unk_1, (u16*)gUnk_0811E4B4);
return 0; return 0;
} }
unk_1++; 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_3 >>= 3;
unk_1 >>= 3; unk_1 >>= 3;
while (unk_3-- > 0) { while (unk_3-- > 0) {
if (sub_080B180C(unk_1, unk_2)) if (EEPROMCompare(unk_1, (u16*)unk_2))
return 0; return 0;
unk_1++; unk_1++;
unk_2 += 8; unk_2 += 8;