GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / F3DDKR.cpp
CommitLineData
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
14void 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
41void 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
58void F3DDKR_DMA_Tri( u32 w0, u32 w1 )
59{
60 gSPDMATriangles( w1, _SHIFTR( w0, 4, 12 ) );
61 gSP.vertexi = 0;
62}
63
64void F3DDKR_DMA_DList( u32 w0, u32 w1 )
65{
66 gSPDMADisplayList( w1, _SHIFTR( w0, 16, 8 ) );
67}
68
69void F3DDKR_DMA_Offsets( u32 w0, u32 w1 )
70{
71 gSPSetDMAOffsets( _SHIFTR( w0, 0, 24 ), _SHIFTR( w1, 0, 24 ) );
72}
73
74void 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
91void 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