Merge pull request #130 from Henny022p/master

Matched EEPROM
This commit is contained in:
notyourav 2021-03-02 17:03:39 -08:00 committed by GitHub
commit c33bd1f9b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 478 additions and 573 deletions

View File

@ -84,6 +84,7 @@ endif
#$(C_BUILDDIR)/need_interworking_file_name.o: CFLAGS += -mthumb-interwork
$(C_BUILDDIR)/arm_proxy.o: CFLAGS += -mthumb-interwork
$(C_BUILDDIR)/eeprom.o: CFLAGS = -O1 -mthumb-interwork -Wimplicit -Wparentheses -Werror -Wno-multichar
C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c)
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))

View File

@ -1,551 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_080B1520
sub_080B1520: @ 0x080B1520
push {lr}
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
movs r2, #0
cmp r0, #4
bne _080B153C
ldr r1, _080B1534 @ =gUnk_02036A50
ldr r0, _080B1538 @ =gUnk_08DE7D40
str r0, [r1]
b _080B1558
.align 2, 0
_080B1534: .4byte gUnk_02036A50
_080B1538: .4byte gUnk_08DE7D40
_080B153C:
cmp r0, #0x40
bne _080B1550
ldr r1, _080B1548 @ =gUnk_02036A50
ldr r0, _080B154C @ =gUnk_08DE7D4C
str r0, [r1]
b _080B1558
.align 2, 0
_080B1548: .4byte gUnk_02036A50
_080B154C: .4byte gUnk_08DE7D4C
_080B1550:
ldr r1, _080B1560 @ =gUnk_02036A50
ldr r0, _080B1564 @ =gUnk_08DE7D40
str r0, [r1]
movs r2, #1
_080B1558:
adds r0, r2, #0
pop {r1}
bx r1
.align 2, 0
_080B1560: .4byte gUnk_02036A50
_080B1564: .4byte gUnk_08DE7D40
thumb_func_start sub_080B1568
sub_080B1568: @ 0x080B1568
push {r4, r5, r6, lr}
lsls r2, r2, #0x10
lsrs r2, r2, #0x10
ldr r4, _080B15C8 @ =0x04000208
ldrh r3, [r4]
adds r6, r3, #0
movs r3, #0
strh r3, [r4]
ldr r5, _080B15CC @ =0x04000204
ldrh r4, [r5]
ldr r3, _080B15D0 @ =0x0000F8FF
ands r4, r3
ldr r3, _080B15D4 @ =gUnk_02036A50
ldr r3, [r3]
ldrh r3, [r3, #6]
orrs r4, r3
strh r4, [r5]
ldr r3, _080B15D8 @ =0x040000D4
str r0, [r3]
ldr r0, _080B15DC @ =0x040000D8
str r1, [r0]
ldr r1, _080B15E0 @ =0x040000DC
movs r0, #0x80
lsls r0, r0, #0x18
orrs r2, r0
str r2, [r1]
adds r1, #2
movs r2, #0x80
lsls r2, r2, #8
adds r0, r2, #0
ldrh r1, [r1]
ands r0, r1
cmp r0, #0
beq _080B15BC
ldr r2, _080B15E4 @ =0x040000DE
movs r0, #0x80
lsls r0, r0, #8
adds r1, r0, #0
_080B15B4:
ldrh r0, [r2]
ands r0, r1
cmp r0, #0
bne _080B15B4
_080B15BC:
ldr r0, _080B15C8 @ =0x04000208
strh r6, [r0]
pop {r4, r5, r6}
pop {r0}
bx r0
.align 2, 0
_080B15C8: .4byte 0x04000208
_080B15CC: .4byte 0x04000204
_080B15D0: .4byte 0x0000F8FF
_080B15D4: .4byte gUnk_02036A50
_080B15D8: .4byte 0x040000D4
_080B15DC: .4byte 0x040000D8
_080B15E0: .4byte 0x040000DC
_080B15E4: .4byte 0x040000DE
thumb_func_start sub_080B15E8
sub_080B15E8: @ 0x080B15E8
push {r4, r5, r6, lr}
sub sp, #0x88
adds r5, r1, #0
lsls r0, r0, #0x10
lsrs r3, r0, #0x10
ldr r0, _080B1600 @ =gUnk_02036A50
ldr r0, [r0]
ldrh r0, [r0, #4]
cmp r3, r0
blo _080B1608
ldr r0, _080B1604 @ =0x000080FF
b _080B168A
.align 2, 0
_080B1600: .4byte gUnk_02036A50
_080B1604: .4byte 0x000080FF
_080B1608:
ldr r0, _080B1694 @ =gUnk_02036A50
adds r6, r0, #0
ldr r0, [r0]
ldrb r1, [r0, #8]
lsls r0, r1, #1
mov r4, sp
adds r2, r0, r4
adds r2, #2
movs r4, #0
cmp r4, r1
bhs _080B1632
_080B161E:
strh r3, [r2]
subs r2, #2
lsrs r3, r3, #1
adds r0, r4, #1
lsls r0, r0, #0x18
lsrs r4, r0, #0x18
ldr r0, [r6]
ldrb r0, [r0, #8]
cmp r4, r0
blo _080B161E
_080B1632:
movs r0, #1
strh r0, [r2]
subs r2, #2
strh r0, [r2]
movs r4, #0xd0
lsls r4, r4, #0x14
ldr r0, _080B1694 @ =gUnk_02036A50
ldr r0, [r0]
ldrb r2, [r0, #8]
adds r2, #3
mov r0, sp
adds r1, r4, #0
bl sub_080B1568
adds r0, r4, #0
mov r1, sp
movs r2, #0x44
bl sub_080B1568
add r2, sp, #8
adds r5, #6
movs r4, #0
movs r6, #1
_080B1660:
movs r1, #0
movs r3, #0
_080B1664:
lsls r1, r1, #0x11
ldrh r0, [r2]
ands r0, r6
lsrs r1, r1, #0x10
orrs r1, r0
adds r2, #2
adds r0, r3, #1
lsls r0, r0, #0x18
lsrs r3, r0, #0x18
cmp r3, #0xf
bls _080B1664
strh r1, [r5]
subs r5, #2
adds r0, r4, #1
lsls r0, r0, #0x18
lsrs r4, r0, #0x18
cmp r4, #3
bls _080B1660
movs r0, #0
_080B168A:
add sp, #0x88
pop {r4, r5, r6}
pop {r1}
bx r1
.align 2, 0
_080B1694: .4byte gUnk_02036A50
thumb_func_start sub_080B1698
sub_080B1698: @ 0x080B1698
push {lr}
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
movs r2, #1
bl sub_080B16AC
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
pop {r1}
bx r1
thumb_func_start sub_080B16AC
sub_080B16AC: @ 0x080B16AC
push {r4, r5, r6, r7, lr}
sub sp, #0xb0
adds r5, r1, #0
lsls r0, r0, #0x10
lsrs r1, r0, #0x10
lsls r2, r2, #0x18
lsrs r7, r2, #0x18
ldr r0, _080B16C8 @ =gUnk_02036A50
ldr r0, [r0]
ldrh r0, [r0, #4]
cmp r1, r0
blo _080B16D0
ldr r0, _080B16CC @ =0x000080FF
b _080B1804
.align 2, 0
_080B16C8: .4byte gUnk_02036A50
_080B16CC: .4byte 0x000080FF
_080B16D0:
ldr r0, _080B1710 @ =gUnk_02036A50
ldr r0, [r0]
ldrb r0, [r0, #8]
lsls r0, r0, #1
mov r2, sp
adds r3, r0, r2
adds r3, #0x84
movs r0, #0
strh r0, [r3]
subs r3, #2
movs r4, #0
_080B16E6:
ldrh r2, [r5]
adds r5, #2
movs r0, #0
_080B16EC:
strh r2, [r3]
subs r3, #2
lsrs r2, r2, #1
adds r0, #1
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #0xf
bls _080B16EC
adds r0, r4, #1
lsls r0, r0, #0x18
lsrs r4, r0, #0x18
cmp r4, #3
bls _080B16E6
movs r4, #0
ldr r0, _080B1710 @ =gUnk_02036A50
adds r2, r0, #0
ldr r0, [r0]
b _080B1722
.align 2, 0
_080B1710: .4byte gUnk_02036A50
_080B1714:
strh r1, [r3]
subs r3, #2
lsrs r1, r1, #1
adds r0, r4, #1
lsls r0, r0, #0x18
lsrs r4, r0, #0x18
ldr r0, [r2]
_080B1722:
ldrb r0, [r0, #8]
cmp r4, r0
blo _080B1714
movs r0, #0
strh r0, [r3]
subs r3, #2
movs r6, #1
strh r6, [r3]
movs r4, #0xd0
lsls r4, r4, #0x14
ldr r0, _080B1794 @ =gUnk_02036A50
ldr r0, [r0]
ldrb r2, [r0, #8]
adds r2, #0x43
mov r0, sp
adds r1, r4, #0
bl sub_080B1568
movs r5, #0
add r2, sp, #0xa4
strh r5, [r2]
mov r1, sp
adds r1, #0xa6
ldr r0, _080B1798 @ =0x04000006
ldrh r0, [r0]
strh r0, [r1]
add r0, sp, #0xac
str r5, [r0]
ldrh r0, [r2]
cmp r0, #0
bne _080B1768
ldrh r0, [r4]
ands r0, r6
cmp r0, #0
bne _080B17F8
_080B1768:
add r3, sp, #0xa8
ldr r0, _080B1798 @ =0x04000006
ldrh r0, [r0]
strh r0, [r3]
mov r4, sp
adds r4, #0xa6
ldrh r1, [r3]
ldrh r0, [r4]
cmp r1, r0
beq _080B17E2
ldrh r1, [r3]
ldrh r0, [r4]
cmp r1, r0
bls _080B179C
add r2, sp, #0xac
ldrh r1, [r3]
ldrh r0, [r4]
subs r1, r1, r0
ldr r0, [r2]
adds r1, r1, r0
str r1, [r2]
b _080B17B2
.align 2, 0
_080B1794: .4byte gUnk_02036A50
_080B1798: .4byte 0x04000006
_080B179C:
add r2, sp, #0xac
add r0, sp, #0xa8
ldrh r0, [r0]
adds r0, #0xe4
mov r1, sp
adds r1, #0xa6
ldrh r1, [r1]
subs r0, r0, r1
ldr r1, [r2]
adds r0, r0, r1
str r0, [r2]
_080B17B2:
add r0, sp, #0xac
ldr r0, [r0]
cmp r0, #0x88
bls _080B17D8
add r0, sp, #0xa4
ldrh r0, [r0]
cmp r0, #0
bne _080B1802
movs r0, #0xd0
lsls r0, r0, #0x14
ldrh r0, [r0]
movs r1, #1
ands r0, r1
cmp r0, #0
bne _080B1802
ldr r5, _080B17D4 @ =0x0000C001
b _080B1802
.align 2, 0
_080B17D4: .4byte 0x0000C001
_080B17D8:
mov r0, sp
adds r0, #0xa6
add r1, sp, #0xa8
ldrh r1, [r1]
strh r1, [r0]
_080B17E2:
add r2, sp, #0xa4
ldrh r0, [r2]
cmp r0, #0
bne _080B1768
movs r0, #0xd0
lsls r0, r0, #0x14
movs r1, #1
ldrh r0, [r0]
ands r1, r0
cmp r1, #0
beq _080B1768
_080B17F8:
ldrh r0, [r2]
adds r0, #1
strh r0, [r2]
cmp r7, #0
bne _080B1768
_080B1802:
adds r0, r5, #0
_080B1804:
add sp, #0xb0
pop {r4, r5, r6, r7}
pop {r1}
bx r1
thumb_func_start sub_080B180C
sub_080B180C: @ 0x080B180C
push {r4, r5, lr}
sub sp, #8
adds r4, r1, #0
lsls r0, r0, #0x10
lsrs r1, r0, #0x10
movs r5, #0
ldr r0, _080B1828 @ =gUnk_02036A50
ldr r0, [r0]
ldrh r0, [r0, #4]
cmp r1, r0
blo _080B1830
ldr r0, _080B182C @ =0x000080FF
b _080B185A
.align 2, 0
_080B1828: .4byte gUnk_02036A50
_080B182C: .4byte 0x000080FF
_080B1830:
adds r0, r1, #0
mov r1, sp
bl sub_080B15E8
mov r2, sp
movs r3, #0
b _080B1848
_080B183E:
adds r0, r3, #1
lsls r0, r0, #0x18
lsrs r3, r0, #0x18
cmp r3, #3
bhi _080B1858
_080B1848:
ldrh r1, [r4]
ldrh r0, [r2]
adds r2, #2
adds r4, #2
cmp r1, r0
beq _080B183E
movs r5, #0x80
lsls r5, r5, #8
_080B1858:
adds r0, r5, #0
_080B185A:
add sp, #8
pop {r4, r5}
pop {r1}
bx r1
.align 2, 0
thumb_func_start sub_080B1864
sub_080B1864: @ 0x080B1864
push {r4, r5, r6, lr}
adds r5, r1, #0
lsls r0, r0, #0x10
lsrs r4, r0, #0x10
movs r6, #0
b _080B1876
_080B1870:
adds r0, r6, #1
lsls r0, r0, #0x18
lsrs r6, r0, #0x18
_080B1876:
cmp r6, #2
bhi _080B189A
adds r0, r4, #0
adds r1, r5, #0
bl sub_080B1698
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
cmp r2, #0
bne _080B1870
adds r0, r4, #0
adds r1, r5, #0
bl sub_080B180C
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
cmp r2, #0
bne _080B1870
_080B189A:
adds r0, r2, #0
pop {r4, r5, r6}
pop {r1}
bx r1
.align 2, 0
thumb_func_start sub_080B18A4
sub_080B18A4: @ 0x080B18A4
push {lr}
adds r3, r1, #0
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
ldr r0, _080B18CC @ =gUnk_02036A50
ldr r0, [r0]
ldr r1, [r0]
movs r0, #0x80
lsls r0, r0, #2
cmp r1, r0
beq _080B18D0
adds r0, r2, #0
adds r1, r3, #0
movs r2, #0
bl sub_080B16AC
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
b _080B18D2
.align 2, 0
_080B18CC: .4byte gUnk_02036A50
_080B18D0:
ldr r0, _080B18D8 @ =0x00008080
_080B18D2:
pop {r1}
bx r1
.align 2, 0
_080B18D8: .4byte 0x00008080
thumb_func_start sub_080B18DC
sub_080B18DC: @ 0x080B18DC
push {r4, r5, r6, lr}
adds r5, r1, #0
lsls r0, r0, #0x10
lsrs r4, r0, #0x10
movs r6, #0
b _080B18EE
_080B18E8:
adds r0, r6, #1
lsls r0, r0, #0x18
lsrs r6, r0, #0x18
_080B18EE:
cmp r6, #2
bhi _080B1912
adds r0, r4, #0
adds r1, r5, #0
bl sub_080B18A4
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
cmp r2, #0
bne _080B18E8
adds r0, r4, #0
adds r1, r5, #0
bl sub_080B180C
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
cmp r2, #0
bne _080B18E8
_080B1912:
adds r0, r2, #0
pop {r4, r5, r6}
pop {r1}
bx r1
.align 2, 0

View File

@ -0,0 +1,192 @@
.syntax unified
.text
push {r4, r5, r6, r7, lr}
sub sp, #0xb0
adds r5, r1, #0
lsls r0, r0, #0x10
lsrs r1, r0, #0x10
lsls r2, r2, #0x18
lsrs r7, r2, #0x18
ldr r0, _080B16C8 @ =gEEPROMConfig
ldr r0, [r0]
ldrh r0, [r0, #4]
cmp r1, r0
blo _080B16D0
ldr r0, _080B16CC @ =0x000080FF
b _080B1804
.align 2, 0
_080B16C8: .4byte gEEPROMConfig
_080B16CC: .4byte 0x000080FF
_080B16D0:
ldr r0, _080B1710 @ =gEEPROMConfig
ldr r0, [r0]
ldrb r0, [r0, #8]
lsls r0, r0, #1
mov r2, sp
adds r3, r0, r2
adds r3, #0x84
movs r0, #0
strh r0, [r3]
subs r3, #2
movs r4, #0
_080B16E6:
ldrh r2, [r5]
adds r5, #2
movs r0, #0
_080B16EC:
strh r2, [r3]
subs r3, #2
lsrs r2, r2, #1
adds r0, #1
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #0xf
bls _080B16EC
adds r0, r4, #1
lsls r0, r0, #0x18
lsrs r4, r0, #0x18
cmp r4, #3
bls _080B16E6
movs r4, #0
ldr r0, _080B1710 @ =gEEPROMConfig
adds r2, r0, #0
ldr r0, [r0]
b _080B1722
.align 2, 0
_080B1710: .4byte gEEPROMConfig
_080B1714:
strh r1, [r3]
subs r3, #2
lsrs r1, r1, #1
adds r0, r4, #1
lsls r0, r0, #0x18
lsrs r4, r0, #0x18
ldr r0, [r2]
_080B1722:
ldrb r0, [r0, #8]
cmp r4, r0
blo _080B1714
movs r0, #0
strh r0, [r3]
subs r3, #2
movs r6, #1
strh r6, [r3]
movs r4, #0xd0
lsls r4, r4, #0x14
ldr r0, _080B1794 @ =gEEPROMConfig
ldr r0, [r0]
ldrb r2, [r0, #8]
adds r2, #0x43
mov r0, sp
adds r1, r4, #0
bl DMA3Transfer
movs r5, #0
add r2, sp, #0xa4
strh r5, [r2]
mov r1, sp
adds r1, #0xa6
ldr r0, _080B1798 @ =0x04000006
ldrh r0, [r0]
strh r0, [r1]
add r0, sp, #0xac
str r5, [r0]
ldrh r0, [r2]
cmp r0, #0
bne _080B1768
ldrh r0, [r4]
ands r0, r6
cmp r0, #0
bne _080B17F8
_080B1768:
add r3, sp, #0xa8
ldr r0, _080B1798 @ =0x04000006
ldrh r0, [r0]
strh r0, [r3]
mov r4, sp
adds r4, #0xa6
ldrh r1, [r3]
ldrh r0, [r4]
cmp r1, r0
beq _080B17E2
ldrh r1, [r3]
ldrh r0, [r4]
cmp r1, r0
bls _080B179C
add r2, sp, #0xac
ldrh r1, [r3]
ldrh r0, [r4]
subs r1, r1, r0
ldr r0, [r2]
adds r1, r1, r0
str r1, [r2]
b _080B17B2
.align 2, 0
_080B1794: .4byte gEEPROMConfig
_080B1798: .4byte 0x04000006
_080B179C:
add r2, sp, #0xac
add r0, sp, #0xa8
ldrh r0, [r0]
adds r0, #0xe4
mov r1, sp
adds r1, #0xa6
ldrh r1, [r1]
subs r0, r0, r1
ldr r1, [r2]
adds r0, r0, r1
str r0, [r2]
_080B17B2:
add r0, sp, #0xac
ldr r0, [r0]
cmp r0, #0x88
bls _080B17D8
add r0, sp, #0xa4
ldrh r0, [r0]
cmp r0, #0
bne _080B1802
movs r0, #0xd0
lsls r0, r0, #0x14
ldrh r0, [r0]
movs r1, #1
ands r0, r1
cmp r0, #0
bne _080B1802
ldr r5, _080B17D4 @ =0x0000C001
b _080B1802
.align 2, 0
_080B17D4: .4byte 0x0000C001
_080B17D8:
mov r0, sp
adds r0, #0xa6
add r1, sp, #0xa8
ldrh r1, [r1]
strh r1, [r0]
_080B17E2:
add r2, sp, #0xa4
ldrh r0, [r2]
cmp r0, #0
bne _080B1768
movs r0, #0xd0
lsls r0, r0, #0x14
movs r1, #1
ldrh r0, [r0]
ands r1, r0
cmp r1, #0
beq _080B1768
_080B17F8:
ldrh r0, [r2]
adds r0, #1
strh r0, [r2]
cmp r7, #0
bne _080B1768
_080B1802:
adds r0, r5, #0
_080B1804:
add sp, #0xb0
pop {r4, r5, r6, r7}
pop {r1}
bx r1
.syntax divided

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

@ -10301,10 +10301,4 @@ gUnk_08DE7D18:: @ 08DE7D18
.incbin "baserom.gba", 0xDE7D18, 0x0000010
gUnk_08DE7D28:: @ 08DE7D28
.incbin "baserom.gba", 0xDE7D28, 0x0000018
gUnk_08DE7D40:: @ 08DE7D40
.incbin "baserom.gba", 0xDE7D40, 0x000000C
gUnk_08DE7D4C:: @ 08DE7D4C
.incbin "baserom.gba", 0xDE7D4C, 0x0000058
.incbin "baserom.gba", 0xDE7D28, 0x000000C

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

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

@ -0,0 +1,21 @@
#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
*/
u16 EEPROMConfigure(u16 unk_1);
u16 EEPROMRead(u16 address, u16* data);
u16 EEPROMCompare(u16 address, const u16* data);
u16 EEPROMWrite0_8k_Check(u16 address, const u16* data);
#endif // GUARD_GBA_EEPROM

View File

@ -148,7 +148,7 @@ SECTIONS {
. = 0x000369F0; gUnk_020369F0 = .;
. = 0x00036A38; gUnk_02036A38 = .;
. = 0x00036A40; gUnk_02036A40 = .;
. = 0x00036A50; gUnk_02036A50 = .;
. = 0x00036A50; gEEPROMConfig = .;
. = 0x00036A58; gUnk_02036A58 = .;
. = 0x00036AD8; gUnk_02036AD8 = .;
. = 0x00036BB8; gUnk_02036BB8 = .;
@ -900,7 +900,7 @@ SECTIONS {
asm/m4a_asm.o(.text);
asm/m4a.o(.text);
asm/libagbsyscall.o(.text);
asm/code_080B1520.o(.text);
src/eeprom.o(.text);
*libc.a:memcpy.o(.text);
/* handwritten assembly in arm mode */
@ -1033,6 +1033,7 @@ SECTIONS {
data/strings.o(.rodata);
data/sprite_table.o(.rodata);
data/data_089FC6C4.o(.rodata);
src/eeprom.o(.rodata);
} >rom
/* DWARF 2 sections */

250
src/eeprom.c Normal file
View File

@ -0,0 +1,250 @@
#include "global.h"
#include "gba/eeprom.h"
typedef struct EEPROMConfig {
u32 unk_00;
u16 size;
u16 waitcnt;
u8 address_width;
// u8 filler[3];
} EEPROMConfig;
const char EEPROM_V124[] = "EEPROM_V124";
extern const EEPROMConfig* gEEPROMConfig;
const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 };
const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe };
u16 EEPROMWrite(u16, const u16*, u8);
u16 EEPROMConfigure(u16 unk_1) {
u16 ret;
ret = 0;
if (unk_1 == 4) {
gEEPROMConfig = &gEEPROMConfig512;
} else {
if (unk_1 == 0x40) {
gEEPROMConfig = &gEEPROMConfig8k;
} else {
gEEPROMConfig = &gEEPROMConfig512;
ret = 1;
}
}
return ret;
}
static void DMA3Transfer(const void* src, void* dest, u16 count) {
u32 temp;
u16 IME_save;
IME_save = REG_IME;
REG_IME = 0; // disable all interrupts
temp = REG_WAITCNT & 0xf8ff;
temp |= gEEPROMConfig->waitcnt; // configure wait state 2
REG_WAITCNT = temp;
REG_DMA3SAD = (u32)src;
REG_DMA3DAD = (u32)dest;
REG_DMA3CNT = count | 0x80000000; // enable dma
while ((REG_DMA3CNT_H & 0x8000) != 0) {} // wait for dma to finish
REG_IME = IME_save;
}
/**
* 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
*/
u16 EEPROMRead(u16 address, u16* data) {
u16 buffer[0x44];
u16* ptr;
u8 t1, t2;
u16 value;
if (address >= gEEPROMConfig->size) {
return EEPROM_OUT_OF_RANGE;
} else {
ptr = buffer;
// setup address
(u8*)ptr += (gEEPROMConfig->address_width << 1) + 1;
((u8*)ptr)++;
for (t1 = 0; t1 < gEEPROMConfig->address_width; t1++) {
*(ptr--) = address;
address >>= 1;
}
// read request
*(ptr--) = 1;
*ptr = 1;
// 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;
}
*(data--) = value;
}
return 0;
}
}
u16 EEPROMWrite1(u16 address, const u16* data) {
return EEPROMWrite(address, data, 1);
}
// reading from EEPROM like a status register
#define REG_EEPROM (*(u16*)0xd000000)
// this is the furthest I could get
// 0x080B16AC
NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 address, const u16* data, u8 unk_3)) {
u16 buffer[0x52]; // this is one too large?
vu16 stack_a4;
vu16 prev_vcount; // stack + a6
vu16 current_vcount; // stack + a6
vu32 passed_scanlines; // stack + ac
u32 r2;
u8 i, j;
u16* ptr;
if (address >= gEEPROMConfig->size)
return EEPROM_OUT_OF_RANGE;
ptr = buffer + gEEPROMConfig->address_width + 0x42;
*ptr = 0;
ptr--;
// copy data into buffer
for (i = 0; i <= 3; i++) {
r2 = *data;
data++;
for (j = 0; j <= 0xf; j++) {
*ptr = r2;
ptr--;
r2 = r2 >> 1;
}
}
// copy address to buffer
for (i = 0; i < gEEPROMConfig->address_width; i++) {
*ptr = address;
ptr--;
address = address >> 1;
}
*ptr = 0;
ptr--;
*ptr = 1;
DMA3Transfer(buffer, (u16*)0xd000000, gEEPROMConfig->address_width + 0x43);
stack_a4 = 0;
prev_vcount = REG_VCOUNT;
passed_scanlines = 0;
if (stack_a4 == 0) {
if ((REG_EEPROM & 1) != 0)
goto bad;
}
// before here its only regalloc, but after I cant get it to work
do {
do {
do {
current_vcount = REG_VCOUNT;
if (current_vcount != prev_vcount) {
if (current_vcount >= prev_vcount) {
passed_scanlines += current_vcount - prev_vcount;
} else {
passed_scanlines += (current_vcount + 0xe4) - prev_vcount;
}
if (passed_scanlines > 0x88) {
if (stack_a4 != 0)
return 0;
if ((REG_EEPROM & 1) != 0)
return 0;
return 0xc001;
}
prev_vcount = current_vcount;
}
} while (stack_a4 != 0);
} while ((REG_EEPROM & 1) != 0);
bad:
stack_a4++;
} while (unk_3 != 0);
return 0;
}
END_NONMATCH
u16 EEPROMCompare(u16 address, const u16* data) {
u16 ret;
u16 buffer[4];
u16* ptr;
u8 i;
ret = 0;
if (address >= gEEPROMConfig->size) {
return EEPROM_OUT_OF_RANGE;
}
EEPROMRead(address, buffer);
ptr = buffer;
for (i = 0; i < ARRAY_COUNT(buffer); i++) {
if (*data++ != *ptr++) {
ret = EEPROM_COMPARE_FAILED;
break;
}
}
return ret;
}
const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT";
u16 EEPROMWrite1_check(u16 address, const u16* data) {
u8 i;
u16 ret;
for (i = 0; i < 3; i++) {
ret = EEPROMWrite1(address, data);
if (ret == 0) {
ret = EEPROMCompare(address, data);
if (ret == 0)
break;
}
}
return ret;
}
u16 EEPROMWrite0_8k(u16 address, const u16* data) {
u16 ret;
if (gEEPROMConfig->unk_00 != 0x200) {
ret = EEPROMWrite(address, data, 0);
} else {
ret = EEPROM_UNSUPPORTED_TYPE;
}
return ret;
}
u16 EEPROMWrite0_8k_Check(u16 address, const u16* data) {
u8 i;
u16 ret;
for (i = 0; i < 3; i++) {
ret = EEPROMWrite0_8k(address, data);
if (ret == 0) {
ret = EEPROMCompare(address, data);
if (ret == 0) {
break;
}
}
}
return ret;
}
const char thing[0x1c] = "\xff\xff\xff\xff";

View File

@ -67,7 +67,7 @@ void sub_08057A18(Manager*, DiggingCaveEntrance*);
u32 sub_0805795C(Manager* this, DiggingCaveEntrance* entr) {
u16 offsetX, offsetY, offsetX2, offsetY2;
u32 tmp;
if (gUnk_03004030.unk_08) {
if (gUnk_03004030.address_width) {
offsetX = gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX;
offsetY = gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY;
offsetX2 = (entr->unk_00 & 0x3F) * 16 + 8;

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;