summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--arm9/lib/include/GX_g2.h34
-rw-r--r--arm9/lib/include/registers.h13
-rw-r--r--arm9/modules/63/asm/mod63_021DB450_asm.s180
-rw-r--r--arm9/modules/63/include/mod63_021DB450.h16
-rw-r--r--arm9/modules/63/src/mod63_021DB450.c87
6 files changed, 143 insertions, 189 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6a8fbb58..d51525ed 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,7 +15,7 @@ add_compile_options(-fms-extensions)
file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "*.c" "*.cpp")
add_executable(PokeDiamond ${SOURCES})
-target_include_directories(PokeDiamond PRIVATE include include-mw arm9/lib/include arm7/lib/include)
+target_include_directories(PokeDiamond PRIVATE include include-mw arm9/lib/include arm7/lib/include arm9/modules/63/include)
add_executable(calcrom .travis/calcrom/calcrom.cpp)
target_include_directories(calcrom PRIVATE /usr/local/include)
diff --git a/arm9/lib/include/GX_g2.h b/arm9/lib/include/GX_g2.h
index d1d1c82c..372be12b 100644
--- a/arm9/lib/include/GX_g2.h
+++ b/arm9/lib/include/GX_g2.h
@@ -2,6 +2,7 @@
#define GUARD_GX_G2_H
#include "fx.h"
+#include "registers.h"
void G2x_SetBGyAffine_(u32 *ptr, struct Mtx22 *mtx, fx32 a, fx32 b, fx32 c, fx32 d);
void G2x_SetBlendAlpha_(u32 *ptr, fx32 a, fx32 b, fx32 c, fx32 d);
@@ -9,6 +10,39 @@ void G2x_SetBlendBrightness_(u16 *ptr, fx32 a, fx32 brightness);
void G2x_SetBlendBrightnessExt_(u16 *ptr, fx32 a, fx32 b, fx32 c, fx32 d, fx32 brightness);
void G2x_ChangeBlendBrightness_(u16 *ptr, fx32 brightness);
+typedef struct
+{
+ u8 planeMask:5;
+ u8 effect:1;
+ u8 _reserve:2;
+}
+ GXWndPlane;
+
+typedef enum
+{
+ GX_WND_PLANEMASK_NONE = 0x0000,
+ GX_WND_PLANEMASK_BG0 = 0x0001,
+ GX_WND_PLANEMASK_BG1 = 0x0002,
+ GX_WND_PLANEMASK_BG2 = 0x0004,
+ GX_WND_PLANEMASK_BG3 = 0x0008,
+ GX_WND_PLANEMASK_OBJ = 0x0010
+}
+ GXWndPlaneMask;
+
+static inline void G2_SetWndOutsidePlane(int wnd, BOOL effect)
+{
+ u32 tmp;
+
+ tmp = ((reg_G2_WINOUT & ~REG_G2_WINOUT_WINOUT_MASK) | ((u32)wnd << REG_G2_WINOUT_WINOUT_SHIFT));
+
+ if (effect)
+ {
+ tmp |= (0x20 << REG_G2_WINOUT_WINOUT_SHIFT); // EFCT
+ }
+
+ reg_G2_WINOUT = (u16)tmp;
+}
+
//The g2 and g2_oam headers contain a lot of inline functions and enums that may want to be ported over at some point
#endif //GUARD_GX_G2_H
diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h
index 37ca97e6..6bfb52ac 100644
--- a/arm9/lib/include/registers.h
+++ b/arm9/lib/include/registers.h
@@ -454,6 +454,19 @@
#define REG_PAD_KEYCNT_A_SIZE 1
#define REG_PAD_KEYCNT_A_MASK 0x0001
+#define REG_G2_WINOUT_OBJWININ_SHIFT 8
+#define REG_G2_WINOUT_OBJWININ_SIZE 6
+#define REG_G2_WINOUT_OBJWININ_MASK 0x3f00
+
+#define REG_G2_WINOUT_WINOUT_SHIFT 0
+#define REG_G2_WINOUT_WINOUT_SIZE 6
+#define REG_G2_WINOUT_WINOUT_MASK 0x003f
+
+#define REG_G2_WINOUT_FIELD( objwinin, winout ) \
+ (u16)( \
+ ((u32)(objwinin) << REG_G2_WINOUT_OBJWININ_SHIFT) | \
+ ((u32)(winout) << REG_G2_WINOUT_WINOUT_SHIFT))
+
#ifndef SDK_ASM
#define REG_PAD_KEYCNT_FIELD( logic, intr, l, r, down, up, left, right, start, sel, b, a ) \
(u16)( \
diff --git a/arm9/modules/63/asm/mod63_021DB450_asm.s b/arm9/modules/63/asm/mod63_021DB450_asm.s
index e32c5ccf..28265e78 100644
--- a/arm9/modules/63/asm/mod63_021DB450_asm.s
+++ b/arm9/modules/63/asm/mod63_021DB450_asm.s
@@ -5,174 +5,7 @@
.extern MOD63_021DBED8
.extern MOD63_021DBEC0
.extern MOD63_021DBEDC
-
- thumb_func_start MOD63_021DB5CC
-MOD63_021DB5CC: ; 0x021DB5CC
- push {r3, r4, r5, r6, r7, lr}
- sub sp, #8
- add r4, r0, #0
- add r7, r2, #0
- ldrb r2, [r4, #0x1c]
- add r5, r4, #0
- add r6, r1, #0
- add r5, #0x1c
- cmp r2, #5
- bls _021DB5E2
- b _021DB6FC
-_021DB5E2:
- add r2, r2, r2
- add r2, pc
- ldrh r2, [r2, #6]
- lsl r2, r2, #0x10
- asr r2, r2, #0x10
- add pc, r2
-_021DB5EE: ; jump table
- .short _021DB5FA - _021DB5EE - 2 ; case 0
- .short _021DB63C - _021DB5EE - 2 ; case 1
- .short _021DB658 - _021DB5EE - 2 ; case 2
- .short _021DB690 - _021DB5EE - 2 ; case 3
- .short _021DB6BE - _021DB5EE - 2 ; case 4
- .short _021DB6E4 - _021DB5EE - 2 ; case 5
-_021DB5FA:
- ldr r0, _021DB704 ; =0x0400004A
- mov r1, #0x3f
- ldrh r2, [r0]
- add r7, r4, #4
- bic r2, r1
- mov r1, #0x11
- orr r1, r2
- mov r2, #0x20
- orr r1, r2
- strh r1, [r0]
- lsl r0, r6, #2
- str r0, [sp]
- ldr r0, [r7, r0]
- mov r1, #0xc
- lsl r2, r2, #5
- bl FUN_02007558
- ldr r0, [sp]
- mov r2, #1
- ldr r0, [r7, r0]
- mov r1, #0xd
- lsl r2, r2, #0xa
- bl FUN_02007558
- ldr r0, [sp]
- mov r1, #6
- ldr r0, [r7, r0]
- mov r2, #0
- bl FUN_02007558
- ldrb r0, [r5]
- add r0, r0, #1
- strb r0, [r5]
-_021DB63C:
- ldr r2, _021DB708 ; =MOD63_021DBED8
- lsl r3, r6, #3
- ldr r2, [r2, r3]
- add r0, r4, #0
- add r1, r6, #0
- blx r2
- cmp r0, #0
- beq _021DB6FC
- mov r0, #0
- strb r0, [r4, #0x1d]
- ldrb r0, [r5]
- add r0, r0, #1
- strb r0, [r5]
- b _021DB6FC
-_021DB658:
- ldr r0, [r4, #0x18]
- mov r1, #1
- bl FUN_02013440
- lsl r0, r6, #2
- str r0, [sp, #4]
- ldr r1, _021DB70C ; =MOD63_021DBF08
- lsl r6, r6, #3
- ldr r3, [sp, #4]
- add r7, r4, #4
- ldr r0, [r4, #0x18]
- ldr r1, [r1, r6]
- ldr r2, _021DB710 ; =MOD63_021DB940
- ldr r3, [r7, r3]
- bl FUN_020133AC
- ldr r1, _021DB714 ; =MOD63_021DBF0C
- ldr r3, [sp, #4]
- ldr r0, [r4, #0x18]
- ldr r1, [r1, r6]
- ldr r2, _021DB710 ; =MOD63_021DB940
- ldr r3, [r7, r3]
- bl FUN_020133AC
- ldrb r0, [r5]
- add r0, r0, #1
- strb r0, [r5]
- b _021DB6FC
-_021DB690:
- ldr r0, [r4, #0x18]
- bl FUN_020133C8
- cmp r0, #0
- bne _021DB6FC
- ldr r0, _021DB718 ; =MOD63_021DBEC0
- lsl r1, r6, #2
- ldr r0, [r0, r1]
- cmp r7, r0
- blt _021DB6FC
- ldr r1, _021DB704 ; =0x0400004A
- mov r0, #0x3f
- ldrh r2, [r1]
- bic r2, r0
- mov r0, #0x10
- orr r2, r0
- mov r0, #0x20
- orr r0, r2
- strh r0, [r1]
- ldrb r0, [r5]
- add r0, r0, #1
- strb r0, [r5]
- b _021DB6FC
-_021DB6BE:
- ldr r2, _021DB71C ; =MOD63_021DBEDC
- lsl r3, r6, #3
- ldr r2, [r2, r3]
- blx r2
- cmp r0, #0
- beq _021DB6FC
- lsl r0, r6, #2
- add r0, r4, r0
- ldr r0, [r0, #4]
- mov r1, #6
- mov r2, #1
- bl FUN_02007558
- mov r0, #0
- strb r0, [r4, #0x1d]
- ldrb r0, [r5]
- add r0, r0, #1
- strb r0, [r5]
- b _021DB6FC
-_021DB6E4:
- ldrb r0, [r4, #0x1d]
- add r0, r0, #1
- strb r0, [r4, #0x1d]
- ldrb r0, [r4, #0x1d]
- cmp r0, #0x14
- blo _021DB6FC
- mov r0, #0
- strb r0, [r4, #0x1d]
- strb r0, [r5]
- add sp, #8
- mov r0, #1
- pop {r3, r4, r5, r6, r7, pc}
-_021DB6FC:
- mov r0, #0
- add sp, #8
- pop {r3, r4, r5, r6, r7, pc}
- nop
-_021DB704: .word 0x0400004A
-_021DB708: .word MOD63_021DBED8
-_021DB70C: .word MOD63_021DBF08
-_021DB710: .word MOD63_021DB940
-_021DB714: .word MOD63_021DBF0C
-_021DB718: .word MOD63_021DBEC0
-_021DB71C: .word MOD63_021DBEDC
- thumb_func_end MOD63_021DB5CC
+ .extern MOD63_021DBF08
thumb_func_start MOD63_021DB720
MOD63_021DB720: ; 0x021DB720
@@ -496,14 +329,3 @@ MOD63_021DB940: ; 0x021DB940
pop {r4, r5, pc}
.align 2, 0
thumb_func_end MOD63_021DB940
-
- .section .rodata
-
- .global MOD63_021DBF08
-MOD63_021DBF08: ; 0x021DBF08
- .byte 0x04, 0x00, 0x00, 0x00
-
- .global MOD63_021DBF0C
-MOD63_021DBF0C: ; 0x021DBF0C
- .byte 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00
- .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
diff --git a/arm9/modules/63/include/mod63_021DB450.h b/arm9/modules/63/include/mod63_021DB450.h
index 2fd902ce..617912a7 100644
--- a/arm9/modules/63/include/mod63_021DB450.h
+++ b/arm9/modules/63/include/mod63_021DB450.h
@@ -44,6 +44,21 @@ typedef struct UnkStruct63_021DB5A8 //possibly the same as above
u32 field_00;
} UnkStruct63_021DB5A8;
+typedef struct UnkStruct63_021DB5CC
+{
+ u8 filler_00[4];
+ u32 field_04[5];
+ u32 field_18;
+ u8 field_1C;
+ u8 field_1D;
+} UnkStruct63_021DB5CC;
+
+typedef struct UnkStruct63_021DBED8
+{
+ BOOL (*unk_00)(struct UnkStruct63_021DB5CC *, u32);
+ BOOL (*unk_04)(struct UnkStruct63_021DB5CC *, u32);
+} UnkStruct63_021DBED8;
+
u32 MOD63_021DB450(u32 param0, u32 param1);
u32 MOD63_021DB474(u32 param0, u32 param1);
u32 MOD63_021DB498(void);
@@ -51,5 +66,6 @@ void Title_SetupMonAnimationSprites(struct UnkStruct63_021DB49C * arg0);
void MOD63_021DB580(UnkStruct63_021DB580 *param0);
void MOD63_021DB598(UnkStruct63_021DB598 *param0);
void MOD63_021DB5A8(UnkStruct63_021DB5A8 *param0);
+BOOL MOD63_021DB5CC(UnkStruct63_021DB5CC *param0, u32 param1, s32 param2);
#endif //POKEDIAMOND_MOD63_021DB450_H
diff --git a/arm9/modules/63/src/mod63_021DB450.c b/arm9/modules/63/src/mod63_021DB450.c
index 20aaa310..a1704f68 100644
--- a/arm9/modules/63/src/mod63_021DB450.c
+++ b/arm9/modules/63/src/mod63_021DB450.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "heap.h"
#include "constants/species.h"
+#include "gx.h"
#include "mod63_021DB450.h"
//todo resolve to static code
@@ -33,16 +34,21 @@ extern u32 FUN_02006ED4(u32 param0);
extern void MOD63_021DB934(void);
extern void FUN_020222B4(u32, u32);
+extern void FUN_02013440(u32, u32);
+extern void FUN_020133AC(u32, u32, const void *, u32);
+extern BOOL FUN_020133C8(u32);
+
//todo funcs
-void MOD63_021DB720();
-void MOD63_021DB784();
-void MOD63_021DB7D0();
-void MOD63_021DB838();
-void MOD63_021DB884();
-void MOD63_021DB8E8();
+extern BOOL MOD63_021DB720(struct UnkStruct63_021DB5CC *, u32);
+extern BOOL MOD63_021DB784(struct UnkStruct63_021DB5CC *, u32);
+extern BOOL MOD63_021DB7D0(struct UnkStruct63_021DB5CC *, u32);
+extern BOOL MOD63_021DB838(struct UnkStruct63_021DB5CC *, u32);
+extern BOOL MOD63_021DB884(struct UnkStruct63_021DB5CC *, u32);
+extern BOOL MOD63_021DB8E8(struct UnkStruct63_021DB5CC *, u32);
+extern void MOD63_021DB940();
//todo data
-const u32 MOD63_021DBEC0[3] = {0x703, 0x7CE, 0x8A8};
+const s32 MOD63_021DBEC0[3] = {0x703, 0x7CE, 0x8A8};
const struct UnkStruct63_021DBEF0 MOD63_021DBEF0[3];
THUMB_FUNC u32 MOD63_021DB450(u32 param0, u32 param1)
@@ -117,11 +123,74 @@ THUMB_FUNC void MOD63_021DB5A8(UnkStruct63_021DB5A8 *param0)
FUN_020222B4(1, 0);
}
-void * const MOD63_021DBED8 = MOD63_021DB720;
-void * const MOD63_021DBEDC[5] = { MOD63_021DB784, MOD63_021DB7D0, MOD63_021DB838, MOD63_021DB884, MOD63_021DB8E8 };
+const struct UnkStruct63_021DBED8 MOD63_021DBED8[3] = {
+ {MOD63_021DB720, MOD63_021DB784},
+ {MOD63_021DB7D0, MOD63_021DB838},
+ {MOD63_021DB884, MOD63_021DB8E8}
+};
const struct UnkStruct63_021DBEF0 MOD63_021DBEF0[3] = {
{0x080, 0xC0},
{0x100, 0xC0},
{0x050, 0xC0}
};
+
+const struct UnkStruct63_021DBEF0 MOD63_021DBF08[3] = { //no idea if this is the right type
+ {4, 5},
+ {2, 3},
+ {0, 1}
+};
+
+THUMB_FUNC BOOL MOD63_021DB5CC(UnkStruct63_021DB5CC *param0, u32 param1, s32 param2)
+{
+ u8 * state = &param0->field_1C;
+ switch(*state)
+ {
+ case 0:
+ G2_SetWndOutsidePlane(GX_WND_PLANEMASK_OBJ | GX_WND_PLANEMASK_BG0, TRUE);
+ FUN_02007558(param0->field_04[param1], 12, 0x400);
+ FUN_02007558(param0->field_04[param1], 13, 0x400);
+ FUN_02007558(param0->field_04[param1], 6, 0);
+ (*state)++;
+ // fallthrough
+ case 1:
+ if (MOD63_021DBED8[param1].unk_00(param0, param1))
+ {
+ param0->field_1D = 0;
+ (*state)++;
+ }
+ break;
+ case 2:
+ FUN_02013440(param0->field_18, 1);
+ FUN_020133AC(param0->field_18, MOD63_021DBF08[param1].field_00, MOD63_021DB940, param0->field_04[param1]);
+ FUN_020133AC(param0->field_18, MOD63_021DBF08[param1].field_04, MOD63_021DB940, param0->field_04[param1]);
+ (*state)++;
+ break;
+ case 3:
+ if (!FUN_020133C8(param0->field_18) && param2 >= MOD63_021DBEC0[param1])
+ {
+ G2_SetWndOutsidePlane(GX_WND_PLANEMASK_OBJ, TRUE);
+ (*state)++;
+ }
+ break;
+ case 4:
+ if (MOD63_021DBED8[param1].unk_04(param0, param1))
+ {
+ FUN_02007558(param0->field_04[param1], 6, 1);
+ param0->field_1D = 0;
+ (*state)++;
+ }
+ break;
+ case 5:
+ param0->field_1D++;
+ if (param0->field_1D >= 20)
+ {
+ param0->field_1D = 0;
+ *state = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+