diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index c714c2674..21399e33b 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -1149,8 +1149,7 @@ Overlay MODULE_59 ##Rowan's intro + TV intro## After arm9 Object mod59_Intro.o - Object mod59_TV_src.o - Object mod59_TV_asm.o + Object mod59_TV.o } Overlay MODULE_60 diff --git a/arm9/lib/NitroSDK/include/GX_g2.h b/arm9/lib/NitroSDK/include/GX_g2.h index 97fa0e107..bb6d1f02f 100644 --- a/arm9/lib/NitroSDK/include/GX_g2.h +++ b/arm9/lib/NitroSDK/include/GX_g2.h @@ -4,8 +4,19 @@ #include "fx.h" #include "registers.h" +typedef enum GXBlendPlaneMask +{ + GX_BLEND_PLANEMASK_NONE = 0x0000, + GX_BLEND_PLANEMASK_BG0 = 0x0001, + GX_BLEND_PLANEMASK_BG1 = 0x0002, + GX_BLEND_PLANEMASK_BG2 = 0x0004, + GX_BLEND_PLANEMASK_BG3 = 0x0008, + GX_BLEND_PLANEMASK_OBJ = 0x0010, + GX_BLEND_PLANEMASK_BD = 0x0020 +} GXBlendPlaneMask; + void G2x_SetBGyAffine_(u32 ptr, const struct Mtx22 *mtx, fx32 a, fx32 b, fx32 c, fx32 d); -void G2x_SetBlendAlpha_(u32 *ptr, fx32 a, fx32 b, fx32 c, fx32 d); +void G2x_SetBlendAlpha_(u32 *ptr, GXBlendPlaneMask plane1, GXBlendPlaneMask plane2, fx32 c, fx32 d); 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); @@ -15,8 +26,7 @@ typedef struct u8 planeMask:5; u8 effect:1; u8 _reserve:2; -} - GXWndPlane; +} GXWndPlane; typedef enum { @@ -26,8 +36,7 @@ typedef enum GX_WND_PLANEMASK_BG2 = 0x0004, GX_WND_PLANEMASK_BG3 = 0x0008, GX_WND_PLANEMASK_OBJ = 0x0010 -} - GXWndPlaneMask; +} GXWndPlaneMask; static inline void G2_SetWndOutsidePlane(int wnd, BOOL effect) { @@ -121,6 +130,16 @@ static inline void G2S_BlendNone(void) reg_G2S_DB_BLDCNT = 0; } +static inline void G2_SetBlendAlpha(GXBlendPlaneMask plane1, GXBlendPlaneMask plane2, fx32 ev1, fx32 ev2) +{ + G2x_SetBlendAlpha_((u32 *)®_G2_BLEND, plane1, plane2, ev1, ev2); +} + +static inline void G2S_SetBlendAlpha(GXBlendPlaneMask plane1, GXBlendPlaneMask plane2, fx32 ev1, fx32 ev2) +{ + G2x_SetBlendAlpha_((u32 *)®_G2S_DB_BLEND, plane1, plane2, ev1, ev2); +} + //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/NitroSDK/src/GX_g2.c b/arm9/lib/NitroSDK/src/GX_g2.c index 39b8bff4d..55ab36ec9 100644 --- a/arm9/lib/NitroSDK/src/GX_g2.c +++ b/arm9/lib/NitroSDK/src/GX_g2.c @@ -13,8 +13,8 @@ ARM_FUNC void G2x_SetBGyAffine_(u32 ptr, const struct Mtx22 *mtx, fx32 a, fx32 b *((vu32 *)ptr + 3) = (u32)(temp3 >> 4); } -ARM_FUNC void G2x_SetBlendAlpha_(u32 *ptr, fx32 a, fx32 b, fx32 c, fx32 d){ - *ptr = (u32)(((a | 0x40) | (b << 0x8)) | ((c | (d << 0x8)) << 0x10)); +ARM_FUNC void G2x_SetBlendAlpha_(u32 *ptr, GXBlendPlaneMask plane1, GXBlendPlaneMask plane2, fx32 c, fx32 d){ + *ptr = (u32)(((plane1 | 0x40) | (plane2 << 0x8)) | ((c | (d << 0x8)) << 0x10)); } ARM_FUNC void G2x_SetBlendBrightness_(u16 *ptr, fx32 a, fx32 brightness){ diff --git a/arm9/modules/59/asm/mod59_TV_asm.s b/arm9/modules/59/asm/mod59_TV_asm.s deleted file mode 100644 index 7d96f5519..000000000 --- a/arm9/modules/59/asm/mod59_TV_asm.s +++ /dev/null @@ -1,454 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - .section .text - .balign 4, 0 - - thumb_func_start MOD59_021D9A20 -MOD59_021D9A20: ; 0x021D9A20 - push {r3, r4, r5, lr} - sub sp, #0xb8 - ldr r5, _021D9BB4 ; =0x021DA0D4 - add r4, r0, #0 - add r3, sp, #0x90 - mov r2, #5 -_021D9A2C: - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - sub r2, r2, #1 - bne _021D9A2C - add r0, sp, #0x90 - bl GX_SetBanks - ldr r0, [r4] - bl BgConfig_Alloc - add r3, sp, #0x80 - ldr r5, _021D9BB8 ; =0x021DA054 - str r0, [r4, #4] - add r2, r3, #0 - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - add r0, r2, #0 - bl SetBothScreensModesAndDisable - ldr r5, _021D9BBC ; =0x021DA080 - add r3, sp, #0x64 - ldmia r5!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5] - mov r1, #2 - str r0, [r3] - ldr r0, [r4, #4] - mov r3, #0 - bl InitBgFromTemplate - ldr r3, [r4] - mov r0, #2 - mov r1, #0x20 - mov r2, #0 - bl BG_ClearCharDataRange - ldr r0, [r4, #4] - mov r1, #2 - bl BgClearTilemapBufferAndCommit - ldr r5, _021D9BC0 ; =0x021DA09C - add r3, sp, #0x48 - ldmia r5!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5] - mov r1, #0 - str r0, [r3] - ldr r0, [r4, #4] - add r3, r1, #0 - bl InitBgFromTemplate - mov r3, #0 - str r3, [sp] - str r3, [sp, #4] - str r3, [sp, #8] - ldr r0, [r4] - mov r1, #1 - str r0, [sp, #0xc] - ldr r2, [r4, #4] - mov r0, #0x88 - bl GfGfxLoader_LoadCharData - mov r3, #0 - str r3, [sp] - str r3, [sp, #4] - str r3, [sp, #8] - ldr r0, [r4] - mov r1, #4 - str r0, [sp, #0xc] - ldr r2, [r4, #4] - mov r0, #0x88 - bl GfGfxLoader_LoadScrnData - ldr r5, _021D9BC4 ; =0x021DA064 - add r3, sp, #0x2c - ldmia r5!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5] - mov r1, #1 - str r0, [r3] - ldr r0, [r4, #4] - mov r3, #0 - bl InitBgFromTemplate - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r4] - mov r1, #2 - str r0, [sp, #0xc] - ldr r2, [r4, #4] - mov r0, #0x88 - mov r3, #1 - bl GfGfxLoader_LoadCharData - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r4] - mov r1, #5 - str r0, [sp, #0xc] - ldr r2, [r4, #4] - mov r0, #0x88 - mov r3, #1 - bl GfGfxLoader_LoadScrnData - ldr r5, _021D9BC8 ; =0x021DA0B8 - add r3, sp, #0x10 - ldmia r5!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5] - mov r1, #3 - str r0, [r3] - ldr r0, [r4, #4] - mov r3, #0 - bl InitBgFromTemplate - mov r1, #0 - str r1, [sp] - str r1, [sp, #4] - str r1, [sp, #8] - ldr r0, [r4] - mov r3, #3 - str r0, [sp, #0xc] - ldr r2, [r4, #4] - mov r0, #0x88 - bl GfGfxLoader_LoadCharData - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r4] - mov r1, #3 - str r0, [sp, #0xc] - ldr r2, [r4, #4] - mov r0, #0x88 - add r3, r1, #0 - bl GfGfxLoader_LoadScrnData - mov r2, #0 - str r2, [sp] - ldr r0, [r4] - mov r1, #6 - str r0, [sp, #4] - mov r0, #0x88 - add r3, r2, #0 - bl GfGfxLoader_GXLoadPal - ldr r2, [r4] - mov r0, #0 - mov r1, #0x20 - bl FUN_02002ED0 - mov r0, #0 - add r1, r0, #0 - bl BG_SetMaskColor - mov r0, #4 - mov r1, #0 - bl BG_SetMaskColor - mov r2, #0xc - ldr r0, _021D9BCC ; =0x04000050 - mov r1, #2 - mov r3, #4 - str r2, [sp] - bl G2x_SetBlendAlpha_ - add sp, #0xb8 - pop {r3, r4, r5, pc} - nop -_021D9BB4: .word MOD59_021DA0D4 -_021D9BB8: .word MOD59_021DA054 -_021D9BBC: .word MOD59_021DA080 -_021D9BC0: .word MOD59_021DA09C -_021D9BC4: .word MOD59_021DA064 -_021D9BC8: .word MOD59_021DA0B8 -_021D9BCC: .word 0x04000050 - thumb_func_end MOD59_021D9A20 - - thumb_func_start MOD59_021D9BD0 -MOD59_021D9BD0: ; 0x021D9BD0 - push {r4, lr} - add r4, r0, #0 - mov r0, #0 - add r1, r0, #0 - bl ToggleBgLayer - mov r0, #1 - mov r1, #0 - bl ToggleBgLayer - mov r0, #2 - mov r1, #0 - bl ToggleBgLayer - mov r0, #3 - mov r1, #0 - bl ToggleBgLayer - mov r0, #4 - mov r1, #0 - bl ToggleBgLayer - mov r0, #5 - mov r1, #0 - bl ToggleBgLayer - mov r0, #6 - mov r1, #0 - bl ToggleBgLayer - mov r0, #7 - mov r1, #0 - bl ToggleBgLayer - ldr r0, _021D9C44 ; =0x04000050 - mov r1, #0 - strh r1, [r0] - ldr r0, [r4, #4] - mov r1, #3 - bl FreeBgTilemapBuffer - ldr r0, [r4, #4] - mov r1, #1 - bl FreeBgTilemapBuffer - ldr r0, [r4, #4] - mov r1, #0 - bl FreeBgTilemapBuffer - ldr r0, [r4, #4] - mov r1, #2 - bl FreeBgTilemapBuffer - ldr r0, [r4, #4] - bl FreeToHeap - pop {r4, pc} - nop -_021D9C44: .word 0x04000050 - thumb_func_end MOD59_021D9BD0 - - thumb_func_start MOD59_021D9C48 -MOD59_021D9C48: ; 0x021D9C48 - push {r4, lr} - add r4, r0, #0 - ldr r2, _021D9C64 ; =0x00000225 - ldr r3, [r4] - mov r0, #1 - mov r1, #0x1a - bl NewMsgDataFromNarc - str r0, [r4, #8] - bl FUN_0201BD5C - mov r0, #0 - str r0, [r4, #0xc] - pop {r4, pc} - .align 2, 0 -_021D9C64: .word 0x00000225 - thumb_func_end MOD59_021D9C48 - - thumb_func_start MOD59_021D9C68 -MOD59_021D9C68: ; 0x021D9C68 - ldr r3, _021D9C70 ; =DestroyMsgData - ldr r0, [r0, #8] - bx r3 - nop -_021D9C70: .word DestroyMsgData - thumb_func_end MOD59_021D9C68 - - thumb_func_start MOD59_021D9C74 -MOD59_021D9C74: ; 0x021D9C74 - push {r4, r5, r6, r7, lr} - sub sp, #0x14 - add r4, r0, #0 - ldr r0, [r4, #0xc] - str r1, [sp, #0x10] - add r7, r3, #0 - mov r5, #0 - cmp r0, #3 - bhi _021D9D66 - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_021D9C92: ; jump table - .short _021D9C9A - _021D9C92 - 2 ; case 0 - .short _021D9D24 - _021D9C92 - 2 ; case 1 - .short _021D9D36 - _021D9C92 - 2 ; case 2 - .short _021D9D50 - _021D9C92 - 2 ; case 3 -_021D9C9A: - mov r0, #2 - add r1, r5, #0 - bl ToggleBgLayer - mov r0, #1 - ldr r1, [r4] - lsl r0, r0, #0xa - bl String_ctor - add r6, r0, #0 - ldr r0, [r4, #8] - ldr r1, [sp, #0x10] - add r2, r6, #0 - bl ReadMsgDataIntoString - add r1, r4, #0 - ldr r0, [r4, #4] - ldr r2, _021D9D6C ; =0x021DA04C - add r1, #0x10 - bl AddWindow - add r1, r5, #0 - mov r0, #1 - lsl r0, r0, #8 - str r0, [sp] - mov r0, #0xc0 - str r0, [sp, #4] - add r0, r4, #0 - add r0, #0x10 - add r2, r1, #0 - add r3, r1, #0 - bl FillWindowPixelRect - add r0, r5, #0 - add r1, r6, #0 - add r2, r0, #0 - bl FUN_02002F08 - mov r1, #1 - lsl r1, r1, #8 - sub r0, r1, r0 - lsr r3, r0, #1 - str r7, [sp] - add r1, r5, #0 - ldr r0, _021D9D70 ; =0x000F0200 - str r1, [sp, #4] - str r0, [sp, #8] - add r0, r4, #0 - add r0, #0x10 - add r2, r6, #0 - str r1, [sp, #0xc] - bl AddTextPrinterParameterized2 - add r0, r6, #0 - bl String_dtor - add r0, r4, #0 - add r0, #0x10 - bl CopyWindowToVram - mov r0, #2 - mov r1, #1 - bl ToggleBgLayer - mov r0, #0xf0 - str r0, [r4, #0x24] - mov r0, #1 - str r0, [r4, #0xc] - b _021D9D66 -_021D9D24: - ldr r0, [r4, #0x24] - cmp r0, #0 - beq _021D9D30 - sub r0, r0, #1 - str r0, [r4, #0x24] - b _021D9D66 -_021D9D30: - mov r0, #2 - str r0, [r4, #0xc] - b _021D9D66 -_021D9D36: - ldr r0, _021D9D74 ; =gMain - ldr r1, [r0, #0x48] - mov r0, #1 - and r0, r1 - cmp r0, #1 - beq _021D9D4A - mov r0, #2 - and r0, r1 - cmp r0, #2 - bne _021D9D66 -_021D9D4A: - mov r0, #3 - str r0, [r4, #0xc] - b _021D9D66 -_021D9D50: - add r0, r4, #0 - add r0, #0x10 - bl RemoveWindow - ldr r0, [r4, #4] - mov r1, #2 - bl BgClearTilemapBufferAndCommit - add r0, r5, #0 - str r0, [r4, #0xc] - mov r5, #1 -_021D9D66: - add r0, r5, #0 - add sp, #0x14 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_021D9D6C: .word MOD59_021DA04C -_021D9D70: .word 0x000F0200 -_021D9D74: .word gMain - thumb_func_end MOD59_021D9C74 - - thumb_func_start MOD59_021D9D78 -MOD59_021D9D78: ; 0x021D9D78 - push {r3, lr} - ldr r1, [r0, #0x20] - mov r2, #3 - add r3, r1, #4 - str r3, [r0, #0x20] - ldr r0, [r0, #4] - mov r1, #1 - asr r3, r3, #4 - bl BgSetPosTextAndCommit - pop {r3, pc} - .align 2, 0 - thumb_func_end MOD59_021D9D78 - - .rodata - - .global MOD59_021DA04C -MOD59_021DA04C: ; 0x021DA04C - .byte 0x02, 0x00, 0x00, 0x20, 0x18, 0x01, 0x01, 0x00 - - .global MOD59_021DA054 -MOD59_021DA054: ; 0x021DA054 - .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .global MOD59_021DA064 -MOD59_021DA064: ; 0x021DA064 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0x02, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .global MOD59_021DA080 -MOD59_021DA080: ; 0x021DA080 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .global MOD59_021DA09C -MOD59_021DA09C: ; 0x021DA09C - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0x01, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .global MOD59_021DA0B8 -MOD59_021DA0B8: ; 0x021DA0B8 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x01, 0x01, 0x03, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .global MOD59_021DA0D4 -MOD59_021DA0D4: ; 0x021DA0D4 - .byte 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/arm9/modules/59/include/mod59_Intro.h b/arm9/modules/59/include/mod59_Intro.h index 53ff14023..d7822809a 100644 --- a/arm9/modules/59/include/mod59_Intro.h +++ b/arm9/modules/59/include/mod59_Intro.h @@ -106,10 +106,10 @@ BOOL MOD59_IntroMain(struct UnkStruct_02006234 *overlayStruct, u32 *param1); BOOL MOD59_IntroExit(struct UnkStruct_02006234 *overlayStruct, u32 *param1); void MOD59_IntroDoGpuBgUpdate(MOD59_IntroOverlayData *data); BOOL MOD59_TestPokeballTouchLocation(void); -void MOD59_SetupBg(MOD59_IntroOverlayData *data); -void MOD59_DestroyBg(MOD59_IntroOverlayData *data); -void MOD59_SetupMsg(MOD59_IntroOverlayData *data); -void MOD59_DestroyMsg(MOD59_IntroOverlayData *data); +void MOD59_IntroSetupBg(MOD59_IntroOverlayData *data); +void MOD59_IntroDestroyBg(MOD59_IntroOverlayData *data); +void MOD59_IntroSetupMsg(MOD59_IntroOverlayData *data); +void MOD59_IntroDestroyMsg(MOD59_IntroOverlayData *data); void MOD59_021D7A4C(MOD59_IntroOverlayData *data); void MOD59_021D7A5C(MOD59_IntroOverlayData *data); BOOL MOD59_FadeController(MOD59_IntroOverlayData *data, u32 param1, u32 param2); diff --git a/arm9/modules/59/include/mod59_TV_src.h b/arm9/modules/59/include/mod59_TV.h similarity index 53% rename from arm9/modules/59/include/mod59_TV_src.h rename to arm9/modules/59/include/mod59_TV.h index 04b54ccdc..a5d196843 100644 --- a/arm9/modules/59/include/mod59_TV_src.h +++ b/arm9/modules/59/include/mod59_TV.h @@ -3,12 +3,17 @@ #include "nitro/types.h" #include "main.h" +#include "bg_window.h" +#include "msgdata.h" typedef struct MOD59_TVOverlayData2 { u32 heap_id; struct BgConfig *bgConfig; - u8 padding[0x1C]; + struct MsgData *msgData; + u32 unk0C; + struct Window window; + s32 unk20; u32 unk24; } MOD59_TVOverlayData; @@ -16,5 +21,11 @@ BOOL MOD59_TVInit(struct UnkStruct_02006234 *param0, u32 *param1); BOOL MOD59_TVMain(struct UnkStruct_02006234 *overlayStruct, u32 *param1); BOOL MOD59_TVExit(struct UnkStruct_02006234 *overlayStruct, u32 *param1); void MOD59_TVDoGpuBgUpdate(MOD59_TVOverlayData *data); +void MOD59_TVSetupGraphics(MOD59_TVOverlayData *data); +void MOD59_TVDestroyGraphics(MOD59_TVOverlayData *data); +void MOD59_TVSetupMsg(MOD59_TVOverlayData *data); +void MOD59_TVDestroyMsg(MOD59_TVOverlayData *data); +BOOL MOD59_021D9C74(MOD59_TVOverlayData *data, u32 msgNo, u32 param2, u32 param3); +void MOD59_021D9D78(MOD59_TVOverlayData *data); #endif // POKEDIAMOND_MOD59_TV_H diff --git a/arm9/modules/59/src/mod59_Intro.c b/arm9/modules/59/src/mod59_Intro.c index 86909cd1a..890bce626 100644 --- a/arm9/modules/59/src/mod59_Intro.c +++ b/arm9/modules/59/src/mod59_Intro.c @@ -10,7 +10,7 @@ #include "gf_gfx_loader.h" #include "heap.h" #include "list_menu_items.h" -#include "mod59_TV_src.h" +#include "mod59_TV.h" #include "module_52.h" #include "msgdata.h" #include "msgdata/msg.naix" @@ -180,15 +180,15 @@ const struct BgTemplate MOD59_021D9EA0 = .bufferSize = 2048, .baseTile = 0, - .size = 1, - .colorMode = 0, - .screenBase = 0, - .charBase = 0, - .bgExtPltt = 0, + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, .priority = 1, - .areaOver = 0, + .areaOver = GX_BG_AREAOVER_XLU, .unk17 = 0, - .mosaic = 0 + .mosaic = FALSE }; const struct BgTemplate MOD59_021D9EBC = @@ -198,15 +198,15 @@ const struct BgTemplate MOD59_021D9EBC = .bufferSize = 2048, .baseTile = 0, - .size = 1, - .colorMode = 0, - .screenBase = 0, - .charBase = 0, - .bgExtPltt = 0, + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, .priority = 0, - .areaOver = 0, + .areaOver = GX_BG_AREAOVER_XLU, .unk17 = 0, - .mosaic = 0 + .mosaic = FALSE }; const u16 MOD59_021D9ED8[0x10] = { 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C, 0x6A3C }; @@ -429,8 +429,8 @@ THUMB_FUNC BOOL MOD59_IntroMain(struct UnkStruct_02006234 *overlayStruct, u32 *p SetKeyRepeatTimers(4, 8); - MOD59_SetupBg(data); - MOD59_SetupMsg(data); + MOD59_IntroSetupBg(data); + MOD59_IntroSetupMsg(data); MOD59_021D7A4C(data); Main_SetVBlankIntrCB((void (*)(void *))MOD59_IntroDoGpuBgUpdate, data); @@ -464,8 +464,8 @@ THUMB_FUNC BOOL MOD59_IntroMain(struct UnkStruct_02006234 *overlayStruct, u32 *p break; } - MOD59_DestroyMsg(data); - MOD59_DestroyBg(data); + MOD59_IntroDestroyMsg(data); + MOD59_IntroDestroyBg(data); MOD59_021D7A5C(data); Main_SetVBlankIntrCB(NULL, NULL); @@ -479,8 +479,8 @@ THUMB_FUNC BOOL MOD59_IntroMain(struct UnkStruct_02006234 *overlayStruct, u32 *p break; } - MOD59_DestroyMsg(data); - MOD59_DestroyBg(data); + MOD59_IntroDestroyMsg(data); + MOD59_IntroDestroyBg(data); MOD59_021D7A5C(data); Main_SetVBlankIntrCB(NULL, NULL); @@ -558,7 +558,7 @@ THUMB_FUNC BOOL MOD59_TestPokeballTouchLocation(void) return ret; } -THUMB_FUNC void MOD59_SetupBg(MOD59_IntroOverlayData *data) +THUMB_FUNC void MOD59_IntroSetupBg(MOD59_IntroOverlayData *data) { struct GraphicsBanks graphicsBanks = MOD59_021D9F18; GX_SetBanks(&graphicsBanks); @@ -568,24 +568,24 @@ THUMB_FUNC void MOD59_SetupBg(MOD59_IntroOverlayData *data) SetBothScreensModesAndDisable(&graphicsModes); struct BgTemplate bgTemplateMain = MOD59_021D9EA0; - bgTemplateMain.screenBase = 15; - bgTemplateMain.charBase = 6; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_0, &bgTemplateMain, 0); + bgTemplateMain.screenBase = GX_BG_SCRBASE_0x7800; + bgTemplateMain.charBase = GX_BG_CHARBASE_0x18000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_0, &bgTemplateMain, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_0); - bgTemplateMain.screenBase = 14; - bgTemplateMain.charBase = 5; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_1, &bgTemplateMain, 0); + bgTemplateMain.screenBase = GX_BG_SCRBASE_0x7000; + bgTemplateMain.charBase = GX_BG_CHARBASE_0x14000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_1, &bgTemplateMain, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_1); - bgTemplateMain.screenBase = 13; - bgTemplateMain.charBase = 4; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_2, &bgTemplateMain, 0); + bgTemplateMain.screenBase = GX_BG_SCRBASE_0x6800; + bgTemplateMain.charBase = GX_BG_CHARBASE_0x10000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_2, &bgTemplateMain, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_2); - bgTemplateMain.screenBase = 12; - bgTemplateMain.charBase = 3; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_3, &bgTemplateMain, 0); + bgTemplateMain.screenBase = GX_BG_SCRBASE_0x6000; + bgTemplateMain.charBase = GX_BG_CHARBASE_0x0c000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_3, &bgTemplateMain, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_3); FUN_0200CD68(data->bgConfig, 0, 994, 4, 0, data->heap_id); @@ -594,24 +594,24 @@ THUMB_FUNC void MOD59_SetupBg(MOD59_IntroOverlayData *data) FUN_02002EEC(GF_BG_LYR_MAIN_0, 192, data->heap_id); struct BgTemplate bgTemplateSub = MOD59_021D9EBC; - bgTemplateSub.screenBase = 15; - bgTemplateSub.charBase = 6; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_0, &bgTemplateSub, 0); + bgTemplateSub.screenBase = GX_BG_SCRBASE_0x7800; + bgTemplateSub.charBase = GX_BG_CHARBASE_0x18000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_0, &bgTemplateSub, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_0); - bgTemplateSub.screenBase = 14; - bgTemplateSub.charBase = 5; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_1, &bgTemplateSub, 0); + bgTemplateSub.screenBase = GX_BG_SCRBASE_0x7000; + bgTemplateSub.charBase = GX_BG_CHARBASE_0x14000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_1, &bgTemplateSub, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_1); - bgTemplateSub.screenBase = 13; - bgTemplateSub.charBase = 4; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_2, &bgTemplateSub, 0); + bgTemplateSub.screenBase = GX_BG_SCRBASE_0x6800; + bgTemplateSub.charBase = GX_BG_CHARBASE_0x10000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_2, &bgTemplateSub, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_2); - bgTemplateSub.screenBase = 12; - bgTemplateSub.charBase = 3; - InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_3, &bgTemplateSub, 0); + bgTemplateSub.screenBase = GX_BG_SCRBASE_0x6000; + bgTemplateSub.charBase = GX_BG_CHARBASE_0x0c000; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_3, &bgTemplateSub, GF_BG_TYPE_TEXT); BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_3); ToggleBgLayer(GF_BG_LYR_MAIN_0, GX_LAYER_TOGGLE_OFF); @@ -628,7 +628,7 @@ THUMB_FUNC void MOD59_SetupBg(MOD59_IntroOverlayData *data) data->fadeCounter = 0; } -THUMB_FUNC void MOD59_DestroyBg(MOD59_IntroOverlayData *data) +THUMB_FUNC void MOD59_IntroDestroyBg(MOD59_IntroOverlayData *data) { ToggleBgLayer(GF_BG_LYR_MAIN_0, GX_LAYER_TOGGLE_OFF); ToggleBgLayer(GF_BG_LYR_MAIN_1, GX_LAYER_TOGGLE_OFF); @@ -653,7 +653,7 @@ THUMB_FUNC void MOD59_DestroyBg(MOD59_IntroOverlayData *data) FreeToHeap(data->bgConfig); } -THUMB_FUNC void MOD59_SetupMsg(MOD59_IntroOverlayData *data) +THUMB_FUNC void MOD59_IntroSetupMsg(MOD59_IntroOverlayData *data) { data->msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0341_bin, data->heap_id); @@ -668,7 +668,7 @@ THUMB_FUNC void MOD59_SetupMsg(MOD59_IntroOverlayData *data) data->createListCounter = 0; } -THUMB_FUNC void MOD59_DestroyMsg(MOD59_IntroOverlayData *data) +THUMB_FUNC void MOD59_IntroDestroyMsg(MOD59_IntroOverlayData *data) { ScrStrBufs_delete(data->strBufs); FUN_020143D0(data->unk60); @@ -688,34 +688,34 @@ THUMB_FUNC void MOD59_021D7A5C(MOD59_IntroOverlayData *data) //MOD59_Destroy... THUMB_FUNC BOOL MOD59_FadeController(MOD59_IntroOverlayData *data, u32 bgId, u32 param2) { BOOL subScreen; - s32 var1; + GXBlendPlaneMask planeMask; BOOL ret = FALSE; switch (bgId) { case GF_BG_LYR_MAIN_0: case GF_BG_LYR_MAIN_3: default: - var1 = 1; + planeMask = GX_BLEND_PLANEMASK_BG0; subScreen = FALSE; break; case GF_BG_LYR_MAIN_1: - var1 = 2; + planeMask = GX_BLEND_PLANEMASK_BG1; subScreen = FALSE; break; case GF_BG_LYR_MAIN_2: - var1 = 4; + planeMask = GX_BLEND_PLANEMASK_BG2; subScreen = FALSE; break; case GF_BG_LYR_SUB_0: - var1 = 1; + planeMask = GX_BLEND_PLANEMASK_BG0; subScreen = TRUE; break; case GF_BG_LYR_SUB_1: - var1 = 2; + planeMask = GX_BLEND_PLANEMASK_BG1; subScreen = TRUE; break; case GF_BG_LYR_SUB_2: - var1 = 4; + planeMask = GX_BLEND_PLANEMASK_BG2; subScreen = TRUE; break; } @@ -729,11 +729,11 @@ THUMB_FUNC BOOL MOD59_FadeController(MOD59_IntroOverlayData *data, u32 bgId, u32 data->fadeCounter = 1; if (!subScreen) { - G2x_SetBlendAlpha_(®_G2_BLEND, var1, 14, data->unk7C, data->unk80); + G2_SetBlendAlpha(planeMask, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1, data->unk7C, data->unk80); } else { - G2x_SetBlendAlpha_(®_G2S_DB_BLEND, var1, 14, data->unk7C, data->unk80); + G2S_SetBlendAlpha(planeMask, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1, data->unk7C, data->unk80); } ToggleBgLayer((u8)bgId, GX_LAYER_TOGGLE_ON); } @@ -751,11 +751,11 @@ THUMB_FUNC BOOL MOD59_FadeController(MOD59_IntroOverlayData *data, u32 bgId, u32 data->unk80--; if (!subScreen) { - G2x_SetBlendAlpha_(®_G2_BLEND, var1, 14, data->unk7C, data->unk80); + G2_SetBlendAlpha(planeMask, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1, data->unk7C, data->unk80); } else { - G2x_SetBlendAlpha_(®_G2S_DB_BLEND, var1, 14, data->unk7C, data->unk80); + G2S_SetBlendAlpha(planeMask, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1, data->unk7C, data->unk80); } } else @@ -770,11 +770,11 @@ THUMB_FUNC BOOL MOD59_FadeController(MOD59_IntroOverlayData *data, u32 bgId, u32 data->unk80++; if (!subScreen) { - G2x_SetBlendAlpha_(®_G2_BLEND, var1, 14, data->unk7C, data->unk80); + G2_SetBlendAlpha(planeMask, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1, data->unk7C, data->unk80); } else { - G2x_SetBlendAlpha_(®_G2S_DB_BLEND, var1, 14, data->unk7C, data->unk80); + G2S_SetBlendAlpha(planeMask, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1, data->unk7C, data->unk80); } } else @@ -1344,7 +1344,7 @@ THUMB_FUNC void MOD59_AnimatePlayerSprite(MOD59_IntroOverlayData *data) timer = 4; } data->maleAnimTimer = timer; - G2x_SetBlendAlpha_(®_G2_BLEND, 4, 8, 6, 10); + G2_SetBlendAlpha(GX_BLEND_PLANEMASK_BG2, GX_BLEND_PLANEMASK_BG3, 6, 10); struct MOD59_CharStruct021D9DEC charStruct = MOD59_021D9DEC; GfGfxLoader_LoadCharData(NARC_DEMO_INTRO_INTRO, charStruct.narcId[data->maleAnimCounter], data->bgConfig, GF_BG_LYR_MAIN_1, 0, 0, FALSE, data->heap_id); } @@ -1361,7 +1361,7 @@ THUMB_FUNC void MOD59_AnimatePlayerSprite(MOD59_IntroOverlayData *data) timer = 4; } data->femaleAnimTimer = timer; - G2x_SetBlendAlpha_(®_G2_BLEND, 2, 8, 6, 10); + G2_SetBlendAlpha(GX_BLEND_PLANEMASK_BG1, GX_BLEND_PLANEMASK_BG3, 6, 10); struct MOD59_CharStruct021D9DEC charStruct = MOD59_021D9DFC; GfGfxLoader_LoadCharData(NARC_DEMO_INTRO_INTRO, charStruct.narcId[data->femaleAnimCounter], data->bgConfig, GF_BG_LYR_MAIN_2, 0, 0, FALSE, data->heap_id); } diff --git a/arm9/modules/59/src/mod59_TV.c b/arm9/modules/59/src/mod59_TV.c new file mode 100644 index 000000000..55e029636 --- /dev/null +++ b/arm9/modules/59/src/mod59_TV.c @@ -0,0 +1,556 @@ +#include "global.h" +#include "mod59_TV.h" +#include "GX_layers.h" +#include "PAD_pad.h" +#include "constants/sndseq.h" +#include "demo/intro/intro_tv.naix" +#include "filesystem.h" +#include "font.h" +#include "game_init.h" +#include "gf_gfx_loader.h" +#include "heap.h" +#include "msgdata/msg.naix" +#include "overlay_manager.h" +#include "text.h" +#include "unk_020040F4.h" + +extern void FUN_0200E3A0(PMLCDTarget, s32); + +extern void FUN_0200E1D0(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 heap_id); +extern u32 FUN_0200E308(void); + +const struct WindowTemplate MOD59_021DA04C = + { + .bgId = GF_BG_LYR_MAIN_2, + .tilemapLeft = 0, + .tilemapTop = 0, + .width = 32, + .height = 24, + .paletteNum = 0x01, + .baseTile = 1, + }; + +const struct GraphicsModes MOD59_021DA054 = + { + .dispMode = GX_DISPMODE_GRAPHICS, + .bgMode = GX_BGMODE_0, + .subMode = GX_BGMODE_0, + ._2d3dMode = GX_BG0_AS_2D, + }; + +const struct BgTemplate MOD59_021DA080 = + { + .x = 0, + .y = 0, + .bufferSize = 2048, + .baseTile = 0, + + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x18000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = GX_BG_AREAOVER_XLU, + .unk17 = 0, + .mosaic = FALSE + }; + +const struct BgTemplate MOD59_021DA09C = + { + .x = 0, + .y = 0, + .bufferSize = 2048, + .baseTile = 0, + + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0800, + .charBase = GX_BG_CHARBASE_0x14000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = GX_BG_AREAOVER_XLU, + .unk17 = 0, + .mosaic = FALSE + }; + +const struct BgTemplate MOD59_021DA064 = + { + .x = 0, + .y = 0, + .bufferSize = 2048, + .baseTile = 0, + + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x1000, + .charBase = GX_BG_CHARBASE_0x10000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = GX_BG_AREAOVER_XLU, + .unk17 = 0, + .mosaic = FALSE + }; + +const struct BgTemplate MOD59_021DA0B8 = + { + .x = 0, + .y = 0, + .bufferSize = 2048, + .baseTile = 0, + + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_256, + .screenBase = GX_BG_SCRBASE_0x1800, + .charBase = GX_BG_CHARBASE_0x20000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = GX_BG_AREAOVER_XLU, + .unk17 = 0, + .mosaic = FALSE + }; + +const struct GraphicsBanks MOD59_021DA0D4 = + { + .bg = 3, + .bgextpltt = 0, + .subbg = 0, + .subbgextpltt = 0, + .obj = 0, + .objextpltt = 0, + .subobj = 0, + .subobjextpltt = 0, + .tex = 0, + .texpltt = 0 + }; + +THUMB_FUNC BOOL MOD59_TVInit(struct UnkStruct_02006234 *param0, u32 *param1) +{ +#pragma unused(param1) + CreateHeap(3, 83, 0x40000); + MOD59_TVOverlayData *data = (MOD59_TVOverlayData *)OverlayManager_CreateAndGetData(param0, sizeof(MOD59_TVOverlayData), 0x53); + (void)memset((void *)data, 0, sizeof(MOD59_TVOverlayData)); + data->heap_id = 0x53; + data->unk24 = 0; + return TRUE; +} + +#ifdef NONMATCHING +THUMB_FUNC BOOL MOD59_TVMain(struct UnkStruct_02006234 *overlayStruct, u32 *param1) +{ + MOD59_TVOverlayData *data = (MOD59_TVOverlayData *)OverlayManager_GetData(overlayStruct); + BOOL ret = FALSE; + + switch (*param1) + { + case 0: + FUN_0200E3A0(PM_LCD_TOP, 0); + FUN_0200E3A0(PM_LCD_BOTTOM, 0); + + Main_SetVBlankIntrCB(NULL, NULL); + FUN_02015F34(NULL, NULL); + + GX_DisableEngineALayers(); + GX_DisableEngineBLayers(); + + reg_GX_DISPCNT = reg_GX_DISPCNT & 0xFFFFE0FF; + reg_GXS_DB_DISPCNT = reg_GXS_DB_DISPCNT & 0xFFFFE0FF; + + SetKeyRepeatTimers(4, 8); + + MOD59_TVSetupGraphics(data); + MOD59_TVSetupMsg(data); + + Main_SetVBlankIntrCB((void (*)(void *))MOD59_TVDoGpuBgUpdate, data); + + GX_BothDispOn(); + + data->unk24 = 60; + + *param1 = 1; + break; + + case 1: + if (data->unk24 != 0) + { + data->unk24--; + break; + } + + FUN_0200414C(SEQ_TV_HOUSOU); + FUN_0200433C(4, SEQ_TV_HOUSOU, 1); + + data->unk24 = 90; + + *param1 = 2; + break; + + case 2: + if (data->unk24 != 0) + { + data->unk24--; + break; + } + data->unk24 = 0; //?? + + FUN_0200E1D0(0, 1, 1, 0, 6, 1, data->heap_id); + + *param1 = 3; + break; + + case 3: + MOD59_021D9D78(data); + + if (FUN_0200E308() != 1) + { + break; + } + + *param1 = 4; + break; + + case 4: + MOD59_021D9D78(data); + + if (MOD59_021D9C74(data, 0, 40, 48) != TRUE) + { + break; + } + + FUN_0200E1D0(0, 0, 0, 0, 6, 1, data->heap_id); + + *param1 = 5; + break; + + case 5: + MOD59_021D9D78(data); + + if (FUN_0200E308() != 1) + { + break; + } + + MOD59_TVDestroyMsg(data); + MOD59_TVDestroyGraphics(data); + + Main_SetVBlankIntrCB(NULL, NULL); + + ret = TRUE; + break; + } + + return ret; +} +#else +THUMB_FUNC asm BOOL MOD59_TVMain(struct UnkStruct_02006234 *overlayStruct, u32 *param1) +{ + push {r3, r4, r5, r6, lr} + sub sp, #0xc + add r5, r1, #0 + bl OverlayManager_GetData + ldr r1, [r5, #0] + add r4, r0, #0 + mov r6, #0 + cmp r1, #5 + bls _021D98AE + b _021D99E2 +_021D98AE: + add r1, r1, r1 + add r1, pc + ldrh r1, [r1, #6] + lsl r1, r1, #0x10 + asr r1, r1, #0x10 + add pc, r1 +_021D98BA: // jump table + dcd 0x0070000a //compiler really hates movs in inline asm + //movs r2, r1 //case 0 + //lsl r0, r6, #1 //case 1 + lsl r6, r2, #2 //case 2 + lsl r0, r0, #3 //case 3 + lsl r2, r2, #3 //case 4 + lsl r4, r0, #4 //case 5 + //.short _021D98C6 - _021D98BA - 2 // case 0 + //.short _021D992C - _021D98BA - 2 // case 1 + //.short _021D9952 - _021D98BA - 2 // case 2 + //.short _021D997C - _021D98BA - 2 // case 3 + //.short _021D998E - _021D98BA - 2 // case 4 + //.short _021D99C0 - _021D98BA - 2 ; case 5 +_021D98C6: + add r0, r6, #0 + add r1, r6, #0 + bl FUN_0200E3A0 + mov r0, #1 + add r1, r6, #0 + bl FUN_0200E3A0 + add r0, r6, #0 + add r1, r0, #0 + bl Main_SetVBlankIntrCB + add r0, r6, #0 + add r1, r0, #0 + bl FUN_02015F34 + bl GX_DisableEngineALayers + bl GX_DisableEngineBLayers + mov r2, #1 + lsl r2, r2, #0x1a + ldr r1, [r2, #0] + ldr r0, =0xFFFFE0FF + and r1, r0 + str r1, [r2, #0] + ldr r2, =0x04001000 + ldr r1, [r2, #0] + and r0, r1 + str r0, [r2] + mov r0, #4 + mov r1, #8 + bl SetKeyRepeatTimers + add r0, r4, #0 + bl MOD59_TVSetupGraphics + add r0, r4, #0 + bl MOD59_TVSetupMsg + ldr r0, =MOD59_TVDoGpuBgUpdate + add r1, r4, #0 + bl Main_SetVBlankIntrCB + bl GX_BothDispOn + mov r0, #0x3c + str r0, [r4, #0x24] + mov r0, #1 + str r0, [r5] + b _021D99E2 +_021D992C: + ldr r0, [r4, #0x24] + cmp r0, #0 + beq _021D9938 + sub r0, r0, #1 + str r0, [r4, #0x24] + b _021D99E2 +_021D9938: + ldr r0, =0x00000406 + bl FUN_0200414C + ldr r1, =0x00000406 + mov r0, #4 + mov r2, #1 + bl FUN_0200433C + mov r0, #0x5a + str r0, [r4, #0x24] + mov r0, #2 + str r0, [r5] + b _021D99E2 +_021D9952: + ldr r0, [r4, #0x24] + cmp r0, #0 + beq _021D995E + sub r0, r0, #1 + str r0, [r4, #0x24] + b _021D99E2 +_021D995E: + str r6, [r4, #0x24] + mov r0, #6 + mov r1, #1 + str r0, [sp] + str r1, [sp, #4] + ldr r0, [r4, #0] + add r2, r1, #0 + str r0, [sp, #8] + add r0, r6, #0 + add r3, r6, #0 + bl FUN_0200E1D0 + mov r0, #3 + str r0, [r5] + b _021D99E2 +_021D997C: + bl MOD59_021D9D78 + bl FUN_0200E308 + cmp r0, #1 + bne _021D99E2 + mov r0, #4 + str r0, [r5] + b _021D99E2 +_021D998E: + bl MOD59_021D9D78 + add r0, r4, #0 + add r1, r6, #0 + mov r2, #0x28 + mov r3, #0x30 + bl MOD59_021D9C74 + cmp r0, #1 + bne _021D99E2 + mov r0, #6 + str r0, [sp] + mov r0, #1 + str r0, [sp, #4] + ldr r0, [r4, #0] + str r0, [sp, #8] + add r0, r6, #0 + add r1, r0, #0 + add r2, r0, #0 + add r3, r0, #0 + bl FUN_0200E1D0 + mov r0, #5 + str r0, [r5] + b _021D99E2 +_021D99C0: + bl MOD59_021D9D78 + bl FUN_0200E308 + cmp r0, #1 + bne _021D99E2 + add r0, r4, #0 + bl MOD59_TVDestroyMsg + add r0, r4, #0 + bl MOD59_TVDestroyGraphics + add r0, r6, #0 + add r1, r0, #0 + bl Main_SetVBlankIntrCB + mov r6, #1 +_021D99E2: + add r0, r6, #0 + add sp, #0xc + pop {r3, r4, r5, r6, pc} +} +#endif + +THUMB_FUNC BOOL MOD59_TVExit(struct UnkStruct_02006234 *overlayStruct, u32 *param1) +{ +#pragma unused (param1) + u32 heap_id = ((MOD59_TVOverlayData *)OverlayManager_GetData(overlayStruct))->heap_id; + OverlayManager_FreeData(overlayStruct); + DestroyHeap(heap_id); + return TRUE; +} + +THUMB_FUNC void MOD59_TVDoGpuBgUpdate(MOD59_TVOverlayData *data) +{ + DoScheduledBgGpuUpdates(data->bgConfig); +} + +THUMB_FUNC void MOD59_TVSetupGraphics(MOD59_TVOverlayData *data) +{ + const struct GraphicsBanks banks = MOD59_021DA0D4; //sp #0x90 + GX_SetBanks(&banks); + + data->bgConfig = BgConfig_Alloc(data->heap_id); + + const struct GraphicsModes modes = MOD59_021DA054; //sp #0x80 + SetBothScreensModesAndDisable(&modes); + + const struct BgTemplate bgTemplateMain2 = MOD59_021DA080; //sp #0x64 + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_2, &bgTemplateMain2, GF_BG_TYPE_TEXT); + + BG_ClearCharDataRange(GF_BG_LYR_MAIN_2, 0x20, 0, data->heap_id); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_2); + + const struct BgTemplate bgTemplateMain0 = MOD59_021DA09C; //sp #0x48 + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_0, &bgTemplateMain0, GF_BG_TYPE_TEXT); + + GfGfxLoader_LoadCharData(NARC_DEMO_INTRO_INTRO_TV, NARC_intro_tv_narc_0001_NCGR, data->bgConfig, GF_BG_LYR_MAIN_0, 0, 0, FALSE, data->heap_id); + GfGfxLoader_LoadScrnData(NARC_DEMO_INTRO_INTRO_TV, NARC_intro_tv_narc_0004_NSCR, data->bgConfig, GF_BG_LYR_MAIN_0, 0, 0, FALSE, data->heap_id); + + const struct BgTemplate bgTemplateMain1 = MOD59_021DA064; //sp #0x2C + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_1, &bgTemplateMain1, GF_BG_TYPE_TEXT); + + GfGfxLoader_LoadCharData(NARC_DEMO_INTRO_INTRO_TV, NARC_intro_tv_narc_0002_NCGR, data->bgConfig, GF_BG_LYR_MAIN_1, 0, 0, FALSE, data->heap_id); + GfGfxLoader_LoadScrnData(NARC_DEMO_INTRO_INTRO_TV, NARC_intro_tv_narc_0005_NSCR, data->bgConfig, GF_BG_LYR_MAIN_1, 0, 0, FALSE, data->heap_id); + + const struct BgTemplate bgTemplateMain3 = MOD59_021DA0B8; //sp #0x10 + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_3, &bgTemplateMain3, GF_BG_TYPE_TEXT); + + GfGfxLoader_LoadCharData(NARC_DEMO_INTRO_INTRO_TV, NARC_intro_tv_narc_0000_NCGR, data->bgConfig, GF_BG_LYR_MAIN_3, 0, 0, FALSE, data->heap_id); + GfGfxLoader_LoadScrnData(NARC_DEMO_INTRO_INTRO_TV, NARC_intro_tv_narc_0003_NSCR, data->bgConfig, GF_BG_LYR_MAIN_3, 0, 0, FALSE, data->heap_id); + + GfGfxLoader_GXLoadPal(NARC_DEMO_INTRO_INTRO_TV, NARC_intro_tv_narc_0006_NCLR, GF_BG_LYR_MAIN_0, 0, 0, data->heap_id); + + FUN_02002ED0(GF_BG_LYR_MAIN_0, 0x20, data->heap_id); + + BG_SetMaskColor(GF_BG_LYR_MAIN_0, 0); + BG_SetMaskColor(GF_BG_LYR_SUB_0, 0); + + G2_SetBlendAlpha(GX_BLEND_PLANEMASK_BG1, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2, 4, 12); +} + +THUMB_FUNC void MOD59_TVDestroyGraphics(MOD59_TVOverlayData *data) +{ + ToggleBgLayer(GF_BG_LYR_MAIN_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_3, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_3, GX_LAYER_TOGGLE_OFF); + + reg_G2_BLDCNT = 0; + + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_3); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_1); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_0); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_2); + FreeToHeap(data->bgConfig); +} + +THUMB_FUNC void MOD59_TVSetupMsg(MOD59_TVOverlayData *data) +{ + data->msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0549_bin, data->heap_id); + + FUN_0201BD5C(); + + data->unk0C = 0; +} + +THUMB_FUNC void MOD59_TVDestroyMsg(MOD59_TVOverlayData *data) +{ + DestroyMsgData(data->msgData); +} + +THUMB_FUNC BOOL MOD59_021D9C74(MOD59_TVOverlayData *data, u32 msgNo, u32 param2, u32 param3) +{ + BOOL ret = FALSE; + switch (data->unk0C) + { + case 0: + ToggleBgLayer(GF_BG_LYR_MAIN_2, GX_LAYER_TOGGLE_OFF); + struct String *string = String_ctor(1024, data->heap_id); + ReadMsgDataIntoString(data->msgData, msgNo, string); + AddWindow(data->bgConfig, &data->window, &MOD59_021DA04C); + FillWindowPixelRect(&data->window, 0, 0, 0, 256, 192); + u32 unk0 = (u32)FUN_02002F08(0, string, 0); + + unk0 = (256 - unk0 ) / 2; + AddTextPrinterParameterized2(&data->window, 0, string, unk0, param3, 0, MakeFontColor(15, 2, 0), NULL); + String_dtor(string); + CopyWindowToVram(&data->window); + ToggleBgLayer(GF_BG_LYR_MAIN_2, GX_LAYER_TOGGLE_ON); + data->unk24 = 240; + data->unk0C = 1; + break; + + case 1: + if (data->unk24 != 0) + { + data->unk24--; + break; + } + data->unk0C = 2; + break; + + case 2: + if((gMain.newKeys & PAD_BUTTON_A) != 1 && (gMain.newKeys & PAD_BUTTON_B) != 2) + { + break; + } + data->unk0C = 3; + break; + + case 3: + RemoveWindow(&data->window); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_2); + data->unk0C = 0; + ret = TRUE; + break; + } + return ret; +} + +THUMB_FUNC void MOD59_021D9D78(MOD59_TVOverlayData *data) +{ + data->unk20 += 4; + BgSetPosTextAndCommit(data->bgConfig, GF_BG_LYR_MAIN_1, BG_POS_OP_SET_Y, data->unk20 >> 4); +} diff --git a/arm9/modules/59/src/mod59_TV_src.c b/arm9/modules/59/src/mod59_TV_src.c deleted file mode 100644 index 60444195b..000000000 --- a/arm9/modules/59/src/mod59_TV_src.c +++ /dev/null @@ -1,319 +0,0 @@ -#include "global.h" -#include "mod59_TV_src.h" -#include "GX_layers.h" -#include "bg_window.h" -#include "constants/sndseq.h" -#include "game_init.h" -#include "heap.h" -#include "overlay_manager.h" -#include "unk_020040F4.h" - -extern void FUN_0200E3A0(PMLCDTarget, s32); - -extern void FUN_0200E1D0(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 heap_id); -extern u32 FUN_0200E308(void); - -extern void MOD59_021D9A20(MOD59_TVOverlayData *data); //setup func -extern void MOD59_021D9C48(MOD59_TVOverlayData *data); //setup func -extern void MOD59_021D9D78(void); -extern BOOL MOD59_021D9C74(MOD59_TVOverlayData *data, u32 param1, u32 param2, u32 param3); -extern void MOD59_021D9C68(MOD59_TVOverlayData *data); -extern void MOD59_021D9BD0(MOD59_TVOverlayData *data); - -THUMB_FUNC BOOL MOD59_TVInit(struct UnkStruct_02006234 *param0, u32 *param1) -{ -#pragma unused(param1) - CreateHeap(3, 83, 0x40000); - MOD59_TVOverlayData *data = (MOD59_TVOverlayData *)OverlayManager_CreateAndGetData(param0, sizeof(MOD59_TVOverlayData), 0x53); - (void)memset((void *)data, 0, sizeof(MOD59_TVOverlayData)); - data->heap_id = 0x53; - data->unk24 = 0; - return TRUE; -} - -#ifdef NONMATCHING -THUMB_FUNC BOOL MOD59_TVMain(struct UnkStruct_02006234 *overlayStruct, u32 *param1) -{ - MOD59_TVOverlayData *data = (MOD59_TVOverlayData *)OverlayManager_GetData(overlayStruct); - BOOL ret = FALSE; - - switch (*param1) - { - case 0: - FUN_0200E3A0(PM_LCD_TOP, 0); - FUN_0200E3A0(PM_LCD_BOTTOM, 0); - - Main_SetVBlankIntrCB(NULL, NULL); - FUN_02015F34(NULL, NULL); - - GX_DisableEngineALayers(); - GX_DisableEngineBLayers(); - - reg_GX_DISPCNT = reg_GX_DISPCNT & 0xFFFFE0FF; - reg_GXS_DB_DISPCNT = reg_GXS_DB_DISPCNT & 0xFFFFE0FF; - - SetKeyRepeatTimers(4, 8); - - MOD59_021D9A20(data); - MOD59_021D9C48(data); - - Main_SetVBlankIntrCB((void (*)(void *))MOD59_TVDoGpuBgUpdate, data); - - GX_BothDispOn(); - - data->unk24 = 60; - - *param1 = 1; - break; - - case 1: - if (data->unk24 != 0) - { - data->unk24--; - break; - } - - FUN_0200414C(SEQ_TV_HOUSOU); - FUN_0200433C(4, SEQ_TV_HOUSOU, 1); - - data->unk24 = 90; - - *param1 = 2; - break; - - case 2: - if (data->unk24 != 0) - { - data->unk24--; - break; - } - data->unk24 = 0; //?? - - FUN_0200E1D0(0, 1, 1, 0, 6, 1, data->heap_id); - - *param1 = 3; - break; - - case 3: - MOD59_021D9D78(); - - if (FUN_0200E308() != 1) - { - break; - } - - *param1 = 4; - break; - - case 4: - MOD59_021D9D78(); - - if (MOD59_021D9C74(data, 0, 40, 48) != TRUE) - { - break; - } - - FUN_0200E1D0(0, 0, 0, 0, 6, 1, data->heap_id); - - *param1 = 5; - break; - - case 5: - MOD59_021D9D78(); - - if (FUN_0200E308() != 1) - { - break; - } - - MOD59_021D9C68(data); - MOD59_021D9BD0(data); - - Main_SetVBlankIntrCB(NULL, NULL); - - ret = TRUE; - break; - } - - return ret; -} -#else -THUMB_FUNC asm BOOL MOD59_TVMain(struct UnkStruct_02006234 *overlayStruct, u32 *param1) -{ - push {r3, r4, r5, r6, lr} - sub sp, #0xc - add r5, r1, #0 - bl OverlayManager_GetData - ldr r1, [r5, #0] - add r4, r0, #0 - mov r6, #0 - cmp r1, #5 - bls _021D98AE - b _021D99E2 -_021D98AE: - add r1, r1, r1 - add r1, pc - ldrh r1, [r1, #6] - lsl r1, r1, #0x10 - asr r1, r1, #0x10 - add pc, r1 -_021D98BA: // jump table - dcd 0x0070000a //compiler really hates movs in inline asm - //movs r2, r1 //case 0 - //lsl r0, r6, #1 //case 1 - lsl r6, r2, #2 //case 2 - lsl r0, r0, #3 //case 3 - lsl r2, r2, #3 //case 4 - lsl r4, r0, #4 //case 5 - //.short _021D98C6 - _021D98BA - 2 // case 0 - //.short _021D992C - _021D98BA - 2 // case 1 - //.short _021D9952 - _021D98BA - 2 // case 2 - //.short _021D997C - _021D98BA - 2 // case 3 - //.short _021D998E - _021D98BA - 2 // case 4 - //.short _021D99C0 - _021D98BA - 2 ; case 5 -_021D98C6: - add r0, r6, #0 - add r1, r6, #0 - bl FUN_0200E3A0 - mov r0, #1 - add r1, r6, #0 - bl FUN_0200E3A0 - add r0, r6, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - add r0, r6, #0 - add r1, r0, #0 - bl FUN_02015F34 - bl GX_DisableEngineALayers - bl GX_DisableEngineBLayers - mov r2, #1 - lsl r2, r2, #0x1a - ldr r1, [r2, #0] - ldr r0, =0xFFFFE0FF - and r1, r0 - str r1, [r2, #0] - ldr r2, =0x04001000 - ldr r1, [r2, #0] - and r0, r1 - str r0, [r2] - mov r0, #4 - mov r1, #8 - bl SetKeyRepeatTimers - add r0, r4, #0 - bl MOD59_021D9A20 - add r0, r4, #0 - bl MOD59_021D9C48 - ldr r0, =MOD59_TVDoGpuBgUpdate - add r1, r4, #0 - bl Main_SetVBlankIntrCB - bl GX_BothDispOn - mov r0, #0x3c - str r0, [r4, #0x24] - mov r0, #1 - str r0, [r5] - b _021D99E2 -_021D992C: - ldr r0, [r4, #0x24] - cmp r0, #0 - beq _021D9938 - sub r0, r0, #1 - str r0, [r4, #0x24] - b _021D99E2 -_021D9938: - ldr r0, =0x00000406 - bl FUN_0200414C - ldr r1, =0x00000406 - mov r0, #4 - mov r2, #1 - bl FUN_0200433C - mov r0, #0x5a - str r0, [r4, #0x24] - mov r0, #2 - str r0, [r5] - b _021D99E2 -_021D9952: - ldr r0, [r4, #0x24] - cmp r0, #0 - beq _021D995E - sub r0, r0, #1 - str r0, [r4, #0x24] - b _021D99E2 -_021D995E: - str r6, [r4, #0x24] - mov r0, #6 - mov r1, #1 - str r0, [sp] - str r1, [sp, #4] - ldr r0, [r4, #0] - add r2, r1, #0 - str r0, [sp, #8] - add r0, r6, #0 - add r3, r6, #0 - bl FUN_0200E1D0 - mov r0, #3 - str r0, [r5] - b _021D99E2 -_021D997C: - bl MOD59_021D9D78 - bl FUN_0200E308 - cmp r0, #1 - bne _021D99E2 - mov r0, #4 - str r0, [r5] - b _021D99E2 -_021D998E: - bl MOD59_021D9D78 - add r0, r4, #0 - add r1, r6, #0 - mov r2, #0x28 - mov r3, #0x30 - bl MOD59_021D9C74 - cmp r0, #1 - bne _021D99E2 - mov r0, #6 - str r0, [sp] - mov r0, #1 - str r0, [sp, #4] - ldr r0, [r4, #0] - str r0, [sp, #8] - add r0, r6, #0 - add r1, r0, #0 - add r2, r0, #0 - add r3, r0, #0 - bl FUN_0200E1D0 - mov r0, #5 - str r0, [r5] - b _021D99E2 -_021D99C0: - bl MOD59_021D9D78 - bl FUN_0200E308 - cmp r0, #1 - bne _021D99E2 - add r0, r4, #0 - bl MOD59_021D9C68 - add r0, r4, #0 - bl MOD59_021D9BD0 - add r0, r6, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - mov r6, #1 -_021D99E2: - add r0, r6, #0 - add sp, #0xc - pop {r3, r4, r5, r6, pc} -} -#endif - -THUMB_FUNC BOOL MOD59_TVExit(struct UnkStruct_02006234 *overlayStruct, u32 *param1) -{ -#pragma unused (param1) - u32 heap_id = ((MOD59_TVOverlayData *)OverlayManager_GetData(overlayStruct))->heap_id; - OverlayManager_FreeData(overlayStruct); - DestroyHeap(heap_id); - return TRUE; -} - -THUMB_FUNC void MOD59_TVDoGpuBgUpdate(MOD59_TVOverlayData *data) -{ - DoScheduledBgGpuUpdates(data->bgConfig); -} diff --git a/include/GX_layers.h b/include/GX_layers.h index 03c20df68..6c99d80d8 100644 --- a/include/GX_layers.h +++ b/include/GX_layers.h @@ -11,7 +11,6 @@ typedef enum { GX_LAYER_TOGGLE_ON, } GX_LayerToggle; - struct GraphicsBanks { s32 bg; @@ -26,7 +25,6 @@ struct GraphicsBanks s32 texpltt; }; - struct GraphicsModes { GXDispMode dispMode; GXBGMode bgMode; @@ -34,16 +32,14 @@ struct GraphicsModes { GXBG0As _2d3dMode; }; - - void GX_SetBanks(const struct GraphicsBanks *banks); -void GX_DisableEngineALayers(); +void GX_DisableEngineALayers(void); void GX_EngineAToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle); void GX_SetEngineALayers(u32 layer_mask); -void GX_DisableEngineBLayers(); +void GX_DisableEngineBLayers(void); void GX_EngineBToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle); -void GX_BothDispOn(); -void GX_SwapDisplay(); -u32 GX_GetEngineALayers(); +void GX_BothDispOn(void); +void GX_SwapDisplay(void); +u32 GX_GetEngineALayers(void); #endif //POKEDIAMOND_GX_LAYERS_H