diff --git a/Makefile b/Makefile index f243bea8..e17925d4 100644 --- a/Makefile +++ b/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)) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s deleted file mode 100644 index 9ecbe88a..00000000 --- a/asm/code_080B1520.s +++ /dev/null @@ -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 - diff --git a/asm/non_matching/code_080B1520/EEPROMWrite.inc b/asm/non_matching/code_080B1520/EEPROMWrite.inc new file mode 100644 index 00000000..6803eef0 --- /dev/null +++ b/asm/non_matching/code_080B1520/EEPROMWrite.inc @@ -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 diff --git a/asm/non_matching/save/sub_0807D1D8.inc b/asm/non_matching/save/sub_0807D1D8.inc index f9b81bde..88c30173 100644 --- a/asm/non_matching/save/sub_0807D1D8.inc +++ b/asm/non_matching/save/sub_0807D1D8.inc @@ -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 diff --git a/asm/non_matching/save/sub_0807D20C.inc b/asm/non_matching/save/sub_0807D20C.inc index 954ad823..7fd90a12 100644 --- a/asm/non_matching/save/sub_0807D20C.inc +++ b/asm/non_matching/save/sub_0807D20C.inc @@ -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 diff --git a/asm/non_matching/save/sub_0807D24C.inc b/asm/non_matching/save/sub_0807D24C.inc index 7761d787..6ec855ad 100644 --- a/asm/non_matching/save/sub_0807D24C.inc +++ b/asm/non_matching/save/sub_0807D24C.inc @@ -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 diff --git a/data/data_089FC6C4.s b/data/data_089FC6C4.s index 4b69eaea..fb6fb436 100644 --- a/data/data_089FC6C4.s +++ b/data/data_089FC6C4.s @@ -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 diff --git a/include/functions.h b/include/functions.h index 2c91bdd9..9d190498 100644 --- a/include/functions.h +++ b/include/functions.h @@ -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); diff --git a/include/gba/eeprom.h b/include/gba/eeprom.h new file mode 100644 index 00000000..46c7e35c --- /dev/null +++ b/include/gba/eeprom.h @@ -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 diff --git a/linker.ld b/linker.ld index 80ec99ed..07848cbf 100644 --- a/linker.ld +++ b/linker.ld @@ -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 */ diff --git a/src/eeprom.c b/src/eeprom.c new file mode 100644 index 00000000..4ea218b3 --- /dev/null +++ b/src/eeprom.c @@ -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"; diff --git a/src/enemy/RopeGolden.c b/src/enemy/ropeGolden.c similarity index 100% rename from src/enemy/RopeGolden.c rename to src/enemy/ropeGolden.c diff --git a/src/manager/manager4.c b/src/manager/manager4.c index da43751f..2ebdf7d3 100644 --- a/src/manager/manager4.c +++ b/src/manager/manager4.c @@ -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; diff --git a/src/save.c b/src/save.c index c6d0bfcd..70f715ef 100644 --- a/src/save.c +++ b/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;