summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2017-07-20 19:08:11 -0400
committerGitHub <noreply@github.com>2017-07-20 19:08:11 -0400
commit457f4cc993ea4b6bf292a81057a0aa0c7216f1ce (patch)
tree88f8b640a29f5a925bea4da06d63a03d6792051c
parent67ced1d77ec0d36cc2b6ebcbfc58ba28b357ddbb (diff)
parenta8bcbe3fe4b6b01cdfc85f1003e50b31f34700f2 (diff)
Merge pull request #364 from camthesaxman/decompile_record_mixing
finish decompiling record_mixing
-rw-r--r--asm/record_mixing.s543
-rw-r--r--data/record_mixing.s68
-rw-r--r--include/flags.h1
-rw-r--r--include/global.h4
-rw-r--r--include/record_mixing.h10
-rw-r--r--include/save.h2
-rw-r--r--include/vars.h1
-rw-r--r--ld_script.txt4
-rw-r--r--src/record_mixing.c882
-rw-r--r--src/save.c6
10 files changed, 734 insertions, 787 deletions
diff --git a/asm/record_mixing.s b/asm/record_mixing.s
deleted file mode 100644
index ce0121a40..000000000
--- a/asm/record_mixing.s
+++ /dev/null
@@ -1,543 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80B9C6C
-sub_80B9C6C: @ 80B9C6C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x58
- str r0, [sp, 0x2C]
- str r1, [sp, 0x30]
- str r3, [sp, 0x38]
- lsls r2, 24
- lsrs r2, 24
- str r2, [sp, 0x34]
- bl Random
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0x40]
- ldr r0, _080B9DA8 @ =gLinkPlayers
- ldrh r0, [r0, 0x4]
- bl SeedRng
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- movs r3, 0
- add r0, sp, 0x1C
- mov r9, r0
- movs r1, 0x1D
- add r1, sp
- mov r10, r1
- mov r2, sp
- adds r2, 0xC
- str r2, [sp, 0x4C]
- movs r7, 0xFF
- add r4, sp, 0x8
- movs r2, 0
- mov r6, r9
- mov r5, r10
-_080B9CBC:
- mov r1, sp
- adds r1, r3
- adds r1, 0x4
- ldrb r0, [r1]
- orrs r0, r7
- strb r0, [r1]
- adds r0, r4, r3
- strb r2, [r0]
- lsls r1, r3, 1
- adds r0, r6, r1
- strb r2, [r0]
- adds r1, r5, r1
- strb r2, [r1]
- adds r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, 0x3
- bls _080B9CBC
- movs r4, 0
- str r4, [sp, 0x3C]
- movs r3, 0
- mov r1, r8
- lsls r0, r1, 16
- lsrs r1, r0, 16
- str r0, [sp, 0x50]
- ldr r4, [sp, 0x30]
- ldr r0, [sp, 0x34]
- adds r2, r4, 0
- muls r2, r0
- str r2, [sp, 0x48]
- ldr r2, [sp, 0x3C]
- cmp r2, r1
- bcs _080B9D46
- mov r8, r1
-_080B9D00:
- ldr r4, [sp, 0x30]
- adds r0, r4, 0
- muls r0, r3
- ldr r1, [sp, 0x2C]
- adds r6, r1, r0
- ldr r0, [r6, 0x70]
- cmp r0, 0
- beq _080B9D3C
- movs r7, 0
- cmp r7, r0
- bcs _080B9D3C
- adds r4, r6, 0
- adds r4, 0x74
- mov r2, r9
- lsls r1, r3, 1
- movs r5, 0x1
-_080B9D20:
- lsls r0, r7, 1
- adds r0, r4, r0
- ldrh r0, [r0]
- cmp r0, 0
- bne _080B9D30
- adds r0, r7, r1
- adds r0, r2, r0
- strb r5, [r0]
-_080B9D30:
- adds r0, r7, 0x1
- lsls r0, 16
- lsrs r7, r0, 16
- ldr r0, [r6, 0x70]
- cmp r7, r0
- bcc _080B9D20
-_080B9D3C:
- adds r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, r8
- bcc _080B9D00
-_080B9D46:
- movs r7, 0
- movs r3, 0
- ldr r2, [sp, 0x50]
- cmp r2, 0
- beq _080B9E3E
- mov r4, sp
- adds r4, 0x24
- str r4, [sp, 0x44]
- movs r0, 0x25
- add r0, sp
- mov r8, r0
-_080B9D5C:
- ldr r1, [sp, 0x30]
- adds r0, r1, 0
- muls r0, r3
- ldr r2, [sp, 0x2C]
- adds r6, r2, r0
- lsls r1, r3, 1
- mov r4, r9
- adds r0, r4, r1
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _080B9D7C
- mov r2, r10
- adds r0, r2, r1
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _080B9D86
-_080B9D7C:
- ldr r0, [sp, 0x3C]
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x3C]
-_080B9D86:
- mov r4, r9
- adds r0, r4, r1
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _080B9DAC
- mov r2, r10
- adds r0, r2, r1
- ldrb r2, [r0]
- cmp r2, 0
- bne _080B9DAC
-_080B9D9A:
- lsls r1, r7, 1
- ldr r4, [sp, 0x44]
- adds r0, r4, r1
- strb r3, [r0]
- add r1, r8
- strb r2, [r1]
- b _080B9E2C
- .align 2, 0
-_080B9DA8: .4byte gLinkPlayers
-_080B9DAC:
- mov r2, r9
- adds r0, r2, r1
- ldrb r0, [r0]
- cmp r0, 0
- bne _080B9DC0
- mov r4, r10
- adds r0, r4, r1
- ldrb r2, [r0]
- cmp r2, 0x1
- beq _080B9D9A
-_080B9DC0:
- mov r2, r9
- adds r0, r2, r1
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _080B9E32
- mov r4, r10
- adds r0, r4, r1
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _080B9E32
- lsls r5, r7, 1
- ldr r1, [sp, 0x44]
- adds r0, r1, r5
- strb r3, [r0]
- adds r0, r6, 0
- str r3, [sp, 0x54]
- bl sub_80B9BBC
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r6, 0
- adds r0, 0x38
- bl sub_80B9BBC
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r3, [sp, 0x54]
- cmp r4, 0
- bne _080B9E0A
- cmp r1, 0
- beq _080B9E0E
- mov r2, r8
- adds r1, r2, r5
- movs r0, 0x1
- strb r0, [r1]
- b _080B9E2C
-_080B9E0A:
- cmp r1, 0
- beq _080B9E26
-_080B9E0E:
- str r3, [sp, 0x54]
- bl Random
- mov r4, r8
- adds r2, r4, r5
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x1
- ands r0, r1
- strb r0, [r2]
- ldr r3, [sp, 0x54]
- b _080B9E2C
-_080B9E26:
- mov r2, r8
- adds r0, r2, r5
- strb r1, [r0]
-_080B9E2C:
- adds r0, r7, 0x1
- lsls r0, 16
- lsrs r7, r0, 16
-_080B9E32:
- adds r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r4, [sp, 0x50]
- cmp r0, r4
- bcc _080B9D5C
-_080B9E3E:
- movs r3, 0
- ldr r1, [sp, 0x48]
- lsls r0, r1, 4
- subs r0, r1
- lsls r0, 3
- ldr r2, [sp, 0x2C]
- adds r6, r2, r0
- ldr r1, [sp, 0x4C]
-_080B9E4E:
- lsls r0, r3, 2
- adds r0, r1, r0
- str r6, [r0]
- adds r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, 0x3
- bls _080B9E4E
- ldr r0, [sp, 0x38]
- bl sub_80B9C4C
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x3
- bl __umodsi3
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r4, [sp, 0x3C]
- cmp r4, 0x3
- beq _080B9E9C
- cmp r4, 0x3
- bgt _080B9E82
- cmp r4, 0x2
- beq _080B9E8A
- b _080B9EF0
-_080B9E82:
- ldr r0, [sp, 0x3C]
- cmp r0, 0x4
- beq _080B9EBC
- b _080B9EF0
-_080B9E8A:
- add r2, sp, 0x24
- movs r0, 0x1
- str r0, [sp]
- ldr r0, [sp, 0x2C]
- ldr r1, [sp, 0x30]
- movs r3, 0
- bl sub_80B9BC4
- b _080B9EF0
-_080B9E9C:
- ldr r0, _080B9EB8 @ =gUnknown_083D02B4
- lsls r1, 1
- adds r2, r1, r0
- ldrb r3, [r2]
- adds r0, 0x1
- adds r1, r0
- ldrb r0, [r1]
- add r2, sp, 0x24
- str r0, [sp]
- ldr r0, [sp, 0x2C]
- ldr r1, [sp, 0x30]
- bl sub_80B9BC4
- b _080B9EF0
- .align 2, 0
-_080B9EB8: .4byte gUnknown_083D02B4
-_080B9EBC:
- add r6, sp, 0x24
- ldr r4, _080B9F2C @ =gUnknown_083D02BA
- lsls r5, r1, 2
- adds r0, r5, r4
- ldrb r3, [r0]
- adds r0, r4, 0x1
- adds r0, r5, r0
- ldrb r0, [r0]
- str r0, [sp]
- ldr r0, [sp, 0x2C]
- ldr r1, [sp, 0x30]
- adds r2, r6, 0
- bl sub_80B9BC4
- adds r0, r4, 0x2
- adds r0, r5, r0
- ldrb r3, [r0]
- adds r4, 0x3
- adds r5, r4
- ldrb r0, [r5]
- str r0, [sp]
- ldr r0, [sp, 0x2C]
- ldr r1, [sp, 0x30]
- adds r2, r6, 0
- bl sub_80B9BC4
-_080B9EF0:
- ldr r1, [sp, 0x2C]
- ldr r2, [sp, 0x48]
- adds r6, r1, r2
- ldr r4, _080B9F30 @ =gSaveBlock1
- ldr r1, _080B9F34 @ =0x0000303c
- adds r0, r4, r1
- adds r1, r6, 0
- movs r2, 0x38
- bl memcpy
- ldr r2, _080B9F38 @ =0x00003074
- adds r4, r2
- adds r1, r6, 0
- adds r1, 0x38
- adds r0, r4, 0
- movs r2, 0x38
- bl memcpy
- ldr r0, [sp, 0x40]
- bl SeedRng
- add sp, 0x58
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080B9F2C: .4byte gUnknown_083D02BA
-_080B9F30: .4byte gSaveBlock1
-_080B9F34: .4byte 0x0000303c
-_080B9F38: .4byte 0x00003074
- thumb_func_end sub_80B9C6C
-
- thumb_func_start sub_80B9F3C
-sub_80B9F3C: @ 80B9F3C
- push {r4,lr}
- adds r4, r0, 0
- lsls r1, 24
- cmp r1, 0
- beq _080BA000
- ldrh r0, [r4]
- cmp r0, 0
- beq _080BA000
- bl GetPocketByItemId
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x5
- bne _080B9FC8
- ldrh r0, [r4]
- movs r1, 0x1
- bl CheckBagHasItem
- lsls r0, 24
- cmp r0, 0
- bne _080B9FB8
- ldrh r0, [r4]
- movs r1, 0x1
- bl CheckPCHasItem
- lsls r0, 24
- cmp r0, 0
- bne _080B9FB8
- ldrh r0, [r4]
- movs r1, 0x1
- bl AddBagItem
- lsls r0, 24
- cmp r0, 0
- beq _080B9FB8
- ldr r0, _080B9FA4 @ =0x00004001
- ldrh r1, [r4]
- bl VarSet
- ldr r0, _080B9FA8 @ =gStringVar1
- ldr r1, _080B9FAC @ =gLinkPlayers + 0x8
- bl StringCopy
- ldrh r1, [r4]
- ldr r0, _080B9FB0 @ =0x00000113
- cmp r1, r0
- bne _080BA000
- ldr r0, _080B9FB4 @ =0x00000853
- bl FlagSet
- b _080BA000
- .align 2, 0
-_080B9FA4: .4byte 0x00004001
-_080B9FA8: .4byte gStringVar1
-_080B9FAC: .4byte gLinkPlayers + 0x8
-_080B9FB0: .4byte 0x00000113
-_080B9FB4: .4byte 0x00000853
-_080B9FB8:
- ldr r0, _080B9FC4 @ =0x00004001
- movs r1, 0
- bl VarSet
- b _080BA000
- .align 2, 0
-_080B9FC4: .4byte 0x00004001
-_080B9FC8:
- ldrh r0, [r4]
- movs r1, 0x1
- bl AddBagItem
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080B9FF8
- ldr r0, _080B9FEC @ =0x00004001
- ldrh r1, [r4]
- bl VarSet
- ldr r0, _080B9FF0 @ =gStringVar1
- ldr r1, _080B9FF4 @ =gLinkPlayers + 0x8
- bl StringCopy
- b _080BA000
- .align 2, 0
-_080B9FEC: .4byte 0x00004001
-_080B9FF0: .4byte gStringVar1
-_080B9FF4: .4byte gLinkPlayers + 0x8
-_080B9FF8:
- ldr r0, _080BA008 @ =0x00004001
- movs r1, 0
- bl VarSet
-_080BA000:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080BA008: .4byte 0x00004001
- thumb_func_end sub_80B9F3C
-
- thumb_func_start sub_80BA00C
-sub_80BA00C: @ 80BA00C
- push {r4,lr}
- lsls r0, 24
- lsrs r2, r0, 24
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 3
- ldr r1, _080BA030 @ =gTasks
- adds r4, r0, r1
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0x5
- bhi _080BA09C
- lsls r0, 2
- ldr r1, _080BA034 @ =_080BA038
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080BA030: .4byte gTasks
-_080BA034: .4byte _080BA038
- .align 2, 0
-_080BA038:
- .4byte _080BA086
- .4byte _080BA086
- .4byte _080BA050
- .4byte _080BA05A
- .4byte _080BA074
- .4byte _080BA08E
-_080BA050:
- bl SetSecretBase2Field_9_AndHideBG
- bl sub_8125E2C
- b _080BA086
-_080BA05A:
- bl sub_8125E6C
- lsls r0, 24
- cmp r0, 0
- beq _080BA09C
- bl ClearSecretBase2Field_9_2
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- movs r1, 0
- strh r0, [r4, 0x8]
- strh r1, [r4, 0xA]
- b _080BA09C
-_080BA074:
- ldrh r0, [r4, 0xA]
- adds r0, 0x1
- strh r0, [r4, 0xA]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xA
- ble _080BA09C
- bl sub_800832C
-_080BA086:
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- b _080BA09C
-_080BA08E:
- ldr r0, _080BA0A4 @ =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- bne _080BA09C
- adds r0, r2, 0
- bl DestroyTask
-_080BA09C:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080BA0A4: .4byte gReceivedRemoteLinkPlayers
- thumb_func_end sub_80BA00C
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/record_mixing.s b/data/record_mixing.s
deleted file mode 100644
index 8b46e1ed3..000000000
--- a/data/record_mixing.s
+++ /dev/null
@@ -1,68 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
-
- .align 2
-recordMixingSecretBases:: @ 83D026C
- @ gSaveBlock1.secretBases
- .4byte gSaveBlock1 + 0x1A08
-
- .align 2
-recordMixingTvShows:: @ 83D0270
- @ gSaveBlock1.tvShows
- .4byte gSaveBlock1 + 0x2738
-
- .align 2
-gUnknown_083D0274:: @ 83D0274
- .4byte gSaveBlock1 + 0x2ABC
-
- .align 2
-gUnknown_083D0278:: @ 83D0278
- .4byte gSaveBlock1 + 0x2D94
-
- .align 2
-recordMixingEasyChatPairs:: @ 83D027C
- @ gSaveBlock1.easyChatPairs
- .4byte gSaveBlock1 + 0x2DD4
-
- .align 2
-gUnknown_083D0280:: @ 83D0280
- .4byte gUnknown_02038738
-
- .align 2
-gUnknown_083D0284:: @ 83D0284
- .4byte gSaveBlock2+0xA8
-
-gUnknown_083D0288:: @ 83D0288
- .byte 1, 0
-
-gUnknown_083D028A:: @ 83D028A
- .byte 1, 2, 0
- .byte 2, 0, 1
-
-gUnknown_083D0290:: @ 83D0290
- .byte 1, 0, 3, 2
- .byte 3, 0, 1, 2
- .byte 2, 0, 3, 1
- .byte 1, 3, 0, 2
- .byte 2, 3, 0, 1
- .byte 3, 2, 0, 1
- .byte 1, 2, 3, 0
- .byte 2, 3, 1, 0
- .byte 3, 2, 1, 0
-
-gUnknown_083D02B4:: @ 83D02B4
- .byte 0, 1
- .byte 1, 2
- .byte 2, 0
-
-gUnknown_083D02BA:: @ 83D02BA
- .byte 0, 1
- .byte 2, 3
-
- .byte 0, 2
- .byte 1, 3
-
- .byte 0, 3
- .byte 2, 1
diff --git a/include/flags.h b/include/flags.h
index 0e408a833..26a129ea2 100644
--- a/include/flags.h
+++ b/include/flags.h
@@ -50,6 +50,7 @@
#define SYS_BRAILLE_STRENGTH 0x850
#define SYS_BRAILLE_WAIT 0x851
#define SYS_BRAILLE_FLY 0x852
+#define SYS_HAS_EON_TICKET 0x853
#define SYS_TV_LATI 0x85D
diff --git a/include/global.h b/include/global.h
index c29797638..c9a092f05 100644
--- a/include/global.h
+++ b/include/global.h
@@ -536,7 +536,9 @@ struct GabbyAndTyData
struct RecordMixing_UnknownStructSub
{
- u8 data[0x38];
+ u32 unk0;
+ u8 data[0x34];
+ //u8 data[0x38];
};
struct RecordMixing_UnknownStruct
diff --git a/include/record_mixing.h b/include/record_mixing.h
index 103f5ad64..ca60b04a7 100644
--- a/include/record_mixing.h
+++ b/include/record_mixing.h
@@ -14,8 +14,8 @@ void Task_RecordMixing_CopyReceiveBuffer(u8 taskId);
void sub_80B99B4(u8 taskId);
void Task_RecordMixing_ReceivePacket(u8 taskId);
void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId);
-void *LoadPtrFromTaskData(u16 *ptr);
-void StorePtrInTaskData(void *ptr, u16 *data);
+void *LoadPtrFromTaskData(u16 *);
+void StorePtrInTaskData(void *, u16 *);
u8 GetMultiplayerId_(void);
u16 *GetPlayerRecvBuffer(u8 player);
void sub_80B9A78(void);
@@ -23,12 +23,12 @@ void sub_80B9A88(u8 *a);
void sub_80B9B1C(u8 *a, size_t size, u8 index);
void sub_80B9B70(u8 *a, size_t size, u8 index);
u8 sub_80B9BBC(u16 *a);
-void sub_80B9BC4(struct RecordMixing_UnknownStruct *, size_t, u8 [][2], u8, u8);
+void sub_80B9BC4(u8 *, size_t, u8[][2], u8 d, u8 e);
u8 sub_80B9C4C(u8 *a);
// ASM
-void sub_80B9C6C(struct RecordMixing_UnknownStruct *, u32, u8, void *);
-void sub_80B9F3C(void *, u8);
+void sub_80B9C6C(u8 *, u32, u8, void *);
+void sub_80B9F3C(u16 *, u8);
void sub_80BA00C(u8);
#endif // GUARD_RECORD_MIXING_H
diff --git a/include/save.h b/include/save.h
index 3feaa1f3d..6c47c6f60 100644
--- a/include/save.h
+++ b/include/save.h
@@ -74,7 +74,7 @@ bool8 sub_8125DA8(void);
u8 sub_8125DDC(void);
u8 sub_8125E04(void);
u8 sub_8125E2C(void);
-u8 sub_8125E6C(void);
+bool8 sub_8125E6C(void);
u8 sub_8125EC8(u8 a1);
bool8 unref_sub_8125F4C(struct UnkSaveSection *a1);
u8 unref_sub_8125FA0(void);
diff --git a/include/vars.h b/include/vars.h
index e08f344d4..efbb462a4 100644
--- a/include/vars.h
+++ b/include/vars.h
@@ -1,6 +1,7 @@
#ifndef GUARD_VARS_H
#define GUARD_VARS_H
+#define VAR_0x4000 0x4000
#define VAR_0x4001 0x4001
#define VAR_0x4002 0x4002
#define VAR_0x4003 0x4003
diff --git a/ld_script.txt b/ld_script.txt
index b0d2c0c39..e283f7124 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -168,7 +168,6 @@ SECTIONS {
src/money.o(.text);
asm/contest_effect.o(.text);
src/record_mixing.o(.text);
- asm/record_mixing.o(.text);
src/sound_check_menu.o(.text);
src/secret_base.o(.text);
asm/secret_base.o(.text_80BC1D0);
@@ -408,7 +407,8 @@ SECTIONS {
data/naming_screen.o(.rodata);
data/money.o(.rodata);
data/contest_effect.o(.rodata);
- data/record_mixing.o(.rodata);
+ src/record_mixing.o(.data);
+ src/record_mixing.o(.rodata);
src/sound_check_menu.o(.rodata);
data/secret_base.o(.rodata);
data/tv.o(.rodata);
diff --git a/src/record_mixing.c b/src/record_mixing.c
index e1a72cf2e..a8daa9220 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -6,11 +6,16 @@
#include "dewford_trend.h"
#include "event_data.h"
#include "fldeff_80C5CD4.h"
+#include "item.h"
+#include "items.h"
+#include "load_save.h"
#include "link.h"
#include "mauville_old_man.h"
#include "menu.h"
#include "mystery_event_script.h"
+#include "rng.h"
#include "rom4.h"
+#include "save.h"
#include "script.h"
#include "secret_base.h"
#include "songs.h"
@@ -20,25 +25,25 @@
#include "task.h"
#include "tv.h"
+extern u8 ewram[];
+#define unk_2018000 (*(struct PlayerRecords *)(ewram + 0x18000))
+#define unk_2008000 (*(struct PlayerRecords *)(ewram + 0x08000))
-extern void *recordMixingSecretBases;
-extern void *recordMixingTvShows;
-extern void *gUnknown_083D0274;
-extern void *gUnknown_083D0278;
-extern void *recordMixingEasyChatPairs;
-extern void *gUnknown_083D0284;
-extern u8 gUnknown_083D0288[2];
-extern u8 gUnknown_083D028A[2][3];
-extern u8 gUnknown_083D0290[9][4];
-
-extern struct RecordMixing_UnknownStruct gUnknown_02038738; //Don't know what type this points to
-extern struct RecordMixing_UnknownStruct *gUnknown_083D0280;
+extern struct RecordMixing_UnknownStruct gUnknown_02038738;
extern u16 gSpecialVar_0x8005;
extern u32 gUnknown_03005D2C;
extern u8 gUnknown_03000718;
extern u8 gUnknown_0300071C[];
extern bool8 gReceivedRemoteLinkPlayers;
+void *recordMixingSecretBases = &gSaveBlock1.secretBases;
+void *recordMixingTvShows = &gSaveBlock1.tvShows;
+void *gUnknown_083D0274 = &gSaveBlock1.unknown_2ABC;
+void *gUnknown_083D0278 = &gSaveBlock1.oldMan;
+void *recordMixingEasyChatPairs = &gSaveBlock1.easyChatPairs;
+struct RecordMixing_UnknownStruct *gUnknown_083D0280 = &gUnknown_02038738;
+void *gUnknown_083D0284 = &gSaveBlock2.filler_A8;
+
#define BUFFER_CHUNK_SIZE 200
void sub_80B929C(void)
@@ -46,7 +51,8 @@ void sub_80B929C(void)
sub_8083A84(Task_RecordMixing_Main);
}
-struct PlayerRecords {
+struct PlayerRecords
+{
struct SecretBaseRecord secretBases[20];
TVShow tvShows[25];
u8 filler1004[0x40];
@@ -57,9 +63,6 @@ struct PlayerRecords {
u16 filler11C8[0x34];
};
-extern struct PlayerRecords unk_2008000;
-extern struct PlayerRecords unk_2018000;
-
void RecordMixing_PrepareExchangePacket(void)
{
sub_80BC300();
@@ -67,14 +70,14 @@ void RecordMixing_PrepareExchangePacket(void)
memcpy(unk_2018000.secretBases, recordMixingSecretBases, sizeof(unk_2018000.secretBases));
memcpy(unk_2018000.tvShows, recordMixingTvShows, sizeof(unk_2018000.tvShows));
- memcpy(unk_2018000.filler1004, gUnknown_083D0274, 0x40);
- memcpy(unk_2018000.filler1044, gUnknown_083D0278, 0x40);
- memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, 0x28);
+ memcpy(unk_2018000.filler1004, gUnknown_083D0274, sizeof(unk_2008000.filler1004));
+ memcpy(unk_2018000.filler1044, gUnknown_083D0278, sizeof(unk_2008000.filler1044));
+ memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(unk_2018000.easyChatPairs));
gUnknown_02038738.data[0] = gSaveBlock1.filler_303C.data[0];
gUnknown_02038738.data[1] = gSaveBlock1.filler_303C.data[1];
sub_8041324(gSaveBlock1.daycareData, &gUnknown_02038738);
memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixing_UnknownStruct));
- memcpy(unk_2018000.filler1124, gUnknown_083D0284, 0xA4);
+ memcpy(unk_2018000.filler1124, gUnknown_083D0284, sizeof(unk_2018000.filler1124));
if (GetMultiplayerId() == 0)
unk_2018000.filler11C8[0] = sub_8126338();
@@ -86,71 +89,77 @@ void RecordMixing_ReceiveExchangePacket(u32 a)
sub_80BFD44((u8 *)unk_2008000.tvShows, sizeof(struct PlayerRecords), a);
sub_80C0514(unk_2008000.filler1004, sizeof(struct PlayerRecords), a);
sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a);
- //UB: Too many arguments for function "sub_80FA4E4"
sub_80FA4E4(unk_2008000.easyChatPairs, sizeof(struct PlayerRecords), a);
- sub_80B9C6C(&unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows);
+ sub_80B9C6C((u8 *)&unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows);
sub_80B9B70(unk_2008000.filler1124, sizeof(struct PlayerRecords), a);
sub_80B9F3C(unk_2008000.filler11C8, a);
}
+#define tCounter data[0]
+
void Task_RecordMixing_SoundEffect(u8 taskId)
{
- gTasks[taskId].data[0]++;
- if (gTasks[taskId].data[0] == 50)
+ gTasks[taskId].tCounter++;
+ if (gTasks[taskId].tCounter == 50)
{
PlaySE(SE_W213);
- gTasks[taskId].data[0] = 0;
+ gTasks[taskId].tCounter = 0;
}
}
-#define TD_STATE 0
+#undef tCounter
+
+
+#define tState data[0]
+#define tSndEffTaskId data[15]
+
void Task_RecordMixing_Main(u8 taskId)
{
- s16 *taskData = gTasks[taskId].data;
+ s16 *data = gTasks[taskId].data;
- switch (taskData[TD_STATE])
+ switch (tState)
{
case 0: // init
sub_8007270(gSpecialVar_0x8005);
- VarSet(0x4000, 1);
+ VarSet(VAR_0x4000, 1);
gUnknown_03000718 = 0;
RecordMixing_PrepareExchangePacket();
CreateRecordMixingSprite();
- taskData[TD_STATE] = 1;
- taskData[10] = CreateTask(sub_80B95F0, 0x50);
- taskData[15] = CreateTask(Task_RecordMixing_SoundEffect, 0x51);
+ tState = 1;
+ data[10] = CreateTask(sub_80B95F0, 0x50);
+ tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 0x51);
break;
case 1: // wait for sub_80B95F0
- if (!gTasks[taskData[10]].isActive)
+ if (!gTasks[data[10]].isActive)
{
- taskData[TD_STATE] = 2;
+ tState = 2;
FlagSet(SYS_MIX_RECORD);
DestroyRecordMixingSprite();
- DestroyTask(taskData[15]);
+ DestroyTask(tSndEffTaskId);
}
break;
case 2:
- taskData[10] = CreateTask(sub_80BA00C, 10);
- taskData[TD_STATE] = 3;
+ data[10] = CreateTask(sub_80BA00C, 10);
+ tState = 3;
PlaySE(SE_W226);
break;
case 3: // wait for sub_80BA00C
- if (!gTasks[taskData[10]].isActive)
+ if (!gTasks[data[10]].isActive)
{
- taskData[TD_STATE] = 4;
- taskData[10] = sub_8083664();
+ tState = 4;
+ data[10] = sub_8083664();
sub_80720B0();
MenuPrint(gOtherText_MixingComplete, 2, 15);
- taskData[8] = 0;
+ data[8] = 0;
}
break;
case 4: // wait 60 frames
- taskData[8]++;
- if (taskData[8] > 60)
- taskData[TD_STATE] = 5;
+ data[8]++;
+ if (data[8] > 60)
+ tState = 5;
break;
case 5:
- if (!gTasks[taskData[10]].isActive)
+ if (!gTasks[data[10]].isActive)
{
sub_8055588();
MenuZeroFillScreen();
@@ -165,14 +174,14 @@ void sub_80B95F0(u8 taskId)
{
struct Task *task = &gTasks[taskId];
- switch (task->data[TD_STATE])
+ switch (task->tState)
{
case 0:
sub_80B9A78();
MenuDisplayMessageBox();
MenuPrint(gOtherText_MixingRecordsWithFriend, 2, 15);
task->data[8] = 0x708;
- task->data[TD_STATE] = 400;
+ task->tState = 400;
ClearLinkCallback_2();
break;
case 100: // wait 20 frames
@@ -180,48 +189,48 @@ void sub_80B95F0(u8 taskId)
if (task->data[12] > 20)
{
task->data[12] = 0;
- task->data[TD_STATE] = 101;
+ task->tState = 101;
}
break;
case 101:
- {
- u8 players = GetLinkPlayerCount_2();
-
- if (IsLinkMaster() == 1)
{
- if (players == sub_800820C())
+ u8 players = GetLinkPlayerCount_2();
+
+ if (IsLinkMaster() == 1)
{
- PlaySE(0x15);
- task->data[TD_STATE] = 201;
- task->data[12] = 0;
+ if (players == sub_800820C())
+ {
+ PlaySE(SE_PIN);
+ task->tState = 201;
+ task->data[12] = 0;
+ }
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ task->tState = 301;
}
- }
- else
- {
- PlaySE(0x16);
- task->data[TD_STATE] = 301;
}
break;
- }
case 201:
if (sub_800820C() == GetLinkPlayerCount_2())
{
if (++task->data[12] > GetLinkPlayerCount_2() * 30)
{
sub_8007F4C();
- task->data[TD_STATE] = 1;
+ task->tState = 1;
}
}
break;
case 301:
if (sub_800820C() == GetLinkPlayerCount_2())
- task->data[TD_STATE] = 1;
+ task->tState = 1;
break;
case 400: // wait 20 frames
task->data[12]++;
if (task->data[12] > 20)
{
- task->data[TD_STATE] = 1;
+ task->tState = 1;
task->data[12] = 0;
}
break;
@@ -229,31 +238,30 @@ void sub_80B95F0(u8 taskId)
if (gReceivedRemoteLinkPlayers)
{
ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2);
- task->data[TD_STATE] = 5;
+ task->tState = 5;
}
break;
case 2:
- {
- u8 subTaskId;
-
- task->data[6] = GetLinkPlayerCount_2();
- task->data[TD_STATE] = 0;
- task->data[5] = GetMultiplayerId_();
- task->func = Task_RecordMixing_SendPacket;
- StorePtrInTaskData(&unk_2018000, &task->data[2]);
- subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50);
- task->data[10] = subTaskId;
- gTasks[subTaskId].data[0] = taskId;
- //StorePtrInTaskData((void*)0x2008000, &gTasks[subTaskId].data[5]);
- StorePtrInTaskData((u8 *)&unk_2018000 - 0x10000, &gTasks[subTaskId].data[5]);
+ {
+ u8 subTaskId;
+
+ task->data[6] = GetLinkPlayerCount_2();
+ task->tState = 0;
+ task->data[5] = GetMultiplayerId_();
+ task->func = Task_RecordMixing_SendPacket;
+ StorePtrInTaskData(&unk_2018000, &task->data[2]);
+ subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50);
+ task->data[10] = subTaskId;
+ gTasks[subTaskId].data[0] = taskId;
+ StorePtrInTaskData((u8 *)&unk_2008000, &gTasks[subTaskId].data[5]);
+ }
break;
- }
case 5: // wait 60 frames
task->data[10]++;
if (task->data[10] > 60)
{
task->data[10] = 0;
- task->data[TD_STATE] = 2;
+ task->tState = 2;
}
break;
}
@@ -264,29 +272,29 @@ void Task_RecordMixing_SendPacket(u8 taskId)
struct Task *task = &gTasks[taskId];
// does this send the data 24 times?
- switch (task->data[TD_STATE])
+ switch (task->tState)
{
case 0: //Copy record data to send buffer
- {
- void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4];
+ {
+ void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4];
- memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE);
- task->data[TD_STATE]++;
+ memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE);
+ task->tState++;
+ }
break;
- }
case 1:
if (GetMultiplayerId() == 0)
sub_8007E9C(1);
- task->data[TD_STATE]++;
+ task->tState++;
break;
case 2:
break;
case 3:
task->data[4]++;
if ((u16)task->data[4] == 24)
- task->data[TD_STATE]++;
+ task->tState++;
else
- task->data[TD_STATE] = 0;
+ task->tState = 0;
break;
case 4:
if (!gTasks[task->data[10]].isActive)
@@ -325,7 +333,6 @@ void Task_RecordMixing_CopyReceiveBuffer(u8 taskId)
}
gTasks[task->data[0]].data[0]++;
}
- //_080B998A
if (handledPlayers == GetLinkPlayerCount())
DestroyTask(taskId);
}
@@ -353,15 +360,15 @@ void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId)
gUnknown_03000718 = 1;
}
-void *LoadPtrFromTaskData(u16 *ptr)
+void *LoadPtrFromTaskData(u16 *taskData)
{
- return (void *)(*ptr | *(ptr + 1) << 16);
+ return (void *)(taskData[0] | (taskData[1] << 16));
}
-void StorePtrInTaskData(void *ptr, u16 *data)
+void StorePtrInTaskData(void *ptr, u16 *taskData)
{
- *data = (u32)ptr;
- *(data + 1) = (u32)ptr >> 16;
+ taskData[0] = (u32)ptr;
+ taskData[1] = (u32)ptr >> 16;
}
u8 GetMultiplayerId_(void)
@@ -379,6 +386,27 @@ void sub_80B9A78(void)
gUnknown_03005D2C = sizeof(struct PlayerRecords);
}
+const u8 gUnknown_083D0288[2] = {1, 0};
+
+const u8 gUnknown_083D028A[2][3] =
+{
+ {1, 2, 0},
+ {2, 0, 1},
+};
+
+const u8 gUnknown_083D0290[9][4] =
+{
+ {1, 0, 3, 2},
+ {3, 0, 1, 2},
+ {2, 0, 3, 1},
+ {1, 3, 0, 2},
+ {2, 3, 0, 1},
+ {3, 2, 0, 1},
+ {1, 2, 3, 0},
+ {2, 3, 1, 0},
+ {3, 2, 1, 0},
+};
+
void sub_80B9A88(u8 *a)
{
u32 i;
@@ -430,101 +458,627 @@ u8 sub_80B9BBC(u16 *a)
return a[16];
}
-#undef NONMATCHING
-#ifdef NONMATCHING
+void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e)
+{
+ struct RecordMixing_UnknownStructSub *r6 = (struct RecordMixing_UnknownStructSub *)(a + b * c[d][0]);
+ struct RecordMixing_UnknownStructSub *src = r6 + c[d][1];
+ struct RecordMixing_UnknownStructSub sp0 = *src;
+ struct RecordMixing_UnknownStructSub *r8 = (struct RecordMixing_UnknownStructSub *)(a + b * c[e][0]);
-void sub_80B9BC4(struct RecordMixing_UnknownStruct *a, size_t b, u8 c[][2], u8 d, u8 e)
+ r6 += c[d][1];
+ *r6 = *(r8 + c[e][1]);
+
+ r8 += c[e][1];
+ *r8 = sp0;
+}
+
+u8 sub_80B9C4C(u8 *a)
{
- struct RecordMixing_UnknownStructSub *offA;
- struct RecordMixing_UnknownStructSub *offB;
- struct RecordMixing_UnknownStructSub v0;
- v0 = (offA = ((struct RecordMixing_UnknownStruct *)(b * c[d][0] + (u32)&a))->data)[c[d][1]];
- offA[c[d][1]] = (offB = ((struct RecordMixing_UnknownStruct *)(b * c[e][0] + (u32)&a))->data)[c[e][1]];
- offB[c[e][1]] = v0;
- //ToDo: Figure out what this strange stack usage is
+ int i;
+ u8 r2 = 0;
+
+ for (i = 0; i < 0x100; i++)
+ r2 += a[i];
+ return r2;
}
+const u8 gUnknown_083D02B4[][2] =
+{
+ {0, 1},
+ {1, 2},
+ {2, 0},
+};
+
+const u8 gUnknown_083D02BA[3][4] =
+{
+ {0, 1, 2, 3},
+ {0, 2, 1, 3},
+ {0, 3, 2, 1},
+};
+
+#ifdef NONMATCHING
+void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d)
+{
+ u8 r8;
+ u8 sp4[4];
+ u8 sp8[4];
+ void *spC[4];
+ u8 sp1C[4][2];
+ u8 sp24[4][2];
+ u8 sp3C;
+ u16 sp40 = Random();
+ u16 i; // r3
+ u16 r7;
+ u8 r1;
+ struct RecordMixing_UnknownStruct *r6;
+
+ //asm("":::"r8");
+ SeedRng(gLinkPlayers[0].trainerId);
+ r8 = GetLinkPlayerCount();
+ for (i = 0; i < 4; i++)
+ {
+ sp4[i] = 0xFF;
+ sp8[i] = 0;
+ sp1C[i][0] = 0;
+ sp1C[i][1] = 0;
+ }
+ sp3C = 0;
+ for (i = 0; i < r8; i++)
+ {
+ r6 = (struct RecordMixing_UnknownStruct *)(a + b * i);
+ if (r6->unk70 != 0)
+ {
+ for (r7 = 0; r7 < r6->unk70; r7++)
+ {
+ if (r6->unk74[r7] == 0)
+ sp1C[i][r7] = 1;
+ }
+ }
+ //_080B9D3C
+ }
+ //_080B9D46
+ for (r7 = 0, i = 0; i < r8; i++)
+ {
+ r6 = (struct RecordMixing_UnknownStruct *)(a + b * i);
+ if (sp1C[i][0] == 1 || sp1C[i][1] == 1)
+ sp3C++;
+ if (sp1C[i][0] == 1 && sp1C[i][1] == 0)
+ {
+ sp24[r7][0] = i;
+ sp24[r7][1] = 0;
+ r7++;
+ }
+ else if (sp1C[i][0] == 0 && sp1C[i][1] == 1)
+ {
+ sp24[r7][0] = i;
+ sp24[r7][1] = 0;
+ r7++;
+ }
+ //else if (sp1C[i][0] == 1 + 1 && sp1C[i][1] + 1 == 1 + 1)
+ else if (sp1C[i][0] == 1 && sp1C[i][1] == 1)
+ {
+ u8 r4, r1;
+
+ sp24[r7][0] = i;
+ r4 = sub_80B9BBC((u16 *)&r6->data[0]);
+ r1 = sub_80B9BBC((u16 *)&r6->data[1]);
+
+ asm("");
+ if (r4 == 0 && r1 != 0)
+ sp24[r7][1] = 1;
+ else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0))
+ sp24[r7][1] = Random() % 2;
+ else
+ sp24[r7][1] = 0;
+ /*
+ if (r4 == 0 && r1 != 0)
+ sp24[r7][1] = 1;
+ else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0))
+ sp24[r7][1] = Random() % 2;
+ else
+ sp24[r7][1] = 0;
+ */
+
+ /*
+ if (r4 == 0 && r1 != 0)
+ sp24[r7][1] = 1;
+ else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0))
+ //sp24[r7][1] = ((Random() << 16) >> 16) % 2;
+ sp24[r7][1] = Random() % 2;
+ else
+ sp24[r7][1] = 0;
+ */
+ //_080B9E2C:
+ r7++;
+ }
+ }
+ //_080B9E3E
+ for (i = 0; i < 4; i++)
+ {
+ r6 = (struct RecordMixing_UnknownStruct *)a + b * c;
+ spC[i] = r6;
+ }
+ r1 = sub_80B9C4C(d) % 3;
+ switch (sp3C)
+ {
+ case 2:
+ sub_80B9BC4(a, b, (u8 *)sp24, 0, 1);
+ break;
+ case 3:
+ {
+ u8 var1 = gUnknown_083D02B4[r1][0];
+ u8 var2 = gUnknown_083D02B4[r1][1];
+ sub_80B9BC4(a, b, (u8 *)sp24, var1, var2);
+ }
+ break;
+ case 4:
+ {
+ u8 *r6 = (u8 *)sp24;
+ u8 var1 = gUnknown_083D02BA[r1][0];
+ u8 var2 = gUnknown_083D02BA[r1][1];
+ sub_80B9BC4(a, b, r6, var1, var2);
+ }
+ {
+ u8 *r6 = (u8 *)sp24;
+ u8 var1 = gUnknown_083D02BA[r1][2];
+ u8 var2 = gUnknown_083D02BA[r1][3];
+ sub_80B9BC4(a, b, r6, var1, var2);
+ }
+ break;
+ }
+ //_080B9EF0
+ //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38);
+ //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38);
+ r6 = (struct RecordMixing_UnknownStruct *)(a + b * c);
+ gSaveBlock1.filler_303C.data[0] = r6->data[0];
+ gSaveBlock1.filler_303C.data[1] = r6->data[1];
+ //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38);
+ //memcpy(&gSaveBlock1.filler_303C.data[1], &r6->data[1], 0x38);
+ SeedRng(sp40);
+}
#else
__attribute__((naked))
-void sub_80B9BC4(struct RecordMixing_UnknownStruct *a, size_t b, u8 c[][2], u8 d, u8 e)
+void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d)
{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- mov r6, r10\n\
- mov r5, r9\n\
- mov r4, r8\n\
- push {r4-r6}\n\
- sub sp, 0x38\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x58\n\
+ str r0, [sp, 0x2C]\n\
+ str r1, [sp, 0x30]\n\
+ str r3, [sp, 0x38]\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r2, [sp, 0x34]\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x40]\n\
+ ldr r0, _080B9DA8 @ =gLinkPlayers\n\
+ ldrh r0, [r0, 0x4]\n\
+ bl SeedRng\n\
+ bl GetLinkPlayerCount\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
mov r8, r0\n\
+ movs r3, 0\n\
+ add r0, sp, 0x1C\n\
+ mov r9, r0\n\
+ movs r1, 0x1D\n\
+ add r1, sp\n\
mov r10, r1\n\
- mov r9, r2\n\
- adds r4, r3, 0\n\
- ldr r5, [sp, 0x54]\n\
- lsls r4, 24\n\
- lsls r5, 24\n\
- lsrs r5, 24\n\
- lsrs r4, 23\n\
- add r4, r9\n\
- ldrb r0, [r4]\n\
- mov r6, r10\n\
- muls r6, r0\n\
- add r6, r8\n\
- ldrb r0, [r4, 0x1]\n\
- lsls r1, r0, 3\n\
- subs r1, r0\n\
- lsls r1, 3\n\
- adds r1, r6, r1\n\
- mov r0, sp\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- lsls r5, 1\n\
- add r5, r9\n\
- ldrb r0, [r5]\n\
- mov r1, r10\n\
- muls r1, r0\n\
+ mov r2, sp\n\
+ adds r2, 0xC\n\
+ str r2, [sp, 0x4C]\n\
+ movs r7, 0xFF\n\
+ add r4, sp, 0x8\n\
+ movs r2, 0\n\
+ mov r6, r9\n\
+ mov r5, r10\n\
+_080B9CBC:\n\
+ mov r1, sp\n\
+ adds r1, r3\n\
+ adds r1, 0x4\n\
+ ldrb r0, [r1]\n\
+ orrs r0, r7\n\
+ strb r0, [r1]\n\
+ adds r0, r4, r3\n\
+ strb r2, [r0]\n\
+ lsls r1, r3, 1\n\
+ adds r0, r6, r1\n\
+ strb r2, [r0]\n\
+ adds r1, r5, r1\n\
+ strb r2, [r1]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, 0x3\n\
+ bls _080B9CBC\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x3C]\n\
+ movs r3, 0\n\
+ mov r1, r8\n\
+ lsls r0, r1, 16\n\
+ lsrs r1, r0, 16\n\
+ str r0, [sp, 0x50]\n\
+ ldr r4, [sp, 0x30]\n\
+ ldr r0, [sp, 0x34]\n\
+ adds r2, r4, 0\n\
+ muls r2, r0\n\
+ str r2, [sp, 0x48]\n\
+ ldr r2, [sp, 0x3C]\n\
+ cmp r2, r1\n\
+ bcs _080B9D46\n\
+ mov r8, r1\n\
+_080B9D00:\n\
+ ldr r4, [sp, 0x30]\n\
+ adds r0, r4, 0\n\
+ muls r0, r3\n\
+ ldr r1, [sp, 0x2C]\n\
+ adds r6, r1, r0\n\
+ ldr r0, [r6, 0x70]\n\
+ cmp r0, 0\n\
+ beq _080B9D3C\n\
+ movs r7, 0\n\
+ cmp r7, r0\n\
+ bcs _080B9D3C\n\
+ adds r4, r6, 0\n\
+ adds r4, 0x74\n\
+ mov r2, r9\n\
+ lsls r1, r3, 1\n\
+ movs r5, 0x1\n\
+_080B9D20:\n\
+ lsls r0, r7, 1\n\
+ adds r0, r4, r0\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080B9D30\n\
+ adds r0, r7, r1\n\
+ adds r0, r2, r0\n\
+ strb r5, [r0]\n\
+_080B9D30:\n\
+ adds r0, r7, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r7, r0, 16\n\
+ ldr r0, [r6, 0x70]\n\
+ cmp r7, r0\n\
+ bcc _080B9D20\n\
+_080B9D3C:\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, r8\n\
+ bcc _080B9D00\n\
+_080B9D46:\n\
+ movs r7, 0\n\
+ movs r3, 0\n\
+ ldr r2, [sp, 0x50]\n\
+ cmp r2, 0\n\
+ beq _080B9E3E\n\
+ mov r4, sp\n\
+ adds r4, 0x24\n\
+ str r4, [sp, 0x44]\n\
+ movs r0, 0x25\n\
+ add r0, sp\n\
+ mov r8, r0\n\
+_080B9D5C:\n\
+ ldr r1, [sp, 0x30]\n\
adds r0, r1, 0\n\
- add r8, r0\n\
- ldrb r1, [r4, 0x1]\n\
- lsls r0, r1, 3\n\
- subs r0, r1\n\
- lsls r0, 3\n\
- adds r6, r0\n\
- ldrb r0, [r5, 0x1]\n\
- lsls r1, r0, 3\n\
- subs r1, r0\n\
- lsls r1, 3\n\
+ muls r0, r3\n\
+ ldr r2, [sp, 0x2C]\n\
+ adds r6, r2, r0\n\
+ lsls r1, r3, 1\n\
+ mov r4, r9\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ beq _080B9D7C\n\
+ mov r2, r10\n\
+ adds r0, r2, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _080B9D86\n\
+_080B9D7C:\n\
+ ldr r0, [sp, 0x3C]\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x3C]\n\
+_080B9D86:\n\
+ mov r4, r9\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _080B9DAC\n\
+ mov r2, r10\n\
+ adds r0, r2, r1\n\
+ ldrb r2, [r0]\n\
+ cmp r2, 0\n\
+ bne _080B9DAC\n\
+_080B9D9A:\n\
+ lsls r1, r7, 1\n\
+ ldr r4, [sp, 0x44]\n\
+ adds r0, r4, r1\n\
+ strb r3, [r0]\n\
add r1, r8\n\
+ strb r2, [r1]\n\
+ b _080B9E2C\n\
+ .align 2, 0\n\
+_080B9DA8: .4byte gLinkPlayers\n\
+_080B9DAC:\n\
+ mov r2, r9\n\
+ adds r0, r2, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080B9DC0\n\
+ mov r4, r10\n\
+ adds r0, r4, r1\n\
+ ldrb r2, [r0]\n\
+ cmp r2, 0x1\n\
+ beq _080B9D9A\n\
+_080B9DC0:\n\
+ mov r2, r9\n\
+ adds r0, r2, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _080B9E32\n\
+ mov r4, r10\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _080B9E32\n\
+ lsls r5, r7, 1\n\
+ ldr r1, [sp, 0x44]\n\
+ adds r0, r1, r5\n\
+ strb r3, [r0]\n\
adds r0, r6, 0\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- ldrb r1, [r5, 0x1]\n\
- lsls r0, r1, 3\n\
+ str r3, [sp, 0x54]\n\
+ bl sub_80B9BBC\n\
+ adds r4, r0, 0\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ adds r0, r6, 0\n\
+ adds r0, 0x38\n\
+ bl sub_80B9BBC\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ ldr r3, [sp, 0x54]\n\
+ cmp r4, 0\n\
+ bne _080B9E0A\n\
+ cmp r1, 0\n\
+ beq _080B9E0E\n\
+ mov r2, r8\n\
+ adds r1, r2, r5\n\
+ movs r0, 0x1\n\
+ strb r0, [r1]\n\
+ b _080B9E2C\n\
+_080B9E0A:\n\
+ cmp r1, 0\n\
+ beq _080B9E26\n\
+_080B9E0E:\n\
+ str r3, [sp, 0x54]\n\
+ bl Random\n\
+ mov r4, r8\n\
+ adds r2, r4, r5\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x1\n\
+ ands r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r3, [sp, 0x54]\n\
+ b _080B9E2C\n\
+_080B9E26:\n\
+ mov r2, r8\n\
+ adds r0, r2, r5\n\
+ strb r1, [r0]\n\
+_080B9E2C:\n\
+ adds r0, r7, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r7, r0, 16\n\
+_080B9E32:\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ ldr r4, [sp, 0x50]\n\
+ cmp r0, r4\n\
+ bcc _080B9D5C\n\
+_080B9E3E:\n\
+ movs r3, 0\n\
+ ldr r1, [sp, 0x48]\n\
+ lsls r0, r1, 4\n\
subs r0, r1\n\
lsls r0, 3\n\
- add r8, r0\n\
- mov r0, r8\n\
- mov r1, sp\n\
+ ldr r2, [sp, 0x2C]\n\
+ adds r6, r2, r0\n\
+ ldr r1, [sp, 0x4C]\n\
+_080B9E4E:\n\
+ lsls r0, r3, 2\n\
+ adds r0, r1, r0\n\
+ str r6, [r0]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, 0x3\n\
+ bls _080B9E4E\n\
+ ldr r0, [sp, 0x38]\n\
+ bl sub_80B9C4C\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ movs r1, 0x3\n\
+ bl __umodsi3\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ ldr r4, [sp, 0x3C]\n\
+ cmp r4, 0x3\n\
+ beq _080B9E9C\n\
+ cmp r4, 0x3\n\
+ bgt _080B9E82\n\
+ cmp r4, 0x2\n\
+ beq _080B9E8A\n\
+ b _080B9EF0\n\
+_080B9E82:\n\
+ ldr r0, [sp, 0x3C]\n\
+ cmp r0, 0x4\n\
+ beq _080B9EBC\n\
+ b _080B9EF0\n\
+_080B9E8A:\n\
+ add r2, sp, 0x24\n\
+ movs r0, 0x1\n\
+ str r0, [sp]\n\
+ ldr r0, [sp, 0x2C]\n\
+ ldr r1, [sp, 0x30]\n\
+ movs r3, 0\n\
+ bl sub_80B9BC4\n\
+ b _080B9EF0\n\
+_080B9E9C:\n\
+ ldr r0, _080B9EB8 @ =gUnknown_083D02B4\n\
+ lsls r1, 1\n\
+ adds r2, r1, r0\n\
+ ldrb r3, [r2]\n\
+ adds r0, 0x1\n\
+ adds r1, r0\n\
+ ldrb r0, [r1]\n\
+ add r2, sp, 0x24\n\
+ str r0, [sp]\n\
+ ldr r0, [sp, 0x2C]\n\
+ ldr r1, [sp, 0x30]\n\
+ bl sub_80B9BC4\n\
+ b _080B9EF0\n\
+ .align 2, 0\n\
+_080B9EB8: .4byte gUnknown_083D02B4\n\
+_080B9EBC:\n\
+ add r6, sp, 0x24\n\
+ ldr r4, _080B9F2C @ =gUnknown_083D02BA\n\
+ lsls r5, r1, 2\n\
+ adds r0, r5, r4\n\
+ ldrb r3, [r0]\n\
+ adds r0, r4, 0x1\n\
+ adds r0, r5, r0\n\
+ ldrb r0, [r0]\n\
+ str r0, [sp]\n\
+ ldr r0, [sp, 0x2C]\n\
+ ldr r1, [sp, 0x30]\n\
+ adds r2, r6, 0\n\
+ bl sub_80B9BC4\n\
+ adds r0, r4, 0x2\n\
+ adds r0, r5, r0\n\
+ ldrb r3, [r0]\n\
+ adds r4, 0x3\n\
+ adds r5, r4\n\
+ ldrb r0, [r5]\n\
+ str r0, [sp]\n\
+ ldr r0, [sp, 0x2C]\n\
+ ldr r1, [sp, 0x30]\n\
+ adds r2, r6, 0\n\
+ bl sub_80B9BC4\n\
+_080B9EF0:\n\
+ ldr r1, [sp, 0x2C]\n\
+ ldr r2, [sp, 0x48]\n\
+ adds r6, r1, r2\n\
+ ldr r4, _080B9F30 @ =gSaveBlock1\n\
+ ldr r1, _080B9F34 @ =0x0000303c\n\
+ adds r0, r4, r1\n\
+ adds r1, r6, 0\n\
movs r2, 0x38\n\
bl memcpy\n\
- add sp, 0x38\n\
+ ldr r2, _080B9F38 @ =0x00003074\n\
+ adds r4, r2\n\
+ adds r1, r6, 0\n\
+ adds r1, 0x38\n\
+ adds r0, r4, 0\n\
+ movs r2, 0x38\n\
+ bl memcpy\n\
+ ldr r0, [sp, 0x40]\n\
+ bl SeedRng\n\
+ add sp, 0x58\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
- pop {r4-r6}\n\
+ pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
+ .align 2, 0\n\
+_080B9F2C: .4byte gUnknown_083D02BA\n\
+_080B9F30: .4byte gSaveBlock1\n\
+_080B9F34: .4byte 0x0000303c\n\
+_080B9F38: .4byte 0x00003074\n\
.syntax divided\n");
}
#endif
-u8 sub_80B9C4C(u8 *a)
+void sub_80B9F3C(u16 *a, u8 b)
{
- int i;
- u8 r2 = 0;
-
- for (i = 0; i < 0x100; i++)
- r2 += a[i];
- return r2;
+ if (b != 0 && *a != 0)
+ {
+ if (GetPocketByItemId(*a) == 5)
+ {
+ if (!CheckBagHasItem(*a, 1) && !CheckPCHasItem(*a, 1) && AddBagItem(*a, 1))
+ {
+ VarSet(VAR_0x4001, *a);
+ StringCopy(gStringVar1, gLinkPlayers[0].name);
+ if (*a == ITEM_EON_TICKET)
+ FlagSet(SYS_HAS_EON_TICKET);
+ }
+ else
+ {
+ VarSet(VAR_0x4001, ITEM_NONE);
+ }
+ }
+ else
+ {
+ if (AddBagItem(*a, 1) == TRUE)
+ {
+ VarSet(VAR_0x4001, *a);
+ StringCopy(gStringVar1, gLinkPlayers[0].name);
+ }
+ else
+ {
+ VarSet(VAR_0x4001, ITEM_NONE);
+ }
+ }
+ }
}
+void sub_80BA00C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[0]++;
+ break;
+ case 2:
+ SetSecretBase2Field_9_AndHideBG();
+ sub_8125E2C();
+ task->data[0]++;
+ break;
+ case 3:
+ if (sub_8125E6C() != 0)
+ {
+ ClearSecretBase2Field_9_2();
+ task->data[0]++;
+ task->data[1] = 0;
+ }
+ break;
+ case 4:
+ task->data[1]++;
+ if (task->data[1] > 10)
+ {
+ sub_800832C();
+ task->data[0]++;
+ }
+ break;
+ case 5:
+ if (!gReceivedRemoteLinkPlayers)
+ DestroyTask(taskId);
+ break;
+ }
+}
diff --git a/src/save.c b/src/save.c
index 570210fb0..46094746a 100644
--- a/src/save.c
+++ b/src/save.c
@@ -672,9 +672,9 @@ u8 sub_8125E2C(void)
return 0;
}
-u8 sub_8125E6C(void)
+bool8 sub_8125E6C(void)
{
- u8 retVal = 0;
+ u8 retVal = FALSE;
u16 val = ++gUnknown_03005EB4;
if (val <= 4)
{
@@ -684,7 +684,7 @@ u8 sub_8125E6C(void)
else
{
sub_81257F0(val, gSaveSectionLocations);
- retVal = 1;
+ retVal = TRUE;
}
if (gDamagedSaveSectors)
DoSaveFailedScreen(1);