mirror of https://github.com/zeldaret/tmc.git
gave names to functions and magic values
This commit is contained in:
parent
2697b736e2
commit
1810f771e5
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
12
src/save.c
12
src/save.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue