mirror of https://github.com/zeldaret/tmc.git
commit
c33bd1f9b1
1
Makefile
1
Makefile
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
12
src/save.c
12
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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue