diff options
author | Made <made111@gmx.de> | 2020-05-12 01:27:44 +0200 |
---|---|---|
committer | Made <made111@gmx.de> | 2020-05-12 01:27:44 +0200 |
commit | 2d3d64c1c94ba8b94147bfbc29bb15bd42772ed3 (patch) | |
tree | 08212861e0eeb7c9cc08979b7fa364f2d4e522a0 /arm9/lib | |
parent | fd64cccafa5d4d8031ba3b19dc907c672f8b7041 (diff) |
Decompile GX_bgcnt.s
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/include/gx.h | 34 | ||||
-rw-r--r-- | arm9/lib/src/GX_bgcnt.c | 195 |
2 files changed, 228 insertions, 1 deletions
diff --git a/arm9/lib/include/gx.h b/arm9/lib/include/gx.h index 6919cbfd..3f218df9 100644 --- a/arm9/lib/include/gx.h +++ b/arm9/lib/include/gx.h @@ -51,6 +51,19 @@ #define HW_REG_DISP3DCNT 0x04000060 +#define HW_REG_BG0CNT_A 0x04000008 +#define HW_REG_BG1CNT_A 0x0400000A +#define HW_REG_BG2CNT_A 0x0400000C +#define HW_REG_BG3CNT_A 0x0400000E + +#define HW_REG_BG0CNT_B 0x04001008 +#define HW_REG_BG1CNT_B 0x0400100A +#define HW_REG_BG2CNT_B 0x0400100C +#define HW_REG_BG3CNT_B 0x0400100E + +#define HW_REG_DISPCNT_A 0x04000000 +#define HW_REG_DISPCNT_B 0x04001000 + //TODO: wait for register commit and replace these #define SETREG8(x, y) ((*(vu8 *)x) = y) #define SETREG16(x, y) ((*(vu16 *)x) = y) @@ -105,7 +118,7 @@ void G3_RotY(fx32 sinphi, fx32 cosphi); void G3_RotZ(fx32 sinphi, fx32 cosphi); //GX_g3x -asm void GXi_NopClearFifo128_(void *reg); +void GXi_NopClearFifo128_(void *reg); void G3X_Init(); void G3X_ResetMtxStack(); void G3X_ClearFifo(); @@ -197,6 +210,25 @@ u32 GX_GetBankForSubOBJ(); u32 GX_GetBankForSubBGExtPltt(); u32 GX_GetBankForSubOBJExtPltt(); +//GX_bgcnt +void *G2_GetBG0ScrPtr(); +void *G2S_GetBG0ScrPtr(); +void *G2_GetBG1ScrPtr(); +void *G2S_GetBG1ScrPtr(); +void *G2_GetBG2ScrPtr(); +void *G2S_GetBG2ScrPtr(); +void *G2_GetBG3ScrPtr(); +void *G2S_GetBG3ScrPtr(); +void *G2_GetBG0CharPtr(); +void *G2S_GetBG0CharPtr(); +void *G2_GetBG1CharPtr(); +void *G2S_GetBG1CharPtr(); +void *G2_GetBG2CharPtr(); +void *G2S_GetBG2CharPtr(); +void *G2_GetBG3CharPtr(); +void *G2S_GetBG3CharPtr(); + + //GXi_NopClearFifo128_ probably asm #endif //GUARD_GX_H diff --git a/arm9/lib/src/GX_bgcnt.c b/arm9/lib/src/GX_bgcnt.c new file mode 100644 index 00000000..918f4d32 --- /dev/null +++ b/arm9/lib/src/GX_bgcnt.c @@ -0,0 +1,195 @@ +#include "global.h" +#include "main.h" +#include "gx.h" + +void *G2_GetBG0ScrPtr(){ + u32 temp = (((READREG16(HW_REG_BG0CNT_A) & 0x1F00) >> 0x8) << 0xB); + return (void *)(0x6000000 + (((READREG32(HW_REG_DISPCNT_A) & 0x38000000) >> 0x1B) << 0x10) + temp); +} + +void *G2S_GetBG0ScrPtr(){ + return (void *)(0x6200000 + (((READREG16(HW_REG_BG0CNT_B) & 0x1F00) >> 0x8) << 0xB)); +} + +void *G2_GetBG1ScrPtr(){ + u32 temp = (((READREG16(HW_REG_BG1CNT_A) & 0x1F00) >> 0x8) << 0xB); + return (void *)(0x6000000 + (((READREG32(HW_REG_DISPCNT_A) & 0x38000000) >> 0x1B) << 0x10) + temp); +} + +void *G2S_GetBG1ScrPtr(){ + return (void *)(0x6200000 + (((READREG16(HW_REG_BG1CNT_B) & 0x1F00) >> 0x8) << 0xB)); +} + +void *G2_GetBG2ScrPtr(){ + u32 temp12 = (READREG32(HW_REG_DISPCNT_A) & 0x7); + u32 temp3 = READREG16(HW_REG_BG2CNT_A); + u32 temp2 = (((READREG32(HW_REG_DISPCNT_A) & 0x38000000) >> 0x1B) << 0x10); + u32 temp1 = ((temp3 & 0x1F00) >> 0x8); + switch (temp12) + { + case 0: + case 1: + case 2: + case 3: + case 4: + return (void *)(0x6000000 + temp2 + (temp1 << 0xB)); + case 5: + if (temp3 & 0x80) + return (void *)(0x6000000 + (temp1 << 0xE)); + else + return (void *)(0x6000000 + temp2 + (temp1 << 0xB)); + case 6: + return (void *)0x6000000; + default: + return NULL; + } +} + +void *G2S_GetBG2ScrPtr(){ + u32 temp12 = (READREG32(HW_REG_DISPCNT_B) & 0x7); + u32 temp3 = READREG16(HW_REG_BG2CNT_B); + u32 temp1 = ((temp3 & 0x1F00) >> 0x8); + switch (temp12) + { + case 0: + case 1: + case 2: + case 3: + case 4: + return (void *)(0x6200000 + (temp1 << 0xB)); + case 5: + if (temp3 & 0x80) + return (void *)(0x6200000 + (temp1 << 0xE)); + else + return (void *)(0x6200000 + (temp1 << 0xB)); + case 6: + return NULL; + default: + return NULL; + } +} + +void *G2_GetBG3ScrPtr(){ + u32 temp12 = (READREG32(HW_REG_DISPCNT_A) & 0x7); + u32 temp3 = READREG16(HW_REG_BG3CNT_A); + u32 temp2 = (((READREG32(HW_REG_DISPCNT_A) & 0x38000000) >> 0x1B) << 0x10); + u32 temp1 = ((temp3 & 0x1F00) >> 0x8); + switch (temp12) + { + case 0: + case 1: + case 2: + return (void *)(0x6000000 + temp2 + (temp1 << 0xB)); + case 3: + case 4: + case 5: + if (temp3 & 0x80) + return (void *)(0x6000000 + (temp1 << 0xE)); + else + return (void *)(0x6000000 + temp2 + (temp1 << 0xB)); + case 6: + return NULL; + default: + return NULL; + } +} + +void *G2S_GetBG3ScrPtr(){ + u32 temp12 = (READREG32(HW_REG_DISPCNT_B) & 0x7); + u32 temp3 = READREG16(HW_REG_BG3CNT_B); + u32 temp1 = ((temp3 & 0x1F00) >> 0x8); + switch (temp12) + { + case 0: + case 1: + case 2: + return (void *)(0x6200000 + (temp1 << 0xB)); + case 3: + case 4: + case 5: + if (temp3 & 0x80) + return (void *)(0x6200000 + (temp1 << 0xE)); + else + return (void *)(0x6200000 + (temp1 << 0xB)); + case 6: + return NULL; + default: + return NULL; + } +} + +void *G2_GetBG0CharPtr(){ + u32 temp = (((READREG16(HW_REG_BG0CNT_A) & 0x3C) >> 0x2) << 0xE); + return (void *)(0x6000000 + (((READREG32(HW_REG_DISPCNT_A) & 0x7000000) >> 0x18) << 0x10) + temp); +} + +void *G2S_GetBG0CharPtr(){ + return (void *)(0x6200000 + (((READREG16(HW_REG_BG0CNT_B) & 0x3C) >> 0x2) << 0xE)); +} + +void *G2_GetBG1CharPtr(){ + u32 temp = (((READREG16(HW_REG_BG1CNT_A) & 0x3C) >> 0x2) << 0xE); + return (void *)(0x6000000 + (((READREG32(HW_REG_DISPCNT_A) & 0x7000000) >> 0x18) << 0x10) + temp); +} + +void *G2S_GetBG1CharPtr(){ + return (void *)(0x6200000 + (((READREG16(HW_REG_BG1CNT_B) & 0x3C) >> 0x2) << 0xE)); +} + +void *G2_GetBG2CharPtr(){ + s32 temp1 = (READREG32(HW_REG_DISPCNT_A) & 0x7); + u32 temp = READREG16(HW_REG_BG2CNT_A); + if (temp1 < 5 || !(temp & 0x80)) + { + u32 temp1 = (((READREG32(HW_REG_DISPCNT_A) & 0x7000000) >> 0x18) << 0x10); + u32 temp2 = (temp & 0x3C) >> 2; + return (void *)(0x6000000 + temp1 + (temp2 << 0xE)); + } + else + { + return NULL; + } +} + +void *G2S_GetBG2CharPtr(){ + s32 temp1 = (READREG32(HW_REG_DISPCNT_B) & 0x7); + u32 temp = READREG16(HW_REG_BG2CNT_B); + if (temp1 < 5 || !(temp & 0x80)) + { + u32 temp2 = ((temp & 0x3C) >> 2) << 0xE; + return (void *)(0x6200000 + temp2); + } + else + { + return NULL; + } +} + +void *G2_GetBG3CharPtr(){ + s32 temp1 = (READREG32(HW_REG_DISPCNT_A) & 0x7); + u32 temp = READREG16(HW_REG_BG3CNT_A); + if (temp1 < 3 || (temp1 < 6 && !(temp & 0x80))) + { + u32 temp1 = (((READREG32(HW_REG_DISPCNT_A) & 0x7000000) >> 0x18) << 0x10); + u32 temp2 = (temp & 0x3C) >> 2; + return (void *)(0x6000000 + temp1 + (temp2 << 0xE)); + } + else + { + return NULL; + } +} + +void *G2S_GetBG3CharPtr(){ + s32 temp1 = (READREG32(HW_REG_DISPCNT_B) & 0x7); + u32 temp = READREG16(HW_REG_BG3CNT_B); + if (temp1 < 3 || (temp1 < 6 && !(temp & 0x80))) + { + u32 temp2 = ((temp & 0x3C) >> 2) << 0xE; + return (void *)(0x6200000 + temp2); + } + else + { + return NULL; + } +} |