summaryrefslogtreecommitdiff
path: root/arm9/lib/include/gx.h
blob: f3016f443a5fdb9d60db101d45f20354f01f1ea2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
#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_POWCNT1         0x04000304

#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_MASTER_BRIGHT   0x0400006C

#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

#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
#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)
#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)

//TODO: add SDK signatures and symbols
//TODO: add arm function attributes


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
};

struct VRAM_banks
{
    u16 var00; //lcdc
    u16 var02; //bg
    u16 var04; //obj
    u16 var06; //arm7
    u16 var08; //tex
    u16 var0A; //texpltt
    u16 var0C; //clearimage
    u16 var0E; //bgextpltt
    u16 var10; //objextpltt
    u16 var12; //subbg
    u16 var14; //subobj
    u16 var16; //subbgextpltt
    u16 var18; //subobjextpltt
};

//GX_g3
void G3_BeginMakeDL(struct DL *displaylist, void *r1, u32 r2);
s32 G3_EndMakeDL(struct DL *displaylist);

//GX_g3_util
void G3i_PerspectiveW_(fx32 fovsin, fx32 fovcos, fx32 ratio, fx32 near, fx32 far, fx32 scale, u32 load, struct Mtx44 *mtx);
void G3i_OrthoW_(fx32 top, fx32 bottom, fx32 left, fx32 right, fx32 near, fx32 far, fx32 scale, u32 load, struct Mtx44 *mtx);
void G3i_LookAt_(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *c, u32 load, struct Mtx44 *mtx);
void G3_RotX(fx32 sinphi, fx32 cosphi);
void G3_RotY(fx32 sinphi, fx32 cosphi);
void G3_RotZ(fx32 sinphi, fx32 cosphi);

//GX_g3x
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);

//GX_vramcnt
//some of the symbols don't match what the function does
void GX_VRAMCNT_SetLCDC_(u32 mask);
void GX_SetBankForBG(s32 bg);
void GX_SetBankForOBJ(s32 obj);
void GX_SetBankForBGExtPltt(s32 bgextpltt);
void GX_SetBankForOBJExtPltt(s32 objextpltt);
void GX_SetBankForTex(s32 tex);
void GX_SetBankForTexPltt(s32 texpltt);
void GX_SetBankForClearImage(s32 clearimage);
void GX_SetBankForARM7(s32 arm7);
void GX_SetBankForLCDC(s32 lcdc);
void GX_SetBankForSubBG(s32 subbg);
void GX_SetBankForSubOBJ(s32 subobj);
void GX_SetBankForSubBGExtPltt(s32 subbgextpltt);
void GX_SetBankForSubOBJExtPltt(s32 subobjextpltt);
u32 FUN_020C6130(u16 *ptr);
u32 GX_ResetBankForBG();
u32 GX_ResetBankForOBJ();
u32 GX_ResetBankForBGExtPltt();
u32 GX_ResetBankForOBJExtPltt();
u32 GX_ResetBankForTex();
u32 GX_ResetBankForTexPltt();
u32 GX_ResetBankForClearImage();
u32 GX_ResetBankForSubBG();
u32 FUN_020C605C();
u32 FUN_020C6034();
u32 GX_ResetBankForSubOBJ();
u32 FUN_020C5F28(u16 *ptr);
u32 disableBankForX_();
u32 GX_DisableBankForOBJExtPltt_2();
u32 GX_DisableBankForBGExtPltt();
u32 GX_DisableBankForOBJExtPltt();
u32 GX_DisableBankForTexPltt_2();
u32 GX_DisableBankForTexPltt();
u32 GX_DisableBankForClearImage();
u32 GX_DisableBankForARM7();
u32 GX_DisableBankForLCDC();
u32 GX_DisableBankForSubBGExtPltt();
u32 GX_DisableBankForSubOBJExtPltt_2();
u32 FUN_020C5E04();
u32 GX_DisableBankForSubOBJExtPltt();
u32 GX_GetBankForBGExtPltt_2();
u32 GX_GetBankForOBJ();
u32 GX_GetBankForBGExtPltt();
u32 GX_GetBankForOBJExtPltt();
u32 FUN_020C5D8C();
u32 GX_GetBankForTexPltt();
u32 GX_GetBankForLCDC();
u32 GX_GetBankForSubBGExtPltt_2();
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();

//GX_load2d
void GX_LoadBGPltt(void *src, u32 offset, u32 size);
void GXS_LoadBGPltt(void *src, u32 offset, u32 size);
void GX_LoadOBJPltt(void *src, u32 offset, u32 size);
void GXS_LoadOBJPltt(void *src, u32 offset, u32 size);
void GX_LoadOAM(void *src, u32 offset, u32 size);
void GXS_LoadOAM(void *src, u32 offset, u32 size);
void GX_LoadOBJ(void *src, u32 offset, u32 size);
void GXS_LoadOBJ(void *src, u32 offset, u32 size);
void GX_LoadBG0Scr(void *src, u32 offset, u32 size);
void GXS_LoadBG0Scr(void *src, u32 offset, u32 size);
void GX_LoadBG1Scr(void *src, u32 offset, u32 size);
void GXS_LoadBG1Scr(void *src, u32 offset, u32 size);
void GX_LoadBG2Scr(void *src, u32 offset, u32 size);
void GXS_LoadBG2Scr(void *src, u32 offset, u32 size);
void GX_LoadBG3Scr(void *src, u32 offset, u32 size);
void GXS_LoadBG3Scr(void *src, u32 offset, u32 size);
void GX_LoadBG0Char(void *src, u32 offset, u32 size);
void GXS_LoadBG0Char(void *src, u32 offset, u32 size);
void GX_LoadBG1Char(void *src, u32 offset, u32 size);
void GXS_LoadBG1Char(void *src, u32 offset, u32 size);
void GX_LoadBG2Char(void *src, u32 offset, u32 size);
void GXS_LoadBG2Char(void *src, u32 offset, u32 size);
void GX_LoadBG3Char(void *src, u32 offset, u32 size);
void GXS_LoadBG3Char(void *src, u32 offset, u32 size);
void GX_BeginLoadBGExtPltt();
void GX_LoadBGExtPltt(void *src, u32 offset, u32 size);
void GX_EndLoadBGExtPltt();
void GX_BeginLoadOBJExtPltt();
void GX_LoadOBJExtPltt(void *src, u32 offset, u32 size);
void GX_EndLoadOBJExtPltt();
void GXS_BeginLoadBGExtPltt();
void GXS_LoadBGExtPltt(void *src, u32 offset, u32 size);
void GXS_EndLoadBGExtPltt();
void GXS_BeginLoadOBJExtPltt();
void GXS_LoadOBJExtPltt(void *src, u32 offset, u32 size);
void GXS_EndLoadOBJExtPltt();

//GX_load3d
void GX_BeginLoadTex();
void GX_LoadTex(void *src, u32 offset, u32 size);
void GX_EndLoadTex();
void GX_BeginLoadTexPltt();
void GX_LoadTexPltt(void *src, u32 offset, u32 size);
void GX_EndLoadTexPltt();
void GX_BeginLoadClearImage();
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