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
lsrs r0, r0, #0x10
adds r1, r6, #0
bl sub_080B15E8
bl EEPROMRead
lsls r0, r0, #0x10
cmp r0, #0
beq _0807D1FA

View File

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

View File

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

View File

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

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 "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;
}

View File

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