GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / F3DDKR.cpp
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