summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2017-09-18 08:52:57 -0400
committerscnorton <scnorton@biociphers.org>2017-09-18 09:23:06 -0400
commit8604291b0f0e430b01f0099ea4e098171938505b (patch)
treec1d706048ccc4ffb852ba6d597428fd6ec2d30e4
parent74bda5b68088f08220cf3f1b9791e5900a6a9877 (diff)
Start decomp
-rwxr-xr-xasm/berry_fix_program.s236
-rw-r--r--data/multiboot_berry_glitch_fix.s1
-rw-r--r--include/gba/multiboot.h26
-rw-r--r--include/gpu_regs.h13
-rw-r--r--include/multiboot.h2
-rw-r--r--include/unknown_task.h11
-rw-r--r--ld_script.txt1
-rw-r--r--src/berry_fix_program.c123
8 files changed, 163 insertions, 250 deletions
diff --git a/asm/berry_fix_program.s b/asm/berry_fix_program.s
index 19ed0babd..caeae0115 100755
--- a/asm/berry_fix_program.s
+++ b/asm/berry_fix_program.s
@@ -5,242 +5,6 @@
.text
- thumb_func_start sub_81BF384
-sub_81BF384: @ 81BF384
- push {r4,lr}
- ldr r0, =0x0000ffff
- bl DisableInterrupts
- movs r0, 0x1
- bl EnableInterrupts
- bl m4aSoundVSyncOff
- movs r0, 0
- bl SetVBlankCallback
- bl ResetSpriteData
- bl ResetTasks
- bl remove_some_task
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- ldr r4, =gUnknown_030012B8
- movs r0, 0x50
- bl AllocZeroed
- str r0, [r4]
- movs r1, 0
- strb r1, [r0]
- ldr r1, [r4]
- movs r0, 0x6
- strb r0, [r1, 0x1]
- ldr r0, =sub_81BF3DC
- bl SetMainCallback2
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81BF384
-
- thumb_func_start sub_81BF3DC
-sub_81BF3DC: @ 81BF3DC
- push {r4,r5,lr}
- sub sp, 0x4
- ldr r1, =gUnknown_030012B8
- ldr r0, [r1]
- ldrb r0, [r0]
- adds r5, r1, 0
- cmp r0, 0x7
- bls _081BF3EE
- b _081BF592
-_081BF3EE:
- lsls r0, 2
- ldr r1, =_081BF400
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081BF400:
- .4byte _081BF420
- .4byte _081BF430
- .4byte _081BF45C
- .4byte _081BF488
- .4byte _081BF4BC
- .4byte _081BF514
- .4byte _081BF552
- .4byte _081BF574
-_081BF420:
- bl sub_81BF5A4
- ldr r0, =gUnknown_030012B8
- ldr r1, [r0]
- movs r0, 0x1
- b _081BF590
- .pool
-_081BF430:
- movs r0, 0x5
- bl sub_81BF7A4
- cmp r0, 0x5
- beq _081BF43C
- b _081BF592
-_081BF43C:
- ldr r0, =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- bne _081BF44A
- b _081BF592
-_081BF44A:
- ldr r0, =gUnknown_030012B8
- ldr r1, [r0]
- movs r0, 0x2
- b _081BF590
- .pool
-_081BF45C:
- movs r0, 0
- bl sub_81BF7A4
- cmp r0, 0
- beq _081BF468
- b _081BF592
-_081BF468:
- ldr r0, =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- bne _081BF476
- b _081BF592
-_081BF476:
- ldr r0, =gUnknown_030012B8
- ldr r1, [r0]
- movs r0, 0x3
- b _081BF590
- .pool
-_081BF488:
- movs r0, 0x1
- bl sub_81BF7A4
- cmp r0, 0x1
- beq _081BF494
- b _081BF592
-_081BF494:
- ldr r4, =gUnknown_030012B8
- ldr r0, [r4]
- ldr r1, =gUnknown_089A6550
- str r1, [r0, 0x2C]
- adds r0, 0x4F
- movs r5, 0
- strb r5, [r0]
- ldr r0, [r4]
- adds r0, 0x4
- bl MultiBootInit
- ldr r1, [r4]
- strh r5, [r1, 0x2]
- movs r0, 0x4
- b _081BF590
- .pool
-_081BF4BC:
- adds r4, r5, 0
- ldr r0, [r4]
- adds r0, 0x4
- bl MultiBootMain
- ldr r4, [r4]
- ldrb r0, [r4, 0x1C]
- cmp r0, 0
- bne _081BF4D8
- ldr r0, [r4, 0x20]
- ldr r1, =0x00020200
- ands r0, r1
- cmp r0, r1
- beq _081BF4E4
-_081BF4D8:
- movs r0, 0
- strh r0, [r4, 0x2]
- b _081BF592
- .pool
-_081BF4E4:
- ldrh r0, [r4, 0x2]
- adds r0, 0x1
- strh r0, [r4, 0x2]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0xB4
- bls _081BF592
- adds r0, r4, 0x4
- ldr r1, =gMultiBootProgram_BerryGlitchFix_Start
- ldr r2, =gMultiBootProgram_BerryGlitchFix_End
- subs r2, r1
- movs r3, 0x1
- str r3, [sp]
- movs r3, 0x4
- bl MultiBootStartMaster
- ldr r1, [r5]
- movs r0, 0x5
- b _081BF590
- .pool
-_081BF514:
- movs r0, 0x2
- bl sub_81BF7A4
- adds r4, r0, 0
- cmp r4, 0x2
- bne _081BF592
- ldr r5, =gUnknown_030012B8
- ldr r0, [r5]
- adds r0, 0x4
- bl MultiBootMain
- ldr r0, [r5]
- adds r0, 0x4
- bl MultiBootCheckComplete
- cmp r0, 0
- beq _081BF540
- ldr r1, [r5]
- movs r0, 0x6
- b _081BF590
- .pool
-_081BF540:
- ldr r1, [r5]
- adds r0, r1, 0
- adds r0, 0x22
- ldrb r0, [r0]
- ands r4, r0
- cmp r4, 0
- bne _081BF592
- movs r0, 0x7
- b _081BF590
-_081BF552:
- movs r0, 0x3
- bl sub_81BF7A4
- cmp r0, 0x3
- bne _081BF592
- ldr r0, =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081BF592
- bl DoSoftReset
- b _081BF592
- .pool
-_081BF574:
- movs r0, 0x4
- bl sub_81BF7A4
- cmp r0, 0x4
- bne _081BF592
- ldr r0, =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081BF592
- ldr r0, =gUnknown_030012B8
- ldr r1, [r0]
- movs r0, 0x1
-_081BF590:
- strb r0, [r1]
-_081BF592:
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81BF3DC
-
thumb_func_start sub_81BF5A4
sub_81BF5A4: @ 81BF5A4
push {r4-r6,lr}
diff --git a/data/multiboot_berry_glitch_fix.s b/data/multiboot_berry_glitch_fix.s
index bc97eb553..e6a26c619 100644
--- a/data/multiboot_berry_glitch_fix.s
+++ b/data/multiboot_berry_glitch_fix.s
@@ -3,6 +3,7 @@
gUnknown_089A6550:: @ 89A6550
.incbin "baserom.gba", 0x9a6550, 0xc0
+gMultiBootProgram_BerryGlitchFix_Script:: @ 89A6610
gMultiBootProgram_BerryGlitchFix_Start:: @ 89A6610
.incbin "baserom.gba", 0x9a6610, 0x3b34
gMultiBootProgram_BerryGlitchFix_End::
diff --git a/include/gba/multiboot.h b/include/gba/multiboot.h
index e88b43a19..61c02ec52 100644
--- a/include/gba/multiboot.h
+++ b/include/gba/multiboot.h
@@ -8,19 +8,19 @@
struct MultiBootParam
{
- u32 system_work[5];
- u8 handshake_data;
- u8 padding;
- u16 handshake_timeout;
- u8 probe_count;
- u8 client_data[MULTIBOOT_NCHILD];
- u8 palette_data;
- u8 response_bit;
- u8 client_bit;
- u8 reserved1;
- u8 *boot_srcp;
- u8 *boot_endp;
- u8 *masterp;
+ u32 system_work[5]; // 00
+ u8 handshake_data; // 14
+ u8 padding; // 15
+ u16 handshake_timeout; // 16
+ u8 probe_count; // 18
+ u8 client_data[MULTIBOOT_NCHILD]; // 19
+ u8 palette_data; // 1c
+ u8 response_bit; // 1d
+ u8 client_bit; // 1e
+ u8 reserved1; // 1f
+ u8 *boot_srcp; // 20
+ u8 *boot_endp; // 24
+ const u8 *masterp;
u8 *reserved2[MULTIBOOT_NCHILD];
u32 system_work2[4];
u8 sendflag;
diff --git a/include/gpu_regs.h b/include/gpu_regs.h
new file mode 100644
index 000000000..d0528bb83
--- /dev/null
+++ b/include/gpu_regs.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_gpu_regs_H
+#define GUARD_gpu_regs_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void DisableInterrupts(u16);
+void EnableInterrupts(u16);
+void SetGpuReg(u8, u16);
+
+#endif //GUARD_gpu_regs_H
diff --git a/include/multiboot.h b/include/multiboot.h
index 950c853d0..d4700ff4e 100644
--- a/include/multiboot.h
+++ b/include/multiboot.h
@@ -15,7 +15,7 @@
void MultiBootInit(struct MultiBootParam *mp);
int MultiBootMain(struct MultiBootParam *mp);
void MultiBootStartProbe(struct MultiBootParam *mp);
-void MultiBootStartMaster(struct MultiBootParam *mp, u8 *srcp, int length, u8 palette_color, s8 palette_speed);
+void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed);
int MultiBootCheckComplete(struct MultiBootParam *mp);
#endif // GUARD_MULTIBOOT_H
diff --git a/include/unknown_task.h b/include/unknown_task.h
new file mode 100644
index 000000000..f59ca9ac3
--- /dev/null
+++ b/include/unknown_task.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_unknown_task_H
+#define GUARD_unknown_task_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void remove_some_task(void);
+
+#endif //GUARD_unknown_task_H
diff --git a/ld_script.txt b/ld_script.txt
index d6b3953fe..b62125311 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -259,6 +259,7 @@ SECTIONS {
asm/battle_controller_player_partner.o(.text);
asm/fldeff_groundshake.o(.text);
asm/fossil_specials.o(.text);
+ src/berry_fix_program.o(.text);
asm/berry_fix_program.o(.text);
asm/pokemon_summary_screen.o(.text);
asm/pokenav.o(.text);
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
new file mode 100644
index 000000000..bafefaf7a
--- /dev/null
+++ b/src/berry_fix_program.c
@@ -0,0 +1,123 @@
+
+// Includes
+#include "global.h"
+#include "multiboot.h"
+#include "gpu_regs.h"
+#include "main.h"
+#include "sprite.h"
+#include "task.h"
+#include "unknown_task.h"
+#include "malloc.h"
+#include "m4a.h"
+
+// Static type declarations
+
+typedef struct {
+ u8 state;
+ u8 unk1;
+ u16 unk2;
+ struct MultiBootParam mb;
+} berryfix_t;
+
+// Static RAM declarations
+
+extern berryfix_t *gUnknown_030012B8;
+
+// Static ROM declarations
+
+static void sub_81BF3DC(void);
+void sub_81BF5A4(void);
+u32 sub_81BF7A4(u8);
+
+// .rodata
+
+extern const u8 gUnknown_089A6550[0xC0];
+extern const u8 gMultiBootProgram_BerryGlitchFix_Script[0x3b34];
+extern const u8 gMultiBootProgram_BerryGlitchFix_Start[];
+extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
+
+// .text
+
+void sub_81BF384(void)
+{
+ DisableInterrupts(0xFFFF);
+ EnableInterrupts(0x0001);
+ m4aSoundVSyncOff();
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ ResetTasks();
+ remove_some_task();
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
+ gUnknown_030012B8 = AllocZeroed(0x50);
+ gUnknown_030012B8->state = 0;
+ gUnknown_030012B8->unk1 = 6;
+ SetMainCallback2(sub_81BF3DC);
+}
+
+static void sub_81BF3DC(void)
+{
+ switch (gUnknown_030012B8->state)
+ {
+ case 0:
+ sub_81BF5A4();
+ gUnknown_030012B8->state = 1;
+ break;
+ case 1:
+ if (sub_81BF7A4(5) == 5 && (gMain.newKeys & A_BUTTON))
+ {
+ gUnknown_030012B8->state = 2;
+ }
+ break;
+ case 2:
+ if (sub_81BF7A4(0) == 0 && (gMain.newKeys & A_BUTTON))
+ {
+ gUnknown_030012B8->state = 3;
+ }
+ break;
+ case 3:
+ if (sub_81BF7A4(1) == 1)
+ {
+ gUnknown_030012B8->mb.masterp = gUnknown_089A6550;
+ gUnknown_030012B8->mb.server_type = 0;
+ MultiBootInit(&gUnknown_030012B8->mb);
+ gUnknown_030012B8->unk2 = 0;
+ gUnknown_030012B8->state = 4;
+ }
+ break;
+ case 4:
+ MultiBootMain(&gUnknown_030012B8->mb);
+ if (gUnknown_030012B8->mb.probe_count != 0 || (!(gUnknown_030012B8->mb.response_bit & 2) || !(gUnknown_030012B8->mb.client_bit & 2)))
+ {
+ gUnknown_030012B8->unk2 = 0;
+ }
+ else if (++ gUnknown_030012B8->unk2 > 180)
+ {
+ MultiBootStartMaster(&gUnknown_030012B8->mb, gMultiBootProgram_BerryGlitchFix_Start, (u32)(gMultiBootProgram_BerryGlitchFix_End - gMultiBootProgram_BerryGlitchFix_Start), 4, 1);
+ gUnknown_030012B8->state = 5;
+ }
+ break;
+ case 5:
+ if (sub_81BF7A4(2) == 2) {
+ MultiBootMain(&gUnknown_030012B8->mb);
+ if (MultiBootCheckComplete(&gUnknown_030012B8->mb)) {
+ gUnknown_030012B8->state = 6;
+ }
+ else if (!(gUnknown_030012B8->mb.client_bit & 2)) {
+ gUnknown_030012B8->state = 7;
+ }
+ }
+ break;
+ case 6:
+ if (sub_81BF7A4(3) == 3 && gMain.newKeys & A_BUTTON)
+ {
+ DoSoftReset();
+ }
+ break;
+ case 7:
+ if (sub_81BF7A4(4) == 4 && gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_030012B8->state = 1;
+ }
+ break;
+ }
+}