diff options
-rw-r--r-- | arm9/arm9.lcf | 1 | ||||
-rw-r--r-- | arm9/asm/GX_asm.s | 16 | ||||
-rw-r--r-- | arm9/asm/GX_g3.s | 72 | ||||
-rw-r--r-- | arm9/asm/GX_g3b.s | 269 | ||||
-rw-r--r-- | arm9/asm/GX_g3x.s | 503 | ||||
-rw-r--r-- | arm9/asm/GX_vramcnt.s | 98 | ||||
-rw-r--r-- | arm9/lib/include/gx.h | 116 | ||||
-rw-r--r-- | arm9/lib/src/GX_asm.c | 16 | ||||
-rw-r--r-- | arm9/lib/src/GX_g3.c | 36 | ||||
-rw-r--r-- | arm9/lib/src/GX_g3b.c | 122 | ||||
-rw-r--r-- | arm9/lib/src/GX_g3x.c | 242 | ||||
-rw-r--r-- | arm9/lib/src/GX_vramcnt_c.c | 24 | ||||
-rw-r--r-- | arm9/undefined_syms.txt | 1 |
13 files changed, 607 insertions, 909 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf index 68347ea4..91b80e07 100644 --- a/arm9/arm9.lcf +++ b/arm9/arm9.lcf @@ -148,6 +148,7 @@ SECTIONS { GX.o (.text) GX_state.o (.text) GX_vramcnt.o (.text) + GX_vramcnt_c.o (.text) GX_bgcnt.o (.text) GX_g2.o (.text) GX_g3b.o (.text) diff --git a/arm9/asm/GX_asm.s b/arm9/asm/GX_asm.s deleted file mode 100644 index ae9b81e3..00000000 --- a/arm9/asm/GX_asm.s +++ /dev/null @@ -1,16 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start GX_SendFifo48B -GX_SendFifo48B: ; 0x020C9BE8 - ldmia r0!, {r2-r3,r12} - stmia r1, {r2-r3,r12} - ldmia r0!, {r2-r3,r12} - stmia r1, {r2-r3,r12} - ldmia r0!, {r2-r3,r12} - stmia r1, {r2-r3,r12} - ldmia r0!, {r2-r3,r12} - stmia r1, {r2-r3,r12} - bx lr diff --git a/arm9/asm/GX_g3.s b/arm9/asm/GX_g3.s deleted file mode 100644 index 078ddf22..00000000 --- a/arm9/asm/GX_g3.s +++ /dev/null @@ -1,72 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start G3_EndMakeDL -G3_EndMakeDL: ; 0x020C9B18 - ldr r3, [r0, #0x0] - ldr r2, [r0, #0x8] - cmp r2, r3 - moveq r0, #0x0 - bxeq lr - and r1, r3, #0x3 - cmp r1, #0x3 - addls pc, pc, r1, lsl #0x2 - b _020C9B8C -_020C9B3C: - b _020C9B4C -_020C9B40: - b _020C9B54 -_020C9B44: - b _020C9B64 -_020C9B48: - b _020C9B78 -_020C9B4C: - sub r0, r3, r2 - bx lr -_020C9B54: - add r1, r3, #0x1 - str r1, [r0, #0x0] - mov r1, #0x0 - strb r1, [r3, #0x0] -_020C9B64: - ldr r3, [r0, #0x0] - mov r1, #0x0 - add r2, r3, #0x1 - str r2, [r0, #0x0] - strb r1, [r3, #0x0] -_020C9B78: - ldr r3, [r0, #0x0] - mov r1, #0x0 - add r2, r3, #0x1 - str r2, [r0, #0x0] - strb r1, [r3, #0x0] -_020C9B8C: - ldr r1, [r0, #0x10] - cmp r1, #0x0 - beq _020C9BB0 - ldr r3, [r0, #0x4] - mov r1, #0x0 - add r2, r3, #0x4 - str r2, [r0, #0x4] - str r1, [r3, #0x0] - str r1, [r0, #0x10] -_020C9BB0: - ldr r1, [r0, #0x4] - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - ldr r0, [r0, #0x8] - sub r0, r1, r0 - bx lr - - arm_func_start G3_BeginMakeDL -G3_BeginMakeDL: ; 0x020C9BC8 - str r2, [r0, #0xc] - str r1, [r0, #0x8] - str r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - mov r1, #0x0 - str r1, [r0, #0x10] - bx lr diff --git a/arm9/asm/GX_g3b.s b/arm9/asm/GX_g3b.s deleted file mode 100644 index 5bb7ac21..00000000 --- a/arm9/asm/GX_g3b.s +++ /dev/null @@ -1,269 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start G3B_End -G3B_End: ; 0x020C75AC - ldr r1, [r0, #0x0] - mov r2, #0x41 - str r2, [r1, #0x0] - ldr r1, [r0, #0x4] - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - bx lr - - arm_func_start G3B_Begin -G3B_Begin: ; 0x020C75D0 - ldr r2, [r0, #0x0] - mov r3, #0x40 - str r3, [r2, #0x0] - ldr r2, [r0, #0x4] - str r1, [r2, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - bx lr - - arm_func_start G3B_LightColor -G3B_LightColor: ; 0x020C7600 - ldr r3, [r0, #0x0] - mov r12, #0x33 - str r12, [r3, #0x0] - ldr r3, [r0, #0x4] - orr r1, r2, r1, lsl #0x1e - str r1, [r3, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - bx lr - - arm_func_start G3B_LightVector -G3B_LightVector: ; 0x020C7634 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0x4 - ldr ip, _020C7694 ; =0x000003FF - ldrsh r4, [sp, #0x10] - ldr lr, [r0, #0x0] - mov r5, #0x32 - str r5, [lr, #0x0] - and lr, r12, r2, asr #0x3 - and r2, r12, r3, asr #0x3 - and r3, r12, r4, asr #0x3 - orr r2, lr, r2, lsl #0xa - orr r3, r2, r3, lsl #0x14 - ldr r2, [r0, #0x4] - orr r1, r3, r1, lsl #0x1e - str r1, [r2, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - add sp, sp, #0x4 - ldmia sp!, {r4-r5,lr} - bx lr - .balign 4 -_020C7694: .word 0x000003FF - - arm_func_start G3B_MaterialColorSpecEmi -G3B_MaterialColorSpecEmi: ; 0x020C7698 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r12, [r0, #0x0] - mov lr, #0x31 - cmp r3, #0x0 - movne r3, #0x1 - str lr, [r12, #0x0] - orr r2, r1, r2, lsl #0x10 - moveq r3, #0x0 - ldr r1, [r0, #0x4] - orr r2, r2, r3, lsl #0xf - str r2, [r1, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - - arm_func_start G3B_MaterialColorDiffAmb -G3B_MaterialColorDiffAmb: ; 0x020C76EC - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r12, [r0, #0x0] - mov lr, #0x30 - cmp r3, #0x0 - movne r3, #0x1 - str lr, [r12, #0x0] - orr r2, r1, r2, lsl #0x10 - moveq r3, #0x0 - ldr r1, [r0, #0x4] - orr r2, r2, r3, lsl #0xf - str r2, [r1, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - - arm_func_start G3B_PolygonAttr -G3B_PolygonAttr: ; 0x020C7740 - orr r1, r1, r2, lsl #0x4 - ldr r2, [r0, #0x0] - mov r12, #0x29 - str r12, [r2, #0x0] - ldr r2, [sp, #0x8] - orr r1, r1, r3, lsl #0x6 - ldr r3, [sp, #0x0] - orr r1, r2, r1 - ldr r12, [sp, #0x4] - orr r2, r1, r3, lsl #0x18 - ldr r1, [r0, #0x4] - orr r2, r2, r12, lsl #0x10 - str r2, [r1, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - bx lr - - arm_func_start G3B_Vtx -G3B_Vtx: ; 0x020C7790 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r12, [r0, #0x0] - mov lr, #0x23 - str lr, [r12, #0x0] - mov r1, r1, lsl #0x10 - mov r2, r2, lsl #0x10 - mov lr, r1, lsr #0x10 - mov r12, r2, lsr #0x10 - mov r1, r3, lsl #0x10 - ldr r2, [r0, #0x4] - orr r3, lr, r12, lsl #0x10 - str r3, [r2, #0x0] - ldr r2, [r0, #0x4] - mov r1, r1, lsr #0x10 - str r1, [r2, #0x4] - ldr r1, [r0, #0x4] - add r1, r1, #0x8 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - - arm_func_start G3B_Normal -G3B_Normal: ; 0x020C77F4 - stmdb sp!, {r4,lr} - ldr ip, _020C7844 ; =0x000003FF - ldr lr, [r0, #0x0] - mov r4, #0x21 - str r4, [lr, #0x0] - and lr, r12, r1, asr #0x3 - and r1, r12, r2, asr #0x3 - and r3, r12, r3, asr #0x3 - orr r2, lr, r1, lsl #0xa - ldr r1, [r0, #0x4] - orr r2, r2, r3, lsl #0x14 - str r2, [r1, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - ldmia sp!, {r4,lr} - bx lr - .balign 4 -_020C7844: .word 0x000003FF - - arm_func_start G3B_Color -G3B_Color: ; 0x020C7848 - ldr r2, [r0, #0x0] - mov r3, #0x20 - str r3, [r2, #0x0] - ldr r2, [r0, #0x4] - str r1, [r2, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - bx lr - - arm_func_start G3B_LoadMtx44 -G3B_LoadMtx44: ; 0x020C7878 - stmdb sp!, {r4,lr} - mov r4, r0 - bl G3BS_LoadMtx44 - ldr r0, [r4, #0x4] - add r0, r0, #0x40 - str r0, [r4, #0x0] - ldr r0, [r4, #0x0] - add r0, r0, #0x4 - str r0, [r4, #0x4] - ldmia sp!, {r4,lr} - bx lr - - arm_func_start G3B_PopMtx -G3B_PopMtx: ; 0x020C78A4 - ldr r2, [r0, #0x0] - mov r3, #0x12 - str r3, [r2, #0x0] - ldr r2, [r0, #0x4] - str r1, [r2, #0x0] - ldr r1, [r0, #0x4] - add r1, r1, #0x4 - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - bx lr - - arm_func_start G3B_PushMtx -G3B_PushMtx: ; 0x020C78D4 - ldr r1, [r0, #0x0] - mov r2, #0x11 - str r2, [r1, #0x0] - ldr r1, [r0, #0x4] - str r1, [r0, #0x0] - ldr r1, [r0, #0x0] - add r1, r1, #0x4 - str r1, [r0, #0x4] - bx lr - - arm_func_start G3BS_LoadMtx44 -G3BS_LoadMtx44: ; 0x020C78F8 - mov r3, r0 - ldr r0, [r3, #0x0] - mov r2, #0x16 - str r2, [r0, #0x0] - mov r0, r1 - ldr ip, _020C7918 ; =MI_Copy64B - ldr r1, [r3, #0x4] - bx r12 - .balign 4 -_020C7918: .word MI_Copy64B diff --git a/arm9/asm/GX_g3x.s b/arm9/asm/GX_g3x.s deleted file mode 100644 index a8513372..00000000 --- a/arm9/asm/GX_g3x.s +++ /dev/null @@ -1,503 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start GXi_NopClearFifo128_ -GXi_NopClearFifo128_: ; 0x020C7970 - mov r1, #0x0 - mov r2, #0x0 - mov r3, #0x0 - mov r12, #0x0 - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - stmia r0, {r1-r3,r12} - bx lr - - arm_func_start G3X_SetHOffset -G3X_SetHOffset: ; 0x020C7A04 - ldr r1, _020C7A10 ; =0x04000010 - str r0, [r1, #0x0] - bx lr - .balign 4 -_020C7A10: .word 0x04000010 - - arm_func_start G3X_GetBoxTestResult -G3X_GetBoxTestResult: ; 0x020C7A14 - ldr r2, _020C7A38 ; =0x04000600 - ldr r1, [r2, #0x0] - ands r1, r1, #0x1 - ldreq r1, [r2, #0x0] - mvnne r0, #0x0 - andeq r1, r1, #0x2 - streq r1, [r0, #0x0] - moveq r0, #0x0 - bx lr - .balign 4 -_020C7A38: .word 0x04000600 - - arm_func_start G3X_GetMtxStackLevelPJ -G3X_GetMtxStackLevelPJ: - ldr r2, _020C7A64 ; =0x04000600 - ldr r1, [r2, #0x0] - ands r1, r1, #0x4000 - ldreq r1, [r2, #0x0] - mvnne r0, #0x0 - andeq r1, r1, #0x2000 - moveq r1, r1, lsr #0xd - streq r1, [r0, #0x0] - moveq r0, #0x0 - bx lr - .balign 4 -_020C7A64: .word 0x04000600 - - arm_func_start G3X_GetMtxStackLevelPV -G3X_GetMtxStackLevelPV: - ldr r2, _020C7A90 ; =0x04000600 - ldr r1, [r2, #0x0] - ands r1, r1, #0x4000 - ldreq r1, [r2, #0x0] - mvnne r0, #0x0 - andeq r1, r1, #0x1f00 - moveq r1, r1, lsr #0x8 - streq r1, [r0, #0x0] - moveq r0, #0x0 - bx lr - .balign 4 -_020C7A90: .word 0x04000600 - - arm_func_start G3X_InitTable -G3X_InitTable: ; 0x020C7A94 - stmdb sp!, {lr} - sub sp, sp, #0xc - ldr r0, _020C7B2C ; =0x02106814 - mvn r1, #0x0 - ldr r0, [r0, #0x0] - cmp r0, r1 - beq _020C7AE4 - mov r2, #0x0 - str r2, [sp, #0x0] - ldr r1, _020C7B30 ; =0x04000330 - mov r3, #0x10 - str r2, [sp, #0x4] - bl MI_DmaFill32Async - ldr r0, _020C7B2C ; =0x02106814 - ldr r1, _020C7B34 ; =0x04000360 - ldr r0, [r0, #0x0] - mov r2, #0x0 - mov r3, #0x60 - bl MI_DmaFill32 - b _020C7B04 -_020C7AE4: - ldr r1, _020C7B30 ; =0x04000330 - mov r0, #0x0 - mov r2, #0x10 - bl MIi_CpuClear32 - ldr r1, _020C7B34 ; =0x04000360 - mov r0, #0x0 - mov r2, #0x60 - bl MIi_CpuClear32 -_020C7B04: - mov r2, #0x0 - ldr r0, _020C7B38 ; =0x040004D0 - mov r1, r2 -_020C7B10: - add r2, r2, #0x1 - str r1, [r0, #0x0] - cmp r2, #0x20 - blt _020C7B10 - add sp, sp, #0xc - ldmia sp!, {lr} - bx lr - .balign 4 -_020C7B2C: .word 0x02106814 -_020C7B30: .word 0x04000330 -_020C7B34: .word 0x04000360 -_020C7B38: .word 0x040004D0 - - arm_func_start G3X_SetClearColor -G3X_SetClearColor: ; 0x020C7B3C - orr r0, r0, r1, lsl #0x10 - ldr r12, [sp, #0x0] - orr r3, r0, r3, lsl #0x18 - cmp r12, #0x0 - ldr r1, _020C7B64 ; =0x04000350 - orrne r3, r3, #0x8000 - ldr r0, _020C7B68 ; =0x04000354 - str r3, [r1, #0x0] - strh r2, [r0, #0x0] - bx lr - .balign 4 -_020C7B64: .word 0x04000350 -_020C7B68: .word 0x04000354 - - arm_func_start G3X_SetFogTable -G3X_SetFogTable: ; 0x020C7B6C - ldr ip, _020C7B78 ; =0x020CE2C4 - ldr r1, _020C7B7C ; =0x04000360 - bx r12 - .balign 4 -_020C7B78: .word 0x020CE2C4 -_020C7B7C: .word 0x04000360 - - arm_func_start G3X_SetEdgeColorTable -G3X_SetEdgeColorTable: ; 0x020C7B80 - ldr ip, _020C7B90 ; =MIi_CpuCopy16 - ldr r1, _020C7B94 ; =0x04000330 - mov r2, #0x10 - bx r12 - .balign 4 -_020C7B90: .word MIi_CpuCopy16 -_020C7B94: .word 0x04000330 - - arm_func_start G3X_GetVectorMtx -G3X_GetVectorMtx: - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, _020C7BD8 ; =0x04000600 - mov r1, r0 - ldr r0, [r2, #0x0] - ands r0, r0, #0x8000000 - addne sp, sp, #0x4 - mvnne r0, #0x0 - ldmneia sp!, {lr} - bxne lr - ldr r0, _020C7BDC ; =0x04000680 - bl MI_Copy36B -_020C7BC8: ; 0x020C7BC8 - mov r0, #0x0 - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C7BD8: .word 0x04000600 -_020C7BDC: .word 0x04000680 - - arm_func_start G3X_GetClipMtx -G3X_GetClipMtx: - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, _020C7C20 ; =0x04000600 - mov r1, r0 - ldr r0, [r2, #0x0] - ands r0, r0, #0x8000000 - addne sp, sp, #0x4 - mvnne r0, #0x0 - ldmneia sp!, {lr} - bxne lr - ldr r0, _020C7C24 ; =0x04000640 - bl MI_Copy64B -_020C7C10: ; 0x020C7C10 - mov r0, #0x0 - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C7C20: .word 0x04000600 -_020C7C24: .word 0x04000640 - - arm_func_start G3X_SetFog -G3X_SetFog: ; 0x020C7C28 - cmp r0, #0x0 - ldreq r2, _020C7C70 ; =0x04000060 - ldreq r0, _020C7C74 ; =0x0000CF7F - ldreqh r1, [r2, #0x0] - andeq r0, r1, r0 - streqh r0, [r2, #0x0] - bxeq lr - ldr r0, _020C7C78 ; =0x0400035C - ldr ip, _020C7C70 ; =0x04000060 - strh r3, [r0, #0x0] - mov r0, r2, lsl #0x8 - orr r0, r0, r1, lsl #0x6 - ldrh r3, [r12, #0x0] - orr r0, r0, #0x80 - bic r1, r3, #0x3f40 - orr r0, r1, r0 - strh r0, [r12, #0x0] - bx lr - .balign 4 -_020C7C70: .word 0x04000060 -_020C7C74: .word 0x0000CF7F -_020C7C78: .word 0x0400035C - - arm_func_start G3X_ResetMtxStack_2 -G3X_ResetMtxStack_2: ; 0x020C7C7C - stmdb sp!, {r4,lr} - sub sp, sp, #0x8 - ldr r1, _020C7D18 ; =0x04000600 - ldr r0, [r1, #0x0] - orr r0, r0, #0x8000 - str r0, [r1, #0x0] - add r4, sp, #0x0 -_020C7C98: - mov r0, r4 - bl G3X_GetMtxStackLevelPV -_020C7CA0: ; 0x020C7CA0 - cmp r0, #0x0 - bne _020C7C98 - add r4, sp, #0x4 -_020C7CAC: - mov r0, r4 - bl G3X_GetMtxStackLevelPJ -_020C7CB4: ; 0x020C7CB4 - cmp r0, #0x0 - bne _020C7CAC - ldr r2, _020C7D1C ; =0x04000440 - mov r1, #0x3 - str r1, [r2, #0x0] - ldr r0, _020C7D20 ; =0x04000454 - mov r1, #0x0 - str r1, [r0, #0x0] - str r1, [r2, #0x0] - ldr r1, [sp, #0x4] - cmp r1, #0x0 - ldrne r0, _020C7D24 ; =0x04000448 - strne r1, [r0, #0x0] - ldr r0, _020C7D1C ; =0x04000440 - mov r1, #0x2 - str r1, [r0, #0x0] - ldr r2, [sp, #0x0] - ldr r1, _020C7D24 ; =0x04000448 - ldr r0, _020C7D20 ; =0x04000454 - str r2, [r1, #0x0] - mov r1, #0x0 - str r1, [r0, #0x0] - add sp, sp, #0x8 - ldmia sp!, {r4,lr} - bx lr - .balign 4 -_020C7D18: .word 0x04000600 -_020C7D1C: .word 0x04000440 -_020C7D20: .word 0x04000454 -_020C7D24: .word 0x04000448 - - arm_func_start G3X_InitMtxStack -G3X_InitMtxStack: ; 0x020C7D28 - stmdb sp!, {r4,lr} - sub sp, sp, #0x8 - ldr r1, _020C7DC8 ; =0x04000600 - ldr r0, [r1, #0x0] - orr r0, r0, #0x8000 - str r0, [r1, #0x0] - add r4, sp, #0x0 -_020C7D44: - mov r0, r4 - bl G3X_GetMtxStackLevelPV -_020C7D4C: ; 0x020C7D4C - cmp r0, #0x0 - bne _020C7D44 - add r4, sp, #0x4 -_020C7D58: - mov r0, r4 - bl G3X_GetMtxStackLevelPJ -_020C7D60: ; 0x020C7D60 - cmp r0, #0x0 - bne _020C7D58 - ldr r2, _020C7DCC ; =0x04000440 - mov r1, #0x3 - str r1, [r2, #0x0] - ldr r0, _020C7DD0 ; =0x04000454 - mov r1, #0x0 - str r1, [r0, #0x0] - str r1, [r2, #0x0] - ldr r1, [sp, #0x4] - ldr r2, _020C7DD0 ; =0x04000454 - cmp r1, #0x0 - ldrne r0, _020C7DD4 ; =0x04000448 - mov r3, #0x0 - strne r1, [r0, #0x0] - ldr r0, _020C7DCC ; =0x04000440 - str r3, [r2, #0x0] - mov r1, #0x2 - str r1, [r0, #0x0] - ldr r1, [sp, #0x0] - ldr r0, _020C7DD4 ; =0x04000448 - str r1, [r0, #0x0] - str r3, [r2, #0x0] - add sp, sp, #0x8 - ldmia sp!, {r4,lr} - bx lr - .balign 4 -_020C7DC8: .word 0x04000600 -_020C7DCC: .word 0x04000440 -_020C7DD0: .word 0x04000454 -_020C7DD4: .word 0x04000448 - - arm_func_start G3X_ClearFifo -G3X_ClearFifo: ; 0x020C7DD8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r0, _020C7E04 ; =0x04000400 - bl GXi_NopClearFifo128_ - ldr r1, _020C7E08 ; =0x04000600 -_020C7DEC: - ldr r0, [r1, #0x0] - ands r0, r0, #0x8000000 - bne _020C7DEC - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C7E04: .word 0x04000400 -_020C7E08: .word 0x04000600 - - arm_func_start G3X_ResetMtxStack -G3X_ResetMtxStack: ; 0x020C7E0C - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, _020C7E7C ; =0x04000600 -_020C7E18: - ldr r0, [r2, #0x0] - ands r0, r0, #0x8000000 - bne _020C7E18 - ldr r0, [r2, #0x0] - ldr r1, _020C7E80 ; =0x04000060 - orr r0, r0, #0x8000 - str r0, [r2, #0x0] - ldrh r0, [r1, #0x0] - orr r0, r0, #0x2000 - strh r0, [r1, #0x0] - ldrh r0, [r1, #0x0] - orr r0, r0, #0x1000 - strh r0, [r1, #0x0] - bl G3X_ResetMtxStack_2 - ldr r2, _020C7E84 ; =0x001F0080 - ldr r0, _020C7E88 ; =0x040004A4 - ldr r1, _020C7E8C ; =0x040004A8 - str r2, [r0, #0x0] - mov r2, #0x0 - ldr r0, _020C7E90 ; =0x040004AC - str r2, [r1, #0x0] - str r2, [r0, #0x0] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C7E7C: .word 0x04000600 -_020C7E80: .word 0x04000060 -_020C7E84: .word 0x001F0080 -_020C7E88: .word 0x040004A4 -_020C7E8C: .word 0x040004A8 -_020C7E90: .word 0x040004AC - - arm_func_start G3X_Init -G3X_Init: ; 0x020C7E94 - stmdb sp!, {lr} - sub sp, sp, #0x4 - bl G3X_ClearFifo - ldr r0, _020C7FAC ; =0x04000504 - mov r1, #0x0 - str r1, [r0, #0x0] - ldr r1, _020C7FB0 ; =0x04000600 -_020C7EB0: - ldr r0, [r1, #0x0] - ands r0, r0, #0x8000000 - bne _020C7EB0 - ldr r0, _020C7FB4 ; =0x04000060 - mov r3, #0x0 - strh r3, [r0, #0x0] - ldr r2, _020C7FB8 ; =0x04000010 - str r3, [r1, #0x0] - str r3, [r2, #0x0] - ldrh r12, [r0, #0x0] - ldr r2, _020C7FBC ; =0xFFFFCFFD - ldr r3, _020C7FC0 ; =0x0000CFFB - orr r12, r12, #0x2000 - strh r12, [r0, #0x0] - ldrh r12, [r0, #0x0] - orr r12, r12, #0x1000 - strh r12, [r0, #0x0] - ldrh r12, [r0, #0x0] - and r2, r12, r2 - strh r2, [r0, #0x0] - ldrh r2, [r0, #0x0] - bic r2, r2, #0x3000 - orr r2, r2, #0x10 - strh r2, [r0, #0x0] - ldrh r2, [r0, #0x0] - and r2, r2, r3 - strh r2, [r0, #0x0] - ldr r0, [r1, #0x0] - orr r0, r0, #0x8000 - str r0, [r1, #0x0] - ldr r0, [r1, #0x0] - bic r0, r0, #0xc0000000 - orr r0, r0, #0x80000000 - str r0, [r1, #0x0] - bl G3X_InitMtxStack - ldr r0, _020C7FC4 ; =0x04000350 - mov r3, #0x0 - ldr r2, _020C7FC8 ; =0x00007FFF - ldr r1, _020C7FCC ; =0x04000354 - str r3, [r0, #0x0] - ldr r0, _020C7FD0 ; =0x04000356 - strh r2, [r1, #0x0] - ldr r1, _020C7FD4 ; =0x04000358 - strh r3, [r0, #0x0] - ldr r0, _020C7FD8 ; =0x0400035C - str r3, [r1, #0x0] - ldr r1, _020C7FDC ; =0x04000008 - strh r3, [r0, #0x0] - ldrh r0, [r1, #0x0] - bic r0, r0, #0x3 - strh r0, [r1, #0x0] - bl G3X_InitTable - ldr r2, _020C7FE0 ; =0x001F0080 - ldr r0, _020C7FE4 ; =0x040004A4 - ldr r1, _020C7FE8 ; =0x040004A8 - str r2, [r0, #0x0] - mov r2, #0x0 - ldr r0, _020C7FEC ; =0x040004AC - str r2, [r1, #0x0] - str r2, [r0, #0x0] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C7FAC: .word 0x04000504 -_020C7FB0: .word 0x04000600 -_020C7FB4: .word 0x04000060 -_020C7FB8: .word 0x04000010 -_020C7FBC: .word 0xFFFFCFFD -_020C7FC0: .word 0x0000CFFB -_020C7FC4: .word 0x04000350 -_020C7FC8: .word 0x00007FFF -_020C7FCC: .word 0x04000354 -_020C7FD0: .word 0x04000356 -_020C7FD4: .word 0x04000358 -_020C7FD8: .word 0x0400035C -_020C7FDC: .word 0x04000008 -_020C7FE0: .word 0x001F0080 -_020C7FE4: .word 0x040004A4 -_020C7FE8: .word 0x040004A8 -_020C7FEC: .word 0x040004AC diff --git a/arm9/asm/GX_vramcnt.s b/arm9/asm/GX_vramcnt.s index 0dc8890b..bf11bd92 100644 --- a/arm9/asm/GX_vramcnt.s +++ b/arm9/asm/GX_vramcnt.s @@ -1489,52 +1489,52 @@ _020C6E9C: .word 0x04000246 _020C6EA0: .word 0x04000245 _020C6EA4: .word 0x04000244 - arm_func_start GX_VRAMCNT_SetLCDC_ -GX_VRAMCNT_SetLCDC_: ; 0x020C6EA8 - ands r1, r0, #0x1 - ldrne r1, _020C6F3C ; =0x04000240 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r1, r0, #0x2 - ldrne r1, _020C6F40 ; =0x04000241 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r1, r0, #0x4 - ldrne r1, _020C6F44 ; =0x04000242 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r1, r0, #0x8 - ldrne r1, _020C6F48 ; =0x04000243 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r1, r0, #0x10 - ldrne r1, _020C6F4C ; =0x04000244 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r1, r0, #0x20 - ldrne r1, _020C6F50 ; =0x04000245 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r1, r0, #0x40 - ldrne r1, _020C6F54 ; =0x04000246 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r1, r0, #0x80 - ldrne r1, _020C6F58 ; =0x04000248 - movne r2, #0x80 - strneb r2, [r1, #0x0] - ands r0, r0, #0x100 - ldrne r0, _020C6F5C ; =0x04000249 - movne r1, #0x80 - strneb r1, [r0, #0x0] - bx lr - .balign 4 -_020C6F3C: .word 0x04000240 -_020C6F40: .word 0x04000241 -_020C6F44: .word 0x04000242 -_020C6F48: .word 0x04000243 -_020C6F4C: .word 0x04000244 -_020C6F50: .word 0x04000245 -_020C6F54: .word 0x04000246 -_020C6F58: .word 0x04000248 -_020C6F5C: .word 0x04000249 +.extern GX_VRAMCNT_SetLCDC_ +;GX_VRAMCNT_SetLCDC_: ; 0x020C6EA8 +; ands r1, r0, #0x1 +; ldrne r1, _020C6F3C ; =0x04000240 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r1, r0, #0x2 +; ldrne r1, _020C6F40 ; =0x04000241 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r1, r0, #0x4 +; ldrne r1, _020C6F44 ; =0x04000242 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r1, r0, #0x8 +; ldrne r1, _020C6F48 ; =0x04000243 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r1, r0, #0x10 +; ldrne r1, _020C6F4C ; =0x04000244 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r1, r0, #0x20 +; ldrne r1, _020C6F50 ; =0x04000245 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r1, r0, #0x40 +; ldrne r1, _020C6F54 ; =0x04000246 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r1, r0, #0x80 +; ldrne r1, _020C6F58 ; =0x04000248 +; movne r2, #0x80 +; strneb r2, [r1, #0x0] +; ands r0, r0, #0x100 +; ldrne r0, _020C6F5C ; =0x04000249 +; movne r1, #0x80 +; strneb r1, [r0, #0x0] +; bx lr +; .balign 4 +;_020C6F3C: .word 0x04000240 +;_020C6F40: .word 0x04000241 +;_020C6F44: .word 0x04000242 +;_020C6F48: .word 0x04000243 +;_020C6F4C: .word 0x04000244 +;_020C6F50: .word 0x04000245 +;_020C6F54: .word 0x04000246 +;_020C6F58: .word 0x04000248 +;_020C6F5C: .word 0x04000249 diff --git a/arm9/lib/include/gx.h b/arm9/lib/include/gx.h new file mode 100644 index 00000000..81138da3 --- /dev/null +++ b/arm9/lib/include/gx.h @@ -0,0 +1,116 @@ +#ifndef GUARD_GX_H +#define GUARD_GX_H + +#include "fx.h" + +//Todos before PR +//TODO: Add defines for GX commands, add structs/unions for HW registers +//TODO: Add ARM_FUNC attributes + +#define HW_REG_END_VTXS 0x04000504 +#define HW_REG_GXSTAT 0x04000600 +#define HW_REG_DISP3DCNT 0x04000060 +#define HW_REG_BG0HOFS 0x04000010 +#define HW_REG_CLEAR_COLOR 0x04000350 +#define HW_REG_CLEAR_DEPTH 0x04000354 +#define HW_REG_CLRIMAGE_OFFSET 0x04000356 +#define HW_REG_FOG_COLOR 0x04000358 +#define HW_REG_FOG_OFFSET 0x0400035C +#define HW_REG_BG0CNT 0x04000008 +#define HW_REG_POLYGON_ATTR 0x040004A4 +#define HW_REG_TEXIMAGE_PARAM 0x040004A8 +#define HW_REG_PLTT_BASE 0x040004AC + +#define HW_REG_GXFIFO 0x04000400 +#define HW_REG_MTX_IDENTITY 0x04000454 +#define HW_REG_MTX_POP 0x04000448 +#define HW_REG_MTX_MODE 0x04000440 + +#define HW_REG_CLIPMTX_RESULT 0x04000640 +#define HW_REG_VECMTX_RESULT 0x04000680 + +#define HW_REG_EDGE_COLOR 0x04000330 +#define HW_REG_FOG_TABLE 0x04000360 + +#define HW_REG_SHININESS 0x040004D0 + + +#define HW_REG_VRAMCNT_A 0x04000240 +#define HW_REG_VRAMCNT_B 0x04000241 +#define HW_REG_VRAMCNT_C 0x04000242 +#define HW_REG_VRAMCNT_D 0x04000243 +#define HW_REG_VRAMCNT_E 0x04000244 +#define HW_REG_VRAMCNT_F 0x04000245 +#define HW_REG_VRAMCNT_G 0x04000246 +#define HW_REG_WRAMCNT 0x04000247 +#define HW_REG_VRAMCNT_H 0x04000248 +#define HW_REG_VRAMCNT_I 0x04000249 + +//TODO: wait for register commit and replace these +#define SETREG8(x, y) ((*(vu8 *)x) = y) +#define SETREG16(x, y) ((*(vu16 *)x) = y) +#define SETREG32(x, y) ((*(vu32 *)x) = y) +#define SETREG64(x, y) ((*(vu64 *)x) = y) + +#define READREG8(x) (*(vu8 *)x) +#define READREG16(x) (*(vu16 *)x) +#define READREG32(x) (*(vu32 *)x) +#define READREG64(x) (*(vu64 *)x) + + +struct DL +{ + u8 *var00; //end pointer + u32 *var04; //aligned end pointer, used to write data + u8 *var08; //start pointer + u32 var0C; + u32 var10; //pad end with zero bool +}; + +//GX_g3 +void G3_BeginMakeDL(struct DL *displaylist, void *r1, u32 r2); +s32 G3_EndMakeDL(struct DL *displaylist); + +//GX_g3x +asm void GXi_NopClearFifo128_(void *reg); +void G3X_Init(); +void G3X_ResetMtxStack(); +void G3X_ClearFifo(); +void G3X_InitMtxStack(); +void G3X_ResetMtxStack_2(); +void G3X_SetFog(u32 enable, u32 alphamode, u32 depth, s32 offset); +u32 G3X_GetClipMtx(struct Mtx44 *dst); +u32 G3X_GetVectorMtx(struct Mtx33 *dst); +void G3X_SetEdgeColorTable(void *tbl_ptr); +void G3X_SetFogTable(void *tbl_ptr); +void G3X_SetClearColor(u32 col, u32 alpha, u32 depth, u32 polygon_id, u32 enable_fog); +void G3X_InitTable(); +u32 G3X_GetMtxStackLevelPV(u32 *level); +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); +void G3B_PopMtx(struct DL *displaylist, void *mtx); +void G3B_LoadMtx44(struct DL *displaylist, struct Mtx44 *mtx); +void G3B_Color(struct DL * displaylist, u32 vtx_col); +void G3B_Normal(struct DL * displaylist, fx16 x, fx16 y, fx16 z); +void G3B_Vtx(struct DL * displaylist, fx32 x, fx32 y, fx32 z); +void G3B_PolygonAttr(struct DL *displaylist, u32 r1, u32 r2, u32 r3, u32 r4, u32 r5, u32 r6); +void G3B_MaterialColorDiffAmb(struct DL *displaylist, u32 diffuse_col, u32 ambient_col, u32 replace); +void G3B_MaterialColorSpecEmi(struct DL *displaylist, u32 specular_col, u32 emission_col, u32 shiny_table); +void G3B_LightVector(struct DL * displaylist, u32 light_num, fx16 x, fx16 y, fx16 z); +void G3B_LightColor(struct DL * displaylist, u32 light_num, u32 col); +void G3B_Begin(struct DL * displaylist, u32 type); +void G3B_End(struct DL * displaylist); + +//GX_asm +void GX_SendFifo48B(void *src, void *dst); + + +//GXi_NopClearFifo128_ probably asm + +#endif //GUARD_GX_H diff --git a/arm9/lib/src/GX_asm.c b/arm9/lib/src/GX_asm.c new file mode 100644 index 00000000..1eb0a011 --- /dev/null +++ b/arm9/lib/src/GX_asm.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "main.h" +#include "gx.h" + +//looks like asm and says asm on the tin... +ARM_FUNC asm void GX_SendFifo48B(void *src, void *dst){ + ldmia r0!, {r2-r3,r12} + stmia r1, {r2-r3,r12} + ldmia r0!, {r2-r3,r12} + stmia r1, {r2-r3,r12} + ldmia r0!, {r2-r3,r12} + stmia r1, {r2-r3,r12} + ldmia r0!, {r2-r3,r12} + stmia r1, {r2-r3,r12} + bx lr +} diff --git a/arm9/lib/src/GX_g3.c b/arm9/lib/src/GX_g3.c new file mode 100644 index 00000000..66e34dc7 --- /dev/null +++ b/arm9/lib/src/GX_g3.c @@ -0,0 +1,36 @@ +#include "global.h" +#include "main.h" +#include "gx.h" + + +void G3_BeginMakeDL(struct DL *displaylist, void *r1, u32 r2){ + displaylist->var0C = r2; + displaylist->var08 = r1; + displaylist->var00 = r1; + displaylist->var04 = (u32 *)r1 + 1; + displaylist->var10 = 0x0; +} + +s32 G3_EndMakeDL(struct DL *displaylist){ + if (displaylist->var08 == displaylist->var00) + return 0; + //pads the buffer with 0 to 4byte alignment if needed + switch((u32)displaylist->var00 & 0x3) + { + case 0: + return displaylist->var00 - displaylist->var08; + case 1: + *displaylist->var00++ = 0x0; + case 2: + *displaylist->var00++ = 0x0; + case 3: + *displaylist->var00++ = 0x0; + } + if (displaylist->var10) + { + *displaylist->var04++ = 0x0; + displaylist->var10 = 0x0; + } + displaylist->var00 = (u8 *)displaylist->var04; + return displaylist->var00 - displaylist->var08; +} diff --git a/arm9/lib/src/GX_g3b.c b/arm9/lib/src/GX_g3b.c new file mode 100644 index 00000000..1e25adb5 --- /dev/null +++ b/arm9/lib/src/GX_g3b.c @@ -0,0 +1,122 @@ +#include "global.h" +#include "main.h" +#include "gx.h" + + +void MI_Copy64B(void *src, void *dst); + +void G3BS_LoadMtx44(struct DL *displaylist, struct Mtx44 *mtx){ + *(u32 *)displaylist->var00 = 0x16; + MI_Copy64B(mtx, displaylist->var04); +} + +void G3B_PushMtx(struct DL *displaylist){ + *(u32 *)displaylist->var00 = 0x11; + displaylist->var00 = (u8 *)displaylist->var04; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_PopMtx(struct DL *displaylist, void *mtx){ + *(u32 *)displaylist->var00 = 0x12; + *displaylist->var04 = (u32)mtx; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_LoadMtx44(struct DL *displaylist, struct Mtx44 *mtx){ + G3BS_LoadMtx44(displaylist, mtx); + displaylist->var00 = (u8 *)displaylist->var04 + sizeof(struct Mtx44); + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +//color format is RGB555, stored in the lower bits +void G3B_Color(struct DL * displaylist, u32 vtx_col){ + *(u32 *)displaylist->var00 = 0x20; + *displaylist->var04 = vtx_col; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +/* +Only feed normalized Vectors +only the fractional part and the sign, which is in the first nonfraction bit +since the vector is assumed to be normalized, are used +*/ +void G3B_Normal(struct DL * displaylist, fx16 x, fx16 y, fx16 z){ + *(u32 *)displaylist->var00 = 0x21; + *displaylist->var04 = ((x >> 3) & 0x3FF) | (((y >> 3) & 0x3FF) << 0xA) | (((z >> 3) & 0x3FF) << 0x14) ; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_Vtx(struct DL * displaylist, fx32 x, fx32 y, fx32 z){ + *(u32 *)displaylist->var00 = 0x23; + displaylist->var04[0] = (u32)(u16)x | (u32)(u16)y << 0x10; + displaylist->var04[1] = (u32)(u16)z; + displaylist->var00 = (u8 *)displaylist->var04 + 0x8; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +//TODO: name arguments +void G3B_PolygonAttr(struct DL *displaylist, u32 r1, u32 r2, u32 r3, u32 r4, u32 r5, u32 r6){ + *(u32 *)displaylist->var00 = 0x29; + *displaylist->var04 = r1 | r2 << 0x4 | r3 << 0x6 | r6 | r4 << 0x18 | r5 << 0x10; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_MaterialColorDiffAmb(struct DL *displaylist, u32 diffuse_col, u32 ambient_col, u32 replace){ + *(u32 *)displaylist->var00 = 0x30; + u32 replace_vtx_color_with_diffuse; + if (replace) + replace_vtx_color_with_diffuse = TRUE; + else + replace_vtx_color_with_diffuse = FALSE; + *displaylist->var04 = diffuse_col | ambient_col << 0x10 | replace_vtx_color_with_diffuse << 0xF; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_MaterialColorSpecEmi(struct DL *displaylist, u32 specular_col, u32 emission_col, u32 shiny_table){ + *(u32 *)displaylist->var00 = 0x31; + u32 enable_shininess_table; + if (shiny_table) + enable_shininess_table = TRUE; + else + enable_shininess_table = FALSE; + *displaylist->var04 = specular_col | emission_col << 0x10 | enable_shininess_table << 0xF; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +/* +Only feed normalized Vectors +only the fractional part and the sign, which is in the first nonfraction bit +since the vector is assumed to be normalized, are used +*/ +void G3B_LightVector(struct DL * displaylist, u32 light_num, fx16 x, fx16 y, fx16 z){ + *(u32 *)displaylist->var00 = 0x32; + *displaylist->var04 = ((x >> 3) & 0x3FF) | (((y >> 3) & 0x3FF) << 0xA) | (((z >> 3) & 0x3FF) << 0x14) | light_num << 0x1E; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_LightColor(struct DL * displaylist, u32 light_num, u32 col){ + *(u32 *)displaylist->var00 = 0x33; + *displaylist->var04 = col | light_num << 0x1E; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_Begin(struct DL * displaylist, u32 type){ + *(u32 *)displaylist->var00 = 0x40; + *displaylist->var04 = type; + displaylist->var00 = (u8 *)displaylist->var04 + 0x4; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} + +void G3B_End(struct DL * displaylist){ + *(u32 *)displaylist->var00 = 0x41; + displaylist->var00 = (u8 *)displaylist->var04; + displaylist->var04 = (u32 *)displaylist->var00 + 1; +} diff --git a/arm9/lib/src/GX_g3x.c b/arm9/lib/src/GX_g3x.c new file mode 100644 index 00000000..f9c2adb7 --- /dev/null +++ b/arm9/lib/src/GX_g3x.c @@ -0,0 +1,242 @@ +#include "global.h" +#include "main.h" +#include "gx.h" + +extern u32 gUnk02106814; +void MI_Copy64B(void *, void *); +void MIi_CpuCopy16(void *, void *, u32); +void GXi_NopClearFifo128_(void *); +void MI_Copy16B(void *, void *); +void MI_DmaFill32Async(u32, void *, u32, u32, u32, u32); +void MI_DmaFill32(u32, void *, u32, u32); +void MIi_CpuClear32(u32, void *, u32); + +asm void GXi_NopClearFifo128_(void *reg){ + mov r1, #0x0 + mov r2, #0x0 + mov r3, #0x0 + mov r12, #0x0 + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + stmia r0, {r1-r3,r12} + bx lr +} + +void G3X_Init(){ + G3X_ClearFifo(); + SETREG32(HW_REG_END_VTXS, 0x0); + while (READREG32(HW_REG_GXSTAT) & 0x8000000); //wait for geometry engine to not be busy + SETREG16(HW_REG_DISP3DCNT, 0x0); + SETREG32(HW_REG_GXSTAT, 0x0); + SETREG32(HW_REG_BG0HOFS, 0x0); + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) | 0x2000); + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) | 0x1000); + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) & ~0x3002); + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) & ~0x3000 | 0x10); + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) & (u16)~0x3004); + SETREG32(HW_REG_GXSTAT, READREG32(HW_REG_GXSTAT) | 0x8000); + SETREG32(HW_REG_GXSTAT, READREG32(HW_REG_GXSTAT) & ~0xC0000000 | 0x80000000); + G3X_InitMtxStack(); + SETREG32(HW_REG_CLEAR_COLOR, 0x0); + SETREG16(HW_REG_CLEAR_DEPTH, 0x7FFF); + SETREG16(HW_REG_CLRIMAGE_OFFSET, 0x0); + SETREG32(HW_REG_FOG_COLOR, 0x0); + SETREG16(HW_REG_FOG_OFFSET, 0x0); + SETREG16(HW_REG_BG0CNT, READREG16(HW_REG_BG0CNT) & ~0x3); + G3X_InitTable(); + SETREG32(HW_REG_POLYGON_ATTR, 0x1F0080); + SETREG32(HW_REG_TEXIMAGE_PARAM, 0x0); + SETREG32(HW_REG_PLTT_BASE, 0x0); +} + +void G3X_ResetMtxStack(){ + while (READREG32(HW_REG_GXSTAT) & 0x8000000); + SETREG32(HW_REG_GXSTAT, READREG32(HW_REG_GXSTAT) | 0x8000); + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) | 0x2000); + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) | 0x1000); + G3X_ResetMtxStack_2(); + SETREG32(HW_REG_POLYGON_ATTR, 0x1F0080); + SETREG32(HW_REG_TEXIMAGE_PARAM, 0x0); + SETREG32(HW_REG_PLTT_BASE, 0x0); +} + +void G3X_ClearFifo(){ + GXi_NopClearFifo128_((void *)HW_REG_GXFIFO); + while (READREG32(HW_REG_GXSTAT) & 0x8000000); +} + +void G3X_InitMtxStack(){ + u32 PV_level, PJ_level; + SETREG32(HW_REG_GXSTAT, READREG32(HW_REG_GXSTAT) | 0x8000); + while (G3X_GetMtxStackLevelPV(&PV_level)); + while (G3X_GetMtxStackLevelPJ(&PJ_level)); + SETREG32(HW_REG_MTX_MODE, 0x3); + SETREG32(HW_REG_MTX_IDENTITY, 0x0); + SETREG32(HW_REG_MTX_MODE, 0x0); + if (PJ_level) + { + SETREG32(HW_REG_MTX_POP, PJ_level); + } + SETREG32(HW_REG_MTX_IDENTITY, 0x0); + SETREG32(HW_REG_MTX_MODE, 0x2); + SETREG32(HW_REG_MTX_POP, PV_level); + SETREG32(HW_REG_MTX_IDENTITY, 0x0); +} + +void G3X_ResetMtxStack_2(){ + u32 PV_level, PJ_level; + SETREG32(HW_REG_GXSTAT, READREG32(HW_REG_GXSTAT) | 0x8000); + while (G3X_GetMtxStackLevelPV(&PV_level)); + while (G3X_GetMtxStackLevelPJ(&PJ_level)); + SETREG32(HW_REG_MTX_MODE, 0x3); + SETREG32(HW_REG_MTX_IDENTITY, 0x0); + SETREG32(HW_REG_MTX_MODE, 0x0); + if (PJ_level) + { + SETREG32(HW_REG_MTX_POP, PJ_level); + } + + SETREG32(HW_REG_MTX_MODE, 0x2); + SETREG32(HW_REG_MTX_POP, PV_level); + SETREG32(HW_REG_MTX_IDENTITY, 0x0); + +} + +void G3X_SetFog(u32 enable, u32 alphamode, u32 depth, s32 offset){ + if (enable) + { + SETREG16(HW_REG_FOG_OFFSET, offset); + SETREG16(HW_REG_DISP3DCNT, (READREG16(HW_REG_DISP3DCNT) &~0x3f40) | (((depth << 0x8)| (alphamode << 0x6)|0x80 ))); + + } + else + { + SETREG16(HW_REG_DISP3DCNT, READREG16(HW_REG_DISP3DCNT) & (u16)~0x3080); + } +} + +u32 G3X_GetClipMtx(struct Mtx44 *dst){ + if (READREG32(HW_REG_GXSTAT) & 0x8000000) + { + return -1; + } + else + { + MI_Copy64B((void *)HW_REG_CLIPMTX_RESULT, dst); + return 0; + } +} + +u32 G3X_GetVectorMtx(struct Mtx33 *dst){ + if (READREG32(HW_REG_GXSTAT) & 0x8000000) + { + return -1; + } + else + { + MI_Copy36B((void *)HW_REG_VECMTX_RESULT, dst); + return 0; + } +} + +void G3X_SetEdgeColorTable(void *tbl_ptr){ + MIi_CpuCopy16(tbl_ptr, (void *)HW_REG_EDGE_COLOR, 0x10); +} + +void G3X_SetFogTable(void *tbl_ptr){ + MI_Copy16B(tbl_ptr, (void *)HW_REG_FOG_TABLE); +} + +void G3X_SetClearColor(u32 col, u32 alpha, u32 depth, u32 polygon_id, u32 enable_fog){ + u32 temp = col | (alpha << 0x10) | (polygon_id << 0x18); + if (enable_fog) + temp |= 0x8000; + SETREG32(HW_REG_CLEAR_COLOR, temp); + SETREG16(HW_REG_CLEAR_DEPTH, depth); +} + +void G3X_InitTable(){ + if (gUnk02106814 != -1) + { + MI_DmaFill32Async(gUnk02106814, (void *)HW_REG_EDGE_COLOR, 0x0, 0x10, 0x0, 0x0); + MI_DmaFill32(gUnk02106814, (void *)HW_REG_FOG_TABLE, 0x0, 0x60); + } + else + { + MIi_CpuClear32(0x0, (void *)HW_REG_EDGE_COLOR, 0x10); + MIi_CpuClear32(0x0, (void *)HW_REG_FOG_TABLE, 0x60); + } + for (int i = 0; i < 0x20; i++) + { + SETREG32(HW_REG_SHININESS, 0x0); + } +} + +u32 G3X_GetMtxStackLevelPV(u32 *level){ + if (READREG32(HW_REG_GXSTAT) & 0x4000) + { + return -1; + } + else + { + *level = (READREG32(HW_REG_GXSTAT) & 0x1F00) >> 0x8; + return 0; + } +} + +u32 G3X_GetMtxStackLevelPJ(u32 *level){ + if (READREG32(HW_REG_GXSTAT) & 0x4000) + { + return -1; + } + else + { + *level = (READREG32(HW_REG_GXSTAT) & 0x2000) >> 0xD; + return 0; + } +} + +u32 G3X_GetBoxTestResult(u32 *result){ + if (READREG32(HW_REG_GXSTAT) & 0x1) + { + return -1; + } + else + { + *result = (READREG32(HW_REG_GXSTAT) & 0x2); + return 0; + } +} + +void G3X_SetHOffset(u32 offset){ + SETREG32(HW_REG_BG0HOFS, offset); +} diff --git a/arm9/lib/src/GX_vramcnt_c.c b/arm9/lib/src/GX_vramcnt_c.c new file mode 100644 index 00000000..50107888 --- /dev/null +++ b/arm9/lib/src/GX_vramcnt_c.c @@ -0,0 +1,24 @@ +#include "global.h" +#include "main.h" +#include "gx.h" + +void GX_VRAMCNT_SetLCDC_(u32 r0){ + if (r0 & (0x1 << 0)) + SETREG8(HW_REG_VRAMCNT_A, 0x80); + if (r0 & (0x1 << 1)) + SETREG8(HW_REG_VRAMCNT_B, 0x80); + if (r0 & (0x1 << 2)) + SETREG8(HW_REG_VRAMCNT_C, 0x80); + if (r0 & (0x1 << 3)) + SETREG8(HW_REG_VRAMCNT_D, 0x80); + if (r0 & (0x1 << 4)) + SETREG8(HW_REG_VRAMCNT_E, 0x80); + if (r0 & (0x1 << 5)) + SETREG8(HW_REG_VRAMCNT_F, 0x80); + if (r0 & (0x1 << 6)) + SETREG8(HW_REG_VRAMCNT_G, 0x80); + if (r0 & (0x1 << 7)) + SETREG8(HW_REG_VRAMCNT_H, 0x80); + if (r0 & (0x1 << 8)) + SETREG8(HW_REG_VRAMCNT_I, 0x80); +} diff --git a/arm9/undefined_syms.txt b/arm9/undefined_syms.txt index 930bffec..b5d30064 100644 --- a/arm9/undefined_syms.txt +++ b/arm9/undefined_syms.txt @@ -7,6 +7,7 @@ SDK_IRQ_STACKSIZE = 0x00000400; // FX FX_AtanTable_ = 0x02103A38; // OS +gUnk02106814 = 0x02106814; OSi_IrqCallbackInfoIndex = 0x02106818; OSi_ConsoleTypeCache = 0x02106828; // DGT |