34cf4058 |
1 | #include "gles2N64.h" |
2 | #include "Debug.h" |
3 | #include "F3D.h" |
4 | #include "F3DDKR.h" |
5 | #include "N64.h" |
6 | #include "RSP.h" |
7 | #include "RDP.h" |
8 | #include "gSP.h" |
9 | #include "gDP.h" |
10 | #include "GBI.h" |
11 | #include "OpenGL.h" |
12 | |
13 | |
14 | void F3DDKR_DMA_Mtx( u32 w0, u32 w1 ) |
15 | { |
16 | if (_SHIFTR( w0, 0, 16 ) != 64) |
17 | { |
18 | // GBI_DetectUCode(); // Something's wrong |
19 | #ifdef DEBUG |
20 | DebugMsg( DEBUG_MEDIUM | DEBUG_HIGH | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR( w0, 0, 16 ), _SHIFTR( w0, 16, 8 ) ); |
21 | #endif |
22 | return; |
23 | } |
24 | |
25 | u32 index = _SHIFTR( w0, 16, 4 ); |
26 | u32 multiply; |
27 | |
28 | if (index == 0) // DKR |
29 | { |
30 | index = _SHIFTR( w0, 22, 2 ); |
31 | multiply = 0; |
32 | } |
33 | else // Gemini |
34 | { |
35 | multiply = _SHIFTR( w0, 23, 1 ); |
36 | } |
37 | |
38 | gSPDMAMatrix( w1, index, multiply ); |
39 | } |
40 | |
41 | void F3DDKR_DMA_Vtx( u32 w0, u32 w1 ) |
42 | { |
43 | if ((w0 & F3DDKR_VTX_APPEND)) |
44 | { |
45 | if (gSP.matrix.billboard) |
46 | gSP.vertexi = 1; |
47 | } |
48 | else |
49 | gSP.vertexi = 0; |
50 | |
51 | u32 n = _SHIFTR( w0, 19, 5 ) + 1; |
52 | |
53 | gSPDMAVertex( w1, n, gSP.vertexi + _SHIFTR( w0, 9, 5 ) ); |
54 | |
55 | gSP.vertexi += n; |
56 | } |
57 | |
58 | void F3DDKR_DMA_Tri( u32 w0, u32 w1 ) |
59 | { |
60 | gSPDMATriangles( w1, _SHIFTR( w0, 4, 12 ) ); |
61 | gSP.vertexi = 0; |
62 | } |
63 | |
64 | void F3DDKR_DMA_DList( u32 w0, u32 w1 ) |
65 | { |
66 | gSPDMADisplayList( w1, _SHIFTR( w0, 16, 8 ) ); |
67 | } |
68 | |
69 | void F3DDKR_DMA_Offsets( u32 w0, u32 w1 ) |
70 | { |
71 | gSPSetDMAOffsets( _SHIFTR( w0, 0, 24 ), _SHIFTR( w1, 0, 24 ) ); |
72 | } |
73 | |
74 | void F3DDKR_MoveWord( u32 w0, u32 w1 ) |
75 | { |
76 | switch (_SHIFTR( w0, 0, 8 )) |
77 | { |
78 | case 0x02: |
79 | gSP.matrix.billboard = w1 & 1; |
80 | break; |
81 | case 0x0A: |
82 | gSP.matrix.modelViewi = _SHIFTR( w1, 6, 2 ); |
83 | gSP.changed |= CHANGED_MATRIX; |
84 | break; |
85 | default: |
86 | F3D_MoveWord( w0, w1 ); |
87 | break; |
88 | } |
89 | } |
90 | |
91 | void F3DDKR_Init() |
92 | { |
93 | // Set GeometryMode flags |
94 | GBI_InitFlags( F3D ); |
95 | |
96 | GBI.PCStackSize = 10; |
97 | |
98 | // GBI Command Command Value Command Function |
99 | GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp ); |
100 | GBI_SetGBI( G_DMA_MTX, F3DDKR_DMA_MTX, F3DDKR_DMA_Mtx ); |
101 | GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem ); |
102 | GBI_SetGBI( G_DMA_VTX, F3DDKR_DMA_VTX, F3DDKR_DMA_Vtx ); |
103 | GBI_SetGBI( G_DL, F3D_DL, F3D_DList ); |
104 | GBI_SetGBI( G_DMA_DL, F3DDKR_DMA_DL, F3DDKR_DMA_DList ); |
105 | GBI_SetGBI( G_DMA_TRI, F3DDKR_DMA_TRI, F3DDKR_DMA_Tri ); |
106 | |
107 | GBI_SetGBI( G_DMA_OFFSETS, F3DDKR_DMA_OFFSETS, F3DDKR_DMA_Offsets ); |
108 | GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL ); |
109 | GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3DDKR_MoveWord ); |
110 | GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture ); |
111 | GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H ); |
112 | GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L ); |
113 | GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL ); |
114 | GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode ); |
115 | GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode ); |
116 | GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad ); |
117 | GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 ); |
118 | GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 ); |
119 | GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont ); |
120 | GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 ); |
121 | |
122 | gSPSetDMAOffsets( 0, 0 ); |
123 | } |
124 | |