diff options
author | Phlosioneer <mattmdrr2@gmail.com> | 2019-02-13 21:37:34 -0500 |
---|---|---|
committer | Phlosioneer <mattmdrr2@gmail.com> | 2019-02-17 23:14:14 -0500 |
commit | a8d920cc45abdef48ca660530d094661557a8451 (patch) | |
tree | f574c18d1a2a4d1201969ced2bb1ed3be69eaefe /src | |
parent | 34b16e9e78a717331344934abe4ee172ca487692 (diff) |
Decompiled 2 functions, unable to decompile 1.
sub_81C795C could not be decompiled due to register naming issues.
However, its structure was correctly matched, so I have left the C
code and a comment explaining the issue.
Diffstat (limited to 'src')
-rw-r--r-- | src/pokenav_main.c | 99 |
1 files changed, 95 insertions, 4 deletions
diff --git a/src/pokenav_main.c b/src/pokenav_main.c index 29df2b40f..5610966b7 100644 --- a/src/pokenav_main.c +++ b/src/pokenav_main.c @@ -13,9 +13,15 @@ #include "bg.h" #include "menu.h" #include "graphics.h" +#include "gba/macro.h" #define UNKNOWN_OFFSET 100000 +struct PaletteDescriptor { + void *palette; + u16 tag; +}; + struct UnknownStruct_0203CF40 { u32 (*field0)(void); u32 field4; @@ -49,14 +55,12 @@ extern void sub_81CAADC(void); extern void sub_81C99D4(void); extern void sub_81C7C94(void); extern void sub_8199D98(void); -extern void sub_81C7944(void* palette, u32 a1, u32 a2); extern void sub_81C7B74(void); extern void sub_81C7C28(void); extern void sub_81C7D28(void); -extern u32 atk47_cmd47(s32 a0); -extern u32 sub_81C791C(s32 a0); +u32 sub_81C791C(s32 a0); bool32 sub_81C756C(u32 a0); bool32 sub_81C76C4(void); u32 AnyMonHasRibbon(void); @@ -65,7 +69,9 @@ u32 sub_81C75D4(void); u32 sub_81C76FC(void); u32 sub_81C786C(void); u32 sub_81C7764(s32 a0); +u32 atk47_cmd47(s32 a0); bool32 sub_81C7738(void); +void CopyPaletteIntoBufferUnfaded(void *palette, u32 a1, u32 a2); void sub_81C7834(u32 (*a0)(void), u32(*a1)(void)); void sub_81C7360(struct UnknownStruct_0203CF40 *a0); void sub_81C7650(u32 index); @@ -493,7 +499,7 @@ u32 sub_81C7764(s32 a0) { decompress_and_copy_tile_data_to_vram(0, &gPokenavHeader_Gfx, 0, 0, 0); SetBgTilemapBuffer(0, &v1->data[11]); CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0); - sub_81C7944(&gPokenavHeader_Pal, 0, 0x20); + CopyPaletteIntoBufferUnfaded(&gPokenavHeader_Pal, 0, 0x20); CopyBgTilemapBufferToVram(0); return 0; case 2: @@ -566,4 +572,89 @@ bool32 sub_81C78C0(void) { v1 = sub_81C763C(0); return sub_81C70D8(v1->fieldC); +} + +u32 atk47_cmd47(s32 a0) { + switch (a0) { + default: + return 4; + case 1: + return 0; + case 0: + return 0; + case 2: + if ((u32)ChangeBgY(0, 384, 1) >= 0x2000) { + ChangeBgY(0, 0x2000, 0); + return 4; + } else { + return 2; + } + } +} + +u32 sub_81C791C(s32 a0) { + if (ChangeBgY(0, 384, 2) <= 0) { + ChangeBgY(0, 0, 0); + return 4; + } else { + return 2; + } +} + +void CopyPaletteIntoBufferUnfaded(void *palette, u32 bufferOffset, u32 size) { + CpuCopy16(palette, gPlttBufferUnfaded + bufferOffset, size); +} + +__attribute__((naked)) +void sub_81C795C(struct PaletteDescriptor *palettes) { + // This code matches the assembly almost exactly; however, gcc chooses + // to store `index` in r0 instead of r1. +#ifdef NONMATCHING + struct PaletteDescriptor *current; + u32 offset; + u32 index; + + current = palettes; + for (;;) { + if (current->palette == NULL) { + break; + } + index = AllocSpritePalette(current->tag); + if (index == 0xFF) { + break; + } + offset = (index * 16) + 0x100; + CopyPaletteIntoBufferUnfaded(current->palette, offset, 0x20); + current++; + } +#else // NONMATCHING + asm(".syntax unified\n\ + push {r4,lr}\n\ + adds r4, r0, 0\n\ + b _081C7974\n\ + _081C7962:\n\ + lsls r0, r1, 4\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + adds r1, r0, r2\n\ + ldr r0, [r4]\n\ + movs r2, 0x20\n\ + bl CopyPaletteIntoBufferUnfaded\n\ + adds r4, 0x8\n\ + _081C7974:\n\ + ldr r0, [r4]\n\ + cmp r0, 0\n\ + beq _081C7988\n\ + ldrh r0, [r4, 0x4]\n\ + bl AllocSpritePalette\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0xFF\n\ + bne _081C7962\n\ + _081C7988:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +#endif // NONMATCHING }
\ No newline at end of file |