diff options
Diffstat (limited to 'arm9')
| -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 | 
5 files changed, 142 insertions, 188 deletions
| 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; +} + | 
