diff options
author | red031000 <rubenru09@aol.com> | 2020-07-31 14:46:39 +0100 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-08-03 15:58:15 -0400 |
commit | 2ad683e977cd1073818c5495de07df9e4d8cbd58 (patch) | |
tree | f726d5c966c0cb20bc5a23a165689bd7d1b0955c | |
parent | 08325760dac0c86a997af5851d07f7994181ccd4 (diff) |
mod63_021DB5CC
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | arm9/lib/include/GX_g2.h | 34 | ||||
-rw-r--r-- | arm9/lib/include/registers.h | 13 | ||||
-rw-r--r-- | arm9/modules/63/asm/mod63_021DB450_asm.s | 180 | ||||
-rw-r--r-- | arm9/modules/63/include/mod63_021DB450.h | 16 | ||||
-rw-r--r-- | arm9/modules/63/src/mod63_021DB450.c | 87 |
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 = ¶m0->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; +} + |