summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMade <made111@gmx.de>2020-05-15 02:40:41 +0200
committerMade <made111@gmx.de>2020-05-15 02:40:41 +0200
commit42adea6c97323f7e5738dc05c062af0d6fddd66d (patch)
treee340778c962add423b6a0dfad717861c7cd2a2df
parent0b3c15a399b456bffcd65aa5d100371ce69fa8eb (diff)
Decompile GX.s
-rw-r--r--arm9/asm/GX.s245
-rw-r--r--arm9/lib/include/gx.h24
-rw-r--r--arm9/lib/src/GX.c127
-rw-r--r--arm9/undefined_syms.txt2
4 files changed, 152 insertions, 246 deletions
diff --git a/arm9/asm/GX.s b/arm9/asm/GX.s
deleted file mode 100644
index 1e6bdc88..00000000
--- a/arm9/asm/GX.s
+++ /dev/null
@@ -1,245 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start GXx_SetMasterBrightness_
-GXx_SetMasterBrightness_: ; 0x020C5978
- cmp r1, #0x0
- moveq r1, #0x0
- streqh r1, [r0, #0x0]
- bxeq lr
- cmp r1, #0x0
- orrgt r1, r1, #0x4000
- strgth r1, [r0, #0x0]
- rsble r1, r1, #0x0
- orrle r1, r1, #0x8000
- strleh r1, [r0, #0x0]
- bx lr
-
- arm_func_start GXS_SetGraphicsMode
-GXS_SetGraphicsMode: ; 0x020C59A4
- ldr r2, _020C59BC ; =0x04001000
- ldr r1, [r2, #0x0]
- bic r1, r1, #0x7
- orr r0, r1, r0
- str r0, [r2, #0x0]
- bx lr
- .balign 4
-_020C59BC: .word 0x04001000
-
- arm_func_start GX_SetGraphicsMode
-GX_SetGraphicsMode: ; 0x020C59C0
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r3, _020C5A28 ; =0x02106810
- mov lr, #0x4000000
- ldrh r12, [r3, #0x0]
- ldr lr, [lr, #0x0]
- ldr r3, _020C5A2C ; =0x021D33C0
- cmp r12, #0x0
- strh r0, [r3, #0x0]
- ldr r3, _020C5A30 ; =0xFFF0FFF0
- moveq r0, #0x0
- and r3, lr, r3
- orr r0, r3, r0, lsl #0x10
- orr r0, r1, r0
- orr r1, r0, r2, lsl #0x3
- mov r12, #0x4000000
- ldr r0, _020C5A2C ; =0x021D33C0
- str r1, [r12, #0x0]
- ldrh r0, [r0, #0x0]
- cmp r0, #0x0
- ldreq r0, _020C5A28 ; =0x02106810
- moveq r1, #0x0
- streqh r1, [r0, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020C5A28: .word 0x02106810
-_020C5A2C: .word 0x021D33C0
-_020C5A30: .word 0xFFF0FFF0
-
- arm_func_start GX_DispOn
-GX_DispOn: ; 0x020C5A34
- ldr r0, _020C5A78 ; =0x021D33C0
- ldr r1, _020C5A7C ; =0x02106810
- ldrh r2, [r0, #0x0]
- mov r0, #0x1
- strh r0, [r1, #0x0]
- cmp r2, #0x0
- moveq r1, #0x4000000
- ldreq r0, [r1, #0x0]
- orreq r0, r0, #0x10000
- streq r0, [r1, #0x0]
- bxeq lr
- mov r1, #0x4000000
- ldr r0, [r1, #0x0]
- bic r0, r0, #0x30000
- orr r0, r0, r2, lsl #0x10
- str r0, [r1, #0x0]
- bx lr
- .balign 4
-_020C5A78: .word 0x021D33C0
-_020C5A7C: .word 0x02106810
-
- arm_func_start GX_DispOff
-GX_DispOff: ; 0x020C5A80
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov lr, #0x4000000
- ldr r12, [lr, #0x0]
- ldr r1, _020C5AC0 ; =0x02106810
- and r2, r12, #0x30000
- mov r3, #0x0
- ldr r0, _020C5AC4 ; =0x021D33C0
- mov r2, r2, lsr #0x10
- strh r3, [r1, #0x0]
- strh r2, [r0, #0x0]
- bic r0, r12, #0x30000
- str r0, [lr, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020C5AC0: .word 0x02106810
-_020C5AC4: .word 0x021D33C0
-
- arm_func_start GX_VBlankIntr
-GX_VBlankIntr: ; 0x020C5AC8
- ldr r2, _020C5AF4 ; =0x04000004
- cmp r0, #0x0
- ldrh r0, [r2, #0x0]
- ldrneh r1, [r2, #0x0]
- and r0, r0, #0x8
- orrne r1, r1, #0x8
- strneh r1, [r2, #0x0]
- ldreqh r1, [r2, #0x0]
- biceq r1, r1, #0x8
- streqh r1, [r2, #0x0]
- bx lr
- .balign 4
-_020C5AF4: .word 0x04000004
-
- arm_func_start GX_HBlankIntr
-GX_HBlankIntr: ; 0x020C5AF8
- ldr r2, _020C5B24 ; =0x04000004
- cmp r0, #0x0
- ldrh r0, [r2, #0x0]
- ldrneh r1, [r2, #0x0]
- and r0, r0, #0x10
- orrne r1, r1, #0x10
- strneh r1, [r2, #0x0]
- ldreqh r1, [r2, #0x0]
- biceq r1, r1, #0x10
- streqh r1, [r2, #0x0]
- bx lr
- .balign 4
-_020C5B24: .word 0x04000004
-
- arm_func_start GX_Init
-GX_Init: ; 0x020C5B28
- stmdb sp!, {r4-r6,lr}
- ldr r3, _020C5C68 ; =0x04000304
- ldr r0, _020C5C6C ; =0xFFFFFDF1
- ldrh r2, [r3, #0x0]
- ldr r1, _020C5C70 ; =0x0000020E
- orr r2, r2, #0x8000
- strh r2, [r3, #0x0]
- ldrh r2, [r3, #0x0]
- and r0, r2, r0
- orr r0, r0, r1
- strh r0, [r3, #0x0]
- ldrh r0, [r3, #0x0]
- orr r0, r0, #0x1
- strh r0, [r3, #0x0]
- bl GX_InitGXState
- ldr r5, _020C5C74 ; =0x021D33BC
- ldrh r0, [r5, #0x0]
- cmp r0, #0x0
- bne _020C5B9C
- mvn r4, #0x2
-_020C5B78:
- bl OS_GetLockID
- mov r6, r0
- cmp r6, r4
- bne _020C5B8C
- bl OS_Terminate
-_020C5B8C:
- strh r6, [r5, #0x0]
- ldrh r0, [r5, #0x0]
- cmp r0, #0x0
- beq _020C5B78
-_020C5B9C:
- ldr r0, _020C5C78 ; =0x04000004
- mov r2, #0x0
- strh r2, [r0, #0x0]
- mov r1, #0x4000000
- ldr r0, _020C5C7C ; =0x02106814
- str r2, [r1, #0x0]
- ldr r0, [r0, #0x0]
- mvn r1, #0x0
- cmp r0, r1
- beq _020C5BF4
- ldr r1, _020C5C80 ; =0x04000008
- mov r3, #0x60
- bl MI_DmaFill32
- ldr r1, _020C5C84 ; =0x0400006C
- mov r2, #0x0
- ldr r0, _020C5C7C ; =0x02106814
- strh r2, [r1, #0x0]
- ldr r0, [r0, #0x0]
- ldr r1, _020C5C88 ; =0x04001000
- mov r3, #0x70
- bl MI_DmaFill32
- b _020C5C1C
-_020C5BF4:
- ldr r1, _020C5C80 ; =0x04000008
- mov r0, r2
- mov r2, #0x60
- bl MIi_CpuClear32
- ldr r3, _020C5C84 ; =0x0400006C
- mov r0, #0x0
- ldr r1, _020C5C88 ; =0x04001000
- mov r2, #0x70
- strh r0, [r3, #0x0]
- bl MIi_CpuClear32
-_020C5C1C:
- ldr r1, _020C5C8C ; =0x04000020
- mov r2, #0x100
- ldr r0, _020C5C90 ; =0x04000026
- strh r2, [r1, #0x0]
- ldr r1, _020C5C94 ; =0x04000030
- strh r2, [r0, #0x0]
- ldr r0, _020C5C98 ; =0x04000036
- strh r2, [r1, #0x0]
- ldr r1, _020C5C9C ; =0x04001020
- strh r2, [r0, #0x0]
- ldr r0, _020C5CA0 ; =0x04001026
- strh r2, [r1, #0x0]
- ldr r1, _020C5CA4 ; =0x04001030
- strh r2, [r0, #0x0]
- ldr r0, _020C5CA8 ; =0x04001036
- strh r2, [r1, #0x0]
- strh r2, [r0, #0x0]
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020C5C68: .word 0x04000304
-_020C5C6C: .word 0xFFFFFDF1
-_020C5C70: .word 0x0000020E
-_020C5C74: .word 0x021D33BC
-_020C5C78: .word 0x04000004
-_020C5C7C: .word 0x02106814
-_020C5C80: .word 0x04000008
-_020C5C84: .word 0x0400006C
-_020C5C88: .word 0x04001000
-_020C5C8C: .word 0x04000020
-_020C5C90: .word 0x04000026
-_020C5C94: .word 0x04000030
-_020C5C98: .word 0x04000036
-_020C5C9C: .word 0x04001020
-_020C5CA0: .word 0x04001026
-_020C5CA4: .word 0x04001030
-_020C5CA8: .word 0x04001036
diff --git a/arm9/lib/include/gx.h b/arm9/lib/include/gx.h
index edb6f122..f3016f44 100644
--- a/arm9/lib/include/gx.h
+++ b/arm9/lib/include/gx.h
@@ -21,6 +21,8 @@
#define HW_REG_TEXIMAGE_PARAM 0x040004A8
#define HW_REG_PLTT_BASE 0x040004AC
+#define HW_REG_POWCNT1 0x04000304
+
#define HW_REG_GXFIFO 0x04000400
#define HW_REG_MTX_IDENTITY 0x04000454
#define HW_REG_MTX_POP 0x04000448
@@ -34,6 +36,7 @@
#define HW_REG_SHININESS 0x040004D0
+#define HW_REG_MASTER_BRIGHT 0x0400006C
#define HW_REG_VRAMCNT_A 0x04000240
#define HW_REG_VRAMCNT_B 0x04000241
@@ -47,10 +50,20 @@
#define HW_REG_VRAMCNT_I 0x04000249
#define HW_REG_DISPCNT 0x04000000
+#define HW_REG_DISPSTAT 0x04000004
#define HW_REG_DISPCNT_2D 0x04001000
#define HW_REG_DISP3DCNT 0x04000060
+#define HW_REG_BG2PA_A 0x04000020
+#define HW_REG_BG2PD_A 0x04000026
+#define HW_REG_BG3PA_A 0x04000030
+#define HW_REG_BG3PD_A 0x04000036
+#define HW_REG_BG2PA_B 0x04001020
+#define HW_REG_BG2PD_B 0x04001026
+#define HW_REG_BG3PA_B 0x04001030
+#define HW_REG_BG3PD_B 0x04001036
+
#define HW_REG_BG0CNT_A 0x04000008
#define HW_REG_BG1CNT_A 0x0400000A
#define HW_REG_BG2CNT_A 0x0400000C
@@ -136,7 +149,6 @@ u32 G3X_GetMtxStackLevelPJ(u32 *level);
u32 G3X_GetBoxTestResult(u32 *result);
void G3X_SetHOffset(u32 offset);
-
//GX_g3b
void G3BS_LoadMtx44(struct DL *displaylist, struct Mtx44 *mtx);
void G3B_PushMtx(struct DL *displaylist);
@@ -278,6 +290,16 @@ void GX_LoadClearImageColor(void *src, u32 size);
void GX_LoadClearImageDepth(void *src, u32 size);
void GX_EndLoadClearImage();
+//GX
+void GX_Init();
+u32 GX_HBlankIntr(u32 enable);
+u32 GX_VBlankIntr(u32 enable);
+void GX_DispOff();
+void GX_DispOn();
+void GX_SetGraphicsMode(u32 mode1, u32 mode2, u32 mode3);
+void GXS_SetGraphicsMode(u32 mode);
+void GXx_SetMasterBrightness_(vu16 *dst, s32 brightness);
+
//GXi_NopClearFifo128_ probably asm
#endif //GUARD_GX_H
diff --git a/arm9/lib/src/GX.c b/arm9/lib/src/GX.c
new file mode 100644
index 00000000..6d979139
--- /dev/null
+++ b/arm9/lib/src/GX.c
@@ -0,0 +1,127 @@
+#include "global.h"
+#include "main.h"
+#include "gx.h"
+
+extern u16 gUnk021D33BC;
+extern u16 gUnk021D33C0;
+extern u32 gUnk02106814;
+extern u16 gUnk02106810;
+
+void GX_InitGXState();
+
+void MI_DmaFill32(u32, void *, u32, u32);
+void MIi_CpuClear32(u32, void *, u32);
+
+void GX_Init(){
+ SETREG16(HW_REG_POWCNT1, READREG16(HW_REG_POWCNT1) | 0x8000);
+ SETREG16(HW_REG_POWCNT1, (READREG16(HW_REG_POWCNT1) & ~0x20E) | 0x20E);
+ SETREG16(HW_REG_POWCNT1, READREG16(HW_REG_POWCNT1) | 0x1);
+ GX_InitGXState();
+ u32 temp;
+ while (gUnk021D33BC == 0)
+ {
+ temp = OS_GetLockID();
+ if (temp == -3)
+ {
+ OS_Terminate();
+ }
+ gUnk021D33BC = temp;
+ }
+ SETREG16(HW_REG_DISPSTAT, 0x0);
+ SETREG32(HW_REG_DISPCNT, 0x0);
+ if (gUnk02106814 != -1)
+ {
+ MI_DmaFill32(gUnk02106814, (void *)HW_REG_BG0CNT_A, 0x0, 0x60);
+ SETREG16(HW_REG_MASTER_BRIGHT, 0x0);
+ MI_DmaFill32(gUnk02106814, (void *)HW_REG_DISPCNT_2D, 0x0, 0x70);
+ }
+ else
+ {
+ MIi_CpuClear32(0x0, (void *)HW_REG_BG0CNT_A, 0x60);
+ SETREG16(HW_REG_MASTER_BRIGHT, 0x0);
+ MIi_CpuClear32(0x0, (void *)HW_REG_DISPCNT_2D, 0x70);
+ }
+ SETREG16(HW_REG_BG2PA_A, 0x100);
+ SETREG16(HW_REG_BG2PD_A, 0x100);
+ SETREG16(HW_REG_BG3PA_A, 0x100);
+ SETREG16(HW_REG_BG3PD_A, 0x100);
+ SETREG16(HW_REG_BG2PA_B, 0x100);
+ SETREG16(HW_REG_BG2PD_B, 0x100);
+ SETREG16(HW_REG_BG3PA_B, 0x100);
+ SETREG16(HW_REG_BG3PD_B, 0x100);
+}
+
+u32 GX_HBlankIntr(u32 enable){
+ u32 temp = READREG16(HW_REG_DISPSTAT) & 0x10;
+ if (enable)
+ {
+ SETREG16(HW_REG_DISPSTAT, READREG16(HW_REG_DISPSTAT) | 0x10);
+ }
+ else
+ {
+ SETREG16(HW_REG_DISPSTAT, READREG16(HW_REG_DISPSTAT) & ~0x10);
+ }
+ return temp;
+}
+
+u32 GX_VBlankIntr(u32 enable){
+ u32 temp = READREG16(HW_REG_DISPSTAT) & 0x8;
+ if (enable)
+ {
+ SETREG16(HW_REG_DISPSTAT, READREG16(HW_REG_DISPSTAT) | 0x8);
+ }
+ else
+ {
+ SETREG16(HW_REG_DISPSTAT, READREG16(HW_REG_DISPSTAT) & ~0x8);
+ }
+ return temp;
+}
+
+void GX_DispOff(){
+ u32 temp = READREG32(HW_REG_DISPCNT);
+ gUnk02106810 = 0x0;
+ gUnk021D33C0 = (temp & 0x30000) >> 0x10;
+ SETREG32(HW_REG_DISPCNT, temp & ~0x30000);
+}
+
+void GX_DispOn(){
+ gUnk02106810 = 0x1;
+ if (gUnk021D33C0)
+ {
+ SETREG32(HW_REG_DISPCNT, READREG32(HW_REG_DISPCNT) & ~0x30000 | (gUnk021D33C0 << 0x10));
+
+ }
+ else
+ {
+ SETREG32(HW_REG_DISPCNT, READREG32(HW_REG_DISPCNT) | 0x10000);
+ }
+}
+
+void GX_SetGraphicsMode(u32 mode1, u32 mode2, u32 mode3){
+ u32 temp2 = READREG32(HW_REG_DISPCNT);
+ gUnk021D33C0 = mode1;
+ if (!gUnk02106810)
+ mode1 = 0;
+ SETREG32(HW_REG_DISPCNT, (mode2 | ((temp2 & 0xFFF0FFF0) | (mode1 << 0x10))) | (mode3 << 0x3));
+ if (!gUnk021D33C0)
+ gUnk02106810 = 0x0;
+}
+
+void GXS_SetGraphicsMode(u32 mode){
+ SETREG32(HW_REG_DISPCNT_2D, READREG32(HW_REG_DISPCNT_2D) & ~0x7 | mode);
+}
+
+void GXx_SetMasterBrightness_(vu16 *dst, s32 brightness){
+ if (!brightness)
+ {
+ *dst = 0x0;
+ }
+ else if (brightness > 0)
+ {
+ *dst = 0x4000 | brightness;
+ }
+ else
+ {
+ *dst = 0x8000 | -brightness;
+ }
+}
diff --git a/arm9/undefined_syms.txt b/arm9/undefined_syms.txt
index 1705fd25..6735579a 100644
--- a/arm9/undefined_syms.txt
+++ b/arm9/undefined_syms.txt
@@ -7,6 +7,7 @@ SDK_IRQ_STACKSIZE = 0x00000400;
// FX
FX_AtanTable_ = 0x02103A38;
// OS
+gUnk02106810 = 0x02106810;
gUnk02106814 = 0x02106814;
OSi_IrqCallbackInfoIndex = 0x02106818;
OSi_ConsoleTypeCache = 0x02106828;
@@ -21,6 +22,7 @@ SDK_OVERLAY_DIGEST = 0x02106F84;
SDK_OVERLAY_DIGEST_END = 0x02106F84;
//GX
gUnk021D33BC = 0x021D33BC;
+gUnk021D33C0 = 0x021D33C0;
gUnk021D33C4 = 0x021D33C4;
gUnk021D33E0 = 0x021D33E0;