diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2017-09-18 08:52:57 -0400 |
---|---|---|
committer | scnorton <scnorton@biociphers.org> | 2017-09-18 09:23:06 -0400 |
commit | 8604291b0f0e430b01f0099ea4e098171938505b (patch) | |
tree | c1d706048ccc4ffb852ba6d597428fd6ec2d30e4 /src/berry_fix_program.c | |
parent | 74bda5b68088f08220cf3f1b9791e5900a6a9877 (diff) |
Start decomp
Diffstat (limited to 'src/berry_fix_program.c')
-rw-r--r-- | src/berry_fix_program.c | 123 |
1 files changed, 123 insertions, 0 deletions
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; + } +} |