summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/arm9.lcf1
-rw-r--r--arm9/asm/GX_asm.s16
-rw-r--r--arm9/asm/GX_g3.s72
-rw-r--r--arm9/asm/GX_g3b.s269
-rw-r--r--arm9/asm/GX_g3x.s503
-rw-r--r--arm9/asm/GX_vramcnt.s98
-rw-r--r--arm9/lib/include/gx.h116
-rw-r--r--arm9/lib/src/GX_asm.c16
-rw-r--r--arm9/lib/src/GX_g3.c36
-rw-r--r--arm9/lib/src/GX_g3b.c122
-rw-r--r--arm9/lib/src/GX_g3x.c242
-rw-r--r--arm9/lib/src/GX_vramcnt_c.c24
-rw-r--r--arm9/undefined_syms.txt1
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