Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/mupen64plus-video-z64/src/disasm.cpp
2 views
1
/*
2
* z64
3
*
4
* Copyright (C) 2007 ziggy
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License along
17
* with this program; if not, write to the Free Software Foundation, Inc.,
18
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
*
20
**/
21
22
#include "z64.h"
23
#include <stdio.h>
24
25
static const char *image_format[] = { "RGBA", "YUV", "CI", "IA", "I", "???", "???", "???" };
26
static const char *image_size[] = { "4-bit", "8-bit", "16-bit", "32-bit" };
27
28
static const int rdp_command_length[64] =
29
{
30
8, // 0x00, No Op
31
8, // 0x01, ???
32
8, // 0x02, ???
33
8, // 0x03, ???
34
8, // 0x04, ???
35
8, // 0x05, ???
36
8, // 0x06, ???
37
8, // 0x07, ???
38
32, // 0x08, Non-Shaded Triangle
39
32+16, // 0x09, Non-Shaded, Z-Buffered Triangle
40
32+64, // 0x0a, Textured Triangle
41
32+64+16, // 0x0b, Textured, Z-Buffered Triangle
42
32+64, // 0x0c, Shaded Triangle
43
32+64+16, // 0x0d, Shaded, Z-Buffered Triangle
44
32+64+64, // 0x0e, Shaded+Textured Triangle
45
32+64+64+16,// 0x0f, Shaded+Textured, Z-Buffered Triangle
46
8, // 0x10, ???
47
8, // 0x11, ???
48
8, // 0x12, ???
49
8, // 0x13, ???
50
8, // 0x14, ???
51
8, // 0x15, ???
52
8, // 0x16, ???
53
8, // 0x17, ???
54
8, // 0x18, ???
55
8, // 0x19, ???
56
8, // 0x1a, ???
57
8, // 0x1b, ???
58
8, // 0x1c, ???
59
8, // 0x1d, ???
60
8, // 0x1e, ???
61
8, // 0x1f, ???
62
8, // 0x20, ???
63
8, // 0x21, ???
64
8, // 0x22, ???
65
8, // 0x23, ???
66
16, // 0x24, Texture_Rectangle
67
16, // 0x25, Texture_Rectangle_Flip
68
8, // 0x26, Sync_Load
69
8, // 0x27, Sync_Pipe
70
8, // 0x28, Sync_Tile
71
8, // 0x29, Sync_Full
72
8, // 0x2a, Set_Key_GB
73
8, // 0x2b, Set_Key_R
74
8, // 0x2c, Set_Convert
75
8, // 0x2d, Set_Scissor
76
8, // 0x2e, Set_Prim_Depth
77
8, // 0x2f, Set_Other_Modes
78
8, // 0x30, Load_TLUT
79
8, // 0x31, ???
80
8, // 0x32, Set_Tile_Size
81
8, // 0x33, Load_Block
82
8, // 0x34, Load_Tile
83
8, // 0x35, Set_Tile
84
8, // 0x36, Fill_Rectangle
85
8, // 0x37, Set_Fill_Color
86
8, // 0x38, Set_Fog_Color
87
8, // 0x39, Set_Blend_Color
88
8, // 0x3a, Set_Prim_Color
89
8, // 0x3b, Set_Env_Color
90
8, // 0x3c, Set_Combine
91
8, // 0x3d, Set_Texture_Image
92
8, // 0x3e, Set_Mask_Image
93
8 // 0x3f, Set_Color_Image
94
};
95
96
int rdp_dasm(UINT32 * rdp_cmd_data, int rdp_cmd_cur, int length, char *buffer)
97
{
98
//int i;
99
int tile;
100
const char *format, *size;
101
char sl[32], tl[32], sh[32], th[32];
102
char s[32], t[32];//, w[32];
103
char dsdx[32], dtdy[32];
104
#if 0
105
char dsdx[32], dtdx[32], dwdx[32];
106
char dsdy[32], dtdy[32], dwdy[32];
107
char dsde[32], dtde[32], dwde[32];
108
char yl[32], yh[32], ym[32], xl[32], xh[32], xm[32];
109
char dxldy[32], dxhdy[32], dxmdy[32];
110
char rt[32], gt[32], bt[32], at[32];
111
char drdx[32], dgdx[32], dbdx[32], dadx[32];
112
char drdy[32], dgdy[32], dbdy[32], dady[32];
113
char drde[32], dgde[32], dbde[32], dade[32];
114
#endif
115
UINT32 r,g,b,a;
116
117
UINT32 cmd[64];
118
UINT32 command;
119
120
if (length < 8)
121
{
122
sprintf(buffer, "ERROR: length = %d\n", length);
123
return 0;
124
}
125
126
cmd[0] = rdp_cmd_data[rdp_cmd_cur+0];
127
cmd[1] = rdp_cmd_data[rdp_cmd_cur+1];
128
129
tile = (cmd[1] >> 24) & 0x7;
130
sprintf(sl, "%4.2f", (float)((cmd[0] >> 12) & 0xfff) / 4.0f);
131
sprintf(tl, "%4.2f", (float)((cmd[0] >> 0) & 0xfff) / 4.0f);
132
sprintf(sh, "%4.2f", (float)((cmd[1] >> 12) & 0xfff) / 4.0f);
133
sprintf(th, "%4.2f", (float)((cmd[1] >> 0) & 0xfff) / 4.0f);
134
135
format = image_format[(cmd[0] >> 21) & 0x7];
136
size = image_size[(cmd[0] >> 19) & 0x3];
137
138
r = (cmd[1] >> 24) & 0xff;
139
g = (cmd[1] >> 16) & 0xff;
140
b = (cmd[1] >> 8) & 0xff;
141
a = (cmd[1] >> 0) & 0xff;
142
143
command = (cmd[0] >> 24) & 0x3f;
144
//printf("command %x\n", command);
145
switch (command)
146
{
147
case 0x00: sprintf(buffer, "No Op"); break;
148
case 0x08:
149
sprintf(buffer, "Tri_NoShade (%08X %08X)", cmd[0], cmd[1]); break;
150
case 0x0a:
151
sprintf(buffer, "Tri_Tex (%08X %08X)", cmd[0], cmd[1]); break;
152
case 0x0c:
153
sprintf(buffer, "Tri_Shade (%08X %08X)", cmd[0], cmd[1]); break;
154
case 0x0e:
155
sprintf(buffer, "Tri_TexShade (%08X %08X)", cmd[0], cmd[1]); break;
156
case 0x09:
157
sprintf(buffer, "TriZ_NoShade (%08X %08X)", cmd[0], cmd[1]); break;
158
case 0x0b:
159
sprintf(buffer, "TriZ_Tex (%08X %08X)", cmd[0], cmd[1]); break;
160
case 0x0d:
161
sprintf(buffer, "TriZ_Shade (%08X %08X)", cmd[0], cmd[1]); break;
162
case 0x0f:
163
sprintf(buffer, "TriZ_TexShade (%08X %08X)", cmd[0], cmd[1]); break;
164
165
#if 0
166
case 0x08: // Tri_NoShade
167
{
168
int lft = (command >> 23) & 0x1;
169
170
if (length < rdp_command_length[command])
171
{
172
sprintf(buffer, "ERROR: Tri_NoShade length = %d\n", length);
173
return 0;
174
}
175
176
cmd[2] = rdp_cmd_data[rdp_cmd_cur+2];
177
cmd[3] = rdp_cmd_data[rdp_cmd_cur+3];
178
cmd[4] = rdp_cmd_data[rdp_cmd_cur+4];
179
cmd[5] = rdp_cmd_data[rdp_cmd_cur+5];
180
cmd[6] = rdp_cmd_data[rdp_cmd_cur+6];
181
cmd[7] = rdp_cmd_data[rdp_cmd_cur+7];
182
183
sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
184
sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
185
sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
186
sprintf(xl, "%4.4f", (float)(cmd[2] / 65536.0f));
187
sprintf(dxldy, "%4.4f", (float)(cmd[3] / 65536.0f));
188
sprintf(xh, "%4.4f", (float)(cmd[4] / 65536.0f));
189
sprintf(dxhdy, "%4.4f", (float)(cmd[5] / 65536.0f));
190
sprintf(xm, "%4.4f", (float)(cmd[6] / 65536.0f));
191
sprintf(dxmdy, "%4.4f", (float)(cmd[7] / 65536.0f));
192
193
sprintf(buffer, "Tri_NoShade %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
194
break;
195
}
196
case 0x0a: // Tri_Tex
197
{
198
int lft = (command >> 23) & 0x1;
199
200
if (length < rdp_command_length[command])
201
{
202
sprintf(buffer, "ERROR: Tri_Tex length = %d\n", length);
203
return 0;
204
}
205
206
for (i=2; i < 24; i++)
207
{
208
cmd[i] = rdp_cmd_data[rdp_cmd_cur+i];
209
}
210
211
sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
212
sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
213
sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
214
sprintf(xl, "%4.4f", (float)((INT32)cmd[2] / 65536.0f));
215
sprintf(dxldy, "%4.4f", (float)((INT32)cmd[3] / 65536.0f));
216
sprintf(xh, "%4.4f", (float)((INT32)cmd[4] / 65536.0f));
217
sprintf(dxhdy, "%4.4f", (float)((INT32)cmd[5] / 65536.0f));
218
sprintf(xm, "%4.4f", (float)((INT32)cmd[6] / 65536.0f));
219
sprintf(dxmdy, "%4.4f", (float)((INT32)cmd[7] / 65536.0f));
220
221
sprintf(s, "%4.4f", (float)(INT32)((cmd[ 8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
222
sprintf(t, "%4.4f", (float)(INT32)(((cmd[ 8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
223
sprintf(w, "%4.4f", (float)(INT32)((cmd[ 9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
224
sprintf(dsdx, "%4.4f", (float)(INT32)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
225
sprintf(dtdx, "%4.4f", (float)(INT32)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
226
sprintf(dwdx, "%4.4f", (float)(INT32)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
227
sprintf(dsde, "%4.4f", (float)(INT32)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
228
sprintf(dtde, "%4.4f", (float)(INT32)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
229
sprintf(dwde, "%4.4f", (float)(INT32)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
230
sprintf(dsdy, "%4.4f", (float)(INT32)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
231
sprintf(dtdy, "%4.4f", (float)(INT32)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
232
sprintf(dwdy, "%4.4f", (float)(INT32)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
233
234
235
buffer+=sprintf(buffer, "Tri_Tex %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
236
buffer+=sprintf(buffer, " ");
237
buffer+=sprintf(buffer, " S: %s, T: %s, W: %s\n", s, t, w);
238
buffer+=sprintf(buffer, " ");
239
buffer+=sprintf(buffer, " DSDX: %s, DTDX: %s, DWDX: %s\n", dsdx, dtdx, dwdx);
240
buffer+=sprintf(buffer, " ");
241
buffer+=sprintf(buffer, " DSDE: %s, DTDE: %s, DWDE: %s\n", dsde, dtde, dwde);
242
buffer+=sprintf(buffer, " ");
243
buffer+=sprintf(buffer, " DSDY: %s, DTDY: %s, DWDY: %s\n", dsdy, dtdy, dwdy);
244
break;
245
}
246
case 0x0c: // Tri_Shade
247
{
248
int lft = (command >> 23) & 0x1;
249
250
if (length < rdp_command_length[command])
251
{
252
sprintf(buffer, "ERROR: Tri_Shade length = %d\n", length);
253
return 0;
254
}
255
256
for (i=2; i < 24; i++)
257
{
258
cmd[i] = rdp_cmd_data[i];
259
}
260
261
sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
262
sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
263
sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
264
sprintf(xl, "%4.4f", (float)((INT32)cmd[2] / 65536.0f));
265
sprintf(dxldy, "%4.4f", (float)((INT32)cmd[3] / 65536.0f));
266
sprintf(xh, "%4.4f", (float)((INT32)cmd[4] / 65536.0f));
267
sprintf(dxhdy, "%4.4f", (float)((INT32)cmd[5] / 65536.0f));
268
sprintf(xm, "%4.4f", (float)((INT32)cmd[6] / 65536.0f));
269
sprintf(dxmdy, "%4.4f", (float)((INT32)cmd[7] / 65536.0f));
270
sprintf(rt, "%4.4f", (float)(INT32)((cmd[8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
271
sprintf(gt, "%4.4f", (float)(INT32)(((cmd[8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
272
sprintf(bt, "%4.4f", (float)(INT32)((cmd[9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
273
sprintf(at, "%4.4f", (float)(INT32)(((cmd[9] & 0xffff) << 16) | (cmd[13] & 0xffff)) / 65536.0f);
274
sprintf(drdx, "%4.4f", (float)(INT32)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
275
sprintf(dgdx, "%4.4f", (float)(INT32)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
276
sprintf(dbdx, "%4.4f", (float)(INT32)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
277
sprintf(dadx, "%4.4f", (float)(INT32)(((cmd[11] & 0xffff) << 16) | (cmd[15] & 0xffff)) / 65536.0f);
278
sprintf(drde, "%4.4f", (float)(INT32)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
279
sprintf(dgde, "%4.4f", (float)(INT32)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
280
sprintf(dbde, "%4.4f", (float)(INT32)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
281
sprintf(dade, "%4.4f", (float)(INT32)(((cmd[17] & 0xffff) << 16) | (cmd[21] & 0xffff)) / 65536.0f);
282
sprintf(drdy, "%4.4f", (float)(INT32)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
283
sprintf(dgdy, "%4.4f", (float)(INT32)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
284
sprintf(dbdy, "%4.4f", (float)(INT32)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
285
sprintf(dady, "%4.4f", (float)(INT32)(((cmd[19] & 0xffff) << 16) | (cmd[23] & 0xffff)) / 65536.0f);
286
287
buffer+=sprintf(buffer, "Tri_Shade %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
288
buffer+=sprintf(buffer, " ");
289
buffer+=sprintf(buffer, " R: %s, G: %s, B: %s, A: %s\n", rt, gt, bt, at);
290
buffer+=sprintf(buffer, " ");
291
buffer+=sprintf(buffer, " DRDX: %s, DGDX: %s, DBDX: %s, DADX: %s\n", drdx, dgdx, dbdx, dadx);
292
buffer+=sprintf(buffer, " ");
293
buffer+=sprintf(buffer, " DRDE: %s, DGDE: %s, DBDE: %s, DADE: %s\n", drde, dgde, dbde, dade);
294
buffer+=sprintf(buffer, " ");
295
buffer+=sprintf(buffer, " DRDY: %s, DGDY: %s, DBDY: %s, DADY: %s\n", drdy, dgdy, dbdy, dady);
296
break;
297
}
298
case 0x0e: // Tri_TexShade
299
{
300
int lft = (command >> 23) & 0x1;
301
302
if (length < rdp_command_length[command])
303
{
304
sprintf(buffer, "ERROR: Tri_TexShade length = %d\n", length);
305
return 0;
306
}
307
308
for (i=2; i < 40; i++)
309
{
310
cmd[i] = rdp_cmd_data[rdp_cmd_cur+i];
311
}
312
313
sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
314
sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
315
sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
316
sprintf(xl, "%4.4f", (float)((INT32)cmd[2] / 65536.0f));
317
sprintf(dxldy, "%4.4f", (float)((INT32)cmd[3] / 65536.0f));
318
sprintf(xh, "%4.4f", (float)((INT32)cmd[4] / 65536.0f));
319
sprintf(dxhdy, "%4.4f", (float)((INT32)cmd[5] / 65536.0f));
320
sprintf(xm, "%4.4f", (float)((INT32)cmd[6] / 65536.0f));
321
sprintf(dxmdy, "%4.4f", (float)((INT32)cmd[7] / 65536.0f));
322
sprintf(rt, "%4.4f", (float)(INT32)((cmd[8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
323
sprintf(gt, "%4.4f", (float)(INT32)(((cmd[8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
324
sprintf(bt, "%4.4f", (float)(INT32)((cmd[9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
325
sprintf(at, "%4.4f", (float)(INT32)(((cmd[9] & 0xffff) << 16) | (cmd[13] & 0xffff)) / 65536.0f);
326
sprintf(drdx, "%4.4f", (float)(INT32)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
327
sprintf(dgdx, "%4.4f", (float)(INT32)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
328
sprintf(dbdx, "%4.4f", (float)(INT32)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
329
sprintf(dadx, "%4.4f", (float)(INT32)(((cmd[11] & 0xffff) << 16) | (cmd[15] & 0xffff)) / 65536.0f);
330
sprintf(drde, "%4.4f", (float)(INT32)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
331
sprintf(dgde, "%4.4f", (float)(INT32)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
332
sprintf(dbde, "%4.4f", (float)(INT32)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
333
sprintf(dade, "%4.4f", (float)(INT32)(((cmd[17] & 0xffff) << 16) | (cmd[21] & 0xffff)) / 65536.0f);
334
sprintf(drdy, "%4.4f", (float)(INT32)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
335
sprintf(dgdy, "%4.4f", (float)(INT32)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
336
sprintf(dbdy, "%4.4f", (float)(INT32)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
337
sprintf(dady, "%4.4f", (float)(INT32)(((cmd[19] & 0xffff) << 16) | (cmd[23] & 0xffff)) / 65536.0f);
338
339
sprintf(s, "%4.4f", (float)(INT32)((cmd[24] & 0xffff0000) | ((cmd[28] >> 16) & 0xffff)) / 65536.0f);
340
sprintf(t, "%4.4f", (float)(INT32)(((cmd[24] & 0xffff) << 16) | (cmd[28] & 0xffff)) / 65536.0f);
341
sprintf(w, "%4.4f", (float)(INT32)((cmd[25] & 0xffff0000) | ((cmd[29] >> 16) & 0xffff)) / 65536.0f);
342
sprintf(dsdx, "%4.4f", (float)(INT32)((cmd[26] & 0xffff0000) | ((cmd[30] >> 16) & 0xffff)) / 65536.0f);
343
sprintf(dtdx, "%4.4f", (float)(INT32)(((cmd[26] & 0xffff) << 16) | (cmd[30] & 0xffff)) / 65536.0f);
344
sprintf(dwdx, "%4.4f", (float)(INT32)((cmd[27] & 0xffff0000) | ((cmd[31] >> 16) & 0xffff)) / 65536.0f);
345
sprintf(dsde, "%4.4f", (float)(INT32)((cmd[32] & 0xffff0000) | ((cmd[36] >> 16) & 0xffff)) / 65536.0f);
346
sprintf(dtde, "%4.4f", (float)(INT32)(((cmd[32] & 0xffff) << 16) | (cmd[36] & 0xffff)) / 65536.0f);
347
sprintf(dwde, "%4.4f", (float)(INT32)((cmd[33] & 0xffff0000) | ((cmd[37] >> 16) & 0xffff)) / 65536.0f);
348
sprintf(dsdy, "%4.4f", (float)(INT32)((cmd[34] & 0xffff0000) | ((cmd[38] >> 16) & 0xffff)) / 65536.0f);
349
sprintf(dtdy, "%4.4f", (float)(INT32)(((cmd[34] & 0xffff) << 16) | (cmd[38] & 0xffff)) / 65536.0f);
350
sprintf(dwdy, "%4.4f", (float)(INT32)((cmd[35] & 0xffff0000) | ((cmd[39] >> 16) & 0xffff)) / 65536.0f);
351
352
353
buffer+=sprintf(buffer, "Tri_TexShade %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
354
buffer+=sprintf(buffer, " ");
355
buffer+=sprintf(buffer, " R: %s, G: %s, B: %s, A: %s\n", rt, gt, bt, at);
356
buffer+=sprintf(buffer, " ");
357
buffer+=sprintf(buffer, " DRDX: %s, DGDX: %s, DBDX: %s, DADX: %s\n", drdx, dgdx, dbdx, dadx);
358
buffer+=sprintf(buffer, " ");
359
buffer+=sprintf(buffer, " DRDE: %s, DGDE: %s, DBDE: %s, DADE: %s\n", drde, dgde, dbde, dade);
360
buffer+=sprintf(buffer, " ");
361
buffer+=sprintf(buffer, " DRDY: %s, DGDY: %s, DBDY: %s, DADY: %s\n", drdy, dgdy, dbdy, dady);
362
363
buffer+=sprintf(buffer, " ");
364
buffer+=sprintf(buffer, " S: %s, T: %s, W: %s\n", s, t, w);
365
buffer+=sprintf(buffer, " ");
366
buffer+=sprintf(buffer, " DSDX: %s, DTDX: %s, DWDX: %s\n", dsdx, dtdx, dwdx);
367
buffer+=sprintf(buffer, " ");
368
buffer+=sprintf(buffer, " DSDE: %s, DTDE: %s, DWDE: %s\n", dsde, dtde, dwde);
369
buffer+=sprintf(buffer, " ");
370
buffer+=sprintf(buffer, " DSDY: %s, DTDY: %s, DWDY: %s\n", dsdy, dtdy, dwdy);
371
break;
372
}
373
#endif
374
case 0x24:
375
case 0x25:
376
{
377
if (length < 16)
378
{
379
sprintf(buffer, "ERROR: Texture_Rectangle length = %d\n", length);
380
return 0;
381
}
382
cmd[2] = rdp_cmd_data[rdp_cmd_cur+2];
383
cmd[3] = rdp_cmd_data[rdp_cmd_cur+3];
384
sprintf(s, "%4.4f", (float)(INT16)((cmd[2] >> 16) & 0xffff) / 32.0f);
385
sprintf(t, "%4.4f", (float)(INT16)((cmd[2] >> 0) & 0xffff) / 32.0f);
386
sprintf(dsdx, "%4.4f", (float)(INT16)((cmd[3] >> 16) & 0xffff) / 1024.0f);
387
sprintf(dtdy, "%4.4f", (float)(INT16)((cmd[3] >> 16) & 0xffff) / 1024.0f);
388
389
if (command == 0x24)
390
sprintf(buffer, "Texture_Rectangle %d, %s, %s, %s, %s, %s, %s, %s, %s", tile, sh, th, sl, tl, s, t, dsdx, dtdy);
391
else
392
sprintf(buffer, "Texture_Rectangle_Flip %d, %s, %s, %s, %s, %s, %s, %s, %s", tile, sh, th, sl, tl, s, t, dsdx, dtdy);
393
394
break;
395
}
396
case 0x26: sprintf(buffer, "Sync_Load"); break;
397
case 0x27: sprintf(buffer, "Sync_Pipe"); break;
398
case 0x28: sprintf(buffer, "Sync_Tile"); break;
399
case 0x29: sprintf(buffer, "Sync_Full"); break;
400
case 0x2d: sprintf(buffer, "Set_Scissor %s, %s, %s, %s", sl, tl, sh, th); break;
401
case 0x2e: sprintf(buffer, "Set_Prim_Depth %04X, %04X", (cmd[1] >> 16) & 0xffff, cmd[1] & 0xffff); break;
402
case 0x2f: sprintf(buffer, "Set_Other_Modes %08X %08X", cmd[0], cmd[1]); break;
403
case 0x30: sprintf(buffer, "Load_TLUT %d, %s, %s, %s, %s", tile, sl, tl, sh, th); break;
404
case 0x32: sprintf(buffer, "Set_Tile_Size %d, %s, %s, %s, %s", tile, sl, tl, sh, th); break;
405
case 0x33: sprintf(buffer, "Load_Block %d, %03X, %03X, %03X, %03X", tile, (cmd[0] >> 12) & 0xfff, cmd[0] & 0xfff, (cmd[1] >> 12) & 0xfff, cmd[1] & 0xfff); break;
406
case 0x34: sprintf(buffer, "Load_Tile %d, %s, %s, %s, %s", tile, sl, tl, sh, th); break;
407
case 0x35: sprintf(buffer, "Set_Tile %d, %s, %s, %d, %04X", tile, format, size, ((cmd[0] >> 9) & 0x1ff) * 8, (cmd[0] & 0x1ff) * 8); break;
408
case 0x36: sprintf(buffer, "Fill_Rectangle %s, %s, %s, %s", sh, th, sl, tl); break;
409
case 0x37: sprintf(buffer, "Set_Fill_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
410
case 0x38: sprintf(buffer, "Set_Fog_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
411
case 0x39: sprintf(buffer, "Set_Blend_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
412
case 0x3a: sprintf(buffer, "Set_Prim_Color %d, %d, R: %d, G: %d, B: %d, A: %d", (cmd[0] >> 8) & 0x1f, cmd[0] & 0xff, r, g, b, a); break;
413
case 0x3b: sprintf(buffer, "Set_Env_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
414
case 0x3c: sprintf(buffer, "Set_Combine %08X %08X", cmd[0], cmd[1]); break;
415
case 0x3d: sprintf(buffer, "Set_Texture_Image %s, %s, %d, %08X", format, size, (cmd[0] & 0x1ff)+1, cmd[1]); break;
416
case 0x3e: sprintf(buffer, "Set_Mask_Image %08X", cmd[1]); break;
417
case 0x3f: sprintf(buffer, "Set_Color_Image %s, %s, %d, %08X", format, size, (cmd[0] & 0x1ff)+1, cmd[1]); break;
418
default: sprintf(buffer, "??? (%08X %08X)", cmd[0], cmd[1]); break;
419
}
420
421
return rdp_command_length[command];
422
}
423
424