summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhlosioneer <mattmdrr2@gmail.com>2019-02-13 21:37:34 -0500
committerPhlosioneer <mattmdrr2@gmail.com>2019-02-17 23:14:14 -0500
commita8d920cc45abdef48ca660530d094661557a8451 (patch)
treef574c18d1a2a4d1201969ced2bb1ed3be69eaefe /src
parent34b16e9e78a717331344934abe4ee172ca487692 (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.c99
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