Glide Plugin GLES2 port from mupen64plus-ae, but with special FrameSkip code
[mupen64plus-pandora.git] / source / gles2glide64 / src / Glide64 / Combine.cpp
1 /*
2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002  Dave2001
4 * Copyright (c) 2003-2009  Sergey 'Gonetz' Lipski
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 * 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
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 //****************************************************************
22 //
23 // Glide64 - Glide Plugin for Nintendo 64 emulators
24 // Project started on December 29th, 2001
25 //
26 // Authors:
27 // Dave2001, original author, founded the project in 2001, left it in 2002
28 // Gugaman, joined the project in 2002, left it in 2002
29 // Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002
30 // Hiroshi 'KoolSmoky' Morii, joined the project in 2007
31 //
32 //****************************************************************
33 //
34 // To modify Glide64:
35 // * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
36 // * Do NOT send me the whole project or file that you modified.  Take out your modified code sections, and tell me where to put them.  If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
37 //
38 //****************************************************************
39
40 #include "Gfx_1.3.h"
41 #include "Util.h"
42 #include "Combine.h"
43
44 #define FASTSEARCH  // Enable fast combine mode searching algorithm
45
46 float percent_org, percent, r, g, b;
47 wxUint32 lod_frac;
48
49 wxUint32 cc_lookup[257];
50 wxUint32 ac_lookup[257];
51 COMBINE cmb;
52
53 //****************************************************************
54 // Macros
55 //****************************************************************
56
57 #define MOD_0(mode)     cmb.mod_0 = mode
58 #define MOD_0_COL(color)  cmb.modcolor_0 = color
59 #define MOD_0_COL1(color) cmb.modcolor1_0 = color
60 #define MOD_0_COL2(color) cmb.modcolor2_0 = color
61 #define MOD_0_FAC(factor) cmb.modfactor_0 = factor
62 #define MOD_1(mode)     cmb.mod_1 = mode
63 #define MOD_1_COL(color)  cmb.modcolor_1 = color
64 #define MOD_1_COL1(color) cmb.modcolor1_1 = color
65 #define MOD_1_COL2(color) cmb.modcolor2_1 = color
66 #define MOD_1_FAC(factor) cmb.modfactor_1 = factor
67
68 #define A_BLEND(f1,f2) cmb.abf1=f1,cmb.abf2=f2
69
70 // To make a color or alpha combine
71 #define CCMB(fnc,fac,loc,oth) \
72   cmb.c_fnc = fnc, \
73   cmb.c_fac = fac, \
74   cmb.c_loc = loc, \
75   cmb.c_oth = oth
76 #define ACMB(fnc,fac,loc,oth) \
77   cmb.a_fnc = fnc, \
78   cmb.a_fac = fac, \
79   cmb.a_loc = loc, \
80   cmb.a_oth = oth
81 #define CCMBEXT(a,a_mode,b,b_mode,c,c_invert,d,d_invert) \
82   cmb.c_ext_a = a, \
83   cmb.c_ext_a_mode = a_mode, \
84   cmb.c_ext_b = b, \
85   cmb.c_ext_b_mode = b_mode, \
86   cmb.c_ext_c = c, \
87   cmb.c_ext_c_invert = c_invert, \
88   cmb.c_ext_d= d, \
89   cmb.c_ext_d_invert = d_invert, \
90   cmb.cmb_ext_use |= COMBINE_EXT_COLOR
91 #define ACMBEXT(a,a_mode,b,b_mode,c,c_invert,d,d_invert) \
92   cmb.a_ext_a = a, \
93   cmb.a_ext_a_mode = a_mode, \
94   cmb.a_ext_b = b, \
95   cmb.a_ext_b_mode = b_mode, \
96   cmb.a_ext_c = c, \
97   cmb.a_ext_c_invert = c_invert, \
98   cmb.a_ext_d= d, \
99   cmb.a_ext_d_invert = d_invert, \
100   cmb.cmb_ext_use |= COMBINE_EXT_ALPHA
101 #define T0CCMBEXT(a,a_mode,b,b_mode,c,c_invert,d,d_invert) \
102   cmb.t0c_ext_a = a, \
103   cmb.t0c_ext_a_mode = a_mode, \
104   cmb.t0c_ext_b = b, \
105   cmb.t0c_ext_b_mode = b_mode, \
106   cmb.t0c_ext_c = c, \
107   cmb.t0c_ext_c_invert = c_invert, \
108   cmb.t0c_ext_d= d, \
109   cmb.t0c_ext_d_invert = d_invert, \
110   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR
111 #define T0ACMBEXT(a,a_mode,b,b_mode,c,c_invert,d,d_invert) \
112   cmb.t0a_ext_a = a, \
113   cmb.t0a_ext_a_mode = a_mode, \
114   cmb.t0a_ext_b = b, \
115   cmb.t0a_ext_b_mode = b_mode, \
116   cmb.t0a_ext_c = c, \
117   cmb.t0a_ext_c_invert = c_invert, \
118   cmb.t0a_ext_d= d, \
119   cmb.t0a_ext_d_invert = d_invert, \
120   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_ALPHA
121 #define T1CCMBEXT(a,a_mode,b,b_mode,c,c_invert,d,d_invert) \
122   cmb.t1c_ext_a = a, \
123   cmb.t1c_ext_a_mode = a_mode, \
124   cmb.t1c_ext_b = b, \
125   cmb.t1c_ext_b_mode = b_mode, \
126   cmb.t1c_ext_c = c, \
127   cmb.t1c_ext_c_invert = c_invert, \
128   cmb.t1c_ext_d= d, \
129   cmb.t1c_ext_d_invert = d_invert, \
130   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR
131 #define T1ACMBEXT(a,a_mode,b,b_mode,c,c_invert,d,d_invert) \
132   cmb.t1a_ext_a = a, \
133   cmb.t1a_ext_a_mode = a_mode, \
134   cmb.t1a_ext_b = b, \
135   cmb.t1a_ext_b_mode = b_mode, \
136   cmb.t1a_ext_c = c, \
137   cmb.t1a_ext_c_invert = c_invert, \
138   cmb.t1a_ext_d= d, \
139   cmb.t1a_ext_d_invert = d_invert, \
140   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_ALPHA
141
142 // To use textures
143 #define USE_T0() \
144   rdp.best_tex = 0; \
145   cmb.tex |= 1, \
146   cmb.tmu0_func = GR_COMBINE_FUNCTION_LOCAL
147 #define USE_T1() \
148   if (voodoo.num_tmu > 1) { \
149   rdp.best_tex = 1; \
150   cmb.tex |= 2, \
151   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
152   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER, \
153   cmb.tmu0_fac = GR_COMBINE_FACTOR_ONE; \
154   } \
155   else { \
156   USE_T0(); \
157 }
158 #define T0_ADD_T1() \
159   rdp.best_tex = 0; \
160   cmb.tex |= 3, \
161   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
162   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
163   cmb.tmu0_fac = GR_COMBINE_FACTOR_ONE
164 #define T0_MUL_T1() \
165   rdp.best_tex = 0; \
166   cmb.tex |= 3, \
167   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
168   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER, \
169   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL
170 #define T0_MUL_T1_ADD_T0() \
171   rdp.best_tex = 0; \
172   cmb.tex |= 3, \
173   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
174   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
175   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL
176 #define T0A_MUL_T1() \
177   rdp.best_tex = 1; \
178   cmb.tex |= 3, \
179   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
180   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER, \
181   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL_ALPHA
182 #define T0_MUL_T1A() \
183   rdp.best_tex = 1; \
184   cmb.tex |= 3, \
185   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL_ALPHA, \
186   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER, \
187   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL
188 #define T0_INTER_T1_USING_FACTOR(factor) \
189   if (factor == 0xFF) { \
190   USE_T1(); \
191   } \
192   else if (factor == 0x00) { \
193   USE_T0(); \
194 }\
195   else {\
196   if (factor <= 0x80) rdp.best_tex = 0; \
197   else rdp.best_tex = 1; \
198   cmb.tex |= 3, \
199   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
200   cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND, \
201   cmb.tmu0_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
202   percent = (float)factor / 255.0f, \
203   cmb.dc0_detailmax = cmb.dc1_detailmax = percent; \
204 }
205 #define T1_INTER_T0_USING_FACTOR(factor)  /* inverse of above */\
206   if (factor == 0xFF) { \
207   USE_T0(); \
208   } \
209   else if (factor == 0x00) { \
210   USE_T1(); \
211 }\
212   else {\
213   if (factor <= 0x80) rdp.best_tex = 0; \
214   else rdp.best_tex = 1; \
215   cmb.tex |= 3, \
216   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
217   cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND, \
218   cmb.tmu0_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
219   percent = (255 - factor) / 255.0f, \
220   cmb.dc0_detailmax = cmb.dc1_detailmax = percent; \
221 }
222 #define T0_INTER_T1_USING_T0() \
223   rdp.best_tex = 0; \
224   cmb.tex |= 3, \
225   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
226   cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND, \
227   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL
228 #define T1_INTER_T0_USING_T0() \
229   rdp.best_tex = 0; \
230   cmb.tex |= 3, \
231   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
232   cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND, \
233   cmb.tmu0_fac = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL
234 #define T0_INTER_T1_USING_T1() \
235   if (!cmb.combine_ext) { \
236   T0_INTER_T1_USING_FACTOR(0x7F); \
237   }\
238   else {\
239   rdp.best_tex = 0; \
240   cmb.tex |= 3, \
241   cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
242   cmb.t1c_ext_a_mode = GR_FUNC_MODE_ZERO, \
243   cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
244   cmb.t1c_ext_b_mode = GR_FUNC_MODE_ZERO, \
245   cmb.t1c_ext_c = GR_CMBX_ZERO, \
246   cmb.t1c_ext_c_invert = 0, \
247   cmb.t1c_ext_d= GR_CMBX_B, \
248   cmb.t1c_ext_d_invert = 0, \
249   cmb.t0c_ext_a = GR_CMBX_OTHER_TEXTURE_RGB, \
250   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
251   cmb.t0c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
252   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
253   cmb.t0c_ext_c = GR_CMBX_OTHER_TEXTURE_RGB, \
254   cmb.t0c_ext_c_invert = 0, \
255   cmb.t0c_ext_d= GR_CMBX_B, \
256   cmb.t0c_ext_d_invert = 0, \
257   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
258 }
259 #define T0_INTER_T1_USING_T1A() \
260   rdp.best_tex = 0; \
261   cmb.tex |= 3, \
262   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
263   cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND, \
264   cmb.tmu0_fac = GR_COMBINE_FACTOR_OTHER_ALPHA
265 #define T0_INTER_T1_USING_PRIM() \
266   if (!cmb.combine_ext) { \
267   T0_INTER_T1_USING_FACTOR ((rdp.prim_color&0xFF)); \
268   }\
269   else {\
270   rdp.best_tex = 0; \
271   cmb.tex |= 3, \
272   cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
273   cmb.t1c_ext_a_mode = GR_FUNC_MODE_ZERO, \
274   cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
275   cmb.t1c_ext_b_mode = GR_FUNC_MODE_ZERO, \
276   cmb.t1c_ext_c = GR_CMBX_ZERO, \
277   cmb.t1c_ext_c_invert = 0, \
278   cmb.t1c_ext_d= GR_CMBX_B, \
279   cmb.t1c_ext_d_invert = 0, \
280   cmb.t0c_ext_a = GR_CMBX_OTHER_TEXTURE_RGB, \
281   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
282   cmb.t0c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
283   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
284   cmb.t0c_ext_c = GR_CMBX_TMU_CCOLOR, \
285   cmb.t0c_ext_c_invert = 0, \
286   cmb.t0c_ext_d= GR_CMBX_B, \
287   cmb.t0c_ext_d_invert = 0, \
288   cmb.tex_ccolor = rdp.prim_color, \
289   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
290 }
291 #define T1_INTER_T0_USING_PRIM() /* inverse of above */\
292   if (!cmb.combine_ext) { \
293   T1_INTER_T0_USING_FACTOR ((rdp.prim_color&0xFF)); \
294   }\
295   else {\
296   rdp.best_tex = 0; \
297   cmb.tex |= 3, \
298   cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
299   cmb.t1c_ext_a_mode = GR_FUNC_MODE_ZERO, \
300   cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
301   cmb.t1c_ext_b_mode = GR_FUNC_MODE_ZERO, \
302   cmb.t1c_ext_c = GR_CMBX_ZERO, \
303   cmb.t1c_ext_c_invert = 0, \
304   cmb.t1c_ext_d= GR_CMBX_B, \
305   cmb.t1c_ext_d_invert = 0, \
306   cmb.t0c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
307   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
308   cmb.t0c_ext_b = GR_CMBX_OTHER_TEXTURE_RGB, \
309   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
310   cmb.t0c_ext_c = GR_CMBX_TMU_CCOLOR, \
311   cmb.t0c_ext_c_invert = 0, \
312   cmb.t0c_ext_d= GR_CMBX_B, \
313   cmb.t0c_ext_d_invert = 0, \
314   cmb.tex_ccolor = rdp.prim_color, \
315   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
316 }
317 #define T0_INTER_T1_USING_ENV() \
318   if (!cmb.combine_ext) { \
319   T0_INTER_T1_USING_FACTOR ((rdp.env_color&0xFF)); \
320   }\
321   else {\
322   rdp.best_tex = 0; \
323   cmb.tex |= 3, \
324   cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
325   cmb.t1c_ext_a_mode = GR_FUNC_MODE_ZERO, \
326   cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
327   cmb.t1c_ext_b_mode = GR_FUNC_MODE_ZERO, \
328   cmb.t1c_ext_c = GR_CMBX_ZERO, \
329   cmb.t1c_ext_c_invert = 0, \
330   cmb.t1c_ext_d= GR_CMBX_B, \
331   cmb.t1c_ext_d_invert = 0, \
332   cmb.t0c_ext_a = GR_CMBX_OTHER_TEXTURE_RGB, \
333   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
334   cmb.t0c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
335   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
336   cmb.t0c_ext_c = GR_CMBX_TMU_CCOLOR, \
337   cmb.t0c_ext_c_invert = 0, \
338   cmb.t0c_ext_d= GR_CMBX_B, \
339   cmb.t0c_ext_d_invert = 0, \
340   cmb.tex_ccolor = rdp.env_color, \
341   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
342 }
343 #define T1_INTER_T0_USING_ENV() /* inverse of above */\
344   if (!cmb.combine_ext) { \
345   T1_INTER_T0_USING_FACTOR ((rdp.env_color&0xFF)); \
346   }\
347   else {\
348   rdp.best_tex = 0; \
349   cmb.tex |= 3, \
350   cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
351   cmb.t1c_ext_a_mode = GR_FUNC_MODE_ZERO, \
352   cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
353   cmb.t1c_ext_b_mode = GR_FUNC_MODE_ZERO, \
354   cmb.t1c_ext_c = GR_CMBX_ZERO, \
355   cmb.t1c_ext_c_invert = 0, \
356   cmb.t1c_ext_d= GR_CMBX_B, \
357   cmb.t1c_ext_d_invert = 0, \
358   cmb.t0c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
359   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
360   cmb.t0c_ext_b = GR_CMBX_OTHER_TEXTURE_RGB, \
361   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
362   cmb.t0c_ext_c = GR_CMBX_TMU_CCOLOR, \
363   cmb.t0c_ext_c_invert = 0, \
364   cmb.t0c_ext_d= GR_CMBX_B, \
365   cmb.t0c_ext_d_invert = 0, \
366   cmb.tex_ccolor = rdp.env_color, \
367   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
368 }
369 #define T0_INTER_T1_USING_SHADEA() \
370   if (!cmb.combine_ext) { \
371   T0_INTER_T1_USING_FACTOR (0x7F); \
372   }\
373   else {\
374   rdp.best_tex = 0; \
375   cmb.tex |= 3, \
376   cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
377   cmb.t1c_ext_a_mode = GR_FUNC_MODE_ZERO, \
378   cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
379   cmb.t1c_ext_b_mode = GR_FUNC_MODE_ZERO, \
380   cmb.t1c_ext_c = GR_CMBX_ZERO, \
381   cmb.t1c_ext_c_invert = 0, \
382   cmb.t1c_ext_d= GR_CMBX_B, \
383   cmb.t1c_ext_d_invert = 0, \
384   cmb.t0c_ext_a = GR_CMBX_OTHER_TEXTURE_RGB, \
385   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
386   cmb.t0c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
387   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
388   cmb.t0c_ext_c = GR_CMBX_ITALPHA, \
389   cmb.t0c_ext_c_invert = 0, \
390   cmb.t0c_ext_d= GR_CMBX_B, \
391   cmb.t0c_ext_d_invert = 0, \
392   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
393 }
394 #define T1_INTER_T0_USING_SHADEA() \
395   if (!cmb.combine_ext) { \
396   T0_INTER_T1_USING_FACTOR (0x7F); \
397   }\
398   else {\
399   rdp.best_tex = 0; \
400   cmb.tex |= 3, \
401   cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
402   cmb.t1c_ext_a_mode = GR_FUNC_MODE_ZERO, \
403   cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB, \
404   cmb.t1c_ext_b_mode = GR_FUNC_MODE_ZERO, \
405   cmb.t1c_ext_c = GR_CMBX_ZERO, \
406   cmb.t1c_ext_c_invert = 0, \
407   cmb.t1c_ext_d= GR_CMBX_B, \
408   cmb.t1c_ext_d_invert = 0, \
409   cmb.t0c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
410   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
411   cmb.t0c_ext_b = GR_CMBX_OTHER_TEXTURE_RGB, \
412   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
413   cmb.t0c_ext_c = GR_CMBX_ITALPHA, \
414   cmb.t0c_ext_c_invert = 0, \
415   cmb.t0c_ext_d= GR_CMBX_B, \
416   cmb.t0c_ext_d_invert = 0, \
417   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
418 }
419 #define T1_SUB_T0() \
420   rdp.best_tex = 0; \
421   cmb.tex |= 3, \
422   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
423   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, \
424   cmb.tmu0_fac = GR_COMBINE_FACTOR_ONE
425 #define T1_SUB_T0_MUL_T0() \
426   rdp.best_tex = 0; \
427   cmb.tex |= 3, \
428   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
429   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, \
430   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL
431 #define T1_MUL_PRIMLOD_ADD_T0() \
432   rdp.best_tex = 0; \
433   cmb.tex |= 3, \
434   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
435   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
436   cmb.tmu0_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
437   percent = (float)(lod_frac) / 255.0f, \
438   cmb.dc0_detailmax = cmb.dc1_detailmax = percent
439 #define T1_MUL_PRIMA_ADD_T0() \
440   rdp.best_tex = 0; \
441   cmb.tex |= 3, \
442   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
443   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
444   cmb.tmu0_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
445   percent = (float)(rdp.prim_color&0xFF) / 255.0f, \
446   cmb.dc0_detailmax = cmb.dc1_detailmax = percent
447 #define T1_MUL_ENVA_ADD_T0() \
448   rdp.best_tex = 0; \
449   cmb.tex |= 3, \
450   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL, \
451   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
452   cmb.tmu0_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
453   percent = (float)(rdp.env_color&0xFF) / 255.0f, \
454   cmb.dc0_detailmax = cmb.dc1_detailmax = percent
455 #define T0_SUB_PRIM_MUL_PRIMLOD_ADD_T1() \
456   T0_ADD_T1 (); \
457   MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC); \
458   MOD_0_COL (rdp.prim_color & 0xFFFFFF00); \
459   MOD_0_FAC (lod_frac & 0xFF);
460 #define T1_SUB_PRIM_MUL_PRIMLOD_ADD_T0() \
461   if (cmb.combine_ext) \
462 { \
463   T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X, \
464   GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X, \
465   GR_CMBX_DETAIL_FACTOR, 0, \
466   GR_CMBX_ZERO, 0); \
467   T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X, \
468   GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X, \
469   GR_CMBX_ZERO, 1, \
470   GR_CMBX_ZERO, 0); \
471   cmb.tex_ccolor = rdp.prim_color; \
472   cmb.tex |= 3; \
473   percent = (float)(lod_frac) / 255.0f; \
474   cmb.dc0_detailmax = cmb.dc1_detailmax = percent; \
475 } \
476   else \
477 {  \
478   T0_ADD_T1 (); \
479   MOD_1 (TMOD_TEX_SUB_COL_MUL_FAC); \
480   MOD_1_COL (rdp.prim_color & 0xFFFFFF00); \
481   MOD_1_FAC (lod_frac & 0xFF); \
482 }
483 #define PRIM_INTER_T0_USING_SHADEA() \
484   if (!cmb.combine_ext) { \
485   USE_T0 (); \
486   }\
487   else {\
488   rdp.best_tex = 0; \
489   cmb.tex |= 1, \
490   cmb.t0c_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB, \
491   cmb.t0c_ext_a_mode = GR_FUNC_MODE_X, \
492   cmb.t0c_ext_b = GR_CMBX_TMU_CCOLOR, \
493   cmb.t0c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
494   cmb.t0c_ext_c = GR_CMBX_ITALPHA, \
495   cmb.t0c_ext_c_invert = 0, \
496   cmb.t0c_ext_d= GR_CMBX_B, \
497   cmb.t0c_ext_d_invert = 0, \
498   cmb.tex_ccolor = rdp.prim_color, \
499   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_COLOR; \
500 }
501
502 #define A_USE_T0() \
503   cmb.tex |= 1, \
504   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_LOCAL
505 #define A_USE_T1() \
506   if (voodoo.num_tmu > 1) { \
507   cmb.tex |= 2, \
508   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
509   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER, \
510   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_ONE; \
511   } \
512   else { \
513   A_USE_T0(); \
514 }
515 #define A_T0_ADD_T1() \
516   cmb.tex |= 3, \
517   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
518   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
519   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_ONE
520 #define A_T1_SUB_T0() \
521   cmb.tex |= 3, \
522   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
523   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, \
524   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_ONE
525 #define A_T0_SUB_T1() \
526   cmb.tex |= 3, \
527   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
528   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_BLEND_LOCAL, \
529   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_OTHER_ALPHA
530 #define A_T0_MUL_T1() \
531   cmb.tex |= 3, \
532   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
533   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER, \
534   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_LOCAL
535 #define A_T0_INTER_T1_USING_T0A() \
536   rdp.best_tex = 0; \
537   cmb.tex |= 3, \
538   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
539   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_BLEND, \
540   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_LOCAL_ALPHA
541 #define A_T1_INTER_T0_USING_T0A() \
542   rdp.best_tex = 0; \
543   cmb.tex |= 3, \
544   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
545   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_BLEND, \
546   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA
547 #define A_T0_INTER_T1_USING_T1A() \
548   rdp.best_tex = 0; \
549   cmb.tex |= 3, \
550   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
551   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_BLEND, \
552   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_OTHER_ALPHA
553 #define A_T0_INTER_T1_USING_FACTOR(factor) \
554   if (factor == 0xFF) { \
555   A_USE_T1(); \
556   } \
557   else if (factor == 0x00) { \
558   A_USE_T0(); \
559 }\
560   else { \
561   cmb.tex |= 3, \
562   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
563   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_BLEND, \
564   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
565   percent = (float)factor / 255.0f, \
566   cmb.dc0_detailmax = cmb.dc1_detailmax = percent; \
567 }
568 #define A_T1_INTER_T0_USING_FACTOR(factor) /* inverse of above */\
569   if (factor == 0xFF) { \
570   A_USE_T0(); \
571   } \
572   else if (factor == 0x00) { \
573   A_USE_T1(); \
574 }\
575   else { \
576   cmb.tex |= 3, \
577   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
578   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_BLEND, \
579   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
580   percent = (255 - factor) / 255.0f, \
581   cmb.dc0_detailmax = cmb.dc1_detailmax = percent; \
582 }
583 #define A_T0_INTER_T1_USING_SHADEA() \
584   if (!cmb.combine_ext) { \
585   A_T0_INTER_T1_USING_FACTOR (0x7F); \
586   }\
587   else {\
588   rdp.best_tex = 0; \
589   cmb.tex |= 3, \
590   cmb.t1a_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA, \
591   cmb.t1a_ext_a_mode = GR_FUNC_MODE_ZERO, \
592   cmb.t1a_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA, \
593   cmb.t1a_ext_b_mode = GR_FUNC_MODE_ZERO, \
594   cmb.t1a_ext_c = GR_CMBX_ZERO, \
595   cmb.t1a_ext_c_invert = 0, \
596   cmb.t1a_ext_d= GR_CMBX_B, \
597   cmb.t1a_ext_d_invert = 0, \
598   cmb.t0a_ext_a = GR_CMBX_OTHER_TEXTURE_ALPHA, \
599   cmb.t0a_ext_a_mode = GR_FUNC_MODE_X, \
600   cmb.t0a_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA, \
601   cmb.t0a_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X, \
602   cmb.t0a_ext_c = GR_CMBX_ITALPHA, \
603   cmb.t0a_ext_c_invert = 0, \
604   cmb.t0a_ext_d= GR_CMBX_B, \
605   cmb.t0a_ext_d_invert = 0, \
606   cmb.tex_cmb_ext_use |= TEX_COMBINE_EXT_ALPHA; \
607 }
608 #define A_T1_MUL_PRIMLOD_ADD_T0() \
609   rdp.best_tex = 0; \
610   cmb.tex |= 3, \
611   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
612   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
613   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
614   percent = (float)(lod_frac) / 255.0f, \
615   cmb.dc0_detailmax = cmb.dc1_detailmax = percent
616 #define A_T1_MUL_PRIMA_ADD_T0() \
617   rdp.best_tex = 0; \
618   cmb.tex |= 3, \
619   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
620   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
621   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
622   percent = (float)(rdp.prim_color&0xFF) / 255.0f, \
623   cmb.dc0_detailmax = cmb.dc1_detailmax = percent
624 #define A_T1_MUL_ENVA_ADD_T0() \
625   rdp.best_tex = 0; \
626   cmb.tex |= 3, \
627   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL, \
628   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, \
629   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR, \
630   percent = (float)(rdp.env_color&0xFF) / 255.0f, \
631   cmb.dc0_detailmax = cmb.dc1_detailmax = percent
632
633
634 // UNIMP - writes to the unimplemented log, if it's enabled
635 #ifdef UNIMP_LOG
636 #define UNIMPMODE() { \
637   std::ofstream unimp; \
638   unimp.open("unimp.txt", std::ios::app); \
639   unimp << out_buf; \
640   unimp.close(); \
641 }
642 #else
643 #define UNIMPMODE()
644 #endif
645
646 // Bright red, sets up a bright red combine
647 #ifdef BRIGHT_RED
648 // Bright red, sets up a bright red combine during the alpha stage
649 #define BrightRed() { \
650   CCMB (GR_COMBINE_FUNCTION_LOCAL, \
651   GR_COMBINE_FACTOR_NONE, \
652   GR_COMBINE_LOCAL_CONSTANT, \
653   GR_COMBINE_OTHER_NONE); \
654   ACMB (GR_COMBINE_FUNCTION_LOCAL, \
655   GR_COMBINE_FACTOR_NONE, \
656   GR_COMBINE_LOCAL_CONSTANT, \
657   GR_COMBINE_OTHER_NONE); \
658   cmb.ccolor = 0xFF0000FF; \
659 }
660 #else
661 #define BrightRed()
662 #endif
663
664 #define CC(color) cmb.ccolor=(color)&0xFFFFFF00
665 #define CC_BYTE(byte) { cmb.ccolor=(byte<<8)|(byte<<16)|(byte<<24); }
666 #define CC_C1MULC2(color1, color2) { \
667   cmb.ccolor=(wxUint8)( ((color1 & 0xFF000000) >> 24) * (((color2 & 0xFF000000) >> 24) /255.0f) ) <<  24 | \
668   (wxUint8)( ((color1 & 0x00FF0000) >> 16) * (((color2 & 0x00FF0000) >> 16) /255.0f) ) <<  16 | \
669   (wxUint8)( ((color1 & 0x0000FF00) >>  8) * (((color2 & 0x0000FF00) >>  8) /255.0f) ) <<   8 ; \
670 }
671 #define CC_C1SUBC2(color1, color2) { \
672   cmb.ccolor=(wxUint8)( max(0, (int)((color1 & 0xFF000000) >> 24) - (int)((color2 & 0xFF000000) >> 24)) ) << 24 | \
673   (wxUint8)( max(0, (int)((color1 & 0x00FF0000) >> 16) - (int)((color2 & 0x00FF0000) >> 16)) ) << 16 | \
674   (wxUint8)( max(0, (int)((color1 & 0x0000FF00) >>  8) - (int)((color2 & 0x0000FF00) >>  8)) ) <<  8 ; \
675 }
676 #define CC_COLMULBYTE(color, byte) { \
677     float factor = byte/255.0f; \
678     cmb.ccolor = (wxUint8)( ((color & 0xFF000000) >> 24) * factor ) <<  24 | \
679       (wxUint8)( ((color & 0x00FF0000) >> 16) * factor ) <<  16 | \
680       (wxUint8)( ((color & 0x0000FF00) >>  8) * factor ) <<   8 ; \
681 }
682 #define CC_PRIM() CC(rdp.prim_color)
683 #define CC_ENV() CC(rdp.env_color)
684 #define CC_1SUBPRIM() CC((~rdp.prim_color))
685 #define CC_1SUBENV() CC((~rdp.env_color))
686 #define CC_PRIMA() CC_BYTE((rdp.prim_color&0xFF))
687 #define CC_ENVA() CC_BYTE((rdp.env_color&0xFF))
688 #define CC_1SUBPRIMA() CC_BYTE(((~rdp.prim_color)&0xFF))
689 #define CC_1SUBENVA() CC_BYTE(((~rdp.env_color)&0xFF))
690 #define CC_PRIMLOD() CC_BYTE(rdp.prim_lodfrac)
691 #define CC_K5() CC_BYTE(rdp.K5)
692 #define CC_PRIMMULENV() CC_C1MULC2(rdp.prim_color, rdp.env_color)
693 #define CC_PRIMSUBENV() CC_C1SUBC2(rdp.prim_color, rdp.env_color)
694
695 #define XSHADE(color, flag) { \
696   rdp.col[0] *= (float)((color & 0xFF000000) >> 24) / 255.0f; \
697   rdp.col[1] *= (float)((color & 0x00FF0000) >> 16) / 255.0f; \
698   rdp.col[2] *= (float)((color & 0x0000FF00) >> 8) / 255.0f; \
699   rdp.cmb_flags |= flag; \
700 }
701 #define XSHADE1M(color, flag) { \
702   rdp.col[0] *= 1.0f-((float)((color & 0xFF000000) >> 24)/255.0f); \
703   rdp.col[1] *= 1.0f-((float)((color & 0x00FF0000) >> 16)/255.0f); \
704   rdp.col[2] *= 1.0f-((float)((color & 0x0000FF00) >> 8)/255.0f); \
705   rdp.cmb_flags |= flag; \
706 }
707 #define XSHADEC1MC2(color1, color2, flag) { \
708   rdp.col[0] *= (float)( max(0, (int)((color1 & 0xFF000000) >> 24) - (int)((color2 & 0xFF000000) >> 24)) )/255.0f; \
709   rdp.col[1] *= (float)( max(0, (int)((color1 & 0x00FF0000) >> 16) - (int)((color2 & 0x00FF0000) >> 16)) )/255.0f; \
710   rdp.col[2] *= (float)( max(0, (int)((color1 & 0x0000FF00) >> 8)  - (int)((color2 & 0x0000FF00) >> 8)) )/255.0f; \
711   rdp.cmb_flags |= flag; \
712 }
713 #define XSHADE_BYTE(byte, flag) { \
714   float tmpcol = (float)byte / 255.0f; \
715   rdp.col[0] *= tmpcol; \
716   rdp.col[1] *= tmpcol; \
717   rdp.col[2] *= tmpcol; \
718   rdp.cmb_flags |= flag; \
719 }
720 #define MULSHADE(color) XSHADE(color, CMB_MULT)
721 #define MULSHADE_PRIM() MULSHADE(rdp.prim_color)
722 #define MULSHADE_ENV() MULSHADE(rdp.env_color)
723 #define MULSHADE_1MPRIM() XSHADE1M(rdp.prim_color, CMB_MULT)
724 #define MULSHADE_1MENV() XSHADE1M(rdp.env_color, CMB_MULT)
725 #define MULSHADE_PRIMSUBENV() XSHADEC1MC2(rdp.prim_color, rdp.env_color, CMB_MULT)
726 #define MULSHADE_ENVSUBPRIM() XSHADEC1MC2(rdp.env_color, rdp.prim_color, CMB_MULT)
727 #define MULSHADE_BYTE(byte) XSHADE_BYTE(byte, CMB_MULT)
728 #define MULSHADE_PRIMA() MULSHADE_BYTE((rdp.prim_color & 0xFF))
729 #define MULSHADE_ENVA() MULSHADE_BYTE((rdp.env_color & 0xFF))
730 #define MULSHADE_1MENVA() MULSHADE_BYTE(((~rdp.env_color) & 0xFF))
731 #define MULSHADE_PRIMLOD() MULSHADE_BYTE((rdp.prim_lodfrac & 0xFF))
732 #define MULSHADE_K5() MULSHADE_BYTE(rdp.K5)
733
734 #define SETSHADE(color) XSHADE(color, CMB_SET)
735 #define SETSHADE_PRIM() SETSHADE(rdp.prim_color)
736 #define SETSHADE_ENV() SETSHADE(rdp.env_color)
737 #define SETSHADE_BYTE(byte) XSHADE_BYTE(byte, CMB_SET)
738 #define SETSHADE_PRIMA() SETSHADE_BYTE((rdp.prim_color & 0xFF))
739 #define SETSHADE_ENVA() SETSHADE_BYTE((rdp.env_color & 0xFF))
740 #define SETSHADE_1MPRIMA() SETSHADE_BYTE(((~rdp.prim_color) & 0xFF))
741 #define SETSHADE_PRIMLOD() SETSHADE_BYTE((rdp.prim_lodfrac & 0xFF))
742 #define SETSHADE_1MPRIMLOD() SETSHADE_BYTE(((~rdp.prim_lodfrac) & 0xFF))
743
744 #define SETSHADE_1MPRIM() XSHADE1M(rdp.prim_color, CMB_SET)
745 #define SETSHADE_1MENV() XSHADE1M(rdp.env_color, CMB_SET)
746 #define SETSHADE_PRIMSUBENV() XSHADEC1MC2(rdp.prim_color, rdp.env_color, CMB_SET)
747 #define SETSHADE_ENVSUBPRIM() XSHADEC1MC2(rdp.env_color, rdp.prim_color, CMB_SET)
748 #define SETSHADE_SHADE_A() { \
749   rdp.cmb_flags = CMB_SETSHADE_SHADEALPHA; \
750 }
751
752 #define XSHADEADD(color, flag) { \
753   rdp.coladd[0] *= (float)((color & 0xFF000000) >> 24) / 255.0f; \
754   rdp.coladd[1] *= (float)((color & 0x00FF0000) >> 16) / 255.0f; \
755   rdp.coladd[2] *= (float)((color & 0x0000FF00) >> 8) / 255.0f; \
756   rdp.cmb_flags |= flag; \
757 }
758 #define XSHADEC1MC2ADD(color1, color2, flag) { \
759   rdp.coladd[0] *= (float)( max(0, (int)((color1 & 0xFF000000) >> 24) - (int)((color2 & 0xFF000000) >> 24)) )/255.0f; \
760   rdp.coladd[1] *= (float)( max(0, (int)((color1 & 0x00FF0000) >> 16) - (int)((color2 & 0x00FF0000) >> 16)) )/255.0f; \
761   rdp.coladd[2] *= (float)( max(0, (int)((color1 & 0x0000FF00) >> 8)  - (int)((color2 & 0x0000FF00) >> 8)) )/255.0f; \
762   rdp.cmb_flags |= flag; \
763 }
764 #define SUBSHADE_PRIM() XSHADEADD(rdp.prim_color, CMB_SUB)
765 #define SUBSHADE_ENV() XSHADEADD(rdp.env_color, CMB_SUB)
766 #define SUBSHADE_PRIMSUBENV() XSHADEC1MC2ADD(rdp.prim_color, rdp.env_color, CMB_SUB)
767 #define ADDSHADE_PRIM() XSHADEADD(rdp.prim_color, CMB_ADD)
768 #define ADDSHADE_ENV() XSHADEADD(rdp.env_color, CMB_ADD)
769 #define ADDSHADE_PRIMSUBENV() XSHADEC1MC2ADD(rdp.prim_color, rdp.env_color, CMB_ADD)
770 #define SUBSHADE_PRIMMULENV() { \
771   rdp.coladd[0] *= (float)( ((rdp.prim_color & 0xFF000000) >> 24) * ((rdp.env_color & 0xFF000000) >> 24) )/255.0f/255.0f; \
772   rdp.coladd[1] *= (float)( ((rdp.prim_color & 0x00FF0000) >> 16) * ((rdp.env_color & 0x00FF0000) >> 16) )/255.0f/255.0f; \
773   rdp.coladd[2] *= (float)( ((rdp.prim_color & 0x0000FF00) >> 8) * ((rdp.env_color & 0x0000FF00) >> 8) )/255.0f/255.0f; \
774   rdp.cmb_flags |= CMB_SUB; \
775 }
776
777 #define COLSUBSHADE_PRIM() { \
778   rdp.coladd[0] *= (float)((rdp.prim_color & 0xFF000000) >> 24) / 255.0f; \
779   rdp.coladd[1] *= (float)((rdp.prim_color & 0x00FF0000) >> 16) / 255.0f; \
780   rdp.coladd[2] *= (float)((rdp.prim_color & 0x0000FF00) >> 8) / 255.0f; \
781   rdp.cmb_flags |= CMB_COL_SUB_OWN; \
782 }
783
784 #define INTERSHADE_2(color,factor) { \
785   rdp.col_2[0] = (((color) >> 24) & 0xFF) / 255.0f; \
786   rdp.col_2[1] = (((color) >> 16) & 0xFF) / 255.0f; \
787   rdp.col_2[2] = (((color) >> 8) & 0xFF) / 255.0f; \
788   rdp.shade_factor = (factor) / 255.0f; \
789   rdp.cmb_flags_2 = CMB_INTER; \
790 }
791
792 #define MULSHADE_SHADEA() rdp.cmb_flags |= CMB_MULT_OWN_ALPHA;
793
794 #define CA(color) cmb.ccolor|=(color)&0xFF
795 #define CA_PRIM() CA(rdp.prim_color)
796 #define CA_ENV() CA(rdp.env_color)
797 #define CA_INVPRIM() cmb.ccolor|=0xFF-(rdp.prim_color&0xFF)
798 #define CA_INVENV() cmb.ccolor|=0xFF-(rdp.env_color&0xFF)
799 #define CA_ENV1MPRIM() cmb.ccolor|= (wxUint32)(((rdp.env_color&0xFF)/255.0f) * (((~(rdp.prim_color&0xFF)) & 0xff)/255.0f) * 255.0f);
800 #define CA_PRIMENV() cmb.ccolor |= (wxUint32)(((rdp.env_color&0xFF)/255.0f) * ((rdp.prim_color&0xFF)/255.0f) * 255.0f);
801 #define CA_PRIMLOD() cmb.ccolor |= rdp.prim_lodfrac;
802 #define CA_PRIM_MUL_PRIMLOD() cmb.ccolor |= (int)(((rdp.prim_color&0xFF) * rdp.prim_lodfrac) / 255.0f);
803 #define CA_ENV_MUL_PRIMLOD() cmb.ccolor |= (int)(((rdp.env_color&0xFF) * rdp.prim_lodfrac) / 255.0f);
804
805 #define XSHADE_A(color, flag) { \
806   rdp.col[3] *= (float)(color & 0xFF) / 255.0f; \
807   rdp.cmb_flags |= flag; \
808 }
809 #define XSHADE1M_A(color, flag) { \
810   rdp.col[3] *= 1.0f-((float)(color & 0xFF) / 255.0f); \
811   rdp.cmb_flags |= flag; \
812 }
813 #define XSHADEC1MC2_A(color1, color2, flag) { \
814   rdp.col[3] *= (float)( max(0, (int)(color1 & 0xFF) - (int)(color2 & 0xFF)) ) / 255.0f; \
815   rdp.cmb_flags |= flag; \
816 }
817 #define MULSHADE_A_PRIM() XSHADE_A(rdp.prim_color, CMB_A_MULT)
818 #define MULSHADE_A_1MPRIM() XSHADE1M_A(rdp.prim_color, CMB_A_MULT)
819 #define MULSHADE_A_ENV() XSHADE_A(rdp.env_color, CMB_A_MULT)
820 #define MULSHADE_A_PRIMSUBENV() XSHADEC1MC2_A(rdp.prim_color, rdp.env_color, CMB_A_MULT)
821 #define MULSHADE_A_ENVSUBPRIM() XSHADEC1MC2_A(rdp.env_color, rdp.prim_color, CMB_A_MULT)
822 #define SETSHADE_A(color) XSHADE_A(color, CMB_A_SET)
823 #define SETSHADE_A_PRIM() SETSHADE_A(rdp.prim_color)
824 #define SETSHADE_A_ENV() SETSHADE_A(rdp.env_color)
825 #define SETSHADE_A_PRIMSUBENV() XSHADEC1MC2_A(rdp.prim_color, rdp.env_color, CMB_A_SET)
826 #define SETSHADE_A_INVENV() XSHADE1M_A(rdp.env_color, CMB_A_SET)
827
828 #define XSHADEADD_A(color, flag) { \
829   rdp.coladd[3] *= (float)(color & 0xFF) / 255.0f; \
830   rdp.cmb_flags |= flag; \
831 }
832 #define SUBSHADE_A_PRIM() XSHADEADD_A(rdp.prim_color, CMB_A_SUB)
833 #define SUBSHADE_A_ENV() XSHADEADD_A(rdp.env_color, CMB_A_SUB)
834 #define ADDSHADE_A_PRIM() XSHADEADD_A(rdp.prim_color, CMB_A_ADD)
835 #define ADDSHADE_A_ENV() XSHADEADD_A(rdp.env_color, CMB_A_ADD)
836
837 //****************************************************************
838 // Combine Functions
839 //****************************************************************
840
841 // These are in a somewhat ordered way, using the A constants below.  T0 comes before
842 //  T1 comes before PRIM, ... except for CMB, which always comes at the end, where
843 //  the CMB comes first in the name.  T0 and T1 are always interleaved, because they use the
844 //  same function.
845 // Keep going in alphabetical order, but do not break the order of variables!
846 //  ex: A*C + B*C -> T0_MUL_PRIM_ADD_ENV_MUL_PRIM,
847 // Although prim comes before env, we have already used prim as C, so it must stay as C
848 //  and would NOT become T0_MUL_PRIM_ADD_PRIM_MUL_ENV
849 //
850 // New version ordered by:
851 // t0
852 // prim
853 // env
854 // shade
855
856 static void cc_one ()
857 {
858   CCMB (GR_COMBINE_FUNCTION_LOCAL,
859     GR_COMBINE_FACTOR_NONE,
860     GR_COMBINE_LOCAL_CONSTANT,
861     GR_COMBINE_OTHER_NONE);
862   //  CC (0xFFFFFF00);
863   CC (0xFFFFFF00);
864 }
865
866 static void cc_zero ()
867 {
868   CCMB (GR_COMBINE_FUNCTION_LOCAL,
869     GR_COMBINE_FACTOR_NONE,
870     GR_COMBINE_LOCAL_CONSTANT,
871     GR_COMBINE_OTHER_NONE);
872   CC (0x00000000);
873 }
874
875 static void cc_t0 ()
876 {
877   if ((rdp.othermode_l & 0x4000) && (rdp.cycle_mode < 2))
878   {
879     wxUint32 blend_mode = (rdp.othermode_l >> 16);
880     if (blend_mode == 0xa500)
881     {
882       CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
883         GR_COMBINE_FACTOR_ONE,
884         GR_COMBINE_LOCAL_CONSTANT,
885         GR_COMBINE_OTHER_TEXTURE);
886       float fog = (rdp.fog_color&0xFF)/255.0f;
887       wxUint32 R = (wxUint32)(((rdp.blend_color>>24)&0xFF)*fog);
888       wxUint32 G = (wxUint32)(((rdp.blend_color>>16)&0xFF)*fog);
889       wxUint32 B = (wxUint32)(((rdp.blend_color>> 8)&0xFF)*fog);
890       CC((R<<24)|(G<<16)|(B<<8));
891     }
892     else if (blend_mode == 0x55f0) //cmem*afog + cfog*1ma
893     {
894       CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
895         GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA,
896         GR_COMBINE_LOCAL_NONE,
897         GR_COMBINE_OTHER_CONSTANT);
898       CC(rdp.fog_color);
899       A_USE_T0 ();
900     }
901     else
902     {
903       CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
904         GR_COMBINE_FACTOR_ONE,
905         GR_COMBINE_LOCAL_NONE,
906         GR_COMBINE_OTHER_TEXTURE);
907     }
908   }
909   else
910   {
911     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
912       GR_COMBINE_FACTOR_ONE,
913       GR_COMBINE_LOCAL_NONE,
914       GR_COMBINE_OTHER_TEXTURE);
915   }
916   USE_T0 ();
917 }
918
919 static void cc_t0a ()
920 {
921   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
922     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
923     GR_COMBINE_LOCAL_NONE,
924     GR_COMBINE_OTHER_CONSTANT);
925   USE_T0 ();
926   A_USE_T0 ();
927   CC (0xFFFFFF00);
928 }
929
930 static void cc_t1 () //Added by Gonetz
931 {
932   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
933     GR_COMBINE_FACTOR_ONE,
934     GR_COMBINE_LOCAL_NONE,
935     GR_COMBINE_OTHER_TEXTURE);
936   USE_T1 ();
937 }
938
939 static void cc_t0_mul_t1 ()
940 {
941   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
942     GR_COMBINE_FACTOR_ONE,
943     GR_COMBINE_LOCAL_NONE,
944     GR_COMBINE_OTHER_TEXTURE);
945   T0_MUL_T1 ();
946 }
947
948 static void cc_t0_mul_t1_add_t0 () //Added by Gonetz
949 {
950   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
951     GR_COMBINE_FACTOR_ONE,
952     GR_COMBINE_LOCAL_NONE,
953     GR_COMBINE_OTHER_TEXTURE);
954   T0_MUL_T1_ADD_T0 ();
955 }
956
957 /*
958 static void cc_t1_inter__env_inter_t0_using_k5__using_t1a ()
959 {
960 CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
961 GR_COMBINE_FACTOR_ONE,
962 GR_COMBINE_LOCAL_NONE,
963 GR_COMBINE_OTHER_TEXTURE);
964 wxUint32 col1 = (rdp.K5<<24) | (rdp.K5<<16) | (rdp.K5<<8);
965 MOD_0 (TMOD_COL_INTER_TEX_USING_COL1);
966 MOD_0_COL (rdp.env_color & 0xFFFFFF00);
967 MOD_0_COL1 (col1 & 0xFFFFFF00);
968 rdp.best_tex = 0;
969 cmb.tex |= 3;
970 cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL;
971 cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL;
972 cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND;
973 cmb.tmu0_fac = GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA;
974 }
975 */
976
977 static void cc_t1_inter_t0_using_env ()
978 {
979   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
980     GR_COMBINE_FACTOR_ONE,
981     GR_COMBINE_LOCAL_NONE,
982     GR_COMBINE_OTHER_TEXTURE);
983   T1_INTER_T0_USING_ENV ();
984 }
985
986 static void cc_prim ()
987 {
988   CCMB (GR_COMBINE_FUNCTION_LOCAL,
989     GR_COMBINE_FACTOR_NONE,
990     GR_COMBINE_LOCAL_CONSTANT,
991     GR_COMBINE_OTHER_NONE);
992   CC_PRIM ();
993 }
994
995 static void cc_env ()
996 {
997   CCMB (GR_COMBINE_FUNCTION_LOCAL,
998     GR_COMBINE_FACTOR_NONE,
999     GR_COMBINE_LOCAL_CONSTANT,
1000     GR_COMBINE_OTHER_NONE);
1001   CC_ENV ();
1002 }
1003
1004 static void cc_scale ()
1005 {
1006   CCMB (GR_COMBINE_FUNCTION_LOCAL,
1007     GR_COMBINE_FACTOR_NONE,
1008     GR_COMBINE_LOCAL_CONSTANT,
1009     GR_COMBINE_OTHER_NONE);
1010   CC (rdp.SCALE);
1011 }
1012
1013 static void cc_shade ()
1014 {
1015   CCMB (GR_COMBINE_FUNCTION_LOCAL,
1016     GR_COMBINE_FACTOR_NONE,
1017     GR_COMBINE_LOCAL_ITERATED,
1018     GR_COMBINE_OTHER_NONE);
1019 }
1020
1021 static void cc_one_mul_shade ()
1022 {
1023   if ((settings.hacks&hack_Knockout) && (rdp.aTBuffTex[0] || rdp.aTBuffTex[1] || rdp.cur_image)) //hack for boxer shadow
1024   {
1025     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1026       GR_COMBINE_FACTOR_LOCAL,
1027       GR_COMBINE_LOCAL_CONSTANT,
1028       GR_COMBINE_OTHER_TEXTURE);
1029     CC (0x20202000);
1030     USE_T0 ();
1031   }
1032   else
1033   {
1034     cc_shade ();
1035   }
1036 }
1037
1038 static void cc_shadea ()
1039 {
1040   CCMB (GR_COMBINE_FUNCTION_LOCAL_ALPHA,
1041     GR_COMBINE_FACTOR_NONE,
1042     GR_COMBINE_LOCAL_ITERATED,
1043     GR_COMBINE_OTHER_NONE);
1044 }
1045
1046 static void cc_t0_mul_prim ()
1047 {
1048   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1049     GR_COMBINE_FACTOR_LOCAL,
1050     GR_COMBINE_LOCAL_CONSTANT,
1051     GR_COMBINE_OTHER_TEXTURE);
1052   CC_PRIM ();
1053   USE_T0 ();
1054 }
1055
1056 static void cc_t0_mul_prima ()
1057 {
1058   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1059     GR_COMBINE_FACTOR_LOCAL,
1060     GR_COMBINE_LOCAL_CONSTANT,
1061     GR_COMBINE_OTHER_TEXTURE);
1062   CC_PRIMA ();
1063   USE_T0 ();
1064 }
1065
1066 static void cc_t1_mul_prim ()
1067 {
1068   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1069     GR_COMBINE_FACTOR_LOCAL,
1070     GR_COMBINE_LOCAL_CONSTANT,
1071     GR_COMBINE_OTHER_TEXTURE);
1072   CC_PRIM ();
1073   if ((rdp.cycle1 & 0xFFFF) == (rdp.cycle2 & 0xFFFF)) // 1 cycle, use t0
1074   {
1075     USE_T0 ();
1076   }
1077   else
1078   {
1079     USE_T1 ();
1080   }
1081 }
1082
1083 static void cc_t0a_mul_prim ()
1084 {
1085   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1086     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
1087     GR_COMBINE_LOCAL_NONE,
1088     GR_COMBINE_OTHER_CONSTANT);
1089   CC_PRIM ();
1090   A_USE_T0 ();
1091 }
1092
1093 //Added by Gonetz
1094 static void cc__t1_inter_t0_using_enva__mul_prim ()
1095 {
1096   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1097     GR_COMBINE_FACTOR_LOCAL,
1098     GR_COMBINE_LOCAL_CONSTANT,
1099     GR_COMBINE_OTHER_TEXTURE);
1100   CC_PRIM ();
1101   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
1102   T1_INTER_T0_USING_FACTOR (factor);
1103 }
1104
1105 static void cc__t0_inter_one_using_t1__mul_prim ()
1106 {
1107   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1108     GR_COMBINE_FACTOR_LOCAL,
1109     GR_COMBINE_LOCAL_CONSTANT,
1110     GR_COMBINE_OTHER_TEXTURE);
1111   CC_PRIM ();
1112   rdp.best_tex = 0;
1113   cmb.tex |= 3;
1114   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL;
1115   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
1116   cmb.tmu0_fac = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL;
1117 }
1118
1119 static void cc__t0_inter_one_using_primlod__mul_prim ()
1120 {
1121   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1122     GR_COMBINE_FACTOR_LOCAL,
1123     GR_COMBINE_LOCAL_CONSTANT,
1124     GR_COMBINE_OTHER_TEXTURE);
1125   CC_PRIM ();
1126   if (cmb.combine_ext)
1127   {
1128     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1129       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ONE_MINUS_X,
1130       GR_CMBX_DETAIL_FACTOR, 0,
1131       GR_CMBX_B, 0);
1132     cmb.tex |= 1;
1133     percent = (float)lod_frac / 255.0f;
1134     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
1135   }
1136   else
1137   {
1138     MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
1139     MOD_0_COL (0xFFFFFF00);
1140     MOD_0_FAC (lod_frac);
1141     USE_T0 ();
1142   }
1143 }
1144
1145 static void cc__t1_inter_one_using_env__mul_prim ()
1146 {
1147   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1148     GR_COMBINE_FACTOR_LOCAL,
1149     GR_COMBINE_LOCAL_CONSTANT,
1150     GR_COMBINE_OTHER_TEXTURE);
1151   CC_PRIM ();
1152   if (cmb.combine_ext)
1153   {
1154     T1CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
1155       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1156       GR_CMBX_LOCAL_TEXTURE_RGB, 1,
1157       GR_CMBX_B, 0);
1158     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1159       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1160       GR_CMBX_ZERO, 1,
1161       GR_CMBX_ZERO, 0);
1162     cmb.tex |= 2;
1163     cmb.tex_ccolor = rdp.env_color;
1164   }
1165   else
1166   {
1167     USE_T1 ();
1168   }
1169 }
1170
1171 static void cc__t1_inter_one_using_enva__mul_t0 ()
1172 {
1173   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1174     GR_COMBINE_FACTOR_ONE,
1175     GR_COMBINE_LOCAL_NONE,
1176     GR_COMBINE_OTHER_TEXTURE);
1177   if (cmb.combine_ext)
1178   {
1179     T1CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
1180       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1181       GR_CMBX_TMU_CALPHA, 0,
1182       GR_CMBX_B, 0);
1183     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1184       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1185       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
1186       GR_CMBX_ZERO, 0);
1187     cmb.tex |= 3;
1188     cmb.tex_ccolor = 0xFFFFFF00 | (rdp.env_color&0xFF);
1189   }
1190   else
1191   {
1192     if ((rdp.env_color&0xFF) == 0xFF)
1193     {
1194       USE_T0 ();
1195     }
1196     else
1197     {
1198       T0_MUL_T1 ();
1199     }
1200   }
1201 }
1202
1203 //Added by Gonetz
1204 static void cc_prim_mul_prim ()
1205 {
1206   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1207     GR_COMBINE_FACTOR_LOCAL,
1208     GR_COMBINE_LOCAL_ITERATED,
1209     GR_COMBINE_OTHER_CONSTANT);
1210   CC_PRIM ();
1211   SETSHADE_PRIM ();
1212 }
1213
1214 static void cc_prim_mul_prima ()
1215 {
1216   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1217     GR_COMBINE_FACTOR_LOCAL,
1218     GR_COMBINE_LOCAL_CONSTANT,
1219     GR_COMBINE_OTHER_ITERATED);
1220   CC_PRIM ();
1221   SETSHADE_PRIMA ();
1222 }
1223
1224 static void cc_t1_mul_prima ()
1225 {
1226   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1227     GR_COMBINE_FACTOR_LOCAL,
1228     GR_COMBINE_LOCAL_CONSTANT,
1229     GR_COMBINE_OTHER_TEXTURE);
1230   CC_PRIMA ();
1231   USE_T1 ();
1232 }
1233
1234 static void cc_t1_mul_enva ()
1235 {
1236   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1237     GR_COMBINE_FACTOR_LOCAL,
1238     GR_COMBINE_LOCAL_CONSTANT,
1239     GR_COMBINE_OTHER_TEXTURE);
1240   CC_ENVA ();
1241   USE_T1 ();
1242 }
1243
1244 static void cc_t0_mul_env ()
1245 {
1246   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1247     GR_COMBINE_FACTOR_LOCAL,
1248     GR_COMBINE_LOCAL_CONSTANT,
1249     GR_COMBINE_OTHER_TEXTURE);
1250   CC_ENV ();
1251   USE_T0 ();
1252 }
1253
1254 static void cc_t1_mul_env ()
1255 {
1256   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1257     GR_COMBINE_FACTOR_LOCAL,
1258     GR_COMBINE_LOCAL_CONSTANT,
1259     GR_COMBINE_OTHER_TEXTURE);
1260   CC_ENV ();
1261   USE_T1 ();
1262 }
1263
1264 //Added by Gonetz
1265 static void cc_t0_mul_enva ()
1266 {
1267   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1268     GR_COMBINE_FACTOR_LOCAL,
1269     GR_COMBINE_LOCAL_CONSTANT,
1270     GR_COMBINE_OTHER_TEXTURE);
1271   CC_ENVA ();
1272   USE_T0 ();
1273 }
1274
1275 static void cc_t0_mul_scale ()
1276 {
1277   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1278     GR_COMBINE_FACTOR_LOCAL,
1279     GR_COMBINE_LOCAL_CONSTANT,
1280     GR_COMBINE_OTHER_TEXTURE);
1281   CC (rdp.SCALE);
1282   USE_T0 ();
1283 }
1284
1285 static void cc_t0_mul_enva_add_prim ()
1286 {
1287   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
1288     GR_COMBINE_FACTOR_TEXTURE_RGB,
1289     GR_COMBINE_LOCAL_ITERATED,
1290     GR_COMBINE_OTHER_CONSTANT);
1291   SETSHADE_PRIM ();
1292   CC_ENVA ();
1293   USE_T0 ();
1294 }
1295
1296 static void cc_t0_mul_shade ()
1297 {
1298   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1299     GR_COMBINE_FACTOR_LOCAL,
1300     GR_COMBINE_LOCAL_ITERATED,
1301     GR_COMBINE_OTHER_TEXTURE);
1302   USE_T0 ();
1303 }
1304
1305 static void cc_f1_sky ()
1306 {
1307   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
1308     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
1309     GR_COMBINE_LOCAL_ITERATED,
1310     GR_COMBINE_OTHER_CONSTANT);
1311   MULSHADE_SHADEA ();
1312   MULSHADE_ENVSUBPRIM ();
1313   ADDSHADE_PRIM();
1314   CC(0xFFFFFFFF);
1315 }
1316
1317 static void cc_t0_mul_shadea ()
1318 {
1319   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1320     GR_COMBINE_FACTOR_LOCAL,
1321     GR_COMBINE_LOCAL_ITERATED,
1322     GR_COMBINE_OTHER_TEXTURE);
1323   SETSHADE_SHADE_A ();
1324   USE_T0 ();
1325 }
1326
1327 static void cc_t0_mul_k5 ()
1328 {
1329   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1330     GR_COMBINE_FACTOR_LOCAL,
1331     GR_COMBINE_LOCAL_CONSTANT,
1332     GR_COMBINE_OTHER_TEXTURE);
1333   CC_K5 ();
1334   USE_T0 ();
1335 }
1336
1337 static void cc_t1_mul_shade ()
1338 {
1339   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1340     GR_COMBINE_FACTOR_LOCAL,
1341     GR_COMBINE_LOCAL_ITERATED,
1342     GR_COMBINE_OTHER_TEXTURE);
1343   USE_T1 ();
1344 }
1345
1346 //Added by Gonetz
1347 static void cc__t0_add_t1__mul_shade ()
1348 {
1349   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1350     GR_COMBINE_FACTOR_LOCAL,
1351     GR_COMBINE_LOCAL_ITERATED,
1352     GR_COMBINE_OTHER_TEXTURE);
1353   T0_ADD_T1 ();
1354 }
1355
1356 static void cc__t0_mul_shade__add__t1_mul_shade ()
1357 {
1358   //combiner is used in Spiderman. It seems that t0 is used instead of t1
1359   if (cmb.combine_ext)
1360   {
1361     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1362       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1363       GR_CMBX_ITRGB, 0,
1364       GR_CMBX_ZERO, 0);
1365     cmb.tex |= 1;
1366     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
1367       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1368       GR_CMBX_ZERO, 1,
1369       GR_CMBX_B, 0);
1370   }
1371   else
1372   {
1373     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1374       GR_COMBINE_FACTOR_LOCAL,
1375       GR_COMBINE_LOCAL_ITERATED,
1376       GR_COMBINE_OTHER_TEXTURE);
1377     USE_T0 ();
1378   }
1379 }
1380
1381 static void cc__t0_mul_prim__inter_env_using_enva ()
1382 {
1383   wxUint32 enva  = rdp.env_color&0xFF;
1384   if (enva == 0xFF)
1385     cc_env ();
1386   else if (enva == 0)
1387     cc_t0_mul_prim ();
1388   else if (cmb.combine_ext)
1389   {
1390     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1391       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
1392       GR_CMBX_TMU_CCOLOR, 0,
1393       GR_CMBX_ZERO, 0);
1394     cmb.tex |= 1;
1395     cmb.tex_ccolor = rdp.prim_color;
1396     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
1397       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1398       GR_CMBX_CONSTANT_COLOR, 0,
1399       GR_CMBX_B, 0);
1400     SETSHADE_ENV();
1401     CC_ENVA();
1402   }
1403   else
1404   {
1405     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1406       GR_COMBINE_FACTOR_LOCAL,
1407       GR_COMBINE_LOCAL_ITERATED,
1408       GR_COMBINE_OTHER_TEXTURE);
1409     SETSHADE_PRIM();
1410     INTERSHADE_2 (rdp.env_color & 0xFFFFFF00, rdp.env_color & 0xFF);
1411     USE_T0 ();
1412     MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
1413     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
1414     MOD_0_FAC (rdp.env_color & 0xFF);
1415   }
1416 }
1417
1418
1419 static void cc__t1_inter_t0_using_t1__mul_shade ()
1420 {
1421   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1422     GR_COMBINE_FACTOR_LOCAL,
1423     GR_COMBINE_LOCAL_ITERATED,
1424     GR_COMBINE_OTHER_TEXTURE);
1425   if (cmb.combine_ext)
1426   {
1427     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1428       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1429       GR_CMBX_ZERO, 0,
1430       GR_CMBX_B, 0);
1431     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1432       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1433       GR_CMBX_B, 0,
1434       GR_CMBX_B, 0);
1435     cmb.tex |= 3;
1436   }
1437   else
1438   {
1439     T0_INTER_T1_USING_FACTOR (0x7F);
1440   }
1441 }
1442
1443 //Added by Gonetz
1444 static void cc__t1_inter_t0_using_enva__mul_shade ()
1445 {
1446   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1447     GR_COMBINE_FACTOR_LOCAL,
1448     GR_COMBINE_LOCAL_ITERATED,
1449     GR_COMBINE_OTHER_TEXTURE);
1450   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
1451   T1_INTER_T0_USING_FACTOR (factor);
1452 }
1453
1454 //Added by Gonetz
1455 static void cc__t1_inter_t0_using_shadea__mul_shade ()
1456 {
1457   if (!cmb.combine_ext) {
1458     cc_t0_mul_shade ();
1459     return;
1460   }
1461   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1462     GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
1463     GR_CMBX_ITRGB, 0,
1464     GR_CMBX_ZERO, 0);
1465   T1_INTER_T0_USING_SHADEA ();
1466 }
1467
1468 //Added by Gonetz
1469 static void cc__t0_inter_one_using_prim__mul_shade ()
1470 {
1471   // (1-t0)*prim+t0, (cmb-0)*shade+0
1472   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1473     GR_COMBINE_FACTOR_LOCAL,
1474     GR_COMBINE_LOCAL_ITERATED,
1475     GR_COMBINE_OTHER_TEXTURE);
1476   if (cmb.combine_ext)
1477   {
1478     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
1479       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ONE_MINUS_X,
1480       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
1481       GR_CMBX_B, 0);
1482     cmb.tex |= 1;
1483     cmb.tex_ccolor = rdp.prim_color;
1484   }
1485   else
1486   {
1487     USE_T0 ();
1488     MOD_0 (TMOD_TEX_INTER_COL_USING_COL1);
1489     MOD_0_COL (0xFFFFFF00);
1490     MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
1491   }
1492 }
1493
1494 static void cc__t0_inter_one_using_primlod__mul_shade ()
1495 {
1496   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1497     GR_COMBINE_FACTOR_LOCAL,
1498     GR_COMBINE_LOCAL_ITERATED,
1499     GR_COMBINE_OTHER_TEXTURE);
1500   if (cmb.combine_ext)
1501   {
1502     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1503       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ONE_MINUS_X,
1504       GR_CMBX_DETAIL_FACTOR, 0,
1505       GR_CMBX_B, 0);
1506     cmb.tex |= 1;
1507     percent = (float)lod_frac / 255.0f;
1508     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
1509   }
1510   else
1511   {
1512     MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
1513     MOD_0_COL (0xFFFFFF00);
1514     MOD_0_FAC (lod_frac);
1515     USE_T0 ();
1516   }
1517 }
1518
1519 //Added by Gonetz
1520 static void cc__t0_inter_env_using_enva__mul_shade ()
1521 {
1522   // (env-t0)*env_a+t0, (cmb-0)*shade+0
1523   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1524     GR_COMBINE_FACTOR_LOCAL,
1525     GR_COMBINE_LOCAL_ITERATED,
1526     GR_COMBINE_OTHER_TEXTURE);
1527   if (cmb.combine_ext)
1528   {
1529     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
1530       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1531       GR_CMBX_TMU_CALPHA, 0,
1532       GR_CMBX_B, 0);
1533     cmb.tex |= 1;
1534     cmb.tex_ccolor = rdp.env_color;
1535   }
1536   else
1537   {
1538     USE_T0 ();
1539     MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
1540     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
1541     MOD_0_FAC (rdp.env_color&0xFF);
1542   }
1543 }
1544
1545 //Added by Gonetz
1546 static void cc__t0_inter_env_using_shadea__mul_shade ()
1547 {
1548   // (env-t0)*shade_a+t0, (cmb-0)*shade+0
1549   if (cmb.combine_ext)
1550   {
1551     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
1552       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1553       GR_CMBX_ITALPHA, 0,
1554       GR_CMBX_B, 0);
1555     cmb.tex |= 1;
1556     cmb.tex_ccolor = rdp.env_color;
1557     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1558       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
1559       GR_CMBX_ITRGB, 0,
1560       GR_CMBX_ZERO, 0);
1561   }
1562   else
1563   {
1564     cc_t0_mul_shade ();
1565   }
1566 }
1567
1568 static void cc__t0_mul_prim_add_env__mul_shade ()
1569 {
1570   if (cmb.combine_ext)
1571   {
1572     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1573       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1574       GR_CMBX_TMU_CCOLOR, 0,
1575       GR_CMBX_ZERO, 0);
1576     cmb.tex |= 1;
1577     cmb.tex_ccolor = rdp.prim_color;
1578     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1579       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
1580       GR_CMBX_ITRGB, 0,
1581       GR_CMBX_ZERO, 0);
1582     CC_ENV ();
1583   }
1584   else
1585   {
1586     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1587       GR_COMBINE_FACTOR_LOCAL,
1588       GR_COMBINE_LOCAL_ITERATED,
1589       GR_COMBINE_OTHER_TEXTURE);
1590     MOD_0 (TMOD_TEX_SCALE_COL_ADD_COL);
1591     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
1592     MOD_0_COL1 (rdp.env_color & 0xFFFFFF00);
1593         USE_T0 ();
1594   }
1595 }
1596
1597 static void cc__t1_sub_t0_mul_primlod_add_prim__mul_shade ()
1598 {
1599   if (cmb.combine_ext)
1600   {
1601     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1602       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1603       GR_CMBX_ZERO, 0,
1604       GR_CMBX_B, 0);
1605     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1606       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1607       GR_CMBX_DETAIL_FACTOR, 0,
1608       GR_CMBX_ZERO, 0);
1609     cmb.tex |= 3;
1610     percent = (float)lod_frac / 255.0f;
1611     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
1612     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1613       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
1614       GR_CMBX_ITRGB, 0,
1615       GR_CMBX_ZERO, 0);
1616     CC_PRIM ();
1617   }
1618   else
1619   {
1620     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
1621       GR_COMBINE_FACTOR_LOCAL,
1622       GR_COMBINE_LOCAL_ITERATED,
1623       GR_COMBINE_OTHER_TEXTURE);
1624     T0_INTER_T1_USING_FACTOR (lod_frac);
1625   }
1626 }
1627
1628 static void cc__t1_sub_prim_mul_t0__mul_shade ()
1629 {
1630   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1631     GR_COMBINE_FACTOR_LOCAL,
1632     GR_COMBINE_LOCAL_ITERATED,
1633     GR_COMBINE_OTHER_TEXTURE);
1634   if (cmb.combine_ext)
1635   {
1636     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1637       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1638       GR_CMBX_ZERO, 0,
1639       GR_CMBX_B, 0);
1640     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1641       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
1642       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
1643       GR_CMBX_ZERO, 0);
1644     cmb.tex_ccolor = rdp.prim_color;
1645     cmb.tex |= 3;
1646   }
1647   else
1648   {
1649     T0_MUL_T1 ();
1650   }
1651 }
1652
1653 static void cc__t1_sub_t0_mul_t0_add_shade__mul_shade () //Aded by Gonetz
1654 {
1655   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
1656     GR_COMBINE_FACTOR_ONE,
1657     GR_COMBINE_LOCAL_ITERATED,
1658     GR_COMBINE_OTHER_TEXTURE);
1659   if (cmb.combine_ext)
1660   {
1661     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1662       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1663       GR_CMBX_ZERO, 0,
1664       GR_CMBX_B, 0);
1665     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1666       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1667       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
1668       GR_CMBX_ITRGB, 0);
1669     cmb.tex |= 3;
1670   }
1671   else
1672   {
1673     T1_SUB_T0_MUL_T0 ();
1674   }
1675 }
1676
1677 static void cc__one_sub_shade_mul_t0_add_shade__mul_shade ()
1678 {
1679   if (cmb.combine_ext)
1680   {
1681     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1682       GR_CMBX_ITRGB, GR_FUNC_MODE_ONE_MINUS_X,
1683       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
1684       GR_CMBX_B, 0);
1685     cmb.tex |= 1;
1686     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1687           GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
1688       GR_CMBX_ITRGB, 0,
1689       GR_CMBX_ZERO, 0);
1690   }
1691   else
1692   {
1693     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
1694       GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
1695       GR_COMBINE_LOCAL_ITERATED,
1696       GR_COMBINE_OTHER_TEXTURE);
1697     USE_T0 ();
1698   }
1699 }
1700
1701 static void cc__t0_sub_prim_mul_t1_add_t1__mul_shade ()
1702 {
1703   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1704     GR_COMBINE_FACTOR_LOCAL,
1705     GR_COMBINE_LOCAL_ITERATED,
1706     GR_COMBINE_OTHER_TEXTURE);
1707   if (rdp.prim_color & 0xFFFFFF00)
1708   {
1709     MOD_0 (TMOD_TEX_SUB_COL);
1710     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
1711   }
1712   if (cmb.combine_ext)
1713   {
1714     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1715       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1716       GR_CMBX_ZERO, 0,
1717       GR_CMBX_B, 0);
1718     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1719       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1720       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
1721       GR_CMBX_B, 0);
1722     cmb.tex |= 3;
1723   }
1724   else
1725   {
1726     T0_MUL_T1 ();
1727   }
1728 }
1729
1730 static void cc__t1_sub_env_mul_t0_add_t0__mul_shade ()
1731 {
1732   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1733     GR_COMBINE_FACTOR_LOCAL,
1734     GR_COMBINE_LOCAL_ITERATED,
1735     GR_COMBINE_OTHER_TEXTURE);
1736   if (cmb.combine_ext)
1737   {
1738     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1739       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
1740       GR_CMBX_ZERO, 1,
1741       GR_CMBX_ZERO, 0);
1742     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1743       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1744       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
1745       GR_CMBX_B, 0);
1746     cmb.tex_ccolor = rdp.env_color;
1747     cmb.tex |= 3;
1748   }
1749   else
1750   {
1751     MOD_1 (TMOD_TEX_SUB_COL);
1752     MOD_1_COL (rdp.env_color & 0xFFFFFF00);
1753     T0_MUL_T1_ADD_T0 ();
1754   }
1755 }
1756
1757 static void cc__t0_mul_prima_add_prim_mul__shade ()
1758 {
1759   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1760     GR_COMBINE_FACTOR_LOCAL,
1761     GR_COMBINE_LOCAL_ITERATED,
1762     GR_COMBINE_OTHER_TEXTURE);
1763   if (cmb.combine_ext)
1764   {
1765     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1766       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
1767       GR_CMBX_TMU_CALPHA, 0,
1768       GR_CMBX_B, 0);
1769     cmb.tex_ccolor = rdp.prim_color;
1770     cmb.tex |= 1;
1771   }
1772   else
1773   {
1774     MOD_0 (TMOD_TEX_SCALE_FAC_ADD_COL);
1775     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
1776     MOD_0_FAC (rdp.prim_color & 0xFF);
1777     USE_T0 ();
1778   }
1779 }
1780
1781 static void cc__t0_inter_prim_using_prima__inter_env_using_enva ()
1782 {
1783   if (cmb.combine_ext)
1784   {
1785     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
1786       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1787       GR_CMBX_TMU_CALPHA, 0,
1788       GR_CMBX_B, 0);
1789     cmb.tex_ccolor = rdp.prim_color;
1790     cmb.tex |= 1;
1791     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
1792       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1793       GR_CMBX_CONSTANT_COLOR, 0,
1794       GR_CMBX_B, 0);
1795     CC_ENVA ();
1796     SETSHADE_ENV ();
1797   }
1798   else
1799   {
1800     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
1801       GR_COMBINE_FACTOR_TEXTURE_RGB,
1802       GR_COMBINE_LOCAL_ITERATED,
1803       GR_COMBINE_OTHER_CONSTANT);
1804     CC_1SUBENVA ();
1805     SETSHADE_ENV ();
1806     SETSHADE_ENVA ();
1807     MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
1808     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
1809     MOD_0_FAC (rdp.prim_color & 0xFF);
1810     USE_T0 ();
1811   }
1812 }
1813
1814 static void cc_prim_inter_t1_mul_shade_using_texa ()
1815 {
1816   if (cmb.combine_ext)
1817   {
1818     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1819       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1820       GR_CMBX_ZERO, 0,
1821       GR_CMBX_B, 0);
1822     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
1823       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
1824       GR_CMBX_ITRGB, 0,
1825       GR_CMBX_ZERO, 0);
1826     cmb.tex |= 3;
1827     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1828       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
1829       GR_CMBX_TEXTURE_ALPHA, 0,
1830       GR_CMBX_B, 0);
1831   }
1832   else
1833   {
1834     cc_t1_mul_shade ();
1835   }
1836 }
1837
1838 static void cc__prim_inter_t0_using_t0a__mul_shade ()
1839 {
1840   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1841     GR_COMBINE_FACTOR_LOCAL,
1842     GR_COMBINE_LOCAL_ITERATED,
1843     GR_COMBINE_OTHER_TEXTURE);
1844   if (cmb.combine_ext)
1845   {
1846     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1847       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
1848       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0,
1849       GR_CMBX_B, 0);
1850     cmb.tex_ccolor = rdp.prim_color;
1851     cmb.tex |= 1;
1852   }
1853   else
1854   {
1855     MOD_0 (TMOD_COL_INTER_TEX_USING_TEXA);
1856     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
1857     USE_T0 ();
1858   }
1859 }
1860
1861 static void cc__prim_inter_t0_using_t0a__inter_env_using_enva ()
1862 {
1863   if (cmb.combine_ext)
1864   {
1865     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1866       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
1867       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0,
1868       GR_CMBX_B, 0);
1869     cmb.tex_ccolor = rdp.prim_color;
1870     cmb.tex |= 1;
1871     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
1872       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
1873       GR_CMBX_CONSTANT_COLOR, 0,
1874       GR_CMBX_B, 0);
1875     CC_ENVA ();
1876     SETSHADE_ENV ();
1877   }
1878   else
1879   {
1880     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
1881       GR_COMBINE_FACTOR_TEXTURE_RGB,
1882       GR_COMBINE_LOCAL_ITERATED,
1883       GR_COMBINE_OTHER_CONSTANT);
1884     CC_1SUBENVA ();
1885     SETSHADE_ENV ();
1886     SETSHADE_ENVA ();
1887     MOD_0 (TMOD_COL_INTER_TEX_USING_TEXA);
1888     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
1889     USE_T0 ();
1890   }
1891 }
1892
1893 // ** A*B **
1894
1895 static void cc__prim_inter_t0_using_shadea__mul_shade ()
1896 {
1897   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1898     GR_COMBINE_FACTOR_LOCAL,
1899     GR_COMBINE_LOCAL_ITERATED,
1900     GR_COMBINE_OTHER_TEXTURE);
1901   PRIM_INTER_T0_USING_SHADEA ();
1902 }
1903
1904 static void cc_t0_sub_shade_mul_shadea_add_shade ();
1905 static void cc__shade_inter_t0_using_shadea__mul_shade ()
1906 {
1907   if (cmb.combine_ext)
1908   {
1909     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
1910       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
1911       GR_CMBX_ITALPHA, 0,
1912       GR_CMBX_B, 0);
1913     cmb.tex |= 1;
1914     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
1915       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
1916       GR_CMBX_ITRGB, 0,
1917       GR_CMBX_ZERO, 0);
1918   }
1919   else
1920   {
1921     cc_t0_sub_shade_mul_shadea_add_shade ();
1922   }
1923 }
1924
1925 static void cc__prim_inter_env_using_enva__mul_shade ()
1926 {
1927   const float ea = ((float)(rdp.env_color&0xFF)) / 255.0f;
1928   const float ea_i = 1.0f - ea;
1929   wxUint32 pr = (rdp.prim_color >> 24)&0xFF;
1930   wxUint32 pg = (rdp.prim_color >> 16)&0xFF;
1931   wxUint32 pb = (rdp.prim_color >>  8)&0xFF;
1932   wxUint32 er = (rdp.env_color >> 24)&0xFF;
1933   wxUint32 eg = (rdp.env_color >> 16)&0xFF;
1934   wxUint32 eb = (rdp.env_color >>  8)&0xFF;
1935   wxUint32 r = min(255, (wxUint32)(er*ea + pr*ea_i));
1936   wxUint32 g = min(255, (wxUint32)(eg*ea + pg*ea_i));
1937   wxUint32 b = min(255, (wxUint32)(eb*ea + pb*ea_i));
1938   wxUint32 col = (r << 24) | (g << 16) | (b << 8) | 0xFF;
1939   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1940     GR_COMBINE_FACTOR_LOCAL,
1941     GR_COMBINE_LOCAL_ITERATED,
1942     GR_COMBINE_OTHER_CONSTANT);
1943   CC (col);
1944 }
1945
1946 //Added by Gonetz
1947 static void cc_prim_mul_env ()
1948 {
1949   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1950     GR_COMBINE_FACTOR_LOCAL,
1951     GR_COMBINE_LOCAL_ITERATED,
1952     GR_COMBINE_OTHER_CONSTANT);
1953   CC_PRIM ();
1954   SETSHADE_ENV ();
1955 }
1956
1957 static void cc_prim_mul_shade ()
1958 {
1959   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1960     GR_COMBINE_FACTOR_LOCAL,
1961     GR_COMBINE_LOCAL_ITERATED,
1962     GR_COMBINE_OTHER_CONSTANT);
1963   CC_PRIM ();
1964 }
1965
1966 static void cc_prim_mul_shadea ()
1967 {
1968   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1969     GR_COMBINE_FACTOR_LOCAL,
1970     GR_COMBINE_LOCAL_ITERATED,
1971     GR_COMBINE_OTHER_CONSTANT);
1972   SETSHADE_SHADE_A ();
1973   CC_PRIM ();
1974 }
1975
1976 static void cc_env_mul_shade ()
1977 {
1978   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1979     GR_COMBINE_FACTOR_LOCAL,
1980     GR_COMBINE_LOCAL_ITERATED,
1981     GR_COMBINE_OTHER_CONSTANT);
1982   CC_ENV ();
1983 }
1984
1985 static void cc_env_mul_enva ()
1986 {
1987   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1988     GR_COMBINE_FACTOR_OTHER_ALPHA,
1989     GR_COMBINE_LOCAL_NONE,
1990     GR_COMBINE_OTHER_CONSTANT);
1991   CC_ENV ();
1992   CA_ENV ();
1993 }
1994
1995 static void cc_scale_mul_shade ()
1996 {
1997   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
1998     GR_COMBINE_FACTOR_LOCAL,
1999     GR_COMBINE_LOCAL_ITERATED,
2000     GR_COMBINE_OTHER_CONSTANT);
2001   CC (rdp.SCALE);
2002 }
2003
2004 // ** A+B **
2005
2006 static void cc_t0_add_prim () //Aded by Gonetz
2007 {
2008   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2009     GR_COMBINE_FACTOR_ONE,
2010     GR_COMBINE_LOCAL_CONSTANT,
2011     GR_COMBINE_OTHER_TEXTURE);
2012   CC_PRIM ();
2013   USE_T0 ();
2014 }
2015
2016 static void cc__t0_mul_t1__add_prim () //Aded by Gonetz
2017 {
2018   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2019     GR_COMBINE_FACTOR_ONE,
2020     GR_COMBINE_LOCAL_CONSTANT,
2021     GR_COMBINE_OTHER_TEXTURE);
2022   CC_PRIM ();
2023   T0_MUL_T1 ();
2024 }
2025
2026 static void cc_t0_add_env ()
2027 {
2028   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2029     GR_COMBINE_FACTOR_ONE,
2030     GR_COMBINE_LOCAL_CONSTANT,
2031     GR_COMBINE_OTHER_TEXTURE);
2032   CC_ENV ();
2033   USE_T0 ();
2034 }
2035
2036 //Added by Gonetz
2037 static void cc__t0_mul_t1__add_env ()
2038 {
2039   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2040     GR_COMBINE_FACTOR_ONE,
2041     GR_COMBINE_LOCAL_CONSTANT,
2042     GR_COMBINE_OTHER_TEXTURE);
2043   CC_ENV ();
2044   T0_MUL_T1 ();
2045 }
2046
2047 static void cc__t0_mul_t1__add_env_mul__t0_mul_t1__add_env ()
2048 {
2049   if (cmb.combine_ext)
2050   {
2051     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2052       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2053       GR_CMBX_ZERO, 0,
2054       GR_CMBX_B, 0);
2055     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
2056       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
2057       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
2058       GR_CMBX_B, 0);
2059     cmb.tex_ccolor = rdp.env_color;
2060     cmb.tex |= 3;
2061     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
2062       GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
2063       GR_CMBX_TEXTURE_RGB, 0,
2064       GR_CMBX_ZERO, 0);
2065   }
2066   else
2067     cc__t0_mul_t1__add_env();
2068 }
2069
2070 static void cc_t0_add_shade () //Aded by Gonetz
2071 {
2072   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2073     GR_COMBINE_FACTOR_ONE,
2074     GR_COMBINE_LOCAL_ITERATED,
2075     GR_COMBINE_OTHER_TEXTURE);
2076   USE_T0 ();
2077 }
2078
2079 static void cc__t0_mul_t1__add_shade () //Aded by Gonetz
2080 {
2081   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2082     GR_COMBINE_FACTOR_ONE,
2083     GR_COMBINE_LOCAL_ITERATED,
2084     GR_COMBINE_OTHER_TEXTURE);
2085   T0_MUL_T1 ();
2086 }
2087
2088 static void cc_prim_add_env ()
2089 {
2090   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2091     GR_COMBINE_FACTOR_ONE,
2092     GR_COMBINE_LOCAL_CONSTANT,
2093     GR_COMBINE_OTHER_ITERATED);
2094   CC_ENV ();
2095   SETSHADE_PRIM ();
2096 }
2097
2098 static void cc_t0_add_prim_mul_one_sub_t0_add_t0 () //Aded by Gonetz
2099 {
2100   if (cmb.combine_ext)
2101   {
2102     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
2103       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2104       GR_CMBX_LOCAL_TEXTURE_RGB, 1,
2105       GR_CMBX_B, 0);
2106     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
2107       GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
2108       GR_CMBX_ZERO, 1,
2109       GR_CMBX_ZERO, 0);
2110     cmb.tex_ccolor = rdp.prim_color;
2111     cmb.tex |= 1;
2112   }
2113   else
2114   {
2115     cc_t0_add_prim ();
2116   }
2117 }
2118
2119 static void cc_one_sub_prim_mul_t0_add_prim();
2120 static void cc__one_sub_prim_mul_t0_add_prim__mul_prima_add__one_sub_prim_mul_t0_add_prim () //Aded by Gonetz
2121 {
2122   if (cmb.combine_ext)
2123   {
2124     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2125       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
2126       GR_CMBX_TMU_CCOLOR, 1,
2127       GR_CMBX_B, 0);
2128     CCMBEXT(GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
2129       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
2130       GR_CMBX_CONSTANT_COLOR, 0,
2131       GR_CMBX_B, 0);
2132     cmb.tex_ccolor = rdp.prim_color;
2133     CC_PRIMA();
2134     cmb.tex |= 3; //hw frame buffer allocated as tile1, but not used in combiner
2135   }
2136   else
2137   {
2138     cc_one_sub_prim_mul_t0_add_prim();
2139     //    cc_t0 ();
2140   }
2141 }
2142
2143 static void cc_prim_add_shade () //Aded by Gonetz
2144 {
2145   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2146     GR_COMBINE_FACTOR_ONE,
2147     GR_COMBINE_LOCAL_ITERATED,
2148     GR_COMBINE_OTHER_CONSTANT);
2149   CC_PRIM ();
2150 }
2151
2152 static void cc_env_add_shade () //Aded by Gonetz
2153 {
2154   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2155     GR_COMBINE_FACTOR_ONE,
2156     GR_COMBINE_LOCAL_ITERATED,
2157     GR_COMBINE_OTHER_CONSTANT);
2158   CC_ENV ();
2159 }
2160
2161 static void cc_shade_add_shade () //Aded by Gonetz
2162 {
2163   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2164     GR_COMBINE_FACTOR_ONE,
2165     GR_COMBINE_LOCAL_ITERATED,
2166     GR_COMBINE_OTHER_ITERATED);
2167 }
2168
2169 // ** A-B **
2170 static void cc__t0_inter_t1_using_enva__sub_env () //Aded by Gonetz
2171 {
2172   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
2173     GR_COMBINE_FACTOR_ONE,
2174     GR_COMBINE_LOCAL_CONSTANT,
2175     GR_COMBINE_OTHER_TEXTURE);
2176   CC_ENV ();
2177   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
2178   T0_INTER_T1_USING_FACTOR (factor);
2179 }
2180
2181 static void cc_t0_sub__shade_mul_center ()
2182 {
2183   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
2184     GR_COMBINE_FACTOR_ONE,
2185     GR_COMBINE_LOCAL_ITERATED,
2186     GR_COMBINE_OTHER_TEXTURE);
2187   MULSHADE(rdp.CENTER);
2188   USE_T0 ();
2189 }
2190
2191 // ** A-B*C **
2192 static void cc_env_sub__t0_sub_t1_mul_primlod__mul_prim () //Aded by Gonetz
2193 {
2194   if (cmb.combine_ext)
2195   {
2196     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2197       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2198       GR_CMBX_ZERO, 0,
2199       GR_CMBX_B, 0);
2200     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2201       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
2202       GR_CMBX_ITRGB, 0,
2203       GR_CMBX_ZERO, 0);
2204     cmb.tex |= 3;
2205     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
2206       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
2207       GR_CMBX_ZERO, 1,
2208       GR_CMBX_ZERO, 0);
2209     SETSHADE_PRIM ();
2210     SETSHADE_PRIMLOD ();
2211     CC_ENV ();
2212   }
2213   else
2214   {
2215     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2216       GR_COMBINE_FACTOR_TEXTURE_RGB,
2217       GR_COMBINE_LOCAL_CONSTANT,
2218       GR_COMBINE_OTHER_ITERATED);
2219     SETSHADE_PRIM ();
2220     CC_ENV ();
2221     T1_INTER_T0_USING_FACTOR (lod_frac);
2222   }
2223 }
2224
2225 static void cc_env_sub__t0_mul_scale_add_env__mul_prim ()
2226 {
2227   if (cmb.combine_ext)
2228   {
2229     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2230       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
2231       GR_CMBX_TMU_CCOLOR, 0,
2232       GR_CMBX_B, 0);
2233     cmb.tex_ccolor = rdp.SCALE;
2234     cmb.tex |= 1;
2235     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
2236       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
2237       GR_CMBX_CONSTANT_COLOR, 0,
2238       GR_CMBX_B, 0);
2239     SETSHADE_ENV ();
2240     CC_PRIM ();
2241   }
2242   else
2243     cc_t0_add_env ();
2244 }
2245
2246 static void cc_one_sub__one_sub_t0_mul_enva_add_prim__mul_prim () //Aded by Gonetz
2247 {
2248   if (cmb.combine_ext)
2249   {
2250     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ONE_MINUS_X,
2251       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
2252       GR_CMBX_DETAIL_FACTOR, 0,
2253       GR_CMBX_B, 0);
2254     cmb.tex_ccolor = rdp.prim_color;
2255     cmb.tex |= 1;
2256     percent = (float)(rdp.env_color&0xFF) / 255.0f;
2257     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
2258     CCMBEXT(GR_CMBX_ZERO, GR_FUNC_MODE_X,
2259       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
2260       GR_CMBX_CONSTANT_COLOR, 0,
2261       GR_CMBX_ZERO, 1);
2262     CC_PRIM ();
2263   }
2264   else
2265   {
2266     cc_one ();
2267   }
2268 }
2269
2270 // ** A+B*C **
2271 //Aded by Gonetz
2272 static void cc_t0_add_env_mul_k5 ()
2273 {
2274   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2275     GR_COMBINE_FACTOR_ONE,
2276     GR_COMBINE_LOCAL_CONSTANT,
2277     GR_COMBINE_OTHER_TEXTURE);
2278   float scale = rdp.K5 / 255.0f;
2279   wxUint8 r = (wxUint8)(rdp.env_color >> 24) & 0xFF;
2280   r = (wxUint8)(r*scale);
2281   wxUint8 g = (wxUint8)(rdp.env_color >> 16) & 0xFF;
2282   g = (wxUint8)(g*scale);
2283   wxUint8 b = (wxUint8)(rdp.env_color >>  8) & 0xFF;
2284   b = (wxUint8)(b*scale);
2285   CC((r<<24)|(g<<16)|(b<<8));
2286   USE_T0 ();
2287 }
2288
2289 static void cc_t0_add_shade_mul_env ()
2290 {
2291   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2292     GR_COMBINE_FACTOR_ONE,
2293     GR_COMBINE_LOCAL_ITERATED,
2294     GR_COMBINE_OTHER_TEXTURE);
2295   MULSHADE_ENV ();
2296   USE_T0 ();
2297 }
2298
2299 static void cc__t1_mul_t0_add_t0__add_prim_mul_shade () //Aded by Gonetz
2300 {
2301   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2302     GR_COMBINE_FACTOR_ONE,
2303     GR_COMBINE_LOCAL_ITERATED,
2304     GR_COMBINE_OTHER_TEXTURE);
2305   MULSHADE_PRIM ();
2306   rdp.best_tex = 0;
2307   cmb.tex |= 3;
2308   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL;
2309   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
2310   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL;
2311 }
2312
2313 static void cc__t0_sub_env_mul_enva__add_prim_mul_shade ()
2314 {
2315   if (cmb.combine_ext)
2316   {
2317     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2318       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
2319       GR_CMBX_DETAIL_FACTOR, 0,
2320       GR_CMBX_ZERO, 0);
2321     cmb.tex_ccolor = rdp.env_color;
2322     cmb.tex |= 1;
2323     percent = (float)(rdp.env_color&0xFF) / 255.0f;
2324     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
2325
2326     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
2327       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2328       GR_CMBX_CONSTANT_COLOR, 0,
2329       GR_CMBX_B, 0);
2330     CC_PRIM ();
2331   }
2332   else {
2333     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2334           GR_COMBINE_FACTOR_ONE,
2335           GR_COMBINE_LOCAL_ITERATED,
2336           GR_COMBINE_OTHER_TEXTURE);
2337     MULSHADE_PRIM ();
2338           MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC);
2339           MOD_0_COL (rdp.env_color & 0xFFFFFF00);
2340           MOD_0_FAC (rdp.env_color & 0xFF);
2341         USE_T0 ();
2342   }
2343 }
2344
2345 // ** A*B+C **
2346 //Added by Gonetz
2347 static void cc_t0_mul_prim_add_t1 ()
2348 {
2349   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
2350     GR_COMBINE_FACTOR_ONE,
2351     GR_COMBINE_LOCAL_NONE,
2352     GR_COMBINE_OTHER_TEXTURE);
2353   if (cmb.combine_ext)
2354   {
2355     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2356       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2357       GR_CMBX_ZERO, 0,
2358       GR_CMBX_B, 0);
2359     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2360       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2361       GR_CMBX_TMU_CCOLOR, 0,
2362       GR_CMBX_B, 0);
2363     cmb.tex |= 3;
2364     cmb.tex_ccolor = rdp.prim_color;
2365   }
2366   else
2367   {
2368     MOD_0 (TMOD_TEX_MUL_COL);
2369     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
2370     T0_ADD_T1 ();
2371   }
2372 }
2373
2374 static void cc_shirt ()
2375 {
2376   // (t1-0)*prim+0, (1-t0)*t1+cmb
2377   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
2378     GR_COMBINE_FACTOR_ONE,
2379     GR_COMBINE_LOCAL_NONE,
2380     GR_COMBINE_OTHER_TEXTURE);
2381   if (cmb.combine_ext)
2382   {
2383     /*
2384     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2385     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2386     GR_CMBX_TMU_CCOLOR, 0,
2387     GR_CMBX_ZERO, 0);
2388     //*/
2389     //*
2390     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2391       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2392       GR_CMBX_ZERO, 0,
2393       GR_CMBX_B, 0);
2394     //*/
2395     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
2396       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2397       GR_CMBX_LOCAL_TEXTURE_RGB, 1,
2398       GR_CMBX_B, 0);
2399     cmb.tex |= 3;
2400     cmb.tex_ccolor = rdp.prim_color;
2401   }
2402   else
2403   {
2404     MOD_1 (TMOD_TEX_MUL_COL);
2405     MOD_1_COL (rdp.prim_color & 0xFFFFFF00);
2406     T0_ADD_T1 ();
2407   }
2408 }
2409
2410 static void cc_t1_mul_prim_add_prim ()
2411 {
2412   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2413     GR_COMBINE_FACTOR_TEXTURE_RGB,
2414     GR_COMBINE_LOCAL_CONSTANT,
2415     GR_COMBINE_OTHER_ITERATED);
2416   SETSHADE_PRIM ();
2417   CC_PRIM ();
2418   USE_T0 ();
2419 }
2420
2421 //Added by Gonetz
2422 static void cc_t0_mul_prim_add_env ()
2423 {
2424   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2425     GR_COMBINE_FACTOR_TEXTURE_RGB,
2426     GR_COMBINE_LOCAL_CONSTANT,
2427     GR_COMBINE_OTHER_ITERATED);
2428   SETSHADE_PRIM ();
2429   CC_ENV ();
2430   USE_T0 ();
2431 }
2432
2433 //Added by Gonetz
2434 static void cc_t1_mul_prim_add_env ()
2435 {
2436   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2437     GR_COMBINE_FACTOR_TEXTURE_RGB,
2438     GR_COMBINE_LOCAL_CONSTANT,
2439     GR_COMBINE_OTHER_ITERATED);
2440   SETSHADE_PRIM ();
2441   CC_ENV ();
2442   USE_T1 ();
2443 }
2444
2445 static void cc__t0_add_primlod__mul_prim_add_env ()
2446 {
2447   if (cmb.combine_ext)
2448   {
2449     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2450       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
2451       GR_CMBX_ZERO, 1,
2452       GR_CMBX_ZERO, 0);
2453     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
2454       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ZERO,
2455       GR_CMBX_ITRGB, 0,
2456       GR_CMBX_B, 0);
2457     CC_PRIMLOD ();
2458     cmb.tex_ccolor = cmb.ccolor;
2459     CC_ENV ();
2460     SETSHADE_PRIM ();
2461     cmb.tex |= 1;
2462   }
2463   else
2464   {
2465     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2466       GR_COMBINE_FACTOR_TEXTURE_RGB,
2467       GR_COMBINE_LOCAL_CONSTANT,
2468       GR_COMBINE_OTHER_ITERATED);
2469     CC_PRIMLOD ();
2470     MOD_0 (TMOD_TEX_ADD_COL);
2471     MOD_0_COL (cmb.ccolor & 0xFFFFFF00);
2472     SETSHADE_PRIM ();
2473     CC_ENV ();
2474     USE_T0 ();
2475   }
2476 }
2477
2478 //Added by Gonetz
2479 static void cc_t0_mul_prim_mul_shade_add_prim_mul_shade ()
2480 {
2481   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2482     GR_COMBINE_FACTOR_LOCAL,
2483     GR_COMBINE_LOCAL_ITERATED,
2484     GR_COMBINE_OTHER_TEXTURE);
2485   MULSHADE_PRIM ();
2486   USE_T0 ();
2487 }
2488
2489 //Added by Gonetz
2490 static void cc__t0_inter_t1_using_primlod__mul_prim_add_env ()
2491 {
2492   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2493     GR_COMBINE_FACTOR_TEXTURE_RGB,
2494     GR_COMBINE_LOCAL_CONSTANT,
2495     GR_COMBINE_OTHER_ITERATED);
2496   SETSHADE_PRIM ();
2497   CC_ENV ();
2498   T0_INTER_T1_USING_FACTOR (lod_frac);
2499 }
2500
2501 static void cc__t1_sub_prim_mul_enva_add_t0__mul_prim_add_env ()
2502 {
2503   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2504     GR_COMBINE_FACTOR_TEXTURE_RGB,
2505     GR_COMBINE_LOCAL_ITERATED,
2506     GR_COMBINE_OTHER_CONSTANT);
2507   CC_PRIM ();
2508   SETSHADE_ENV ();
2509   if (cmb.combine_ext)
2510   {
2511     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2512       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
2513       GR_CMBX_DETAIL_FACTOR, 0,
2514       GR_CMBX_ZERO, 0);
2515     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
2516       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2517       GR_CMBX_ZERO, 1,
2518       GR_CMBX_ZERO, 0);
2519     cmb.tex_ccolor = rdp.prim_color;
2520     cmb.tex |= 3;
2521     percent = (float)(rdp.env_color&0xFF) / 255.0f;
2522     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
2523   }
2524   else
2525   {
2526     MOD_1 (TMOD_TEX_SUB_COL_MUL_FAC);
2527     MOD_1_COL (rdp.prim_color & 0xFFFFFF00);
2528     MOD_1_FAC (rdp.env_color & 0xFF);
2529     T0_ADD_T1 ();
2530   }
2531 }
2532
2533 //Added by Gonetz
2534 static void cc__t0_inter_t1_using_primlod__mul_shade_add_env ()
2535 {
2536   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2537     GR_COMBINE_FACTOR_TEXTURE_RGB,
2538     GR_COMBINE_LOCAL_CONSTANT,
2539     GR_COMBINE_OTHER_ITERATED);
2540   CC_ENV ();
2541   T0_INTER_T1_USING_FACTOR (lod_frac);
2542 }
2543
2544 //Added by Gonetz
2545 static void cc__t1_sub_prim_mul_primlod_add_t0__mul_prim_add_env ()
2546 {
2547   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2548     GR_COMBINE_FACTOR_TEXTURE_RGB,
2549     GR_COMBINE_LOCAL_CONSTANT,
2550     GR_COMBINE_OTHER_ITERATED);
2551   SETSHADE_PRIM ();
2552   CC_ENV ();
2553   T1_SUB_PRIM_MUL_PRIMLOD_ADD_T0 ();
2554 }
2555
2556 //Aded by Gonetz
2557 static void cc__t0_mul_t1__mul_prim_add_env ()
2558 {
2559   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2560     GR_COMBINE_FACTOR_TEXTURE_RGB,
2561     GR_COMBINE_LOCAL_CONSTANT,
2562     GR_COMBINE_OTHER_ITERATED);
2563   CC_ENV ();
2564   MULSHADE_PRIM ();
2565   T0_MUL_T1 ();
2566 }
2567
2568 //Aded by Gonetz
2569 static void cc__t0_mul_t1__sub_prim_mul_env_add_shade ()
2570 {
2571   if (cmb.combine_ext)
2572   {
2573     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2574       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2575       GR_CMBX_TMU_CCOLOR, 0,
2576       GR_CMBX_ZERO, 0);
2577     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
2578       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
2579       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
2580       GR_CMBX_B, 0);
2581     cmb.tex_ccolor = rdp.env_color;
2582     cmb.tex |= 3;
2583     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
2584       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
2585       GR_CMBX_ZERO, 1,
2586       GR_CMBX_TEXTURE_RGB, 0);
2587     CC_PRIMMULENV ();
2588   }
2589   else
2590   {
2591     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2592       GR_COMBINE_FACTOR_TEXTURE_RGB,
2593       GR_COMBINE_LOCAL_ITERATED,
2594       GR_COMBINE_OTHER_CONSTANT);
2595     CC_ENV ();
2596     T0_MUL_T1 ();
2597   }
2598 }
2599
2600 static void cc__t0_sub_prim_mul_t1_add_t1__mul_env_add_shade ()
2601 {
2602   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2603     GR_COMBINE_FACTOR_TEXTURE_RGB,
2604     GR_COMBINE_LOCAL_ITERATED,
2605     GR_COMBINE_OTHER_CONSTANT);
2606   CC_ENV ();
2607   if (rdp.prim_color & 0xFFFFFF00)
2608   {
2609     MOD_0 (TMOD_TEX_SUB_COL);
2610     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
2611   }
2612   if (cmb.combine_ext)
2613   {
2614     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2615       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2616       GR_CMBX_ZERO, 0,
2617       GR_CMBX_B, 0);
2618     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
2619       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2620       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
2621       GR_CMBX_B, 0);
2622     cmb.tex |= 3;
2623   }
2624   else
2625   {
2626     T0_MUL_T1 ();
2627   }
2628 }
2629
2630 static void cc__t0_mul_t1__mul_shade_add_prim ()
2631 {
2632   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2633     GR_COMBINE_FACTOR_TEXTURE_RGB,
2634     GR_COMBINE_LOCAL_CONSTANT,
2635     GR_COMBINE_OTHER_ITERATED);
2636   CC_PRIM ();
2637   T0_MUL_T1 ();
2638 }
2639
2640 static void cc__t0_mul_shadea_add_env__mul_shade_add_prim ()
2641 {
2642   if (cmb.combine_ext)
2643   {
2644     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
2645       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
2646       GR_CMBX_ITALPHA, 0,
2647       GR_CMBX_B, 0);
2648     cmb.tex_ccolor = rdp.env_color;
2649     cmb.tex |= 1;
2650     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
2651       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ZERO,
2652       GR_CMBX_ITRGB, 0,
2653       GR_CMBX_B, 0);
2654     CC_PRIM ();
2655   }
2656   else
2657   {
2658     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2659       GR_COMBINE_FACTOR_TEXTURE_RGB,
2660       GR_COMBINE_LOCAL_CONSTANT,
2661       GR_COMBINE_OTHER_ITERATED);
2662     MULSHADE_SHADEA ();
2663     CC_PRIM ();
2664     USE_T0 ();
2665   }
2666 }
2667
2668 static void cc__t0_mul_t1__mul_shade_add_env ()
2669 {
2670   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2671     GR_COMBINE_FACTOR_TEXTURE_RGB,
2672     GR_COMBINE_LOCAL_CONSTANT,
2673     GR_COMBINE_OTHER_ITERATED);
2674   CC_ENV ();
2675   T0_MUL_T1 ();
2676 }
2677
2678 //Added by Gonetz
2679 static void cc__t0_add_t1__mul_shade_add_env ()
2680 {
2681   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2682     GR_COMBINE_FACTOR_TEXTURE_RGB,
2683     GR_COMBINE_LOCAL_CONSTANT,
2684     GR_COMBINE_OTHER_ITERATED);
2685   CC_ENV ();
2686   T0_ADD_T1 ();
2687 }
2688
2689 static void cc__t1_mul_prima_add_t0__mul_shade_add_env ()
2690 {
2691   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2692     GR_COMBINE_FACTOR_TEXTURE_RGB,
2693     GR_COMBINE_LOCAL_CONSTANT,
2694     GR_COMBINE_OTHER_ITERATED);
2695   CC_ENV ();
2696   T1_MUL_PRIMA_ADD_T0 ();
2697 }
2698
2699 static void cc__t0_inter_t1_using_enva__mul_shade_add_prim ()
2700 {
2701   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2702     GR_COMBINE_FACTOR_TEXTURE_RGB,
2703     GR_COMBINE_LOCAL_CONSTANT,
2704     GR_COMBINE_OTHER_ITERATED);
2705   CC_PRIM ();
2706   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
2707   T0_INTER_T1_USING_FACTOR (factor);
2708 }
2709
2710 static void cc__t0_inter_t1_using_enva__mul_shade_add_env ()
2711 {
2712   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2713     GR_COMBINE_FACTOR_TEXTURE_RGB,
2714     GR_COMBINE_LOCAL_CONSTANT,
2715     GR_COMBINE_OTHER_ITERATED);
2716   CC_ENV ();
2717   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
2718   T0_INTER_T1_USING_FACTOR (factor);
2719 }
2720
2721 //Added by Gonetz
2722 static void cc_t0_mul_primlod_add_prim ()
2723 {
2724   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2725     GR_COMBINE_FACTOR_TEXTURE_RGB,
2726     GR_COMBINE_LOCAL_ITERATED,
2727     GR_COMBINE_OTHER_CONSTANT);
2728   SETSHADE_PRIM ();
2729   CC_PRIMLOD ();
2730   USE_T0 ();
2731 }
2732
2733 static void cc__t0_mul_primlod__add__prim_mul_shade ()
2734 {
2735   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2736     GR_COMBINE_FACTOR_TEXTURE_RGB,
2737     GR_COMBINE_LOCAL_ITERATED,
2738     GR_COMBINE_OTHER_CONSTANT);
2739   MULSHADE_PRIM ();
2740   CC_PRIMLOD ();
2741   USE_T0 ();
2742 }
2743
2744 //Added by Gonetz
2745 static void cc_t0_mul_primlod_add_prim_mul_shade_add_env ()
2746 {
2747   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2748     GR_COMBINE_FACTOR_TEXTURE_RGB,
2749     GR_COMBINE_LOCAL_ITERATED,
2750     GR_COMBINE_OTHER_CONSTANT);
2751   MULSHADE_PRIM ();
2752   ADDSHADE_ENV ();
2753   CC_PRIMLOD ();
2754   USE_T0 ();
2755 }
2756
2757 //Added by Gonetz
2758 static void cc_t1_mul_primlod_add_prim_mul_shade_add_env ()
2759 {
2760   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2761     GR_COMBINE_FACTOR_TEXTURE_RGB,
2762     GR_COMBINE_LOCAL_ITERATED,
2763     GR_COMBINE_OTHER_CONSTANT);
2764   MULSHADE_PRIM ();
2765   ADDSHADE_ENV ();
2766   CC_PRIMLOD ();
2767   USE_T1 ();
2768 }
2769
2770 static void cc__t0_inter_t1_using_primlod__mul_shade_add_prim ()
2771 {
2772   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2773     GR_COMBINE_FACTOR_TEXTURE_RGB,
2774     GR_COMBINE_LOCAL_CONSTANT,
2775     GR_COMBINE_OTHER_ITERATED);
2776   CC_PRIM ();
2777   T0_INTER_T1_USING_FACTOR (lod_frac);
2778 }
2779
2780 static void cc__t1_inter_t0_using_primlod__mul_shade_add_prim ()
2781 {
2782   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2783     GR_COMBINE_FACTOR_TEXTURE_RGB,
2784     GR_COMBINE_LOCAL_CONSTANT,
2785     GR_COMBINE_OTHER_ITERATED);
2786   CC_PRIM ();
2787   T1_INTER_T0_USING_FACTOR (lod_frac);
2788 }
2789
2790 //Added by Gonetz
2791 static void cc__t1_sub_t0_mul_primlod_add_prim__mul_shade_add_shade ()
2792 {
2793   if (cmb.combine_ext)
2794   {
2795     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2796       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
2797       GR_CMBX_ZERO, 0,
2798       GR_CMBX_B, 0);
2799     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
2800       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
2801       GR_CMBX_DETAIL_FACTOR, 0,
2802       GR_CMBX_ZERO, 0);
2803     cmb.tex |= 3;
2804     percent = (float)lod_frac / 255.0f;
2805     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
2806     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
2807       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
2808       GR_CMBX_ITRGB, 0,
2809       GR_CMBX_ITRGB, 0);
2810     CC_PRIM ();
2811   }
2812   else
2813   {
2814     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2815       GR_COMBINE_FACTOR_LOCAL,
2816       GR_COMBINE_LOCAL_ITERATED,
2817       GR_COMBINE_OTHER_TEXTURE);
2818     T0_INTER_T1_USING_FACTOR (lod_frac);
2819   }
2820 }
2821
2822 //Added by Gonetz
2823 static void cc__t0_inter_t1_using_half__mul_prim_add_env ()
2824 {
2825   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2826     GR_COMBINE_FACTOR_TEXTURE_RGB,
2827     GR_COMBINE_LOCAL_CONSTANT,
2828     GR_COMBINE_OTHER_ITERATED);
2829   SETSHADE_PRIM ();
2830   CC_ENV ();
2831   T0_INTER_T1_USING_FACTOR (0x7F);
2832 }
2833
2834 //Added by Gonetz
2835 static void cc__t0_inter_t1_using_t1__mul_prim_add_shade ()
2836 {
2837   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2838     GR_COMBINE_FACTOR_TEXTURE_RGB,
2839     GR_COMBINE_LOCAL_ITERATED,
2840     GR_COMBINE_OTHER_CONSTANT);
2841   CC_PRIM ();
2842   T0_INTER_T1_USING_T1 ();
2843 }
2844
2845 //Added by Gonetz
2846 static void cc_one_sub_t1_mul_t0a_add_t0_mul_env_add_prim ()
2847 {
2848   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2849     GR_COMBINE_FACTOR_ONE,
2850     GR_COMBINE_LOCAL_CONSTANT,
2851     GR_COMBINE_OTHER_TEXTURE);
2852   CC_PRIM ();
2853   MOD_0 (TMOD_TEX_MUL_COL);
2854   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
2855   rdp.best_tex = 0;
2856   cmb.tex |= 3;
2857   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL;
2858   cmb.tmu1_invert = 1;
2859   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
2860   cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL_ALPHA;
2861 }
2862
2863 //Added by Gonetz
2864 static void cc__t0_inter_t1_using_t1__mul_shade_add_prim ()
2865 {
2866   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2867     GR_COMBINE_FACTOR_TEXTURE_RGB,
2868     GR_COMBINE_LOCAL_CONSTANT,
2869     GR_COMBINE_OTHER_ITERATED);
2870   CC_PRIM ();
2871   T0_INTER_T1_USING_T1 ();
2872 }
2873
2874 //Added by Gonetz
2875 static void cc_t0_mul_prim_add_shade ()
2876 {
2877   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2878     GR_COMBINE_FACTOR_TEXTURE_RGB,
2879     GR_COMBINE_LOCAL_ITERATED,
2880     GR_COMBINE_OTHER_CONSTANT);
2881   CC_PRIM ();
2882   USE_T0 ();
2883 }
2884
2885 static void cc_t1_mul_prim_add_shade ()
2886 {
2887   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2888     GR_COMBINE_FACTOR_TEXTURE_RGB,
2889     GR_COMBINE_LOCAL_ITERATED,
2890     GR_COMBINE_OTHER_CONSTANT);
2891   CC_PRIM ();
2892   USE_T1 ();
2893 }
2894
2895 //Added by Gonetz
2896 static void cc_t0_mul_env_add_prim ()
2897 {
2898   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2899     GR_COMBINE_FACTOR_TEXTURE_RGB,
2900     GR_COMBINE_LOCAL_CONSTANT,
2901     GR_COMBINE_OTHER_ITERATED);
2902   SETSHADE_ENV ();
2903   CC_PRIM ();
2904   USE_T0 ();
2905 }
2906
2907 //Added by Gonetz
2908 static void cc_t1_mul_env_add_prim ()
2909 {
2910   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2911     GR_COMBINE_FACTOR_TEXTURE_RGB,
2912     GR_COMBINE_LOCAL_CONSTANT,
2913     GR_COMBINE_OTHER_ITERATED);
2914   SETSHADE_ENV ();
2915   CC_PRIM ();
2916   USE_T1 ();
2917 }
2918
2919 static void cc_t0_mul_scale_add_prim ()
2920 {
2921   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2922     GR_COMBINE_FACTOR_TEXTURE_RGB,
2923     GR_COMBINE_LOCAL_CONSTANT,
2924     GR_COMBINE_OTHER_ITERATED);
2925   SETSHADE (rdp.SCALE);
2926   CC_PRIM ();
2927   USE_T0 ();
2928 }
2929
2930 //Added by Gonetz
2931 static void cc__t0_mul_t1__mul_env_add_prim ()
2932 {
2933   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2934     GR_COMBINE_FACTOR_TEXTURE_RGB,
2935     GR_COMBINE_LOCAL_CONSTANT,
2936     GR_COMBINE_OTHER_ITERATED);
2937   SETSHADE_ENV ();
2938   CC_PRIM ();
2939   T0_MUL_T1 ();
2940 }
2941
2942 //Added by Gonetz
2943 static void cc__t0_add__t1_mul_scale__mul_env_sub_center_add_prim ()
2944 {
2945   // (t1-0)*scale+t0, (env-center)*cmb+prim
2946   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2947     GR_COMBINE_FACTOR_TEXTURE_RGB,
2948     GR_COMBINE_LOCAL_ITERATED,
2949     GR_COMBINE_OTHER_CONSTANT);
2950   CC_C1SUBC2(rdp.env_color, rdp.CENTER);
2951   SETSHADE_PRIM ();
2952   MOD_1 (TMOD_TEX_MUL_COL);
2953   MOD_1_COL (rdp.SCALE & 0xFFFFFF00);
2954   T0_ADD_T1 ();
2955 }
2956
2957 //Added by Gonetz
2958 static void cc__t1_sub_t0__mul_env_add_prim ()
2959 {
2960   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2961     GR_COMBINE_FACTOR_TEXTURE_RGB,
2962     GR_COMBINE_LOCAL_CONSTANT,
2963     GR_COMBINE_OTHER_ITERATED);
2964   SETSHADE_ENV ();
2965   CC_PRIM ();
2966   T1_SUB_T0 ();
2967 }
2968
2969 //Added by Gonetz
2970 static void cc_t0_mul_env_add_shade ()
2971 {
2972   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2973     GR_COMBINE_FACTOR_TEXTURE_RGB,
2974     GR_COMBINE_LOCAL_ITERATED,
2975     GR_COMBINE_OTHER_CONSTANT);
2976   CC_ENV ();
2977   USE_T0 ();
2978 }
2979
2980 static void cc_t0_mul_shade_add_prim ()
2981 {
2982   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2983     GR_COMBINE_FACTOR_TEXTURE_RGB,
2984     GR_COMBINE_LOCAL_CONSTANT,
2985     GR_COMBINE_OTHER_ITERATED);
2986   CC_PRIM ();
2987   USE_T0 ();
2988 }
2989
2990 static void cc__t0_mul_enva_add_t1__mul_shade_add_prim ()
2991 {
2992   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
2993     GR_COMBINE_FACTOR_TEXTURE_RGB,
2994     GR_COMBINE_LOCAL_CONSTANT,
2995     GR_COMBINE_OTHER_ITERATED);
2996   CC_PRIM ();
2997   if (cmb.combine_ext)
2998   {
2999     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3000       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3001       GR_CMBX_ZERO, 1,
3002       GR_CMBX_ZERO, 0);
3003     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3004       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3005       GR_CMBX_DETAIL_FACTOR, 0,
3006       GR_CMBX_B, 0);
3007     cmb.tex |= 3;
3008     percent = (float)(rdp.env_color&0xFF) / 255.0f;
3009     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
3010   }
3011   else
3012   {
3013     T0_ADD_T1 ();
3014   }
3015 }
3016
3017 static void cc_t0_mul_shade_add_prima ()
3018 {
3019   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3020     GR_COMBINE_FACTOR_TEXTURE_RGB,
3021     GR_COMBINE_LOCAL_CONSTANT,
3022     GR_COMBINE_OTHER_ITERATED);
3023   CC_PRIMA ();
3024   USE_T0 ();
3025 }
3026
3027 static void cc_t1_mul_shade_add_prim ()
3028 {
3029   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3030     GR_COMBINE_FACTOR_TEXTURE_RGB,
3031     GR_COMBINE_LOCAL_CONSTANT,
3032     GR_COMBINE_OTHER_ITERATED);
3033   CC_PRIM ();
3034   USE_T1 ();
3035 }
3036
3037 static void cc_t0_mul_shade_add_env ()
3038 {
3039   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3040     GR_COMBINE_FACTOR_TEXTURE_RGB,
3041     GR_COMBINE_LOCAL_CONSTANT,
3042     GR_COMBINE_OTHER_ITERATED);
3043   CC_ENV ();
3044   USE_T0 ();
3045 }
3046
3047 static void cc__t0_add_prim__mul_shade_add_t0 ()
3048 {
3049   if (cmb.combine_ext)
3050   {
3051     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
3052       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3053       GR_CMBX_ITRGB, 0,
3054       GR_CMBX_B, 0);
3055     CC_PRIM ();
3056   }
3057   else
3058   {
3059     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3060       GR_COMBINE_FACTOR_LOCAL,
3061       GR_COMBINE_LOCAL_ITERATED,
3062       GR_COMBINE_OTHER_TEXTURE);
3063     //    MOD_0 (TMOD_TEX_ADD_COL);
3064     //    MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
3065   }
3066   USE_T0 ();
3067 }
3068
3069 static void cc__t0_add_prim__mul_shade_add_t1 ()
3070 {
3071   if (cmb.combine_ext)
3072   {
3073     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3074       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3075       GR_CMBX_ZERO, 0,
3076       GR_CMBX_B, 0);
3077     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3078       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3079       GR_CMBX_ITRGB, 0,
3080       GR_CMBX_B, 0);
3081     cmb.tex |= 3;
3082     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
3083       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3084       GR_CMBX_ITRGB, 0,
3085       GR_CMBX_B, 0);
3086     CC_PRIM ();
3087   }
3088   else
3089   {
3090     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3091       GR_COMBINE_FACTOR_ONE,
3092       GR_COMBINE_LOCAL_ITERATED,
3093       GR_COMBINE_OTHER_TEXTURE);
3094     MULSHADE_PRIM ();
3095     T0_ADD_T1 ();
3096   }
3097 }
3098
3099 static void cc__t0_add_primlod__mul_shade_add_env ()
3100 {
3101   if (cmb.combine_ext)
3102   {
3103     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3104       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
3105       GR_CMBX_ZERO, 1,
3106       GR_CMBX_ZERO, 0);
3107     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3108       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
3109       GR_CMBX_ZERO, 1,
3110       GR_CMBX_ZERO, 0);
3111     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3112       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ZERO,
3113       GR_CMBX_ITRGB, 0,
3114       GR_CMBX_B, 0);
3115     CC_PRIMLOD ();
3116     cmb.tex_ccolor = cmb.ccolor;
3117     CC_ENV ();
3118     cmb.tex |= 1;
3119   }
3120   else
3121   {
3122     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3123       GR_COMBINE_FACTOR_TEXTURE_RGB,
3124       GR_COMBINE_LOCAL_CONSTANT,
3125       GR_COMBINE_OTHER_ITERATED);
3126     wxUint32 color = (lod_frac<<24) | (lod_frac<<16) | (lod_frac<<8);
3127     MOD_0 (TMOD_TEX_ADD_COL);
3128     MOD_0_COL (color & 0xFFFFFF00);
3129     CC_ENV ();
3130     USE_T0 ();
3131   }
3132 }
3133
3134 static void cc__t0_mul_prima_add_prim_mul__shade_add_env ()
3135 {
3136   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3137     GR_COMBINE_FACTOR_TEXTURE_RGB,
3138     GR_COMBINE_LOCAL_CONSTANT,
3139     GR_COMBINE_OTHER_ITERATED);
3140   CC_ENV ();
3141   if (cmb.combine_ext)
3142   {
3143     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3144       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
3145       GR_CMBX_TMU_CALPHA, 0,
3146       GR_CMBX_B, 0);
3147     cmb.tex_ccolor = rdp.prim_color;
3148     cmb.tex |= 1;
3149   }
3150   else
3151   {
3152     MOD_0 (TMOD_TEX_SCALE_FAC_ADD_COL);
3153     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
3154     MOD_0_FAC (rdp.prim_color & 0xFF);
3155     USE_T0 ();
3156   }
3157 }
3158
3159 //Added by Gonetz
3160 static void cc_t0_mul_shadea_add_shade ()
3161 {
3162   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3163     GR_COMBINE_FACTOR_LOCAL_ALPHA,
3164     GR_COMBINE_LOCAL_ITERATED,
3165     GR_COMBINE_OTHER_TEXTURE);
3166   USE_T0 ();
3167 }
3168
3169 static void cc_prim_mul_prima_add_prim () //Added by Gonetz
3170 {
3171   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3172     GR_COMBINE_FACTOR_LOCAL_ALPHA,
3173     GR_COMBINE_LOCAL_CONSTANT,
3174     GR_COMBINE_OTHER_ITERATED);
3175   CC_PRIM ();
3176   CA_PRIM ();
3177   SETSHADE_PRIM ();
3178 }
3179
3180 static void cc_prim_mul_prima_add_t0 () //Added by Gonetz
3181 {
3182   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3183     GR_COMBINE_FACTOR_ONE,
3184     GR_COMBINE_LOCAL_ITERATED,
3185     GR_COMBINE_OTHER_TEXTURE);
3186   SETSHADE_PRIM ();
3187   SETSHADE_PRIMA ();
3188   USE_T0 ();
3189 }
3190
3191 static void cc_prim_mul_env_add_t0 () //Added by Gonetz
3192 {
3193   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3194     GR_COMBINE_FACTOR_ONE,
3195     GR_COMBINE_LOCAL_ITERATED,
3196     GR_COMBINE_OTHER_TEXTURE);
3197   SETSHADE_PRIM ();
3198   SETSHADE_ENV ();
3199   USE_T0 ();
3200 }
3201
3202 static void cc_prim_mul_shade_add_t0 ()
3203 {
3204   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3205     GR_COMBINE_FACTOR_ONE,
3206     GR_COMBINE_LOCAL_ITERATED,
3207     GR_COMBINE_OTHER_TEXTURE);
3208   MULSHADE_PRIM ();
3209   USE_T0 ();
3210 }
3211
3212 static void cc_prim_mul_shade_add_env ()
3213 {
3214   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3215     GR_COMBINE_FACTOR_ONE,
3216     GR_COMBINE_LOCAL_CONSTANT,
3217     GR_COMBINE_OTHER_ITERATED);
3218   CC_ENV ();
3219   MULSHADE_PRIM ();
3220 }
3221
3222 static void cc_env_mul_shade_add_env ()  //Added by Gonetz
3223 {
3224   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3225     GR_COMBINE_FACTOR_ONE,
3226     GR_COMBINE_LOCAL_CONSTANT,
3227     GR_COMBINE_OTHER_ITERATED);
3228   CC_ENV ();
3229   MULSHADE_ENV ();
3230 }
3231
3232 // ** A*B+C*D **
3233 static void cc_t0_mul_prim_add_one_sub_prim_mul_shade () //Added by Gonetz
3234 {
3235   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3236     GR_COMBINE_FACTOR_TEXTURE_RGB,
3237     GR_COMBINE_LOCAL_ITERATED,
3238     GR_COMBINE_OTHER_CONSTANT);
3239   CC_PRIM ();
3240   MULSHADE_1MPRIM ();
3241   USE_T0 ();
3242 }
3243
3244 static void cc_t0_mul_prim_add_shade_sub_env_mul_prim () //Added by Gonetz
3245 {
3246   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3247     GR_COMBINE_FACTOR_TEXTURE_RGB,
3248     GR_COMBINE_LOCAL_ITERATED,
3249     GR_COMBINE_OTHER_CONSTANT);
3250   CC_PRIM ();
3251   SUBSHADE_ENV ()
3252     MULSHADE_PRIM ();
3253   USE_T0 ();
3254 }
3255
3256 static void cc_t0_mul_prim_add_shade_mul_shadea_mul_prim ()
3257 {
3258   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3259     GR_COMBINE_FACTOR_TEXTURE_RGB,
3260     GR_COMBINE_LOCAL_ITERATED,
3261     GR_COMBINE_OTHER_CONSTANT);
3262   CC_PRIM ();
3263   MULSHADE_PRIM ();
3264   MULSHADE_SHADEA ();
3265   USE_T0 ();
3266 }
3267
3268 static void cc__t0_mul_t1__mul_prim_add_prim_mul_shade () //Added by Gonetz
3269 {
3270   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3271     GR_COMBINE_FACTOR_TEXTURE_RGB,
3272     GR_COMBINE_LOCAL_ITERATED,
3273     GR_COMBINE_OTHER_CONSTANT);
3274   MULSHADE_PRIM ();
3275   CC_PRIM ();
3276   T0_MUL_T1 ();
3277 }
3278
3279 static void cc_t0_mul_env_add_prim_mul_shade () //Added by Gonetz
3280 {
3281   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3282     GR_COMBINE_FACTOR_TEXTURE_RGB,
3283     GR_COMBINE_LOCAL_ITERATED,
3284     GR_COMBINE_OTHER_CONSTANT);
3285   MULSHADE_PRIM ();
3286   CC_ENV ();
3287   USE_T0 ();
3288 }
3289
3290 static void cc_t0_mul_enva_add_prim_mul_shade () //Added by Gonetz
3291 {
3292   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3293     GR_COMBINE_FACTOR_TEXTURE_RGB,
3294     GR_COMBINE_LOCAL_ITERATED,
3295     GR_COMBINE_OTHER_CONSTANT);
3296   MULSHADE_PRIM ();
3297   CC_ENVA ();
3298   USE_T0 ();
3299 }
3300
3301 static void cc_t0_mul_shade_add_prim_mul_env () //Added by Gonetz
3302 {
3303   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3304     GR_COMBINE_FACTOR_TEXTURE_RGB,
3305     GR_COMBINE_LOCAL_CONSTANT,
3306     GR_COMBINE_OTHER_ITERATED);
3307   CC_PRIMMULENV ();
3308   USE_T0 ();
3309 }
3310
3311 static void cc_prim_mul_env_add_one_sub_prim_mul_shade () //Added by Gonetz
3312 {
3313   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3314     GR_COMBINE_FACTOR_ONE,
3315     GR_COMBINE_LOCAL_ITERATED,
3316     GR_COMBINE_OTHER_CONSTANT);
3317   MULSHADE_1MPRIM ();
3318   CC_PRIMMULENV ();
3319 }
3320
3321 // ** A*B*C **
3322
3323 static void cc_t0_mul_prim_mul_prim () //Added by Gonetz
3324 {
3325   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3326     GR_COMBINE_FACTOR_LOCAL,
3327     GR_COMBINE_LOCAL_ITERATED,
3328     GR_COMBINE_OTHER_TEXTURE);
3329   SETSHADE_PRIM ();
3330   SETSHADE_PRIM ();
3331   USE_T0 ();
3332 }
3333
3334 static void cc_t0_mul_prim_mul_prima () //Added by Gonetz
3335 {
3336   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3337     GR_COMBINE_FACTOR_LOCAL,
3338     GR_COMBINE_LOCAL_ITERATED,
3339     GR_COMBINE_OTHER_TEXTURE);
3340   SETSHADE_PRIM ();
3341   SETSHADE_PRIMA ();
3342   USE_T0 ();
3343 }
3344
3345 static void cc_t0_mul_enva_mul_shade ()
3346 {
3347   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3348     GR_COMBINE_FACTOR_LOCAL,
3349     GR_COMBINE_LOCAL_ITERATED,
3350     GR_COMBINE_OTHER_TEXTURE);
3351   MULSHADE_ENVA ();
3352   USE_T0 ();
3353 }
3354
3355 static void cc_t0_mul_primlod_mul_prim () //Added by Gonetz
3356 {
3357   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3358     GR_COMBINE_FACTOR_LOCAL,
3359     GR_COMBINE_LOCAL_CONSTANT,
3360     GR_COMBINE_OTHER_TEXTURE);
3361   CC_COLMULBYTE (rdp.prim_color, rdp.prim_lodfrac);
3362   USE_T0 ();
3363 }
3364
3365 static void cc_t0_mul_primlod_mul_shade () //Added by Gonetz
3366 {
3367   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3368     GR_COMBINE_FACTOR_LOCAL,
3369     GR_COMBINE_LOCAL_ITERATED,
3370     GR_COMBINE_OTHER_TEXTURE);
3371   MULSHADE_PRIMLOD ();
3372   USE_T0 ();
3373 }
3374
3375 static void cc__t0_mul_t1__mul_prim ()
3376 {
3377   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3378     GR_COMBINE_FACTOR_LOCAL,
3379     GR_COMBINE_LOCAL_CONSTANT,
3380     GR_COMBINE_OTHER_TEXTURE);
3381   CC_PRIM ();
3382   T0_MUL_T1 ();
3383 }
3384
3385 static void cc__t1_mul_t1_add_t0__mul_prim ()
3386 {
3387   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3388     GR_COMBINE_FACTOR_LOCAL,
3389     GR_COMBINE_LOCAL_CONSTANT,
3390     GR_COMBINE_OTHER_TEXTURE);
3391   CC_PRIM ();
3392   if (cmb.combine_ext)
3393   {
3394     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3395       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3396       GR_CMBX_ZERO, 0,
3397       GR_CMBX_B, 0);
3398     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
3399       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3400       GR_CMBX_OTHER_TEXTURE_RGB, 0,
3401       GR_CMBX_B, 0);
3402     cmb.tex |= 3;
3403   }
3404   else
3405   {
3406     T0_ADD_T1 ();
3407   }
3408 }
3409
3410 static void cc__t0_mul_t1__mul_prima () //Added by Gonetz
3411 {
3412   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3413     GR_COMBINE_FACTOR_LOCAL,
3414     GR_COMBINE_LOCAL_CONSTANT,
3415     GR_COMBINE_OTHER_TEXTURE);
3416   CC_PRIMA ();
3417   T0_MUL_T1 ();
3418 }
3419
3420 static void cc__t0_mul_t1__mul_env () //Added by Gonetz
3421 {
3422   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3423     GR_COMBINE_FACTOR_LOCAL,
3424     GR_COMBINE_LOCAL_CONSTANT,
3425     GR_COMBINE_OTHER_TEXTURE);
3426   CC_ENV ();
3427   T0_MUL_T1 ();
3428 }
3429
3430 static void cc__t0_mul_t1__mul_enva () //Added by Gonetz
3431 {
3432   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3433     GR_COMBINE_FACTOR_LOCAL,
3434     GR_COMBINE_LOCAL_CONSTANT,
3435     GR_COMBINE_OTHER_TEXTURE);
3436   CC_ENVA ();
3437   T0_MUL_T1 ();
3438 }
3439
3440 static void cc__t0_mul_t1__mul_shade ()
3441 {
3442   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3443     GR_COMBINE_FACTOR_LOCAL,
3444     GR_COMBINE_LOCAL_ITERATED,
3445     GR_COMBINE_OTHER_TEXTURE);
3446   T0_MUL_T1 ();
3447 }
3448
3449 static void cc__t0a_mul_t1__mul_prim () //Added by Gonetz
3450 {
3451   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3452     GR_COMBINE_FACTOR_LOCAL,
3453     GR_COMBINE_LOCAL_CONSTANT,
3454     GR_COMBINE_OTHER_TEXTURE);
3455   CC_PRIM ();
3456   T0A_MUL_T1 ();
3457 }
3458
3459 static void cc__t0_mul_t1a__mul_shade () //Added by Gonetz
3460 {
3461   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3462     GR_COMBINE_FACTOR_LOCAL,
3463     GR_COMBINE_LOCAL_ITERATED,
3464     GR_COMBINE_OTHER_TEXTURE);
3465   T0_MUL_T1A ();
3466 }
3467
3468 static void cc__t0a_mul_t1__mul_shade () //Added by Gonetz
3469 {
3470   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3471     GR_COMBINE_FACTOR_LOCAL,
3472     GR_COMBINE_LOCAL_ITERATED,
3473     GR_COMBINE_OTHER_TEXTURE);
3474   T0A_MUL_T1 ();
3475 }
3476
3477 static void cc_t0_mul_prim_mul_env ()
3478 {
3479   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3480     GR_COMBINE_FACTOR_LOCAL,
3481     GR_COMBINE_LOCAL_ITERATED,
3482     GR_COMBINE_OTHER_TEXTURE);
3483   SETSHADE_PRIM ();
3484   SETSHADE_ENV ();  // notice that setshade multiplies
3485   USE_T0 ();
3486 }
3487
3488 static void cc_t0_mul_prim_mul_shade ()
3489 {
3490   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3491     GR_COMBINE_FACTOR_LOCAL,
3492     GR_COMBINE_LOCAL_ITERATED,
3493     GR_COMBINE_OTHER_TEXTURE);
3494   MULSHADE_PRIM ();
3495   USE_T0 ();
3496 }
3497
3498 static void cc_t0_mul_prim_mul_shadea ()
3499 {
3500   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3501     GR_COMBINE_FACTOR_LOCAL,
3502     GR_COMBINE_LOCAL_ITERATED,
3503     GR_COMBINE_OTHER_TEXTURE);
3504   SETSHADE_PRIM ();
3505   MULSHADE_SHADEA();
3506   USE_T0 ();
3507 }
3508
3509 static void cc_t0_mul_prima_mul_shade ()
3510 {
3511   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3512     GR_COMBINE_FACTOR_LOCAL,
3513     GR_COMBINE_LOCAL_ITERATED,
3514     GR_COMBINE_OTHER_TEXTURE);
3515   MULSHADE_PRIMA ();
3516   USE_T0 ();
3517 }
3518
3519 static void cc_t1_mul__one_sub_prim_mul_shade_add_prim ()
3520 {
3521   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3522     GR_COMBINE_FACTOR_LOCAL,
3523     GR_COMBINE_LOCAL_ITERATED,
3524     GR_COMBINE_OTHER_TEXTURE);
3525   MULSHADE_1MPRIM ();
3526   ADDSHADE_PRIM ();
3527   USE_T1 ();
3528 }
3529
3530 static void cc_t0_mul_one_sub_env_mul_shade ()
3531 {
3532   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3533     GR_COMBINE_FACTOR_LOCAL,
3534     GR_COMBINE_LOCAL_ITERATED,
3535     GR_COMBINE_OTHER_TEXTURE);
3536   MULSHADE_1MENV ();
3537   USE_T0 ();
3538 }
3539
3540 static void cc_t1_mul_prim_mul_shade ()
3541 {
3542   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3543     GR_COMBINE_FACTOR_LOCAL,
3544     GR_COMBINE_LOCAL_ITERATED,
3545     GR_COMBINE_OTHER_TEXTURE);
3546   MULSHADE_PRIM ();
3547   USE_T1 ();
3548 }
3549
3550 //Added by Gonetz
3551 static void cc_t0_mul_1mprim_mul_shade ()
3552 {
3553   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3554     GR_COMBINE_FACTOR_LOCAL,
3555     GR_COMBINE_LOCAL_ITERATED,
3556     GR_COMBINE_OTHER_TEXTURE);
3557   MULSHADE_1MPRIM ();
3558   USE_T0 ();
3559 }
3560
3561 static void cc_t0_mul_env_mul_shade ()
3562 {
3563   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3564     GR_COMBINE_FACTOR_LOCAL,
3565     GR_COMBINE_LOCAL_ITERATED,
3566     GR_COMBINE_OTHER_TEXTURE);
3567   MULSHADE_ENV ();
3568   USE_T0 ();
3569 }
3570
3571 static void cc_t0_mul_scale_mul_shade ()
3572 {
3573   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3574     GR_COMBINE_FACTOR_LOCAL,
3575     GR_COMBINE_LOCAL_ITERATED,
3576     GR_COMBINE_OTHER_TEXTURE);
3577   MULSHADE (rdp.SCALE);
3578   USE_T0 ();
3579 }
3580
3581 static void cc_t0_mul_shade_mul_shadea ()
3582 {
3583   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3584     GR_COMBINE_FACTOR_LOCAL,
3585     GR_COMBINE_LOCAL_ITERATED,
3586     GR_COMBINE_OTHER_TEXTURE);
3587   MULSHADE_SHADEA ();
3588   USE_T0 ();
3589 }
3590
3591 static void cc_prim_mul_env_mul_shade ()
3592 {
3593   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3594     GR_COMBINE_FACTOR_LOCAL,
3595     GR_COMBINE_LOCAL_CONSTANT,
3596     GR_COMBINE_OTHER_ITERATED);
3597   CC_ENV ();
3598   MULSHADE_PRIM ();
3599 }
3600
3601 static void cc_prim_mul_one_sub_env_mul_shade ()
3602 {
3603   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3604     GR_COMBINE_FACTOR_LOCAL,
3605     GR_COMBINE_LOCAL_CONSTANT,
3606     GR_COMBINE_OTHER_ITERATED);
3607   CC_1SUBENV ();
3608   MULSHADE_PRIM ();
3609 }
3610
3611 // ** A*B*C+D **
3612 static void cc_t0_mul_prim_mul_shade_add_env ()
3613 {
3614   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3615     GR_COMBINE_FACTOR_TEXTURE_RGB,
3616     GR_COMBINE_LOCAL_CONSTANT,
3617     GR_COMBINE_OTHER_ITERATED);
3618   CC_ENV ();
3619   MULSHADE_PRIM ();
3620   USE_T0 ();
3621 }
3622
3623 //Added by Gonetz
3624 static void cc_t0_mul_prim_mul_shadea_add_env ()
3625 {
3626   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3627     GR_COMBINE_FACTOR_LOCAL_ALPHA,
3628     GR_COMBINE_LOCAL_ITERATED,
3629     GR_COMBINE_OTHER_TEXTURE);
3630   CC_ENV ();
3631   SETSHADE_ENV ();
3632   MULSHADE_A_PRIM ();
3633   USE_T0 ();
3634 }
3635
3636 // (A*B+C)*D
3637 static void cc__t0_mul_prim_add_shade__mul_env ()
3638 {
3639   if (cmb.combine_ext)
3640   {
3641     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3642       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
3643       GR_CMBX_TMU_CCOLOR, 0,
3644       GR_CMBX_B, 0);
3645     cmb.tex |= 1;
3646     cmb.tex_ccolor = rdp.prim_color;
3647     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3648       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
3649       GR_CMBX_CONSTANT_COLOR, 0,
3650       GR_CMBX_ZERO, 0);
3651     CC_ENV ();
3652   }
3653   else
3654   {
3655     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3656       GR_COMBINE_FACTOR_ONE,
3657       GR_COMBINE_LOCAL_ITERATED,
3658       GR_COMBINE_OTHER_TEXTURE);
3659     MULSHADE_ENV ();
3660     MOD_0 (TMOD_TEX_MUL_COL);
3661     CC_PRIMMULENV ();
3662     MOD_0_COL (cmb.ccolor & 0xFFFFFF00);
3663     USE_T0 ();
3664   }
3665 }
3666
3667 static void cc__t0a_mul_prim_add_t0__mul_shade ()
3668 {
3669   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3670     GR_COMBINE_FACTOR_LOCAL,
3671     GR_COMBINE_LOCAL_ITERATED,
3672     GR_COMBINE_OTHER_TEXTURE);
3673   MOD_0 (TMOD_COL_MUL_TEXA_ADD_TEX);
3674   MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
3675   USE_T0 ();
3676 }
3677
3678 static void cc__t0a_mul_env_add_t0__mul_shade ()
3679 {
3680   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3681     GR_COMBINE_FACTOR_LOCAL,
3682     GR_COMBINE_LOCAL_ITERATED,
3683     GR_COMBINE_OTHER_TEXTURE);
3684   MOD_0 (TMOD_COL_MUL_TEXA_ADD_TEX);
3685   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
3686   USE_T0 ();
3687 }
3688
3689 static void cc__prim_mul_shade_add_env__mul_shade () //Aded by Gonetz
3690 {
3691   if (!cmb.combine_ext)
3692   {
3693     cc_prim_mul_shade_add_env ();
3694     return;
3695   }
3696   T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
3697     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3698     GR_CMBX_ITRGB, 0,
3699     GR_CMBX_ZERO, 0);
3700   cmb.tex |= 1;
3701   cmb.tex_ccolor = rdp.prim_color;
3702   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3703     GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
3704     GR_CMBX_ITRGB, 0,
3705     GR_CMBX_ZERO, 0);
3706   CC_ENV ();
3707 }
3708
3709 // ** A*B*C+D*E **
3710 //Added by Gonetz
3711 static void cc__t0_sub_t1__mul_prim_mul_shade_add_prim_mul_env ()
3712 {
3713   if (cmb.combine_ext)
3714   {
3715     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3716       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3717       GR_CMBX_ZERO, 0,
3718       GR_CMBX_B, 0);
3719     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3720       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
3721       GR_CMBX_ZERO, 1,
3722       GR_CMBX_ZERO, 0);
3723     cmb.tex |= 3;
3724   }
3725   else
3726   {
3727     USE_T0 ();
3728   }
3729
3730   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3731     GR_COMBINE_FACTOR_TEXTURE_RGB,
3732     GR_COMBINE_LOCAL_CONSTANT,
3733     GR_COMBINE_OTHER_ITERATED);
3734   CC_PRIMMULENV ();
3735   MULSHADE_PRIM ();
3736 }
3737
3738 static void cc__t0_mul_prim_mul_env__add__prim_mul_shade ()
3739 {
3740   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3741     GR_COMBINE_FACTOR_TEXTURE_RGB,
3742     GR_COMBINE_LOCAL_ITERATED,
3743     GR_COMBINE_OTHER_CONSTANT);
3744   CC_PRIMMULENV ();
3745   MULSHADE_PRIM ();
3746   USE_T0 ();
3747 }
3748
3749 static void cc__t1_mul_prim_mul_env__add__prim_mul_shade ()
3750 {
3751   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3752     GR_COMBINE_FACTOR_TEXTURE_RGB,
3753     GR_COMBINE_LOCAL_ITERATED,
3754     GR_COMBINE_OTHER_CONSTANT);
3755   CC_PRIMMULENV ();
3756   MULSHADE_PRIM ();
3757   USE_T1 ();
3758 }
3759
3760 //Added by Gonetz
3761 static void cc_t0_mul_one_sub_prim_mul_shade_add_prim_mul_env ()
3762 {
3763   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3764     GR_COMBINE_FACTOR_TEXTURE_RGB,
3765     GR_COMBINE_LOCAL_CONSTANT,
3766     GR_COMBINE_OTHER_ITERATED);
3767   CC_PRIMMULENV ();
3768   MULSHADE_1MPRIM ();
3769   USE_T0 ();
3770 }
3771
3772 //Added by Gonetz
3773 static void cc_t0_mul_one_sub_prim_mul_shadea_add_prim_mul_env ()
3774 {
3775   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3776     GR_COMBINE_FACTOR_TEXTURE_RGB,
3777     GR_COMBINE_LOCAL_CONSTANT,
3778     GR_COMBINE_OTHER_ITERATED);
3779   CC_PRIMMULENV ();
3780   SETSHADE_1MPRIM ();
3781   MULSHADE_SHADEA ();
3782   USE_T0 ();
3783 }
3784
3785 //Added by Gonetz
3786 static void cc_t0_mul_one_sub_env_mul_shade_add_env ()
3787 {
3788   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3789     GR_COMBINE_FACTOR_TEXTURE_RGB,
3790     GR_COMBINE_LOCAL_CONSTANT,
3791     GR_COMBINE_OTHER_ITERATED);
3792   CC_ENV ();
3793   MULSHADE_1MENV ();
3794   USE_T0 ();
3795 }
3796
3797 static void cc_t0_mul_prima_mul_shade_add_prim_mul_one_sub_prima ()  //Aded by Gonetz
3798 {
3799   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3800     GR_COMBINE_FACTOR_TEXTURE_RGB,
3801     GR_COMBINE_LOCAL_CONSTANT,
3802     GR_COMBINE_OTHER_ITERATED);
3803   MULSHADE_PRIMA ();
3804   USE_T0 ();
3805   wxUint8 fac = 255 - (wxUint8)(rdp.prim_color&0xFF);
3806   float col[3];
3807   col[0] = (float)((rdp.prim_color & 0xFF000000) >> 24) / 255.0f;
3808   col[1] = (float)((rdp.prim_color & 0x00FF0000) >> 16) / 255.0f;
3809   col[2] = (float)((rdp.prim_color & 0x0000FF00) >> 8) / 255.0f;
3810   CC ( ((wxUint8)(col[0]*fac))<<24 | ((wxUint8)(col[1]*fac))<<16 | ((wxUint8)(col[2]*fac))<<8 | fac );
3811 }
3812
3813 // ** A*(1-B)+C **
3814 static void cc_t0_mul_1menv_add_prim ()
3815 {
3816   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
3817     GR_COMBINE_FACTOR_TEXTURE_RGB,
3818     GR_COMBINE_LOCAL_CONSTANT,
3819     GR_COMBINE_OTHER_ITERATED);
3820   CC_PRIM ();
3821   SETSHADE_1MENV ();
3822   USE_T0 ();
3823 }
3824
3825 // ** (A+B)*C **
3826 static void cc_t0_mul_scale_add_prim__mul_shade () //Aded by Gonetz
3827 {
3828   if (cmb.combine_ext)
3829   {
3830     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3831       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
3832       GR_CMBX_TMU_CCOLOR, 0,
3833       GR_CMBX_ZERO, 0);
3834     cmb.tex |= 1;
3835     cmb.tex_ccolor = rdp.SCALE;
3836     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3837       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
3838       GR_CMBX_ITRGB, 0,
3839       GR_CMBX_ZERO, 0);
3840     CC_PRIM ();
3841   }
3842   else
3843   {
3844     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3845       GR_COMBINE_FACTOR_LOCAL,
3846       GR_COMBINE_LOCAL_ITERATED,
3847       GR_COMBINE_OTHER_TEXTURE);
3848     MOD_0 (TMOD_TEX_ADD_COL);
3849     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
3850     USE_T0 ();
3851   }
3852 }
3853
3854 static void cc__t0_mul_t1_add_prim__mul_shade () //Aded by Gonetz
3855 {
3856   if (cmb.combine_ext)
3857   {
3858     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3859       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
3860       GR_CMBX_ITRGB, 0,
3861       GR_CMBX_ZERO, 0);
3862     CC_PRIM ();
3863   }
3864   else
3865   {
3866     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3867       GR_COMBINE_FACTOR_LOCAL,
3868       GR_COMBINE_LOCAL_ITERATED,
3869       GR_COMBINE_OTHER_TEXTURE);
3870     MULSHADE_PRIM ();
3871   }
3872   T0_MUL_T1 ();
3873 }
3874
3875 static void cc_t0_mul__prim_add_env ()
3876 {
3877   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3878     GR_COMBINE_FACTOR_LOCAL,
3879     GR_COMBINE_LOCAL_ITERATED,
3880     GR_COMBINE_OTHER_TEXTURE);
3881   SETSHADE_PRIM ();
3882   ADDSHADE_ENV ();
3883   USE_T0 ();
3884 }
3885
3886 static void cc_t0_mul__prim_mul_primlod_add_env () //Aded by Gonetz
3887 {
3888   // forest behind window, Dobutsu no Mori.
3889   // (prim-0)*prim_lod+env, (t1-0)*cmb+0
3890   //actually, the game uses t0 instead of t1 here. t1 does not set at all this moment.
3891   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3892     GR_COMBINE_FACTOR_LOCAL,
3893     GR_COMBINE_LOCAL_ITERATED,
3894     GR_COMBINE_OTHER_TEXTURE);
3895   float prim_lod = rdp.prim_lodfrac / 65025.0f;
3896   rdp.col[0] *= ((rdp.prim_color & 0xFF000000) >> 24) * prim_lod;
3897   rdp.col[1] *= ((rdp.prim_color & 0x00FF0000) >> 16) * prim_lod;
3898   rdp.col[2] *= ((rdp.prim_color & 0x0000FF00) >> 8) * prim_lod;
3899   rdp.cmb_flags = CMB_SET;
3900   ADDSHADE_ENV ();
3901   USE_T0 ();
3902 }
3903
3904 // ** (A-B)*C **
3905 static void cc__t0_mul_prim_add_shade__sub_env_mul_shade ()
3906 {
3907   if (cmb.combine_ext)
3908   {
3909     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3910       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
3911       GR_CMBX_TMU_CCOLOR, 0,
3912       GR_CMBX_B, 0);
3913     cmb.tex_ccolor = rdp.prim_color;
3914     cmb.tex |= 1;
3915     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3916       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
3917       GR_CMBX_ITRGB, 0,
3918       GR_CMBX_ZERO, 0);
3919     CC_ENV ();
3920   }
3921   else
3922   {
3923     cc_t0_mul_prim_mul_shade ();
3924   }
3925 }
3926
3927 static void cc_t0_sub_prim_mul_shadea ()  //Aded by Gonetz
3928 {
3929   // * not guaranteed to work if another iterated alpha is set
3930   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
3931     GR_COMBINE_FACTOR_LOCAL_ALPHA,
3932     GR_COMBINE_LOCAL_ITERATED,
3933     GR_COMBINE_OTHER_TEXTURE);
3934   SETSHADE_PRIM ();
3935   USE_T0 ();
3936 }
3937
3938 static void cc__t0_sub_env_mul_shade__sub_prim_mul_shade ()
3939 {
3940   if (cmb.combine_ext)
3941   {
3942     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
3943       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
3944       GR_CMBX_ITRGB, 0,
3945       GR_CMBX_ZERO, 0);
3946     cmb.tex_ccolor = rdp.env_color;
3947     cmb.tex |= 1;
3948     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3949       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
3950       GR_CMBX_ITRGB, 0,
3951       GR_CMBX_ITRGB, 0);
3952     CC_PRIM ();
3953   }
3954   else
3955   {
3956     cc_t0_mul_shade ();
3957   }
3958 }
3959
3960 static void cc_t0_sub_prim_mul_shade ()
3961 {
3962   if (cmb.combine_ext)
3963   {
3964     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3965       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
3966       GR_CMBX_ITRGB, 0,
3967       GR_CMBX_ZERO, 0);
3968     CC_PRIM ();
3969   }
3970   else
3971   {
3972     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3973       GR_COMBINE_FACTOR_LOCAL,
3974       GR_COMBINE_LOCAL_ITERATED,
3975       GR_COMBINE_OTHER_TEXTURE);
3976     if (rdp.prim_color & 0xFFFFFF00)
3977     {
3978       MOD_0 (TMOD_TEX_SUB_COL);
3979       MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
3980     }
3981   }
3982   USE_T0 ();
3983 }
3984
3985 static void cc__t0_mul_t1__sub_prim_mul_shade ()
3986 {
3987   if (cmb.combine_ext)
3988   {
3989     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
3990       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
3991       GR_CMBX_ITRGB, 0,
3992       GR_CMBX_ZERO, 0);
3993     CC_PRIM ();
3994   }
3995   else
3996   {
3997     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
3998       GR_COMBINE_FACTOR_LOCAL,
3999       GR_COMBINE_LOCAL_ITERATED,
4000       GR_COMBINE_OTHER_TEXTURE);
4001   }
4002   T0_MUL_T1 ();
4003 }
4004
4005 static void cc_t0_sub_env_mul_shade ()
4006 {
4007   if (cmb.combine_ext)
4008   {
4009     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4010       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
4011       GR_CMBX_ITRGB, 0,
4012       GR_CMBX_ZERO, 0);
4013     CC_ENV ();
4014   }
4015   else
4016   {
4017     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4018       GR_COMBINE_FACTOR_LOCAL,
4019       GR_COMBINE_LOCAL_ITERATED,
4020       GR_COMBINE_OTHER_TEXTURE);
4021     if (rdp.env_color & 0xFFFFFF00)
4022     {
4023       MOD_0 (TMOD_TEX_SUB_COL);
4024       MOD_0_COL (rdp.env_color & 0xFFFFFF00);
4025     }
4026   }
4027   USE_T0 ();
4028 }
4029
4030 static void cc__t0_mul_prima_add_t0__sub_center_mul_scale ()
4031 {
4032   if (cmb.combine_ext)
4033   {
4034     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4035       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4036       GR_CMBX_TMU_CCOLOR, 0,
4037       GR_CMBX_B, 0);
4038     wxUint32 prima = rdp.prim_color&0xFF;
4039     cmb.tex_ccolor = (prima<<24)|(prima<<16)|(prima<<8)|prima;
4040     cmb.tex |= 1;
4041     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4042       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
4043       GR_CMBX_ITRGB, 0,
4044       GR_CMBX_ZERO, 0);
4045     CC(rdp.CENTER);
4046     SETSHADE(rdp.SCALE);
4047   }
4048   else
4049   {
4050     cc_t0_mul_prima();
4051   }
4052 }
4053
4054 static void cc__t1_inter_t0_using_primlod__sub_shade_mul_prim ()
4055 {
4056   if (cmb.combine_ext)
4057   {
4058     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4059       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
4060       GR_CMBX_CONSTANT_COLOR, 0,
4061       GR_CMBX_ZERO, 0);
4062     CC_PRIM ();
4063   }
4064   else
4065   {
4066     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4067       GR_COMBINE_FACTOR_ONE,
4068       GR_COMBINE_LOCAL_ITERATED,
4069       GR_COMBINE_OTHER_TEXTURE);
4070     MULSHADE_PRIM ();
4071   }
4072   T1_INTER_T0_USING_FACTOR (lod_frac);
4073 }
4074
4075 static void cc__t0_inter_t1_using_enva__sub_shade_mul_prim ()
4076 {
4077   if (cmb.combine_ext)
4078   {
4079     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4080       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
4081       GR_CMBX_CONSTANT_COLOR, 0,
4082       GR_CMBX_ZERO, 0);
4083     CC_PRIM ();
4084   }
4085   else
4086   {
4087     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4088       GR_COMBINE_FACTOR_ONE,
4089       GR_COMBINE_LOCAL_ITERATED,
4090       GR_COMBINE_OTHER_TEXTURE);
4091     MULSHADE_PRIM ();
4092   }
4093   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
4094   T0_INTER_T1_USING_FACTOR (factor);
4095 }
4096
4097 static void cc_t0_sub_shade_mul_shadea ()  //Aded by Gonetz
4098 {
4099   // * not guaranteed to work if another iterated alpha is set
4100   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4101     GR_COMBINE_FACTOR_LOCAL_ALPHA,
4102     GR_COMBINE_LOCAL_ITERATED,
4103     GR_COMBINE_OTHER_TEXTURE);
4104   USE_T0 ();
4105 }
4106
4107 static void cc_one_sub_t0_mul_prim () //Added by Gonetz
4108 {
4109   CCMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
4110     GR_COMBINE_FACTOR_TEXTURE_RGB,
4111     GR_COMBINE_LOCAL_CONSTANT,
4112     GR_COMBINE_OTHER_NONE);
4113   CC_PRIM ();
4114   USE_T0 ();
4115 }
4116
4117 static void cc_one_sub_prim_mul_prima () //Added by Gonetz
4118 {
4119   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4120     GR_COMBINE_FACTOR_LOCAL,
4121     GR_COMBINE_LOCAL_ITERATED,
4122     GR_COMBINE_OTHER_CONSTANT);
4123   CC (~rdp.prim_color);
4124   SETSHADE_PRIMA ();
4125 }
4126
4127 static void cc_shade_sub_prim_mul_t0 () //Aded by Gonetz
4128 {
4129   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4130     GR_COMBINE_FACTOR_TEXTURE_RGB,
4131     GR_COMBINE_LOCAL_CONSTANT,
4132     GR_COMBINE_OTHER_ITERATED);
4133   CC_PRIM ();
4134   USE_T0 ();
4135 }
4136
4137 static void cc_shade_sub_prim_mul_env () //Aded by Gonetz
4138 {
4139   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4140     GR_COMBINE_FACTOR_LOCAL,
4141     GR_COMBINE_LOCAL_CONSTANT,
4142     GR_COMBINE_OTHER_ITERATED);
4143   CC_ENV ();
4144   SUBSHADE_PRIM ();
4145 }
4146
4147 static void cc_shade_sub_env_mul_t0 () //Aded by Gonetz
4148 {
4149   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4150     GR_COMBINE_FACTOR_TEXTURE_RGB,
4151     GR_COMBINE_LOCAL_CONSTANT,
4152     GR_COMBINE_OTHER_ITERATED);
4153   CC_ENV ();
4154   USE_T0 ();
4155 }
4156
4157 static void cc_shade_sub_prim_mul__t0_inter_t1_using_primlod () //Aded by Gonetz
4158 {
4159   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4160     GR_COMBINE_FACTOR_TEXTURE_RGB,
4161     GR_COMBINE_LOCAL_CONSTANT,
4162     GR_COMBINE_OTHER_ITERATED);
4163   CC_PRIM ();
4164   T0_INTER_T1_USING_FACTOR (lod_frac);
4165 }
4166
4167 static void cc_shade_sub_env_mul__t0_inter_t1_using_primlod () //Aded by Gonetz
4168 {
4169   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4170     GR_COMBINE_FACTOR_TEXTURE_RGB,
4171     GR_COMBINE_LOCAL_CONSTANT,
4172     GR_COMBINE_OTHER_ITERATED);
4173   CC_ENV ();
4174   T0_INTER_T1_USING_FACTOR (lod_frac);
4175 }
4176
4177 static void cc_shade_sub_env_mul_prim () //Aded by Gonetz
4178 {
4179   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4180     GR_COMBINE_FACTOR_LOCAL,
4181     GR_COMBINE_LOCAL_CONSTANT,
4182     GR_COMBINE_OTHER_ITERATED);
4183   CC_PRIM();
4184   SUBSHADE_ENV ();
4185 }
4186
4187 static void cc_shade_sub__prim_mul_prima () //Aded by Gonetz
4188 {
4189   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4190     GR_COMBINE_FACTOR_ONE,
4191     GR_COMBINE_LOCAL_CONSTANT,
4192     GR_COMBINE_OTHER_ITERATED);
4193   CC_C1MULC2 (rdp.prim_color, (rdp.prim_color&0xFF));
4194 }
4195
4196 static void cc_one_sub__t0_mul_t1__mul_shade () //Aded by Gonetz
4197 {
4198   CCMB (GR_COMBINE_FUNCTION_BLEND,
4199     GR_COMBINE_FACTOR_TEXTURE_RGB,
4200     GR_COMBINE_LOCAL_ITERATED,
4201     GR_COMBINE_OTHER_CONSTANT);
4202   CC (0);
4203   T0_MUL_T1 ();
4204 }
4205
4206 static void cc_one_sub__t0_mul_shadea__mul_shade () //Aded by Gonetz
4207 {
4208   if (cmb.combine_ext)
4209   {
4210     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4211       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4212       GR_CMBX_ITALPHA, 0,
4213       GR_CMBX_ZERO, 0);
4214     cmb.tex |= 1;
4215
4216     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_ONE_MINUS_X,
4217       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
4218       GR_CMBX_ITRGB, 0,
4219       GR_CMBX_ZERO, 0);
4220   }
4221   else
4222   {
4223     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4224       GR_COMBINE_FACTOR_LOCAL,
4225       GR_COMBINE_LOCAL_ITERATED,
4226       GR_COMBINE_OTHER_TEXTURE);
4227     USE_T0 ();
4228     cmb.tmu0_invert = TRUE;
4229   }
4230 }
4231
4232 static void cc_one_sub_env_mul_t0 () //Aded by Gonetz
4233 {
4234   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4235     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
4236     GR_COMBINE_LOCAL_CONSTANT,
4237     GR_COMBINE_OTHER_TEXTURE);
4238   CC_ENV ();
4239   USE_T0 ();
4240 }
4241
4242 static void cc_one_sub_env_mul__t0_inter_t1_using_primlod () //Aded by Gonetz
4243 {
4244   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4245     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
4246     GR_COMBINE_LOCAL_CONSTANT,
4247     GR_COMBINE_OTHER_TEXTURE);
4248   CC_ENV ();
4249   T0_INTER_T1_USING_FACTOR (lod_frac);
4250 }
4251
4252 static void cc_one_sub_env_mul_prim () //Aded by Gonetz
4253 {
4254   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4255     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
4256     GR_COMBINE_LOCAL_CONSTANT,
4257     GR_COMBINE_OTHER_ITERATED);
4258   CC_ENV ();
4259   SETSHADE_PRIM ();
4260 }
4261
4262 static void cc_one_sub_env_mul_shade () //Aded by Gonetz
4263 {
4264   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4265     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
4266     GR_COMBINE_LOCAL_CONSTANT,
4267     GR_COMBINE_OTHER_ITERATED);
4268   CC_ENV ();
4269 }
4270
4271 // ** (1-A)*B + A*C **
4272 static void cc_t0_mul_env_add_1mt0_mul_shade ()
4273 {
4274   CCMB (GR_COMBINE_FUNCTION_BLEND,
4275     GR_COMBINE_FACTOR_TEXTURE_RGB,
4276     GR_COMBINE_LOCAL_ITERATED,
4277     GR_COMBINE_OTHER_CONSTANT);
4278   CC_ENV ();
4279   USE_T0 ();
4280 }
4281
4282 // ** (1-A)*B+C **
4283 static void cc_one_sub_shade_mul__t1_sub_prim_mul_primlod_add_t0__add_shade () //Added by Gonetz
4284 {
4285   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4286     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
4287     GR_COMBINE_LOCAL_ITERATED,
4288     GR_COMBINE_OTHER_TEXTURE);
4289   T1_SUB_PRIM_MUL_PRIMLOD_ADD_T0 ();
4290 }
4291
4292 // ** (1-A)*B*C **
4293 static void cc_one_sub_t0_mul_prim_mul_shade () //Added by Gonetz
4294 {
4295   CCMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
4296     GR_COMBINE_FACTOR_TEXTURE_RGB,
4297     GR_COMBINE_LOCAL_ITERATED,
4298     GR_COMBINE_OTHER_NONE);
4299   MULSHADE_PRIM ();
4300   USE_T0 ();
4301 }
4302
4303 // ** (A-B)*C*D **
4304 static void cc_prim_sub_env_mul_t0_mul_shade ()
4305 {
4306   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4307     GR_COMBINE_FACTOR_TEXTURE_RGB,
4308     GR_COMBINE_LOCAL_NONE,
4309     GR_COMBINE_OTHER_ITERATED);
4310   MULSHADE_PRIMSUBENV ();
4311   USE_T0 ();
4312 }
4313
4314 // ** (A-B)*C+D **
4315 static void cc_t0_sub_t1_mul_prim_mul_shade_add_t1 ()  //Aded by Gonetz
4316 {
4317   if (cmb.combine_ext)
4318   {
4319     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4320       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4321       GR_CMBX_ZERO, 0,
4322       GR_CMBX_B, 0);
4323     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4324       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
4325       GR_CMBX_ITRGB, 0,
4326       GR_CMBX_B, 0);
4327     cmb.tex |= 3;
4328     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4329       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
4330       GR_CMBX_ZERO, 1,
4331       GR_CMBX_ZERO, 0);
4332     MULSHADE_PRIM ();
4333   }
4334   else
4335   {
4336     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4337       GR_COMBINE_FACTOR_LOCAL,
4338       GR_COMBINE_LOCAL_CONSTANT,
4339       GR_COMBINE_OTHER_TEXTURE);
4340     CC_PRIM ();
4341     T0_ADD_T1 ();
4342   }
4343 }
4344
4345 static void cc_t0_sub_prim_mul_t0a_add_prim ()  //Aded by Gonetz
4346 {
4347   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
4348     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
4349     GR_COMBINE_LOCAL_CONSTANT,
4350     GR_COMBINE_OTHER_TEXTURE);
4351   CC_PRIM ();
4352   USE_T0 ();
4353 }
4354
4355 static void cc_t0_sub_prim_mul_t1_add_shade ()  //Aded by Gonetz
4356 {
4357   if (cmb.combine_ext)
4358   {
4359     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4360       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4361       GR_CMBX_ZERO, 0,
4362       GR_CMBX_B, 0);
4363     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4364       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4365       GR_CMBX_OTHER_TEXTURE_RGB, 0,
4366       GR_CMBX_ZERO, 0);
4367     cmb.tex |= 3;
4368     cmb.tex_ccolor = rdp.prim_color;
4369     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4370       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
4371       GR_CMBX_ZERO, 1,
4372       GR_CMBX_B, 0);
4373   }
4374   else
4375   {
4376     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4377       GR_COMBINE_FACTOR_ONE,
4378       GR_COMBINE_LOCAL_ITERATED,
4379       GR_COMBINE_OTHER_TEXTURE);
4380     MOD_0 (TMOD_TEX_SUB_COL);
4381     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
4382     T0_MUL_T1 ();
4383   }
4384 }
4385
4386 static void cc_t0_sub_prim_mul_primlod_add_prim ()  //Aded by Gonetz
4387 {
4388   if (cmb.combine_ext)
4389   {
4390     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4391       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
4392       GR_CMBX_CONSTANT_COLOR, 0,
4393       GR_CMBX_B, 0);
4394     SETSHADE_PRIM ();
4395     CC_PRIMLOD ();
4396   }
4397   else
4398   {
4399     // * not guaranteed to work if another iterated alpha is set
4400     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4401       GR_COMBINE_FACTOR_TEXTURE_RGB,
4402       GR_COMBINE_LOCAL_ITERATED,
4403       GR_COMBINE_OTHER_CONSTANT);
4404     SETSHADE_PRIM ();
4405     SETSHADE_1MPRIMLOD ();
4406     CC_PRIMLOD ();
4407   }
4408   USE_T0 ();
4409 }
4410
4411 static void cc_t0_sub_prim_mul_prima_add_prim ()  //Aded by Gonetz
4412 {
4413   // * not guaranteed to work if another iterated alpha is set
4414   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4415     GR_COMBINE_FACTOR_TEXTURE_RGB,
4416     GR_COMBINE_LOCAL_ITERATED,
4417     GR_COMBINE_OTHER_CONSTANT);
4418   SETSHADE_PRIM ();
4419   SETSHADE_1MPRIMA ();
4420   CC_PRIMA ();
4421   USE_T0 ();
4422 }
4423
4424 static void cc_t0_sub_prim_mul_shadea_add_prim ()  //Aded by Gonetz
4425 {
4426   // * not guaranteed to work if another iterated alpha is set
4427   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
4428     GR_COMBINE_FACTOR_LOCAL_ALPHA,
4429     GR_COMBINE_LOCAL_ITERATED,
4430     GR_COMBINE_OTHER_TEXTURE);
4431   SETSHADE_PRIM ();
4432   USE_T0 ();
4433 }
4434
4435 static void cc_t0_sub_prim_mul_env_add_shade ()  //Aded by Gonetz
4436 {
4437   if (cmb.combine_ext)
4438   {
4439     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4440       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4441       GR_CMBX_ZERO, 1,
4442       GR_CMBX_ZERO, 0);
4443     cmb.tex |= 1;
4444     cmb.tex_ccolor = rdp.prim_color;
4445     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4446       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
4447       GR_CMBX_CONSTANT_COLOR, 0,
4448       GR_CMBX_B, 0);
4449     CC_ENV ();
4450   }
4451   else
4452   {
4453     cc_t0_mul_env_add_shade ();
4454   }
4455 }
4456
4457 static void cc__t0_inter_t1_using_shadea__sub_prim_mul_env_add_shade ()  //Aded by Gonetz
4458 {
4459   if (cmb.combine_ext)
4460   {
4461     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4462       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
4463       GR_CMBX_CONSTANT_COLOR, 0,
4464       GR_CMBX_B, 0);
4465     //have to pass shade alpha to combiner
4466     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
4467       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
4468       GR_CMBX_ZERO, 0,
4469       GR_CMBX_ZERO, 0);
4470   }
4471   else
4472   {
4473     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4474       GR_COMBINE_FACTOR_TEXTURE_RGB,
4475       GR_COMBINE_LOCAL_ITERATED,
4476       GR_COMBINE_OTHER_CONSTANT);
4477   }
4478   CC_ENV ();
4479   SUBSHADE_PRIMMULENV ();
4480   T0_INTER_T1_USING_SHADEA ();
4481 }
4482
4483
4484 static void cc_t0_sub_prim_mul_env_add_prim ()  //Aded by Gonetz
4485 {
4486   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4487     GR_COMBINE_FACTOR_TEXTURE_RGB,
4488     GR_COMBINE_LOCAL_ITERATED,
4489     GR_COMBINE_OTHER_CONSTANT);
4490   CC_ENV ();
4491   SETSHADE_PRIM ();
4492   SETSHADE_1MENV ();
4493   USE_T0 ();
4494 }
4495
4496 static void cc_t0_sub_prim_mul_enva_add_prim ()  //Aded by Gonetz41
4497 {
4498   if (cmb.combine_ext)
4499   {
4500     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4501       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
4502       GR_CMBX_CONSTANT_COLOR, 0,
4503       GR_CMBX_B, 0);
4504     SETSHADE_PRIM ();
4505     CC_ENVA ();
4506   }
4507   else
4508   {
4509     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4510       GR_COMBINE_FACTOR_ONE,
4511       GR_COMBINE_LOCAL_CONSTANT,
4512       GR_COMBINE_OTHER_TEXTURE);
4513     CC_PRIM ();
4514     MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC);
4515     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
4516     MOD_0_FAC (rdp.env_color & 0xFF);
4517   }
4518   USE_T0 ();
4519 }
4520
4521 static void cc_t0_sub_prim_mul_primlod_add_env ()  //Aded by Gonetz
4522 {
4523   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4524     GR_COMBINE_FACTOR_ONE,
4525     GR_COMBINE_LOCAL_CONSTANT,
4526     GR_COMBINE_OTHER_TEXTURE);
4527   CC_ENV ();
4528   MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC);
4529   MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
4530   MOD_0_FAC (lod_frac & 0xFF);
4531   USE_T0 ();
4532 }
4533
4534 static void cc_t0_sub__prim_mul_env ()  //Aded by Gonetz
4535 {
4536   if ( (rdp.prim_color & 0xFFFFFF00) == 0xFFFFFF00 && (rdp.env_color & 0xFFFFFF00) == 0xFFFFFF00)
4537   {
4538     CCMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
4539       GR_COMBINE_FACTOR_TEXTURE_RGB,
4540       GR_COMBINE_LOCAL_CONSTANT,
4541       GR_COMBINE_OTHER_NONE);
4542     CC_PRIM ();
4543   }
4544   else
4545   {
4546     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
4547       GR_COMBINE_FACTOR_ONE,
4548       GR_COMBINE_LOCAL_ITERATED,
4549       GR_COMBINE_OTHER_TEXTURE);
4550     SETSHADE_PRIM ();
4551     SETSHADE_ENV ();
4552   }
4553   USE_T0 ();
4554 }
4555
4556 static void cc__t0_mul_t1__sub_prim_mul__t0t1a__add_prim ()  //Aded by Gonetz
4557 {
4558   // * not guaranteed to work if another iterated alpha is set
4559   CCMB (GR_COMBINE_FUNCTION_BLEND,
4560     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
4561     GR_COMBINE_LOCAL_CONSTANT,
4562     GR_COMBINE_OTHER_TEXTURE);
4563   CC_PRIM ();
4564   T0_MUL_T1 ();
4565   A_T0_MUL_T1 ();
4566 }
4567
4568 static void cc__t1_inter_t0_using_enva__sub_prim_mul_prima_add_prim ()  //Aded by Gonetz
4569 {
4570   // * not guaranteed to work if another iterated alpha is set
4571   CCMB (GR_COMBINE_FUNCTION_BLEND,
4572     GR_COMBINE_FACTOR_LOCAL_ALPHA,
4573     GR_COMBINE_LOCAL_CONSTANT,
4574     GR_COMBINE_OTHER_TEXTURE);
4575   CC_PRIM ();
4576   CA_PRIM ();
4577   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
4578   T1_INTER_T0_USING_FACTOR (factor);
4579 }
4580
4581 static void cc_t0_sub_prim_mul_shade_add_env ()
4582 {
4583   if (cmb.combine_ext)
4584   {
4585     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4586       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4587       GR_CMBX_ZERO, 1,
4588       GR_CMBX_ZERO, 0);
4589     cmb.tex |= 1;
4590     cmb.tex_ccolor = rdp.prim_color;
4591     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4592       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ZERO,
4593       GR_CMBX_ITRGB, 0,
4594       GR_CMBX_B, 0);
4595     CC_ENV ();
4596   }
4597   else
4598   {
4599     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4600       GR_COMBINE_FACTOR_TEXTURE_RGB,
4601       GR_COMBINE_LOCAL_CONSTANT,
4602       GR_COMBINE_OTHER_ITERATED);
4603     CC_ENV ();
4604     MOD_0 (TMOD_TEX_SUB_COL);
4605     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
4606     USE_T0 ();
4607   }
4608 }
4609
4610 static void cc_t1_sub_prim_mul_shade_add_env ()
4611 {
4612   if (cmb.combine_ext)
4613   {
4614     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4615       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4616       GR_CMBX_ZERO, 1,
4617       GR_CMBX_ZERO, 0);
4618     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
4619       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4620       GR_CMBX_ZERO, 1,
4621       GR_CMBX_ZERO, 0);
4622     cmb.tex |= 2;
4623     cmb.tex_ccolor = rdp.prim_color;
4624     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4625       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ZERO,
4626       GR_CMBX_ITRGB, 0,
4627       GR_CMBX_B, 0);
4628     CC_ENV ();
4629   }
4630   else
4631   {
4632     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4633       GR_COMBINE_FACTOR_TEXTURE_RGB,
4634       GR_COMBINE_LOCAL_CONSTANT,
4635       GR_COMBINE_OTHER_ITERATED);
4636     CC_ENV ();
4637     MOD_1 (TMOD_TEX_SUB_COL);
4638     MOD_1_COL (rdp.prim_color & 0xFFFFFF00);
4639     USE_T1 ();
4640   }
4641 }
4642
4643 static void cc_t1_sub_k4_mul_prima_add_t0 ()
4644 {
4645   if (cmb.combine_ext)
4646   {
4647     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4648       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4649       GR_CMBX_DETAIL_FACTOR, 1,
4650       GR_CMBX_ZERO, 0);
4651     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
4652       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4653       GR_CMBX_ZERO, 1,
4654       GR_CMBX_ZERO, 0);
4655     cmb.tex |= 3;
4656     CC_BYTE (rdp.K4);
4657     cmb.tex_ccolor = cmb.ccolor;
4658     percent = (float)(rdp.prim_color&0xFF) / 255.0f;
4659     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
4660     CCMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
4661       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4662       GR_CMBX_CONSTANT_COLOR, 0,
4663       GR_CMBX_B, 0);
4664   }
4665   else
4666   {
4667     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4668       GR_COMBINE_FACTOR_ONE,
4669       GR_COMBINE_LOCAL_NONE,
4670       GR_COMBINE_OTHER_TEXTURE);
4671     T0_ADD_T1 ();
4672   }
4673 }
4674
4675 static void cc__t0_sub_prim_mul_shade_add_env__mul_shade ()
4676 {
4677   if (cmb.combine_ext)
4678   {
4679     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4680       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4681       GR_CMBX_ITRGB, 0,
4682       GR_CMBX_ZERO, 0);
4683     cmb.tex |= 1;
4684     cmb.tex_ccolor = rdp.prim_color;
4685     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4686       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
4687       GR_CMBX_ITRGB, 0,
4688       GR_CMBX_ZERO, 0);
4689     CC_ENV ();
4690   }
4691   else
4692   {
4693     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4694       GR_COMBINE_FACTOR_TEXTURE_RGB,
4695       GR_COMBINE_LOCAL_CONSTANT,
4696       GR_COMBINE_OTHER_ITERATED);
4697     CC_ENV ();
4698     MOD_0 (TMOD_TEX_SUB_COL);
4699     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
4700     USE_T0 ();
4701   }
4702 }
4703
4704 static void cc__t0_sub_prim_mul_shade_add_env__mul_shadea ()
4705 {
4706   if (cmb.combine_ext)
4707   {
4708     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4709       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4710       GR_CMBX_ITRGB, 0,
4711       GR_CMBX_ZERO, 0);
4712     cmb.tex |= 1;
4713     cmb.tex_ccolor = rdp.prim_color;
4714     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4715       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
4716       GR_CMBX_ITALPHA, 0,
4717       GR_CMBX_ZERO, 0);
4718     CC_ENV ();
4719   }
4720   else
4721   {
4722     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4723       GR_COMBINE_FACTOR_TEXTURE_RGB,
4724       GR_COMBINE_LOCAL_CONSTANT,
4725       GR_COMBINE_OTHER_ITERATED);
4726     MULSHADE_SHADEA();
4727     CC_ENV ();
4728     MOD_0 (TMOD_TEX_SUB_COL);
4729     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
4730     USE_T0 ();
4731   }
4732 }
4733
4734 static void cc__t0_mul_shade__sub_env_mul_shadea_add_env ()  //Aded by Gonetz
4735 {
4736   if (rdp.tiles[rdp.cur_tile].format == 4)
4737   {
4738     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
4739       GR_COMBINE_FACTOR_OTHER_ALPHA,
4740       GR_COMBINE_LOCAL_CONSTANT,
4741       GR_COMBINE_OTHER_ITERATED);
4742     CC_ENV ();
4743   }
4744   else if (rdp.tiles[rdp.cur_tile].format == 2)
4745   {
4746     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4747       GR_COMBINE_FACTOR_LOCAL,
4748       GR_COMBINE_LOCAL_ITERATED,
4749       GR_COMBINE_OTHER_TEXTURE);
4750     USE_T0 ();
4751   }
4752   else
4753   {
4754     cc_t0 ();
4755   }
4756 }
4757
4758 static void cc_t0_sub_env_mul_k5_add_prim ()  //Aded by Gonetz
4759 {
4760   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4761     GR_COMBINE_FACTOR_ONE,
4762     GR_COMBINE_LOCAL_CONSTANT,
4763     GR_COMBINE_OTHER_TEXTURE);
4764   CC_PRIM ();
4765   MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC);
4766   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
4767   MOD_0_FAC (rdp.K5);
4768   USE_T0 ();
4769 }
4770
4771 static void cc_t0_sub_k4_mul_k5_add_t0 ()  //Aded by Gonetz
4772 {
4773   if (cmb.combine_ext)
4774   {
4775     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
4776       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4777       GR_CMBX_CONSTANT_COLOR, 0,
4778       GR_CMBX_B, 0);
4779     wxUint32 temp = rdp.prim_lodfrac;
4780     rdp.prim_lodfrac = rdp.K4;
4781     SETSHADE_PRIMLOD ();
4782     rdp.prim_lodfrac = temp;
4783     CC_K5 ();
4784     USE_T0 ();
4785   }
4786   else
4787   {
4788     cc_t0 ();
4789   }
4790 }
4791
4792 static void cc__t0_inter_t1_using_t0__sub_shade_mul_prima_add_shade ()  //Aded by Gonetz
4793 {
4794   if (cmb.combine_ext)
4795   {
4796     cmb.tex |= 3;
4797     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4798       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
4799       GR_CMBX_CONSTANT_COLOR, 0,
4800       GR_CMBX_B, 0);
4801     CC_PRIMA();
4802     T0_INTER_T1_USING_T0 ();
4803   }
4804   else
4805   {
4806     // * not guaranteed to work if another iterated alpha is set
4807     CCMB (GR_COMBINE_FUNCTION_BLEND,
4808       GR_COMBINE_FACTOR_LOCAL_ALPHA,
4809       GR_COMBINE_LOCAL_ITERATED,
4810       GR_COMBINE_OTHER_TEXTURE);
4811     SETSHADE_A_PRIM ();
4812     T1_INTER_T0_USING_T0 ();  //strange, but this one looks better
4813   }
4814 }
4815
4816 static void cc_t0_sub__prim_mul_shade__mul_enva_add__prim_mul_shade ()  //Aded by Gonetz
4817 {
4818   // * not guaranteed to work if another iterated alpha is set
4819   CCMB (GR_COMBINE_FUNCTION_BLEND,
4820     GR_COMBINE_FACTOR_LOCAL_ALPHA,
4821     GR_COMBINE_LOCAL_ITERATED,
4822     GR_COMBINE_OTHER_TEXTURE);
4823   MULSHADE_PRIM ();
4824   SETSHADE_A_ENV ();
4825   USE_T0 ();
4826 }
4827
4828 static void cc_t0_sub_env_mul_t0_add_env ()  //Aded by Gonetz
4829 {
4830   CCMB (GR_COMBINE_FUNCTION_BLEND,
4831     GR_COMBINE_FACTOR_TEXTURE_RGB,
4832     GR_COMBINE_LOCAL_CONSTANT,
4833     GR_COMBINE_OTHER_TEXTURE);
4834   CC_ENV ();
4835   USE_T0 ();
4836   //(t0-env)*t0+env = t0*t0 + (1-t0)*env
4837 }
4838
4839 static void cc_t0_sub_env_mul_prima_add_env ()  //Aded by Gonetz
4840 {
4841   if (cmb.combine_ext)
4842   {
4843     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4844       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4845       GR_CMBX_DETAIL_FACTOR, 0,
4846       GR_CMBX_B, 0);
4847     cmb.tex |= 1;
4848     percent = (rdp.prim_color&0xFF) / 255.0f;
4849     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
4850   }
4851   else
4852   {
4853     MOD_0 (TMOD_COL_INTER_TEX_USING_COL1);
4854     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
4855     wxUint32 prima = rdp.prim_color & 0xFF;
4856     MOD_0_COL1 ((prima<<24)|(prima|16)|(prima<<8));
4857     USE_T0 ();
4858   }
4859   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
4860     GR_COMBINE_FACTOR_ONE,
4861     GR_COMBINE_LOCAL_NONE,
4862     GR_COMBINE_OTHER_TEXTURE);
4863 }
4864
4865 static void cc_t0_sub_env_mul_k5_add_env ()  //Aded by Gonetz
4866 {
4867   CCMB (GR_COMBINE_FUNCTION_BLEND,
4868     GR_COMBINE_FACTOR_LOCAL_ALPHA,
4869     GR_COMBINE_LOCAL_CONSTANT,
4870     GR_COMBINE_OTHER_TEXTURE);
4871   cmb.ccolor = (rdp.env_color&0xFFFFFF00) | rdp.K5;
4872   USE_T0 ();
4873 }
4874
4875 static void cc_t0_sub_env_mul_prim_add_shade ()  //Aded by Gonetz
4876 {
4877   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4878     GR_COMBINE_FACTOR_TEXTURE_RGB,
4879     GR_COMBINE_LOCAL_ITERATED,
4880     GR_COMBINE_OTHER_CONSTANT);
4881   CC_PRIM ();
4882   MOD_0 (TMOD_TEX_SUB_COL);
4883   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
4884   USE_T0 ();
4885 }
4886
4887 static void cc_t0_sub_env_mul_shade_add_prim ()  //Aded by Gonetz
4888 {
4889   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
4890     GR_COMBINE_FACTOR_TEXTURE_RGB,
4891     GR_COMBINE_LOCAL_CONSTANT,
4892     GR_COMBINE_OTHER_ITERATED);
4893   CC_PRIM ();
4894   if (cmb.combine_ext)
4895   {
4896     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4897       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4898       GR_CMBX_ZERO, 1,
4899       GR_CMBX_ZERO, 0);
4900     cmb.tex |= 1;
4901     cmb.tex_ccolor = rdp.env_color;
4902   }
4903   else
4904   {
4905     MOD_0 (TMOD_TEX_SUB_COL);
4906     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
4907     USE_T0 ();
4908   }
4909 }
4910
4911 static void cc__t0_sub_t1_mul_enva_add_shade__sub_env_mul_prim ()
4912 // (t0-t1)*env_a+shade, (cmb-env)*prim+0
4913 {
4914   if (cmb.combine_ext)
4915   {
4916     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4917       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
4918       GR_CMBX_ZERO, 0,
4919       GR_CMBX_B, 0);
4920     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4921       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
4922       GR_CMBX_TMU_CCOLOR, 0,
4923       GR_CMBX_ITRGB, 0);
4924     cmb.tex |= 3;
4925     CC_COLMULBYTE(rdp.prim_color, (rdp.env_color&0xFF));
4926     cmb.tex_ccolor = cmb.ccolor;
4927     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
4928       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
4929       GR_CMBX_ZERO, 1,
4930       GR_CMBX_TEXTURE_RGB, 0);
4931     MULSHADE_PRIM ();
4932     CC_PRIMMULENV ();
4933   }
4934   else
4935   {
4936     cc_t0_sub_env_mul_prim_add_shade();
4937   }
4938 }
4939
4940 static void cc__t0_inter_t1_using_primlod__sub_env_mul_shade_add_prim ()  //Aded by Gonetz
4941 {
4942   if (!(rdp.env_color&0xFFFFFF00))
4943   {
4944     cc__t0_inter_t1_using_primlod__mul_shade_add_prim ();
4945     return;
4946   }
4947   if (!(rdp.prim_color&0xFFFFFF00))
4948   {
4949     if (!cmb.combine_ext)
4950     {
4951       cc_t0_sub_env_mul_shade ();
4952       return;
4953     }
4954     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4955       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
4956       GR_CMBX_ITRGB, 0,
4957       GR_CMBX_ZERO, 0);
4958     CC_ENV ();
4959     T0_INTER_T1_USING_FACTOR (lod_frac);
4960     return;
4961   }
4962   cc__t0_inter_t1_using_primlod__mul_shade_add_prim ();
4963 }
4964
4965 static void cc__t0_sub_env_mul_shade_add_prim__mul_shade ()  //Aded by Gonetz
4966 {
4967   if (!cmb.combine_ext)
4968   {
4969     cc_t0_sub_env_mul_shade_add_prim ();
4970     return;
4971   }
4972   T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4973     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
4974     GR_CMBX_ITRGB, 0,
4975     GR_CMBX_ZERO, 0);
4976   cmb.tex_ccolor = rdp.env_color;
4977   cmb.tex |= 1;
4978   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
4979     GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
4980     GR_CMBX_ITRGB, 0,
4981     GR_CMBX_ZERO, 0);
4982   CC_PRIM ();
4983 }
4984
4985 static void cc__t0_sub_env_mul_shade_add_prim__mul_shadea ()  //Aded by Gonetz
4986 {
4987   if (!cmb.combine_ext)
4988   {
4989     cc_t0_sub_env_mul_shade_add_prim ();
4990     return;
4991   }
4992   T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
4993     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
4994     GR_CMBX_ITRGB, 0,
4995     GR_CMBX_B, 0);
4996   cmb.tex_ccolor = rdp.prim_color;
4997   cmb.tex |= 1;
4998   MOD_0 (TMOD_TEX_SUB_COL);
4999   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
5000
5001   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
5002     GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
5003     GR_CMBX_ITALPHA, 0,
5004     GR_CMBX_ZERO, 0);
5005 }
5006
5007 static void cc__t0_inter_t1_using_primlod__sub_env_mul_shade_add_env ()
5008 {
5009   // (t1-t0)*primlod+t0, (cmb-env)*shade+env
5010   if (cmb.combine_ext)
5011   {
5012     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
5013       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
5014       GR_CMBX_ITRGB, 0,
5015       GR_CMBX_B, 0);
5016   }
5017   else
5018   {
5019     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5020       GR_COMBINE_FACTOR_TEXTURE_RGB,
5021       GR_COMBINE_LOCAL_CONSTANT,
5022       GR_COMBINE_OTHER_ITERATED);
5023   }
5024   CC_ENV ();
5025   T0_INTER_T1_USING_FACTOR (lod_frac);
5026 }
5027
5028
5029 static void cc_t0_sub_env_mul_enva_add_prim ()  //Aded by Gonetz
5030 {
5031   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5032     GR_COMBINE_FACTOR_ONE,
5033     GR_COMBINE_LOCAL_CONSTANT,
5034     GR_COMBINE_OTHER_TEXTURE);
5035   CC_PRIM ();
5036   MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC);
5037   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
5038   MOD_0_FAC (rdp.env_color & 0xFF);
5039   USE_T0 ();
5040 }
5041
5042 static void cc_one_sub_t0_mul_prim_add_t0 ()  //Aded by Gonetz
5043 {
5044   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5045     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5046     GR_COMBINE_LOCAL_CONSTANT,
5047     GR_COMBINE_OTHER_TEXTURE);
5048   CC_PRIM ();
5049   USE_T0 ();
5050   //(1-t)*prim+t == (1-prim)*t+prim
5051 }
5052
5053 static void cc_one_sub_t1_mul_prim_add_t1 ()  //Aded by Gonetz
5054 {
5055   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5056     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5057     GR_COMBINE_LOCAL_CONSTANT,
5058     GR_COMBINE_OTHER_TEXTURE);
5059   CC_PRIM ();
5060   USE_T1 ();
5061   //(1-t)*prim+t == (1-prim)*t+prim
5062 }
5063
5064 static void cc_one_sub_t1_mul_env_add_t1 ()  //Aded by Gonetz
5065 {
5066   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5067     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5068     GR_COMBINE_LOCAL_CONSTANT,
5069     GR_COMBINE_OTHER_TEXTURE);
5070   CC_ENV ();
5071   USE_T1 ();
5072   //(1-t)*env+t == (1-env)*t+env
5073 }
5074
5075 static void cc_one_sub_t0_mul_primlod_add_t0 ()  //Aded by Gonetz
5076 {
5077   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5078     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5079     GR_COMBINE_LOCAL_CONSTANT,
5080     GR_COMBINE_OTHER_TEXTURE);
5081   CC_PRIMLOD ();
5082   USE_T0 ();
5083   //(1-t)*primlod+t == (1-primlod)*t+primlod
5084 }
5085
5086 static void cc_one_sub_t0_mul_prima_add_t0 ()  //Aded by Gonetz
5087 {
5088   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5089     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA,
5090     GR_COMBINE_LOCAL_CONSTANT,
5091     GR_COMBINE_OTHER_TEXTURE);
5092   CA_PRIM ();
5093   USE_T0 ();
5094   //(1-t)*prima+t == (1-prima)*t+prima
5095 }
5096
5097 static void cc_one_sub__t0_inter_t1_using_enva__mul_prim_add__t0_inter_t1_using_enva ()  //Aded by Gonetz
5098 {
5099   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5100     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5101     GR_COMBINE_LOCAL_CONSTANT,
5102     GR_COMBINE_OTHER_TEXTURE);
5103   CC_PRIM ();
5104   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
5105   T0_INTER_T1_USING_FACTOR (factor);
5106   //(1-t)*prim+t == (1-prim)*t+prim
5107 }
5108
5109 static void cc_one_sub_t0_mul_shade_add_t0 ()
5110 {
5111   CCMB (GR_COMBINE_FUNCTION_BLEND,
5112     GR_COMBINE_FACTOR_TEXTURE_RGB,
5113     GR_COMBINE_LOCAL_ITERATED,
5114     GR_COMBINE_OTHER_CONSTANT);
5115   CC (0xFFFFFFFF);
5116   USE_T0 ();
5117 }
5118
5119 static void cc_one_sub_prim_mul_t0_add_prim () //Aded by Gonetz
5120 {
5121   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5122     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5123     GR_COMBINE_LOCAL_CONSTANT,
5124     GR_COMBINE_OTHER_TEXTURE);
5125   CC_PRIM ();
5126   USE_T0 ();
5127 }
5128
5129 static void cc_one_sub_prim_mul_t0a_add_prim ()
5130 {
5131   if (cmb.combine_ext)
5132   {
5133     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ONE_MINUS_X,
5134       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ZERO,
5135       GR_CMBX_TEXTURE_ALPHA, 0,
5136       GR_CMBX_B, 0);
5137     CC_PRIM ();
5138   } else {
5139     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
5140       GR_COMBINE_FACTOR_ONE,
5141       GR_COMBINE_LOCAL_NONE,
5142       GR_COMBINE_OTHER_TEXTURE);
5143     MOD_0 (TMOD_COL_INTER_COL1_USING_TEXA);
5144     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
5145     MOD_0_COL1 (0xFFFFFF00);
5146   }
5147   USE_T0 ();
5148 }
5149
5150 static void cc_one_sub_prim_mul__t0_inter_t1_using_primlod__add_prim () //Aded by Gonetz
5151 {
5152   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5153     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5154     GR_COMBINE_LOCAL_CONSTANT,
5155     GR_COMBINE_OTHER_TEXTURE);
5156   CC_PRIM ();
5157   T0_INTER_T1_USING_FACTOR (lod_frac);
5158 }
5159
5160 static void cc__one_sub_prim_mul_shade__mul_t0_add__prim_mul_shade () //Aded by Gonetz
5161 {
5162   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5163     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5164     GR_COMBINE_LOCAL_ITERATED,
5165     GR_COMBINE_OTHER_TEXTURE);
5166   MULSHADE_PRIM ();
5167   USE_T0 ();
5168 }
5169
5170 static void cc_one_sub_shade_mul__t0_inter_t1_using_primlod__add_shade () //Aded by Gonetz
5171 {
5172   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5173     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5174     GR_COMBINE_LOCAL_ITERATED,
5175     GR_COMBINE_OTHER_TEXTURE);
5176   T0_INTER_T1_USING_FACTOR (lod_frac);
5177 }
5178
5179 static void cc_one_sub_prim_mul_t1_add_prim () //Aded by Gonetz
5180 {
5181   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5182     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5183     GR_COMBINE_LOCAL_CONSTANT,
5184     GR_COMBINE_OTHER_TEXTURE);
5185   CC_PRIM ();
5186   USE_T1 ();
5187 }
5188
5189 static void cc_one_sub_prim_mul_env_add_prim ()  //Aded by Gonetz
5190 {
5191   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5192     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5193     GR_COMBINE_LOCAL_CONSTANT,
5194     GR_COMBINE_OTHER_ITERATED);
5195   CC_PRIM ();
5196   SETSHADE_ENV ();
5197 }
5198
5199 static void cc_t0_sub_prim_mul_shade_add_shade ()  //Aded by Gonetz
5200 {
5201   if (cmb.combine_ext)
5202   {
5203     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
5204       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
5205       GR_CMBX_ITRGB, 0,
5206       GR_CMBX_ITRGB, 0);
5207     CC_PRIM ();
5208   }
5209   else
5210   {
5211     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5212       GR_COMBINE_FACTOR_LOCAL,
5213       GR_COMBINE_LOCAL_ITERATED,
5214       GR_COMBINE_OTHER_TEXTURE);
5215     if (rdp.prim_color & 0xFFFFFF00)
5216     {
5217       MOD_0 (TMOD_TEX_SUB_COL);
5218       MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
5219     }
5220   }
5221   USE_T0 ();
5222 }
5223
5224 static void cc__t0_mul_t0__sub_prim_mul_shade_add_shade ()  //Aded by Gonetz
5225 {
5226   if (cmb.combine_ext)
5227   {
5228     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5229       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5230       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
5231       GR_CMBX_ZERO, 0);
5232     cmb.tex |= 1;
5233     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
5234       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
5235       GR_CMBX_ITRGB, 0,
5236       GR_CMBX_ITRGB, 0);
5237     CC_PRIM ();
5238   }
5239   else
5240     cc_t0_sub_prim_mul_shade_add_shade();
5241 }
5242
5243 static void cc__t0_mul_t1__sub_prim_mul_shade_add_shade ()  //Aded by Gonetz
5244 {
5245   if (cmb.combine_ext)
5246   {
5247     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
5248       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
5249       GR_CMBX_ITRGB, 0,
5250       GR_CMBX_ITRGB, 0);
5251     CC_PRIM ();
5252   }
5253   else
5254   {
5255     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5256       GR_COMBINE_FACTOR_LOCAL,
5257       GR_COMBINE_LOCAL_ITERATED,
5258       GR_COMBINE_OTHER_TEXTURE);
5259   }
5260   T0_MUL_T1 ();
5261 }
5262
5263 static void cc__t0_mul_t1__sub_env_mul_shade_add_shade ()  //Aded by Gonetz
5264 {
5265   if (cmb.combine_ext)
5266   {
5267     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
5268       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
5269       GR_CMBX_ITRGB, 0,
5270       GR_CMBX_ITRGB, 0);
5271     CC_ENV ();
5272   }
5273   else
5274   {
5275     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5276       GR_COMBINE_FACTOR_LOCAL,
5277       GR_COMBINE_LOCAL_ITERATED,
5278       GR_COMBINE_OTHER_TEXTURE);
5279   }
5280   T0_MUL_T1 ();
5281 }
5282
5283 static void cc_one_sub_prim_mul_shade_add_shade ()  //Aded by Gonetz
5284 {
5285   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5286     GR_COMBINE_FACTOR_LOCAL,
5287     GR_COMBINE_LOCAL_ITERATED,
5288     GR_COMBINE_OTHER_CONSTANT);
5289   CC_1SUBPRIM ();
5290 }
5291
5292 static void cc_t0_inter_env_using_prima ()
5293 {
5294   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
5295     GR_COMBINE_FACTOR_ONE,
5296     GR_COMBINE_LOCAL_NONE,
5297     GR_COMBINE_OTHER_TEXTURE);
5298   USE_T0 ();
5299
5300   MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
5301   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
5302   MOD_0_FAC (rdp.prim_color & 0xFF);
5303 }
5304
5305 static void cc_t0_inter_env_using_enva ()
5306 {
5307   //(env-t0)*env_a+t0
5308   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
5309     GR_COMBINE_FACTOR_ONE,
5310     GR_COMBINE_LOCAL_NONE,
5311     GR_COMBINE_OTHER_TEXTURE);
5312   if (cmb.combine_ext)
5313   {
5314     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
5315       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
5316       GR_CMBX_TMU_CALPHA, 0,
5317       GR_CMBX_B, 0);
5318     cmb.tex_ccolor = rdp.env_color;
5319     cmb.tex |= 1;
5320   }
5321   else
5322   {
5323     USE_T0 ();
5324     MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
5325     MOD_0_COL (rdp.env_color & 0xFFFFFFFF);
5326     MOD_0_FAC (rdp.env_color & 0xFF);
5327   }
5328 }
5329
5330 static void cc_t0_inter_noise_using_prim ()
5331 {
5332   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
5333     GR_COMBINE_FACTOR_ONE,
5334     GR_COMBINE_LOCAL_NONE,
5335     GR_COMBINE_OTHER_TEXTURE);
5336   USE_T0 ();
5337
5338   MOD_0 (TMOD_TEX_INTER_NOISE_USING_COL);
5339   MOD_0_COL (rdp.prim_color);
5340   rdp.noise = RDP::noise_texture;
5341 }
5342
5343 static void cc_t0_inter_noise_using_env ()
5344 {
5345   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
5346     GR_COMBINE_FACTOR_ONE,
5347     GR_COMBINE_LOCAL_NONE,
5348     GR_COMBINE_OTHER_TEXTURE);
5349   USE_T0 ();
5350
5351   MOD_0 (TMOD_TEX_INTER_NOISE_USING_COL);
5352   MOD_0_COL (rdp.env_color);
5353   rdp.noise = RDP::noise_texture;
5354 }
5355
5356 static void cc_t0_sub_env_mul_enva_add_env ()
5357 {
5358   CCMB (GR_COMBINE_FUNCTION_BLEND,
5359     GR_COMBINE_FACTOR_LOCAL_ALPHA,
5360     GR_COMBINE_LOCAL_CONSTANT,
5361     GR_COMBINE_OTHER_TEXTURE);
5362   CC_ENV ();
5363   CA_ENV ();
5364   USE_T0 ();
5365 }
5366
5367 //Added by Gonetz
5368 static void cc_one_sub_prim_mul__t0_mul_t1__add__prim_mul_env ()
5369 {
5370   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5371     GR_COMBINE_FACTOR_TEXTURE_RGB,
5372     GR_COMBINE_LOCAL_ITERATED,
5373     GR_COMBINE_OTHER_CONSTANT);
5374   CC_1SUBPRIM ();
5375   SETSHADE_PRIM ();
5376   SETSHADE_ENV ();
5377   T0_MUL_T1 ();
5378 }
5379
5380 //Added by Gonetz
5381 static void cc_one_sub_prim_mul__t0_mul_t1__add__prim_mul_shade ()
5382 {
5383   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5384     GR_COMBINE_FACTOR_TEXTURE_RGB,
5385     GR_COMBINE_LOCAL_ITERATED,
5386     GR_COMBINE_OTHER_CONSTANT);
5387   CC_1SUBPRIM ();
5388   MULSHADE_PRIM ();
5389   T0_MUL_T1 ();
5390 }
5391
5392 //Added by Gonetz
5393 static void cc_one_sub_prim_mul__t0_inter_t1_using_enva__add_prim ()
5394 {
5395   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5396     GR_COMBINE_FACTOR_TEXTURE_RGB,
5397     GR_COMBINE_LOCAL_ITERATED,
5398     GR_COMBINE_OTHER_CONSTANT);
5399   CC_1SUBPRIM ();
5400   SETSHADE_PRIM ();
5401   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
5402   T0_INTER_T1_USING_FACTOR (factor);
5403 }
5404
5405 static void cc_one_sub_env_mul__t0_inter_t1_using_primlod__add_env () //Aded by Gonetz
5406 {
5407   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5408     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5409     GR_COMBINE_LOCAL_CONSTANT,
5410     GR_COMBINE_OTHER_TEXTURE);
5411   CC_ENV ();
5412   T0_INTER_T1_USING_FACTOR (lod_frac);
5413 }
5414
5415 static void cc_one_sub_env_mul__t1_sub_prim_mul_primlod_add_t0__add_env () //Aded by Gonetz
5416 {
5417   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5418     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5419     GR_COMBINE_LOCAL_CONSTANT,
5420     GR_COMBINE_OTHER_TEXTURE);
5421   CC_ENV ();
5422   T1_SUB_PRIM_MUL_PRIMLOD_ADD_T0 ();
5423 }
5424
5425 static void cc_one_sub_env_mul_t0_add_prim_mul_env () //Aded by Gonetz
5426 {
5427   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5428     GR_COMBINE_FACTOR_TEXTURE_RGB,
5429     GR_COMBINE_LOCAL_ITERATED,
5430     GR_COMBINE_OTHER_CONSTANT);
5431   CC_1SUBENV ();
5432   SETSHADE_PRIM ();
5433   SETSHADE_ENV ();
5434   USE_T0 ();
5435 }
5436
5437 static void cc_one_sub_env_mul_t0_add_env () //Aded by Gonetz
5438 {
5439   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5440     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5441     GR_COMBINE_LOCAL_CONSTANT,
5442     GR_COMBINE_OTHER_TEXTURE);
5443   CC_ENV ();
5444   USE_T0 ();
5445 }
5446
5447 static void cc_one_sub_env_mul_t0_add_shade () //Aded by Gonetz
5448 {
5449   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5450     GR_COMBINE_FACTOR_TEXTURE_RGB,
5451     GR_COMBINE_LOCAL_ITERATED,
5452     GR_COMBINE_OTHER_CONSTANT);
5453   CC_1SUBENV ();
5454   USE_T0 ();
5455 }
5456
5457 static void cc_one_sub_env_mul_prim_add_env () //Aded by Gonetz
5458 {
5459   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5460     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5461     GR_COMBINE_LOCAL_CONSTANT,
5462     GR_COMBINE_OTHER_ITERATED);
5463   CC_ENV ();
5464   SETSHADE_PRIM ();
5465 }
5466
5467 static void cc_one_sub_env_mul_prim_add_shade () //Aded by Gonetz
5468 {
5469   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5470     GR_COMBINE_FACTOR_ONE,
5471     GR_COMBINE_LOCAL_ITERATED,
5472     GR_COMBINE_OTHER_CONSTANT);
5473   CC_1SUBENV ();
5474   CC_C1MULC2 (rdp.prim_color, cmb.ccolor);
5475 }
5476
5477 static void cc_one_sub_env_mul_shade_add_env () //Aded by Gonetz
5478 {
5479   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5480     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5481     GR_COMBINE_LOCAL_CONSTANT,
5482     GR_COMBINE_OTHER_ITERATED);
5483   CC_ENV ();
5484 }
5485
5486 static void cc_one_sub_env_mul_prim_add__t0_inter_t1_using_env () //Aded by Gonetz
5487 {
5488   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5489     GR_COMBINE_FACTOR_ONE,
5490     GR_COMBINE_LOCAL_ITERATED,
5491     GR_COMBINE_OTHER_TEXTURE);
5492   SETSHADE_PRIM ();
5493   SETSHADE_1MENV ();
5494   T0_INTER_T1_USING_ENV ();
5495 }
5496
5497 static void cc_one_sub_shade_mul_t0_add_shade ()
5498 {
5499   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5500     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5501     GR_COMBINE_LOCAL_ITERATED,
5502     GR_COMBINE_OTHER_TEXTURE);
5503   USE_T0 ();
5504 }
5505
5506 static void cc_one_sub_shade_mul__t0_mul_shadea__add_shade ()
5507 {
5508   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5509     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5510     GR_COMBINE_LOCAL_ITERATED,
5511     GR_COMBINE_OTHER_TEXTURE);
5512   if (cmb.combine_ext)
5513   {
5514     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5515       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5516       GR_CMBX_ITALPHA, 0,
5517       GR_CMBX_ZERO, 0);
5518     cmb.tex |= 1;
5519   }
5520   else
5521   {
5522     USE_T0 ();
5523   }
5524 }
5525
5526 static void cc_one_sub_shade_mul_env_add_shade ()
5527 {
5528   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5529     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
5530     GR_COMBINE_LOCAL_ITERATED,
5531     GR_COMBINE_OTHER_CONSTANT);
5532   CC_ENV ();
5533 }
5534
5535 static void cc_one_sub_shade_mul_shadea_add_shade ()
5536 {
5537   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5538     GR_COMBINE_FACTOR_LOCAL_ALPHA,
5539     GR_COMBINE_LOCAL_ITERATED,
5540     GR_COMBINE_OTHER_CONSTANT);
5541   CC (0xFFFFFFFF);
5542 }
5543
5544 ///*
5545 static void cc_t0_sub_env_mul_prim_add_env ()  //Aded by Gonetz
5546 {
5547   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5548     GR_COMBINE_FACTOR_TEXTURE_RGB,
5549     GR_COMBINE_LOCAL_ITERATED,
5550     GR_COMBINE_OTHER_CONSTANT);
5551   SETSHADE_1MPRIM();
5552   SETSHADE_ENV();
5553   CC_PRIM ();
5554   USE_T0 ();
5555   //(t0-env)*prim+env == t0*prim + env*(1-prim)
5556 }
5557 //*/
5558 static void cc__t0_inter_t1_using_t1a__sub_env_mul_enva_add_env ()  //Aded by Gonetz
5559 {
5560   CCMB (GR_COMBINE_FUNCTION_BLEND,
5561     GR_COMBINE_FACTOR_LOCAL_ALPHA,
5562     GR_COMBINE_LOCAL_CONSTANT,
5563     GR_COMBINE_OTHER_TEXTURE);
5564   cmb.ccolor = rdp.env_color;
5565   T0_INTER_T1_USING_T1A ();
5566 }
5567
5568 static void cc_t0_sub_shade_mul_t0a_add_shade ()
5569 {
5570   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5571     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
5572     GR_COMBINE_LOCAL_ITERATED,
5573     GR_COMBINE_OTHER_TEXTURE);
5574   USE_T0 ();
5575   A_USE_T0 ();
5576 }
5577
5578 static void cc_t0_sub_shade_mul_prima_add_shade ()  //Aded by Gonetz
5579 {
5580   // * not guaranteed to work if another iterated alpha is set
5581   CCMB (GR_COMBINE_FUNCTION_BLEND,
5582     GR_COMBINE_FACTOR_LOCAL_ALPHA,
5583     GR_COMBINE_LOCAL_ITERATED,
5584     GR_COMBINE_OTHER_TEXTURE);
5585   SETSHADE_A_PRIM ();
5586   USE_T0 ();
5587 }
5588
5589 static void cc_t0_sub_shade_mul_shadea_add_shade ()  //Aded by Gonetz
5590 {
5591   // * not guaranteed to work if another iterated alpha is set
5592   CCMB (GR_COMBINE_FUNCTION_BLEND,
5593     GR_COMBINE_FACTOR_LOCAL_ALPHA,
5594     GR_COMBINE_LOCAL_ITERATED,
5595     GR_COMBINE_OTHER_TEXTURE);
5596   USE_T0 ();
5597 }
5598
5599 static void cc__t0_mul_t1_add_env__mul_shadea_add_shade ()
5600 {
5601   if (cmb.combine_ext)
5602   {
5603     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5604       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5605       GR_CMBX_ZERO, 0,
5606       GR_CMBX_B, 0);
5607     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
5608       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
5609       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
5610       GR_CMBX_B, 0);
5611     cmb.tex_ccolor = rdp.env_color;
5612     cmb.tex |= 3;
5613   }
5614   else
5615   {
5616     T0_MUL_T1 ();
5617   }
5618   // * not guaranteed to work if another iterated alpha is set
5619   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5620     GR_COMBINE_FACTOR_LOCAL_ALPHA,
5621     GR_COMBINE_LOCAL_ITERATED,
5622     GR_COMBINE_OTHER_TEXTURE);
5623 }
5624
5625 static void cc_prim_sub_t0_mul_env_add_t0 ()  //Aded by Gonetz
5626 {
5627   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5628     GR_COMBINE_FACTOR_TEXTURE_RGB,
5629     GR_COMBINE_LOCAL_ITERATED,
5630     GR_COMBINE_OTHER_CONSTANT);
5631   CC_1SUBENV ();
5632   SETSHADE_PRIM ();
5633   SETSHADE_ENV ();
5634   USE_T0 ();
5635   //(prim-t0)*env+t0 == prim*env + t0*(1-env)
5636 }
5637
5638 static void cc_prim_sub_t0_mul_t1_add_t0 ()  //Aded by Gonetz
5639 {
5640   if (!cmb.combine_ext)
5641   {
5642     cc_t0_mul_t1 ();
5643     return;
5644   }
5645   T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5646     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5647     GR_CMBX_ZERO, 0,
5648     GR_CMBX_B, 0);
5649   T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
5650     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
5651     GR_CMBX_OTHER_TEXTURE_RGB, 0,
5652     GR_CMBX_B, 0);
5653   cmb.tex_ccolor = rdp.prim_color;
5654   cmb.tex |= 3;
5655   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5656     GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5657     GR_CMBX_ZERO, 0,
5658     GR_CMBX_B, 0);
5659 }
5660
5661 static void cc_env_sub_t0_mul_prim_add_t0 ()  //Aded by Gonetz
5662 {
5663   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5664     GR_COMBINE_FACTOR_TEXTURE_RGB,
5665     GR_COMBINE_LOCAL_ITERATED,
5666     GR_COMBINE_OTHER_CONSTANT);
5667   CC_1SUBPRIM ();
5668   SETSHADE_PRIM ();
5669   SETSHADE_ENV ();
5670   USE_T0 ();
5671   //(env-t0)*prim+t0 == prim*env + t0*(1-prim)
5672 }
5673
5674 static void cc_env_sub_t0_mul_shade_add_t0 ()  //Aded by Gonetz
5675 {
5676   if (!cmb.combine_ext)
5677   {
5678     cc_t0_mul_shade ();
5679     return;
5680   }
5681   CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
5682     GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
5683     GR_CMBX_ITRGB, 0,
5684     GR_CMBX_B, 0);
5685   CC_ENV ();
5686   USE_T0 ();
5687 }
5688
5689 static void cc_prim_sub_env_mul_t0_add_prim ()
5690 {
5691   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5692     GR_COMBINE_FACTOR_TEXTURE_RGB,
5693     GR_COMBINE_LOCAL_CONSTANT,
5694     GR_COMBINE_OTHER_ITERATED);
5695   CC_PRIM ();
5696   SETSHADE_PRIMSUBENV ();
5697   USE_T0 ();
5698 }
5699
5700 static void cc_prim_sub_env_mul_t0_add_env ()
5701 {
5702   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5703     GR_COMBINE_FACTOR_TEXTURE_RGB,
5704     GR_COMBINE_LOCAL_ITERATED,
5705     GR_COMBINE_OTHER_CONSTANT);
5706   CC_PRIM ();
5707   SETSHADE_ENV ();
5708   USE_T0 ();
5709 }
5710
5711 static void cc__prim_sub_env_mul_t0_add_env__add_primlod ()
5712 {
5713   if (!cmb.combine_ext)
5714   {
5715     cc_prim_sub_env_mul_t0_add_env ();
5716     return;
5717   }
5718   T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5719     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
5720     GR_CMBX_ITRGB, 0,
5721     GR_CMBX_B, 0);
5722   cmb.tex_ccolor = rdp.env_color;
5723   cmb.tex |= 1;
5724   SETSHADE_PRIMSUBENV ();
5725   CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
5726     GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
5727     GR_CMBX_ZERO, 1,
5728     GR_CMBX_TEXTURE_RGB, 0);
5729   CC_PRIMLOD ();
5730 }
5731
5732 static void cc__prim_sub_env_mul_t0_add_env__add_shadea ()
5733 {
5734   if (!cmb.combine_ext)
5735   {
5736     cc_prim_sub_env_mul_t0_add_env ();
5737     return;
5738   }
5739   T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5740     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
5741     GR_CMBX_ITRGB, 0,
5742     GR_CMBX_B, 0);
5743   cmb.tex_ccolor = rdp.env_color;
5744   cmb.tex |= 1;
5745   SETSHADE_PRIMSUBENV ();
5746   CCMBEXT(GR_CMBX_ITALPHA, GR_FUNC_MODE_X,
5747     GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
5748     GR_CMBX_ZERO, 1,
5749     GR_CMBX_TEXTURE_RGB, 0);
5750 }
5751
5752 static void cc_prim_sub_env_mul__t0_mul_t1a__add_env ()
5753 {
5754   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5755     GR_COMBINE_FACTOR_TEXTURE_RGB,
5756     GR_COMBINE_LOCAL_ITERATED,
5757     GR_COMBINE_OTHER_CONSTANT);
5758   CC_PRIM ();
5759   SETSHADE_ENV ();
5760   T0_MUL_T1A ();
5761 }
5762
5763 static void cc_prim_sub_env_mul__t0_mul_prim__add_env ()
5764 {
5765   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5766     GR_COMBINE_FACTOR_TEXTURE_RGB,
5767     GR_COMBINE_LOCAL_ITERATED,
5768     GR_COMBINE_OTHER_CONSTANT);
5769   CC_PRIM ();
5770   SETSHADE_ENV ();
5771   if (cmb.combine_ext)
5772   {
5773     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5774       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5775       GR_CMBX_TMU_CCOLOR, 0,
5776       GR_CMBX_ZERO, 0);
5777     cmb.tex_ccolor = rdp.prim_color;
5778     cmb.tex |= 1;
5779   }
5780   else
5781   {
5782     USE_T0 ();
5783   }
5784 }
5785
5786 static void cc_prim_sub_env_mul_t0_mul_shade_add_env ()
5787 {
5788   if (cmb.combine_ext)
5789   {
5790     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5791       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5792       GR_CMBX_TMU_CCOLOR, 0,
5793       GR_CMBX_ZERO, 0);
5794     CC_PRIMSUBENV ();
5795     cmb.tex_ccolor = cmb.ccolor;
5796     cmb.tex |= 1;
5797     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
5798       GR_COMBINE_FACTOR_TEXTURE_RGB,
5799       GR_COMBINE_LOCAL_CONSTANT,
5800       GR_COMBINE_OTHER_ITERATED);
5801     CC_ENV ();
5802   }
5803   else
5804   {
5805     cc_t0_mul_prim_mul_shade ();
5806   }
5807 }
5808
5809 static void cc_prim_sub_env_mul__t0_sub_t0_mul_prima__add_env ()
5810 {
5811   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5812     GR_COMBINE_FACTOR_TEXTURE_RGB,
5813     GR_COMBINE_LOCAL_ITERATED,
5814     GR_COMBINE_OTHER_CONSTANT);
5815   CC_PRIM ();
5816   SETSHADE_ENV ();
5817   rdp.best_tex = 0;
5818   cmb.tex |= 1;
5819   cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND_LOCAL;
5820   cmb.tmu0_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR;
5821   percent = (float)(rdp.prim_color&0xFF) / 255.0f;
5822   cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
5823 }
5824
5825 static void cc_prim_sub_env_mul__one_sub_t0_mul_primlod_add_prim__add_env ()
5826 {
5827   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5828     GR_COMBINE_FACTOR_TEXTURE_RGB,
5829     GR_COMBINE_LOCAL_CONSTANT,
5830     GR_COMBINE_OTHER_ITERATED);
5831   CC_ENV ();
5832   SETSHADE_PRIM ();
5833   if (cmb.combine_ext)
5834   {
5835     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ONE_MINUS_X,
5836       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
5837       GR_CMBX_DETAIL_FACTOR, 0,
5838       GR_CMBX_B, 0);
5839     cmb.tex_ccolor = rdp.prim_color;
5840     cmb.tex |= 1;
5841     cmb.dc0_detailmax = cmb.dc1_detailmax = (float)lod_frac / 255.0f;
5842   }
5843   else
5844   {
5845     USE_T0 ();
5846   }
5847 }
5848
5849 static void cc_prim_sub_env_mul__t0_add_t1a__add_env ()
5850 {
5851   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5852     GR_COMBINE_FACTOR_TEXTURE_RGB,
5853     GR_COMBINE_LOCAL_ITERATED,
5854     GR_COMBINE_OTHER_CONSTANT);
5855   CC_PRIM ();
5856   SETSHADE_ENV ();
5857   rdp.best_tex = 0;
5858   cmb.tex |= 3;
5859   cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL_ALPHA;
5860   cmb.tmu0_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
5861   cmb.tmu0_fac = GR_COMBINE_FACTOR_ONE;
5862 }
5863
5864 static void cc_prim_sub_env_mul__t0_sub_prim_mul_enva_add_t0__add_env ()
5865 {
5866   // (t0-prim)*env_a+t0, (prim-env)*cmb+env
5867   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5868     GR_COMBINE_FACTOR_TEXTURE_RGB,
5869     GR_COMBINE_LOCAL_CONSTANT,
5870     GR_COMBINE_OTHER_ITERATED);
5871   CC_ENV ();
5872   SETSHADE_PRIM ();
5873   USE_T0 ();
5874
5875   MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC_ADD_TEX);
5876   MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
5877   MOD_0_FAC (rdp.env_color & 0xFF);
5878 }
5879
5880 static void cc_prim_sub_env_mul__t1_sub_prim_mul_enva_add_t0__add_env ()
5881 {
5882   //(t1-prim)*env_a+t0, (prim-env)*cmb+env
5883   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5884     GR_COMBINE_FACTOR_TEXTURE_RGB,
5885     GR_COMBINE_LOCAL_CONSTANT,
5886     GR_COMBINE_OTHER_ITERATED);
5887   CC_ENV ();
5888   SETSHADE_PRIM ();
5889   if (cmb.combine_ext)
5890   {
5891     if (rdp.tiles[rdp.cur_tile].format > 2)
5892     {
5893       T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5894         GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5895         GR_CMBX_ZERO, 0,
5896         GR_CMBX_B, 0);
5897       T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
5898         GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
5899         GR_CMBX_DETAIL_FACTOR, 0,
5900         GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
5901     }
5902     else
5903     {
5904       T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5905         GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
5906         GR_CMBX_DETAIL_FACTOR, 0,
5907         GR_CMBX_ZERO, 0);
5908       T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
5909         GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5910         GR_CMBX_ZERO, 1,
5911         GR_CMBX_ZERO, 0);
5912     }
5913     cmb.tex_ccolor = rdp.prim_color;
5914     cmb.tex |= 3;
5915     cmb.dc0_detailmax = cmb.dc1_detailmax = (float)(rdp.env_color&0xFF) / 255.0f;
5916   }
5917   else
5918   {
5919     MOD_1 (TMOD_TEX_SUB_COL_MUL_FAC);
5920     MOD_1_COL (rdp.prim_color & 0xFFFFFF00);
5921     MOD_1_FAC (rdp.env_color & 0xFF);
5922     T0_ADD_T1 ();
5923   }
5924 }
5925
5926 static void cc_prim_sub_env_mul__t1_sub_prim_mul_prima_add_t0__add_env ()
5927 {
5928   // (t1-prim)*prim_a+t0, (prim-env)*cmb+env
5929   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5930     GR_COMBINE_FACTOR_TEXTURE_RGB,
5931     GR_COMBINE_LOCAL_CONSTANT,
5932     GR_COMBINE_OTHER_ITERATED);
5933   CC_ENV ();
5934   SETSHADE_PRIM ();
5935   if (cmb.combine_ext)
5936   {
5937     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
5938       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
5939       GR_CMBX_ZERO, 1,
5940       GR_CMBX_ZERO, 0);
5941     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
5942       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
5943       GR_CMBX_DETAIL_FACTOR, 0,
5944       GR_CMBX_B, 0);
5945     cmb.tex_ccolor = rdp.prim_color;
5946     cmb.tex |= 3;
5947     cmb.dc0_detailmax = cmb.dc1_detailmax = (float)(rdp.prim_color&0xFF) / 255.0f;
5948   }
5949   else
5950   {
5951     MOD_1 (TMOD_TEX_SUB_COL_MUL_FAC);
5952     MOD_1_COL (rdp.prim_color & 0xFFFFFF00);
5953     MOD_1_FAC (rdp.prim_color & 0xFF);
5954     T0_ADD_T1 ();
5955   }
5956 }
5957
5958 static void cc__prim_sub_env_mul_t0_add_env__mul_primlod ()
5959 {
5960   CCMB (GR_COMBINE_FUNCTION_BLEND,
5961     GR_COMBINE_FACTOR_TEXTURE_RGB,
5962     GR_COMBINE_LOCAL_ITERATED,
5963     GR_COMBINE_OTHER_CONSTANT);
5964   float factor = (float)rdp.prim_lodfrac / 255.0f;
5965   wxUint8 r = (wxUint8)((rdp.prim_color >> 24) & 0xFF);
5966   r = (wxUint8)((float)r * factor);
5967   wxUint8 g = (wxUint8)((rdp.prim_color >> 16) & 0xFF);
5968   g = (wxUint8)((float)g * factor);
5969   wxUint8 b = (wxUint8)((rdp.prim_color >>  8) & 0xFF);
5970   b = (wxUint8)((float)b * factor);
5971   CC ((r<<24) | (g<<16) | (b<<8));
5972   SETSHADE_ENV ();
5973   MULSHADE_PRIMLOD ();
5974   USE_T0 ();
5975 }
5976
5977 static void cc__prim_sub_env_mul_t0_add_env__mul_k5 ()
5978 {
5979   CCMB (GR_COMBINE_FUNCTION_BLEND,
5980     GR_COMBINE_FACTOR_TEXTURE_RGB,
5981     GR_COMBINE_LOCAL_ITERATED,
5982     GR_COMBINE_OTHER_CONSTANT);
5983   float factor = (float)rdp.K5 / 255.0f;
5984   wxUint8 r = (wxUint8)((rdp.prim_color >> 24) & 0xFF);
5985   r = (wxUint8)((float)r * factor);
5986   wxUint8 g = (wxUint8)((rdp.prim_color >> 16) & 0xFF);
5987   g = (wxUint8)((float)g * factor);
5988   wxUint8 b = (wxUint8)((rdp.prim_color >>  8) & 0xFF);
5989   b = (wxUint8)((float)b * factor);
5990   CC ((r<<24) | (g<<16) | (b<<8));
5991   SETSHADE_ENV ();
5992   MULSHADE_K5 ();
5993   USE_T0 ();
5994 }
5995
5996 static void cc_prim_sub_env_mul_t1_add_env ()
5997 {
5998   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
5999     GR_COMBINE_FACTOR_TEXTURE_RGB,
6000     GR_COMBINE_LOCAL_ITERATED,
6001     GR_COMBINE_OTHER_CONSTANT);
6002   CC_PRIM ();
6003   SETSHADE_ENV ();
6004   if (rdp.cycle_mode == 0 || ((settings.hacks&hack_KI) && (rdp.cycle2 & 0x0FFFFFFF) == 0x01FF1FFF))
6005   {
6006     USE_T0 ();
6007   }
6008   else
6009   {
6010     USE_T1 ();
6011   }
6012 }
6013
6014 static void cc_prim_sub_env_mul_t1_add_env_mul_t0 ()
6015 {
6016   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
6017     GR_COMBINE_FACTOR_ONE,
6018     GR_COMBINE_LOCAL_NONE,
6019     GR_COMBINE_OTHER_TEXTURE);
6020   MOD_1 (TMOD_COL_INTER_COL1_USING_TEX);
6021   MOD_1_COL (rdp.env_color & 0xFFFFFF00);
6022   MOD_1_COL1 (rdp.prim_color & 0xFFFFFF00);
6023   T0_MUL_T1 ();
6024 }
6025
6026 static void cc_prim_sub_env_mul_t0a_add_t0 ()
6027 {
6028   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
6029     GR_COMBINE_FACTOR_ONE,
6030     GR_COMBINE_LOCAL_NONE,
6031     GR_COMBINE_OTHER_TEXTURE);
6032   CC_PRIMSUBENV ();
6033   if (cmb.combine_ext)
6034   {
6035     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
6036       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
6037       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0,
6038       GR_CMBX_B, 0);
6039     cmb.tex_ccolor = cmb.ccolor;
6040     cmb.tex |= 1;
6041   }
6042   else
6043   {
6044     MOD_0 (TMOD_COL_MUL_TEXA_ADD_TEX);
6045     MOD_0_COL (cmb.ccolor & 0xFFFFFF00);
6046     USE_T0 ();
6047   }
6048 }
6049
6050 //Added by Gonetz
6051 static void cc_prim_sub_env_mul_t0a_add_env ()
6052 {
6053   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6054     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6055     GR_COMBINE_LOCAL_CONSTANT,
6056     GR_COMBINE_OTHER_ITERATED);
6057   CC_ENV ();
6058   SETSHADE_PRIM ();
6059   USE_T0 ();
6060 }
6061
6062 //Added by Gonetz
6063 static void cc_prim_sub_env_mul_t1a_add_env ()
6064 {
6065   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6066     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6067     GR_COMBINE_LOCAL_CONSTANT,
6068     GR_COMBINE_OTHER_ITERATED);
6069   CC_ENV ();
6070   SETSHADE_PRIM ();
6071   USE_T1 ();
6072 }
6073
6074 //Added by Gonetz
6075 static void cc_prim_sub_env_mul__t0_mul_t1__add_env ()
6076 {
6077   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6078     GR_COMBINE_FACTOR_TEXTURE_RGB,
6079     GR_COMBINE_LOCAL_ITERATED,
6080     GR_COMBINE_OTHER_CONSTANT);
6081   CC_PRIM ();
6082   SETSHADE_ENV ();
6083   T0_MUL_T1 ();
6084 }
6085
6086 //Added by Gonetz
6087 static void cc_prim_sub_env_mul__t0_add_t1__add_env ()
6088 {
6089   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6090     GR_COMBINE_FACTOR_TEXTURE_RGB,
6091     GR_COMBINE_LOCAL_ITERATED,
6092     GR_COMBINE_OTHER_CONSTANT);
6093   CC_PRIM ();
6094   SETSHADE_ENV ();
6095   T0_ADD_T1 ();
6096 }
6097
6098 //Added by Gonetz
6099 static void cc_prim_sub_env_mul__t0_mul_enva__add_env ()
6100 {
6101   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6102     GR_COMBINE_FACTOR_TEXTURE_RGB,
6103     GR_COMBINE_LOCAL_CONSTANT,
6104     GR_COMBINE_OTHER_ITERATED);
6105   CC_ENV ();
6106   SETSHADE_PRIMSUBENV ();
6107   SETSHADE_ENVA ();
6108   USE_T0 ();
6109 }
6110
6111 //Added by Gonetz
6112 static void cc_prim_sub_env_mul__t0_mul_shade__add_env ()
6113 {
6114   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6115     GR_COMBINE_FACTOR_TEXTURE_RGB,
6116     GR_COMBINE_LOCAL_CONSTANT,
6117     GR_COMBINE_OTHER_ITERATED);
6118   CC_ENV ();
6119   MULSHADE_PRIMSUBENV ();
6120   USE_T0 ();
6121 }
6122
6123 //Added by Gonetz
6124 static void cc_prim_sub_env_mul__prim_inter_t0_using_shadea__add_env ()
6125 {
6126   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6127     GR_COMBINE_FACTOR_TEXTURE_RGB,
6128     GR_COMBINE_LOCAL_CONSTANT,
6129     GR_COMBINE_OTHER_ITERATED);
6130   CC_ENV ();
6131   if (cmb.combine_ext)
6132   {
6133     SETSHADE_PRIM ();
6134     PRIM_INTER_T0_USING_SHADEA ();
6135   }
6136   else
6137   {
6138     SETSHADE_PRIMSUBENV ();
6139     MULSHADE_SHADEA ();
6140     USE_T0 ();
6141   }
6142 }
6143
6144 //Added by Gonetz
6145 static void cc_prim_sub_env_mul__t0_sub_prim_mul_primlod_add_t0__add_env ()
6146 {
6147   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6148     GR_COMBINE_FACTOR_TEXTURE_RGB,
6149     GR_COMBINE_LOCAL_ITERATED,
6150     GR_COMBINE_OTHER_CONSTANT);
6151   CC_PRIM ();
6152   SETSHADE_ENV ();
6153   if (cmb.combine_ext)
6154   {
6155     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
6156       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6157       GR_CMBX_DETAIL_FACTOR, 0,
6158       GR_CMBX_B, 0);
6159     cmb.tex_ccolor = rdp.prim_color;
6160     cmb.tex |= 1;
6161     percent = (float)(lod_frac) / 255.0f;
6162     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
6163   }
6164   else
6165   {
6166     USE_T0 ();
6167     MOD_0 (TMOD_TEX_SUB_COL_MUL_FAC_ADD_TEX);
6168     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
6169     MOD_0_FAC (lod_frac & 0xFF);
6170   }
6171 }
6172
6173 static void cc_prim_sub_env_mul__t0_sub_prim_mul_primlod_add_shade__add_env ()
6174 {
6175   if (!cmb.combine_ext)
6176   {
6177     cc_prim_sub_env_mul_t0_add_env ();
6178     return;
6179   }
6180   T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6181     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
6182     GR_CMBX_DETAIL_FACTOR, 0,
6183     GR_CMBX_ITRGB, 0);
6184   CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
6185     GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
6186     GR_CMBX_TEXTURE_RGB, 0,
6187     GR_CMBX_B, 0);
6188   cmb.tex_ccolor = rdp.prim_color;
6189   CC_PRIM ();
6190   SETSHADE_ENV ();
6191   cmb.tex |= 1;
6192   percent = (float)(lod_frac) / 255.0f;
6193   cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
6194 }
6195
6196 static void cc_prim_sub_env_mul__t0_sub_shade_mul_primlod_add_shade__add_env ()
6197 {
6198   if (!cmb.combine_ext)
6199   {
6200     cc_prim_sub_env_mul_t0_add_env ();
6201     return;
6202   }
6203   T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6204     GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
6205     GR_CMBX_DETAIL_FACTOR, 0,
6206     GR_CMBX_B, 0);
6207   CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
6208     GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
6209     GR_CMBX_TEXTURE_RGB, 0,
6210     GR_CMBX_B, 0);
6211   CC_PRIM ();
6212   SETSHADE_ENV ();
6213   cmb.tex |= 1;
6214   percent = (float)(lod_frac) / 255.0f;
6215   cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
6216 }
6217
6218 //Added by Gonetz
6219 static void cc_lavatex_sub_prim_mul_shade_add_lavatex ()
6220 {
6221   if (cmb.combine_ext)
6222   {
6223     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
6224       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
6225       GR_CMBX_ITRGB, 0,
6226       GR_CMBX_B, 0);
6227     CC_PRIM ();
6228     T0_SUB_PRIM_MUL_PRIMLOD_ADD_T1 ();
6229   }
6230   else
6231   {
6232     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
6233       GR_COMBINE_FACTOR_ONE,
6234       GR_COMBINE_LOCAL_NONE,
6235       GR_COMBINE_OTHER_TEXTURE);
6236     T0_ADD_T1 ();
6237   }
6238 }
6239
6240 //Added by Gonetz
6241 static void cc_prim_sub_env_mul__t0_sub_prim_mul_primlod_add_t1__add_env ()
6242 {
6243   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6244     GR_COMBINE_FACTOR_TEXTURE_RGB,
6245     GR_COMBINE_LOCAL_ITERATED,
6246     GR_COMBINE_OTHER_CONSTANT);
6247   CC_PRIM ();
6248   SETSHADE_ENV ();
6249   T0_SUB_PRIM_MUL_PRIMLOD_ADD_T1 ();
6250 }
6251
6252 //Added by Gonetz
6253 static void cc_prim_sub_env_mul__t1_sub_prim_mul_primlod_add_t0__add_env ()
6254 {
6255   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6256     GR_COMBINE_FACTOR_TEXTURE_RGB,
6257     GR_COMBINE_LOCAL_ITERATED,
6258     GR_COMBINE_OTHER_CONSTANT);
6259   CC_PRIM ();
6260   SETSHADE_ENV ();
6261   T1_SUB_PRIM_MUL_PRIMLOD_ADD_T0 ();
6262 }
6263
6264 //Added by Gonetz
6265 static void cc_prim_sub_env_mul__t0_inter_t1_using_t1__add_env ()
6266 {
6267   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6268     GR_COMBINE_FACTOR_TEXTURE_RGB,
6269     GR_COMBINE_LOCAL_ITERATED,
6270     GR_COMBINE_OTHER_CONSTANT);
6271   CC_PRIM ();
6272   SETSHADE_ENV ();
6273   T0_INTER_T1_USING_T1 ();
6274 }
6275
6276 //Added by Gonetz
6277 static void cc_prim_sub_env_mul__t0_inter_t1_using_enva_alpha__add_env ()
6278 {
6279   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6280     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6281     GR_COMBINE_LOCAL_ITERATED,
6282     GR_COMBINE_OTHER_CONSTANT);
6283   CC_PRIM ();
6284   SETSHADE_ENV ();
6285   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
6286   T0_INTER_T1_USING_FACTOR (factor);
6287   A_T0_INTER_T1_USING_FACTOR (factor);
6288 }
6289
6290 //Added by Gonetz
6291 static void cc__env_inter_prim_using_t0__sub_shade_mul_t0a_add_shade ()
6292 {
6293   if (!cmb.combine_ext)
6294   {
6295     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6296       GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6297       GR_COMBINE_LOCAL_ITERATED,
6298       GR_COMBINE_OTHER_TEXTURE);
6299     MOD_0 (TMOD_COL_INTER_COL1_USING_TEX);
6300     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
6301     MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
6302     USE_T0 ();
6303     A_USE_T0 ();
6304   }
6305   else
6306   {
6307     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6308       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
6309       GR_CMBX_DETAIL_FACTOR, 0,
6310       GR_CMBX_B, 0);
6311     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
6312       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
6313       GR_CMBX_TEXTURE_ALPHA, 0,
6314       GR_CMBX_B, 0);
6315     cmb.tex_ccolor = rdp.env_color;
6316     cmb.tex |= 1;
6317     wxUint32 pse = (rdp.prim_color>>24) - (rdp.env_color>>24);
6318     percent = (float)(pse) / 255.0f;
6319     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
6320   }
6321 }
6322
6323 //Added by Gonetz
6324 static void cc_prim_sub_env_mul_shade_add_t0 ()
6325 {
6326   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6327     GR_COMBINE_FACTOR_ONE,
6328     GR_COMBINE_LOCAL_ITERATED,
6329     GR_COMBINE_OTHER_TEXTURE);
6330   MULSHADE_PRIMSUBENV ();
6331   USE_T0 ();
6332 }
6333
6334 //Added by Gonetz
6335 static void cc_prim_sub_env_mul_prima_add_t0 ()
6336 {
6337   if (rdp.prim_color != 0x000000ff)
6338   {
6339     if (cmb.combine_ext)
6340     {
6341       CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
6342         GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
6343         GR_CMBX_CONSTANT_ALPHA, 0,
6344         GR_CMBX_TEXTURE_RGB, 0);
6345       CC_PRIM ();
6346       SETSHADE_ENV ();
6347     }
6348     else
6349     {
6350       CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6351         GR_COMBINE_FACTOR_ONE,
6352         GR_COMBINE_LOCAL_ITERATED,
6353         GR_COMBINE_OTHER_TEXTURE);
6354       SETSHADE_PRIMSUBENV ();
6355       SETSHADE_PRIMA ();
6356     }
6357   }
6358   else if ((rdp.prim_color&0xFFFFFF00) - (rdp.env_color&0xFFFFFF00) == 0)
6359   {
6360     cc_t0 ();
6361     return;
6362   }
6363   else
6364   {
6365     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
6366       GR_COMBINE_FACTOR_ONE,
6367       GR_COMBINE_LOCAL_CONSTANT,
6368       GR_COMBINE_OTHER_TEXTURE);
6369     CC_ENV ();
6370   }
6371   USE_T0 ();
6372 }
6373
6374 //Added by Gonetz
6375 static void cc_prim_sub_env_mul_shade_add_env ()
6376 {
6377   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6378     GR_COMBINE_FACTOR_ONE,
6379     GR_COMBINE_LOCAL_CONSTANT,
6380     GR_COMBINE_OTHER_ITERATED);
6381   CC_ENV ();
6382   MULSHADE_PRIMSUBENV ();
6383 }
6384
6385 static void cc_prim_sub_env_mul_shadea_add_env ()
6386 {
6387   // * not guaranteed to work if another iterated alpha is set
6388   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6389     GR_COMBINE_FACTOR_OTHER_ALPHA,
6390     GR_COMBINE_LOCAL_CONSTANT,
6391     GR_COMBINE_OTHER_ITERATED);
6392   CC_ENV ();
6393   SETSHADE_PRIM ();
6394 }
6395
6396 //Added by Gonetz
6397 static void cc_prim_sub_env_mul__t0_inter_t1_using_prima__add_env ()
6398 {
6399   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6400     GR_COMBINE_FACTOR_TEXTURE_RGB,
6401     GR_COMBINE_LOCAL_CONSTANT,
6402     GR_COMBINE_OTHER_ITERATED);
6403   CC_ENV ();
6404   SETSHADE_PRIM ();
6405   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
6406   T0_INTER_T1_USING_FACTOR (factor);
6407 }
6408
6409 //Added by Gonetz
6410 static void cc_prim_sub_env_mul__t1_inter_t0_using_prima__add_env ()
6411 {
6412   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6413     GR_COMBINE_FACTOR_TEXTURE_RGB,
6414     GR_COMBINE_LOCAL_CONSTANT,
6415     GR_COMBINE_OTHER_ITERATED);
6416   CC_ENV ();
6417   SETSHADE_PRIM ();
6418   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
6419   T1_INTER_T0_USING_FACTOR (factor);
6420 }
6421
6422 static void cc_prim_sub_env_mul__t0_inter_t1_using_enva__add_env ()
6423 {
6424   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6425     GR_COMBINE_FACTOR_TEXTURE_RGB,
6426     GR_COMBINE_LOCAL_CONSTANT,
6427     GR_COMBINE_OTHER_ITERATED);
6428   CC_ENV ();
6429   SETSHADE_PRIM ();
6430   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
6431   T0_INTER_T1_USING_FACTOR (factor);
6432 }
6433
6434 static void cc_prim_sub_center_mul__t0_inter_t1_using_enva__add_env ()
6435 {
6436   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6437     GR_COMBINE_FACTOR_TEXTURE_RGB,
6438     GR_COMBINE_LOCAL_ITERATED,
6439     GR_COMBINE_OTHER_CONSTANT);
6440   CC_C1SUBC2 (rdp.prim_color, rdp.CENTER);
6441   SETSHADE_ENV ();
6442   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
6443   T0_INTER_T1_USING_FACTOR (factor);
6444 }
6445
6446 static void cc_prim_sub_env_mul__t1_inter_t0_using_enva__add_env ()
6447 {
6448   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6449     GR_COMBINE_FACTOR_TEXTURE_RGB,
6450     GR_COMBINE_LOCAL_CONSTANT,
6451     GR_COMBINE_OTHER_ITERATED);
6452   CC_ENV ();
6453   SETSHADE_PRIM ();
6454   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
6455   T1_INTER_T0_USING_FACTOR (factor);
6456 }
6457
6458 static void cc_prim_sub_env_mul__t0_mul_enva_add_t1__add_env ()
6459 {
6460   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6461     GR_COMBINE_FACTOR_TEXTURE_RGB,
6462     GR_COMBINE_LOCAL_CONSTANT,
6463     GR_COMBINE_OTHER_ITERATED);
6464   CC_ENV ();
6465   SETSHADE_PRIM ();
6466   if (cmb.combine_ext)
6467   {
6468     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
6469       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6470       GR_CMBX_ZERO, 1,
6471       GR_CMBX_ZERO, 0);
6472     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6473       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
6474       GR_CMBX_DETAIL_FACTOR, 0,
6475       GR_CMBX_B, 0);
6476     cmb.tex |= 3;
6477     percent = (float)(rdp.env_color&0xFF) / 255.0f;
6478     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
6479   }
6480   else
6481   {
6482     T0_ADD_T1 ();
6483   }
6484 }
6485
6486 static void cc_prim_sub_env_mul__t1_mul_enva_add_t0__add_env ()
6487 {
6488   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6489     GR_COMBINE_FACTOR_TEXTURE_RGB,
6490     GR_COMBINE_LOCAL_CONSTANT,
6491     GR_COMBINE_OTHER_ITERATED);
6492   CC_ENV ();
6493   SETSHADE_PRIM ();
6494   T1_MUL_ENVA_ADD_T0 ();
6495 }
6496
6497 //Added by Gonetz
6498 static void cc_prim_sub_env_mul_primlod_add__t0_inter_t1_using_primlod ()
6499 {
6500   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6501     GR_COMBINE_FACTOR_ONE,
6502     GR_COMBINE_LOCAL_CONSTANT,
6503     GR_COMBINE_OTHER_TEXTURE);
6504   CC_PRIMSUBENV();
6505   CC_COLMULBYTE(cmb.ccolor, rdp.prim_lodfrac);
6506   T0_INTER_T1_USING_FACTOR (lod_frac);
6507 }
6508
6509 static void cc_prim_sub_env_mul__t0_inter_t1_using_primlod__add_env ()
6510 {
6511   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6512     GR_COMBINE_FACTOR_TEXTURE_RGB,
6513     GR_COMBINE_LOCAL_CONSTANT,
6514     GR_COMBINE_OTHER_ITERATED);
6515   CC_ENV ();
6516   SETSHADE_PRIM ();
6517   T0_INTER_T1_USING_FACTOR (lod_frac);
6518 }
6519
6520 static void cc_prim_sub_env_mul__t1_inter_t0_using_primlod__add_env ()
6521 {
6522   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6523     GR_COMBINE_FACTOR_TEXTURE_RGB,
6524     GR_COMBINE_LOCAL_CONSTANT,
6525     GR_COMBINE_OTHER_ITERATED);
6526   CC_ENV ();
6527   SETSHADE_PRIM ();
6528   T1_INTER_T0_USING_FACTOR (lod_frac);
6529 }
6530
6531 static void cc_prim_sub_env_mul__t1_mul_primlod_add_t0__add_env ()
6532 {
6533   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6534     GR_COMBINE_FACTOR_TEXTURE_RGB,
6535     GR_COMBINE_LOCAL_CONSTANT,
6536     GR_COMBINE_OTHER_ITERATED);
6537   CC_ENV ();
6538   SETSHADE_PRIM ();
6539   T1_MUL_PRIMLOD_ADD_T0 ();
6540 }
6541
6542 static void cc_prim_sub_env_mul__t1_sub_prim_mul_t0_add_t0__add_env ()
6543 {
6544   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6545     GR_COMBINE_FACTOR_TEXTURE_RGB,
6546     GR_COMBINE_LOCAL_CONSTANT,
6547     GR_COMBINE_OTHER_ITERATED);
6548   CC_ENV ();
6549   SETSHADE_PRIM ();
6550   if (cmb.combine_ext)
6551   {
6552     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6553       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
6554       GR_CMBX_ZERO, 1,
6555       GR_CMBX_ZERO, 0);
6556     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
6557       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
6558       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
6559       GR_CMBX_B, 0);
6560     cmb.tex_ccolor = rdp.prim_color;
6561     cmb.tex |= 3;
6562   }
6563   else
6564   {
6565     MOD_1 (TMOD_TEX_SUB_COL);
6566     MOD_1_COL (rdp.prim_color & 0xFFFFFF00);
6567     T0_MUL_T1_ADD_T0 ();
6568   }
6569 }
6570
6571 //Added by Gonetz
6572 static void cc__prim_sub_env_mul_prim_add_t0__mul_prim ()
6573 {
6574   if (cmb.combine_ext)
6575   {
6576     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6577       GR_CMBX_ITRGB, GR_FUNC_MODE_X,
6578       GR_CMBX_ZERO, 1,
6579       GR_CMBX_ZERO, 0);
6580     cmb.tex |= 1;
6581     SETSHADE_PRIMSUBENV ();
6582     SETSHADE_PRIM ();
6583     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
6584       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
6585       GR_CMBX_CONSTANT_COLOR, 0,
6586       GR_CMBX_ZERO, 0);
6587     CC_PRIM() ;
6588   }
6589   else
6590   {
6591     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6592       GR_COMBINE_FACTOR_ONE,
6593       GR_COMBINE_LOCAL_ITERATED,
6594       GR_COMBINE_OTHER_TEXTURE);
6595     SETSHADE_PRIMSUBENV ();
6596     SETSHADE_PRIM ();
6597     USE_T0 ();
6598   }
6599 }
6600
6601 //Added by Gonetz
6602 static void cc_prim_sub_env_mul_prim_add_env ()
6603 {
6604   if (cmb.combine_ext)
6605   {
6606     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
6607       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
6608       GR_CMBX_CONSTANT_COLOR, 0,
6609       GR_CMBX_B, 0);
6610     SETSHADE_ENV();
6611     CC_PRIM ();
6612   }
6613   else
6614   {
6615     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6616       GR_COMBINE_FACTOR_ONE,
6617       GR_COMBINE_LOCAL_CONSTANT,
6618       GR_COMBINE_OTHER_ITERATED);
6619     SETSHADE_PRIMSUBENV ();
6620     SETSHADE_PRIM ();
6621     CC_ENV ();
6622   }
6623 }
6624
6625 static void cc_prim_sub_env_mul_primlod_add_env ()
6626 {
6627   if (cmb.combine_ext)
6628   {
6629     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
6630       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
6631       GR_CMBX_ZERO, 0,
6632       GR_CMBX_B, 0);
6633     cmb.tex |= 1;
6634     CC_PRIMLOD ();
6635     cmb.tex_ccolor = cmb.ccolor;
6636     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
6637       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
6638       GR_CMBX_TEXTURE_RGB, 0,
6639       GR_CMBX_B, 0);
6640     SETSHADE_PRIM();
6641     CC_ENV ();
6642   }
6643   else
6644   {
6645     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6646       GR_COMBINE_FACTOR_ONE,
6647       GR_COMBINE_LOCAL_CONSTANT,
6648       GR_COMBINE_OTHER_ITERATED);
6649     SETSHADE_PRIMSUBENV ();
6650     SETSHADE_PRIMLOD ();
6651     CC_ENV ();
6652   }
6653 }
6654
6655 //Added by Gonetz
6656 static void cc_prim_sub_env_mul_enva_add_t0 ()
6657 {
6658   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6659     GR_COMBINE_FACTOR_ONE,
6660     GR_COMBINE_LOCAL_ITERATED,
6661     GR_COMBINE_OTHER_TEXTURE);
6662   SETSHADE_PRIMSUBENV ();
6663   SETSHADE_ENVA ();
6664   USE_T0 ();
6665 }
6666
6667 static void cc_prim_sub_env_mul_enva_add_env ()
6668 {
6669   if (cmb.combine_ext)
6670   {
6671     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
6672       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
6673       GR_CMBX_ZERO, 0,
6674       GR_CMBX_B, 0);
6675     cmb.tex |= 1;
6676     CC_ENVA ();
6677     cmb.tex_ccolor = cmb.ccolor;
6678     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
6679       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
6680       GR_CMBX_TEXTURE_RGB, 0,
6681       GR_CMBX_B, 0);
6682     SETSHADE_PRIM();
6683     CC_ENV ();
6684   }
6685   else
6686   {
6687     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6688       GR_COMBINE_FACTOR_ONE,
6689       GR_COMBINE_LOCAL_CONSTANT,
6690       GR_COMBINE_OTHER_ITERATED);
6691     SETSHADE_PRIMSUBENV ();
6692     SETSHADE_ENVA ();
6693     CC_ENV ();
6694   }
6695 }
6696
6697 //Added by Gonetz
6698 static void cc_prim_sub_shade_mul_t0_add_env ()
6699 {
6700   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6701     GR_COMBINE_FACTOR_TEXTURE_RGB,
6702     GR_COMBINE_LOCAL_CONSTANT,
6703     GR_COMBINE_OTHER_ITERATED);
6704   CC_ENV ();
6705   COLSUBSHADE_PRIM ();
6706   USE_T0 ();
6707 }
6708
6709 //Added by Gonetz
6710 static void cc_prim_sub_shade_mul__t1_sub_prim_mul_primlod_add_t0__add_shade ()
6711 {
6712   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6713     GR_COMBINE_FACTOR_TEXTURE_RGB,
6714     GR_COMBINE_LOCAL_ITERATED,
6715     GR_COMBINE_OTHER_CONSTANT);
6716   CC_PRIM ();
6717   T1_SUB_PRIM_MUL_PRIMLOD_ADD_T0 ();
6718 }
6719
6720 static void cc_prim_sub_shade_mul_t1a_add_shade ()
6721 {
6722   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6723     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6724     GR_COMBINE_LOCAL_ITERATED,
6725     GR_COMBINE_OTHER_CONSTANT);
6726   CC_PRIM ();
6727   USE_T1 ();
6728 }
6729
6730 //Added by Gonetz
6731 static void cc_prim_sub_shade_mul_t0_add_shade ()
6732 {
6733   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6734     GR_COMBINE_FACTOR_TEXTURE_RGB,
6735     GR_COMBINE_LOCAL_ITERATED,
6736     GR_COMBINE_OTHER_CONSTANT);
6737   CC_PRIM ();
6738   USE_T0 ();
6739 }
6740
6741 //Added by Gonetz
6742 static void cc_prim_sub_shade_mul_t1_add_shade ()
6743 {
6744   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6745     GR_COMBINE_FACTOR_TEXTURE_RGB,
6746     GR_COMBINE_LOCAL_ITERATED,
6747     GR_COMBINE_OTHER_CONSTANT);
6748   CC_PRIM ();
6749   USE_T1 ();
6750 }
6751
6752 //Added by Gonetz
6753 static void cc_prim_sub_shade_mul__t0a_mul_t1__add_shade ()
6754 {
6755   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6756     GR_COMBINE_FACTOR_TEXTURE_RGB,
6757     GR_COMBINE_LOCAL_ITERATED,
6758     GR_COMBINE_OTHER_CONSTANT);
6759   CC_PRIM ();
6760   T0A_MUL_T1();
6761 }
6762
6763 //Added by Gonetz
6764 static void cc_prim_sub_shade_mul__t0_inter_t1_using_enva__add_shade ()
6765 {
6766   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6767     GR_COMBINE_FACTOR_TEXTURE_RGB,
6768     GR_COMBINE_LOCAL_ITERATED,
6769     GR_COMBINE_OTHER_CONSTANT);
6770   CC_PRIM ();
6771   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
6772   T0_INTER_T1_USING_FACTOR (factor);
6773 }
6774
6775 //Added by Gonetz
6776 static void cc_prim_sub_shade_mul__t0_inter_t1_using_shadea__add_shade ()
6777 {
6778   if (cmb.combine_ext)
6779   {
6780     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
6781       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
6782       GR_CMBX_TEXTURE_RGB, 0,
6783       GR_CMBX_B, 0);
6784   }
6785   else
6786   {
6787     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6788       GR_COMBINE_FACTOR_TEXTURE_RGB,
6789       GR_COMBINE_LOCAL_ITERATED,
6790       GR_COMBINE_OTHER_CONSTANT);
6791   }
6792   CC_PRIM ();
6793   T0_INTER_T1_USING_SHADEA ();
6794 }
6795
6796 //Added by Gonetz
6797 static void cc_prim_sub_shade_mul_prima_add_shade ()
6798 {
6799   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6800     GR_COMBINE_FACTOR_OTHER_ALPHA,
6801     GR_COMBINE_LOCAL_ITERATED,
6802     GR_COMBINE_OTHER_CONSTANT);
6803   CC_PRIM ();
6804   CA_PRIM ();
6805 }
6806
6807 //Added by Gonetz
6808 static void cc_prim_sub_shade_mul_env_add_shade ()
6809 {
6810   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
6811     GR_COMBINE_FACTOR_ONE,
6812     GR_COMBINE_LOCAL_ITERATED,
6813     GR_COMBINE_OTHER_CONSTANT);
6814   CC_PRIMMULENV ();
6815   MULSHADE_1MENV ();
6816 }
6817
6818 //Added by Gonetz
6819 static void cc_prim_sub_shade_mul_shadea_add_shade ()
6820 {
6821   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6822     GR_COMBINE_FACTOR_LOCAL_ALPHA,
6823     GR_COMBINE_LOCAL_ITERATED,
6824     GR_COMBINE_OTHER_CONSTANT);
6825   CC_PRIM ();
6826 }
6827
6828 static void cc_env_sub_prim_mul_t0_add_prim ()
6829 {
6830   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6831     GR_COMBINE_FACTOR_TEXTURE_RGB,
6832     GR_COMBINE_LOCAL_ITERATED,
6833     GR_COMBINE_OTHER_CONSTANT);
6834   CC_ENV ();
6835   SETSHADE_PRIM ();
6836   USE_T0 ();
6837 }
6838
6839 static void cc_env_sub_prim_mul_t1_add_prim ()
6840 {
6841   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6842     GR_COMBINE_FACTOR_TEXTURE_RGB,
6843     GR_COMBINE_LOCAL_ITERATED,
6844     GR_COMBINE_OTHER_CONSTANT);
6845   CC_ENV ();
6846   SETSHADE_PRIM ();
6847   USE_T1 ();
6848 }
6849
6850 static void cc_env_sub_prim_mul_t0a_add_prim ()
6851 {
6852   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6853     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6854     GR_COMBINE_LOCAL_ITERATED,
6855     GR_COMBINE_OTHER_CONSTANT);
6856   CC_ENV ();
6857   SETSHADE_PRIM ();
6858   A_USE_T0 ();
6859 }
6860
6861 static void cc_env_sub_prim_mul_t1a_add_prim ()
6862 {
6863   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6864     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6865     GR_COMBINE_LOCAL_ITERATED,
6866     GR_COMBINE_OTHER_CONSTANT);
6867   CC_ENV ();
6868   SETSHADE_PRIM ();
6869   A_USE_T1 ();
6870 }
6871
6872 static void cc_env_sub_prim_mul__t0_add_t1__add_prim ()
6873 {
6874   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6875     GR_COMBINE_FACTOR_TEXTURE_RGB,
6876     GR_COMBINE_LOCAL_ITERATED,
6877     GR_COMBINE_OTHER_CONSTANT);
6878   CC_ENV ();
6879   SETSHADE_PRIM ();
6880   T0_ADD_T1 ();
6881 }
6882
6883 static void cc_env_sub_prim_mul__t0_mul_t1__add_prim () //Added by Gonetz
6884 {
6885   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6886     GR_COMBINE_FACTOR_TEXTURE_RGB,
6887     GR_COMBINE_LOCAL_ITERATED,
6888     GR_COMBINE_OTHER_CONSTANT);
6889   CC_ENV ();
6890   SETSHADE_PRIM ();
6891   T0_MUL_T1 ();
6892 }
6893
6894 static void cc_env_sub_prim_mul__t0t1a__add_prim () //Added by Gonetz
6895 {
6896   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6897     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6898     GR_COMBINE_LOCAL_ITERATED,
6899     GR_COMBINE_OTHER_CONSTANT);
6900   CC_ENV ();
6901   SETSHADE_PRIM ();
6902   A_T0_MUL_T1 ();
6903 }
6904
6905 static void cc_env_sub_prim_mul__t0_inter_t1_using_t1__add_prim () //Added by Gonetz
6906 {
6907   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6908     GR_COMBINE_FACTOR_TEXTURE_RGB,
6909     GR_COMBINE_LOCAL_ITERATED,
6910     GR_COMBINE_OTHER_CONSTANT);
6911   CC_ENV ();
6912   SETSHADE_PRIM ();
6913   T0_INTER_T1_USING_T1 ();
6914 }
6915
6916 static void cc_env_sub_prim_mul__t0_inter_t1_using_half__add_prim () //Added by Gonetz
6917 {
6918   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6919     GR_COMBINE_FACTOR_TEXTURE_RGB,
6920     GR_COMBINE_LOCAL_ITERATED,
6921     GR_COMBINE_OTHER_CONSTANT);
6922   CC_ENV ();
6923   SETSHADE_PRIM ();
6924   T0_INTER_T1_USING_FACTOR (0x7F);
6925 }
6926
6927 static void cc_env_sub_prim_mul__t1_inter_t0_using_t0__add_prim () //Added by Gonetz
6928 {
6929   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6930     GR_COMBINE_FACTOR_TEXTURE_RGB,
6931     GR_COMBINE_LOCAL_ITERATED,
6932     GR_COMBINE_OTHER_CONSTANT);
6933   CC_ENV ();
6934   SETSHADE_PRIM ();
6935   T1_INTER_T0_USING_T0 ();
6936 }
6937
6938 static void cc_env_sub_shade_mul__t0_mul_t1__add_shade () //Added by Gonetz
6939 {
6940   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
6941     GR_COMBINE_FACTOR_TEXTURE_RGB,
6942     GR_COMBINE_LOCAL_ITERATED,
6943     GR_COMBINE_OTHER_CONSTANT);
6944   CC_ENV ();
6945   T0_MUL_T1 ();
6946 }
6947
6948 static void cc_env_sub_prim_mul__t0a_mul_t1a__add_prim ()
6949 {
6950   CCMB (GR_COMBINE_FUNCTION_BLEND,
6951     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
6952     GR_COMBINE_LOCAL_CONSTANT,
6953     GR_COMBINE_OTHER_ITERATED);
6954   CC_PRIM ();
6955   SETSHADE_ENV ();
6956   A_T0_MUL_T1 ();
6957 }
6958
6959
6960 static void cc_env_sub_prim_mul_prima_add_prim ()  //Aded by Gonetz
6961 {
6962   // * not guaranteed to work if another iterated alpha is set
6963   CCMB (GR_COMBINE_FUNCTION_BLEND,
6964     GR_COMBINE_FACTOR_LOCAL_ALPHA,
6965     GR_COMBINE_LOCAL_CONSTANT,
6966     GR_COMBINE_OTHER_ITERATED);
6967   CC_PRIM ();
6968   CA_PRIM ();
6969   SETSHADE_ENV ();
6970 }
6971
6972 static void cc_env_sub_prim_mul_enva_add_prim ()  //Aded by Gonetz
6973 {
6974   // * not guaranteed to work if another iterated alpha is set
6975   CCMB (GR_COMBINE_FUNCTION_BLEND,
6976     GR_COMBINE_FACTOR_OTHER_ALPHA,
6977     GR_COMBINE_LOCAL_ITERATED,
6978     GR_COMBINE_OTHER_CONSTANT);
6979   CC_ENV ();
6980   CA_ENV ();
6981   SETSHADE_PRIM ();
6982 }
6983
6984 static void cc__t0_sub_env_mul_shade__sub_prim_mul_shade_add_prim ()
6985 {
6986   if (cmb.combine_ext)
6987   {
6988     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
6989       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
6990       GR_CMBX_ITRGB, 0,
6991       GR_CMBX_ZERO, 0);
6992     cmb.tex_ccolor = rdp.env_color;
6993     cmb.tex |= 1;
6994     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
6995       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
6996       GR_CMBX_ITRGB, 0,
6997       GR_CMBX_B, 0);
6998     CC_PRIM ();
6999   }
7000   else
7001   {
7002     cc_t0_mul_shade ();
7003   }
7004 }
7005
7006 static void cc_env_sub_prim_mul_shade_add_prim () //Added by Gonetz
7007 {
7008   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7009     GR_COMBINE_FACTOR_ONE,
7010     GR_COMBINE_LOCAL_CONSTANT,
7011     GR_COMBINE_OTHER_ITERATED);
7012   CC_PRIM ();
7013   MULSHADE_ENVSUBPRIM ();
7014 }
7015
7016 static void cc_env_sub_prim_mul_shadea_add_prim () //Added by Gonetz
7017 {
7018   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7019     GR_COMBINE_FACTOR_ONE,
7020     GR_COMBINE_LOCAL_CONSTANT,
7021     GR_COMBINE_OTHER_ITERATED);
7022   CC_PRIM ();
7023   SETSHADE_ENVSUBPRIM ();
7024   MULSHADE_SHADEA ();
7025 }
7026
7027 static void cc_env_sub_prim_mul__t0_inter_t1_using_prima__add_prim ()
7028 {
7029   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7030     GR_COMBINE_FACTOR_TEXTURE_RGB,
7031     GR_COMBINE_LOCAL_ITERATED,
7032     GR_COMBINE_OTHER_CONSTANT);
7033   CC_ENV ();
7034   SETSHADE_PRIM ();
7035   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
7036   T0_INTER_T1_USING_FACTOR (factor);
7037 }
7038
7039 static void cc_env_sub_prim_mul__t0_inter_t1_using_primlod__add_prim ()
7040 {
7041   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7042     GR_COMBINE_FACTOR_TEXTURE_RGB,
7043     GR_COMBINE_LOCAL_ITERATED,
7044     GR_COMBINE_OTHER_CONSTANT);
7045   CC_ENV ();
7046   SETSHADE_PRIM ();
7047   T0_INTER_T1_USING_FACTOR (lod_frac);
7048 }
7049
7050 static void cc_env_sub_primshade_mul_t0_add_primshade ()
7051 {
7052   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7053     GR_COMBINE_FACTOR_TEXTURE_RGB,
7054     GR_COMBINE_LOCAL_ITERATED,
7055     GR_COMBINE_OTHER_CONSTANT);
7056   CC_ENV ();
7057   MULSHADE_PRIM ();
7058   USE_T0 ();
7059 }
7060
7061 static void cc_env_sub_primshade_mul_t1_add_primshade ()
7062 {
7063   //  cc_prim_mul_shade();
7064   //  return;
7065   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7066     GR_COMBINE_FACTOR_TEXTURE_RGB,
7067     GR_COMBINE_LOCAL_ITERATED,
7068     GR_COMBINE_OTHER_CONSTANT);
7069   CC_ENV ();
7070   MULSHADE_PRIM ();
7071   USE_T0 ();
7072 }
7073
7074 static void cc_env_sub_shade_mul_t0_add_shade ()
7075 {
7076   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7077     GR_COMBINE_FACTOR_TEXTURE_RGB,
7078     GR_COMBINE_LOCAL_ITERATED,
7079     GR_COMBINE_OTHER_CONSTANT);
7080   CC_ENV ();
7081   USE_T0 ();
7082 }
7083
7084 static void cc__env_sub_shade_mul_t0_add_shade__mul_prim ()
7085 {
7086   if (cmb.combine_ext)
7087   {
7088     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
7089       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
7090       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
7091       GR_CMBX_B, 0);
7092     cmb.tex |= 1;
7093     cmb.tex_ccolor = rdp.prim_color;
7094     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7095       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
7096       GR_CMBX_CONSTANT_COLOR, 0,
7097       GR_CMBX_ZERO, 0);
7098     CC_PRIM() ;
7099   }
7100   else
7101   {
7102     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7103       GR_COMBINE_FACTOR_TEXTURE_RGB,
7104       GR_COMBINE_LOCAL_ITERATED,
7105       GR_COMBINE_OTHER_CONSTANT);
7106     CC_ENV ();
7107     MULSHADE_PRIM ();
7108     USE_T0 ();
7109   }
7110 }
7111
7112 static void cc_env_sub_shade_mul_t1_add_shade ()
7113 {
7114   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7115     GR_COMBINE_FACTOR_TEXTURE_RGB,
7116     GR_COMBINE_LOCAL_ITERATED,
7117     GR_COMBINE_OTHER_CONSTANT);
7118   CC_ENV ();
7119   USE_T1 ();
7120 }
7121
7122 //Added by Gonetz
7123 static void cc_env_sub_shade_mul__t0_inter_t1_using_shadea__add_shade ()
7124 {
7125   if (cmb.combine_ext)
7126   {
7127     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
7128       GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
7129       GR_CMBX_TEXTURE_RGB, 0,
7130       GR_CMBX_B, 0);
7131   }
7132   else
7133   {
7134     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7135       GR_COMBINE_FACTOR_TEXTURE_RGB,
7136       GR_COMBINE_LOCAL_ITERATED,
7137       GR_COMBINE_OTHER_CONSTANT);
7138   }
7139   CC_ENV ();
7140   T0_INTER_T1_USING_SHADEA ();
7141 }
7142
7143 //Added by Gonetz
7144 static void cc_env_sub_shade_mul_enva_add_shade ()
7145 {
7146   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7147     GR_COMBINE_FACTOR_OTHER_ALPHA,
7148     GR_COMBINE_LOCAL_ITERATED,
7149     GR_COMBINE_OTHER_CONSTANT);
7150   cmb.ccolor = rdp.env_color;
7151 }
7152
7153 //Added by Gonetz
7154 static void cc_shade_sub_t0_mul_shadea_add_t0 ()
7155 {
7156   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7157     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA,
7158     GR_COMBINE_LOCAL_ITERATED,
7159     GR_COMBINE_OTHER_TEXTURE);
7160   MULSHADE_SHADEA ();
7161   USE_T0 ();
7162 }
7163
7164
7165 static void cc__t0_mul_shade_mul_shadea__add__t1_mul_one_sub_shadea ()
7166 {
7167   // (t0-0)*shade+0, (cmb-t0)*shadea+t0
7168   if (cmb.combine_ext)
7169   {
7170     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
7171       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7172       GR_CMBX_ITALPHA, 1,
7173       GR_CMBX_ZERO, 0);
7174     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
7175       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7176       GR_CMBX_ITRGB, 0,
7177       GR_CMBX_B, 0);
7178     MULSHADE_SHADEA ();
7179     cmb.tex |= 3;
7180     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
7181       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
7182       GR_CMBX_ZERO, 0,
7183       GR_CMBX_TEXTURE_RGB, 0);
7184   }
7185   else
7186   {
7187     cc_t0_mul_shade ();
7188   }
7189 }
7190
7191 static void cc_shade_sub_prim_mul__t0_inter_t1_using_primlod__add_prim ()
7192 {
7193   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7194     GR_COMBINE_FACTOR_TEXTURE_RGB,
7195     GR_COMBINE_LOCAL_CONSTANT,
7196     GR_COMBINE_OTHER_ITERATED);
7197   CC_PRIM ();
7198   T0_INTER_T1_USING_FACTOR (lod_frac);
7199 }
7200
7201 static void cc_shade_sub_prim_mul_t0_add_prim ()
7202 {
7203   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7204     GR_COMBINE_FACTOR_TEXTURE_RGB,
7205     GR_COMBINE_LOCAL_CONSTANT,
7206     GR_COMBINE_OTHER_ITERATED);
7207   CC_PRIM ();
7208   USE_T0 ();
7209 }
7210
7211 //Added by Gonetz
7212 static void cc_shade_sub_prim_mul_t1_add_prim ()
7213 {
7214   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7215     GR_COMBINE_FACTOR_TEXTURE_RGB,
7216     GR_COMBINE_LOCAL_CONSTANT,
7217     GR_COMBINE_OTHER_ITERATED);
7218   CC_PRIM ();
7219   USE_T1 ();
7220 }
7221
7222 //Added by Gonetz
7223 static void cc_shade_sub_env_mul__t0_mul_t1__add__t0_mul_t1 ()
7224 {
7225   if (cmb.combine_ext)
7226   {
7227     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
7228       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
7229       GR_CMBX_TEXTURE_RGB, 0,
7230       GR_CMBX_TEXTURE_RGB, 0);
7231     CC_ENV ();
7232     T0_MUL_T1 ();
7233   }
7234   else
7235   {
7236     cc_t0_mul_t1 ();
7237   }
7238 }
7239
7240 //Added by Gonetz
7241 static void cc_shade_sub_env_mul_t0_add_prim ()
7242 {
7243   if (rdp.cur_image && (rdp.cur_image->format != 0))
7244   {
7245     cc_prim ();
7246     return;
7247   }
7248
7249   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7250     GR_COMBINE_FACTOR_TEXTURE_RGB,
7251     GR_COMBINE_LOCAL_CONSTANT,
7252     GR_COMBINE_OTHER_ITERATED);
7253   CC_PRIM ();
7254   SUBSHADE_ENV ();
7255   USE_T0 ();
7256 }
7257
7258 //Added by Gonetz
7259 static void cc_shade_sub_env_mul__t0_inter_t1_using_primlod__add_prim ()
7260 {
7261   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7262     GR_COMBINE_FACTOR_TEXTURE_RGB,
7263     GR_COMBINE_LOCAL_CONSTANT,
7264     GR_COMBINE_OTHER_ITERATED);
7265   CC_PRIM ();
7266   SUBSHADE_ENV ();
7267   T0_INTER_T1_USING_FACTOR (lod_frac);
7268 }
7269
7270 //Added by Gonetz
7271 static void cc_shade_sub_env_mul__t0_inter_t1_using_primlod__add_env ()
7272 {
7273   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7274     GR_COMBINE_FACTOR_TEXTURE_RGB,
7275     GR_COMBINE_LOCAL_CONSTANT,
7276     GR_COMBINE_OTHER_ITERATED);
7277   CC_ENV ();
7278   T0_INTER_T1_USING_FACTOR (lod_frac);
7279 }
7280
7281 //Added by Gonetz
7282 static void cc_shade_sub_env_mul__t0_mul_t1__add_env ()
7283 {
7284   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7285     GR_COMBINE_FACTOR_TEXTURE_RGB,
7286     GR_COMBINE_LOCAL_CONSTANT,
7287     GR_COMBINE_OTHER_ITERATED);
7288   CC_ENV ();
7289   T0_MUL_T1 ();
7290 }
7291
7292 //Added by Gonetz
7293 static void cc_shade_sub_env_mul__t1_sub_prim_mul_primlod_add_t0__add_env ()
7294 {
7295   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7296     GR_COMBINE_FACTOR_TEXTURE_RGB,
7297     GR_COMBINE_LOCAL_CONSTANT,
7298     GR_COMBINE_OTHER_ITERATED);
7299   CC_ENV ();
7300   SETSHADE_ENV ();
7301   T1_SUB_PRIM_MUL_PRIMLOD_ADD_T0 ();
7302 }
7303
7304 //Added by Gonetz
7305 static void cc_shade_sub_env_mul_t0_add_env ()
7306 {
7307   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7308     GR_COMBINE_FACTOR_TEXTURE_RGB,
7309     GR_COMBINE_LOCAL_CONSTANT,
7310     GR_COMBINE_OTHER_ITERATED);
7311   CC_ENV ();
7312   USE_T0 ();
7313 }
7314
7315 //Added by Gonetz
7316 static void cc_shade_sub_env_mul_t0_mul_prim_add_prim_mul_env ()
7317 {
7318   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7319     GR_COMBINE_FACTOR_TEXTURE_RGB,
7320     GR_COMBINE_LOCAL_CONSTANT,
7321     GR_COMBINE_OTHER_ITERATED);
7322   CC_PRIMMULENV ();
7323   SUBSHADE_ENV ();
7324   MULSHADE_PRIM()
7325     USE_T0 ();
7326 }
7327
7328 //Added by Gonetz
7329 static void cc_shade_sub_env_mul_t1_add_env ()
7330 {
7331   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
7332     GR_COMBINE_FACTOR_TEXTURE_RGB,
7333     GR_COMBINE_LOCAL_CONSTANT,
7334     GR_COMBINE_OTHER_ITERATED);
7335   CC_ENV ();
7336   USE_T1 ();
7337 }
7338
7339 //Added by Gonetz
7340 static void cc_shade_sub_env_mul_prim_add_t0 ()
7341 {
7342   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7343     GR_COMBINE_FACTOR_ONE,
7344     GR_COMBINE_LOCAL_ITERATED,
7345     GR_COMBINE_OTHER_TEXTURE);
7346   SUBSHADE_ENV ();
7347   MULSHADE_PRIM ();
7348   USE_T0 ();
7349 }
7350
7351 static void cc__t0_add_prim_mul_shade__mul_shade_add_env ()
7352 {
7353   if (!cmb.combine_ext)
7354   {
7355     cc_shade_sub_env_mul_prim_add_t0 ();
7356     return;
7357   }
7358   T1CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
7359     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7360     GR_CMBX_ITRGB, 0,
7361     GR_CMBX_B, 0);
7362   T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
7363     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7364     GR_CMBX_ITRGB, 0,
7365     GR_CMBX_B, 0);
7366   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7367     GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_ZERO,
7368     GR_CMBX_ITRGB, 0,
7369     GR_CMBX_B, 0);
7370   cmb.tex_ccolor = rdp.prim_color;
7371   CC_ENV ();
7372   cmb.tex |= 1;
7373 }
7374
7375 static void cc__t0_add_prim_mul_shade__mul_shade ()
7376 {
7377   if (!cmb.combine_ext)
7378   {
7379     cc_shade_sub_env_mul_prim_add_t0 ();
7380     return;
7381   }
7382   T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
7383     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7384     GR_CMBX_ITRGB, 0,
7385     GR_CMBX_B, 0);
7386   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7387     GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
7388     GR_CMBX_ITRGB, 0,
7389     GR_CMBX_ZERO, 0);
7390   cmb.tex_ccolor = rdp.prim_color;
7391   cmb.tex |= 1;
7392 }
7393
7394 //Added by Gonetz
7395 static void cc_shade_sub_env_mul_prim_add_env ()
7396 {
7397   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7398     GR_COMBINE_FACTOR_ONE,
7399     GR_COMBINE_LOCAL_CONSTANT,
7400     GR_COMBINE_OTHER_ITERATED);
7401   SUBSHADE_ENV ();
7402   MULSHADE_PRIM ();
7403   CC_ENV ();
7404 }
7405
7406 //Added by Gonetz
7407 static void cc_shade_sub_env_mul_prima_add_prim ()
7408 {
7409   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7410     GR_COMBINE_FACTOR_ONE,
7411     GR_COMBINE_LOCAL_CONSTANT,
7412     GR_COMBINE_OTHER_ITERATED);
7413   SUBSHADE_ENV ();
7414   MULSHADE_PRIMA ();
7415   CC_PRIM ();
7416 }
7417
7418 static void cc_shade_sub_env_mul_k5_add_prim ()
7419 {
7420   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7421     GR_COMBINE_FACTOR_ONE,
7422     GR_COMBINE_LOCAL_CONSTANT,
7423     GR_COMBINE_OTHER_ITERATED);
7424   SUBSHADE_ENV ();
7425   wxUint32 temp = rdp.prim_color;
7426   rdp.prim_color = rdp.K5;
7427   MULSHADE_PRIMA ();
7428   rdp.prim_color = temp;
7429   CC_PRIM ();
7430 }
7431
7432 // ** A inter B using C **
7433 static void cc_t0_inter_t1_using_t1a ()
7434 {
7435   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7436     GR_COMBINE_FACTOR_ONE,
7437     GR_COMBINE_LOCAL_NONE,
7438     GR_COMBINE_OTHER_TEXTURE);
7439   T0_INTER_T1_USING_T1A ();
7440 }
7441
7442 static void cc_t0_inter_t1_using_prima ()
7443 {
7444   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7445     GR_COMBINE_FACTOR_ONE,
7446     GR_COMBINE_LOCAL_NONE,
7447     GR_COMBINE_OTHER_TEXTURE);
7448   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
7449   T0_INTER_T1_USING_FACTOR (factor);
7450 }
7451
7452 static void cc_t1_inter_t0_using_prima ()
7453 {
7454   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7455     GR_COMBINE_FACTOR_ONE,
7456     GR_COMBINE_LOCAL_NONE,
7457     GR_COMBINE_OTHER_TEXTURE);
7458   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
7459   T1_INTER_T0_USING_FACTOR (factor);
7460 }
7461
7462 static void cc_t1_inter_t0_using_prim ()
7463 {
7464   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7465     GR_COMBINE_FACTOR_ONE,
7466     GR_COMBINE_LOCAL_NONE,
7467     GR_COMBINE_OTHER_TEXTURE);
7468   T1_INTER_T0_USING_PRIM ();
7469 }
7470
7471 static void cc_t0_inter_t1_using_env ()
7472 {
7473   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7474     GR_COMBINE_FACTOR_ONE,
7475     GR_COMBINE_LOCAL_NONE,
7476     GR_COMBINE_OTHER_TEXTURE);
7477   T0_INTER_T1_USING_ENV ();
7478 }
7479
7480 static void cc_t0_inter_t1_using_enva ()
7481 {
7482   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7483     GR_COMBINE_FACTOR_ONE,
7484     GR_COMBINE_LOCAL_NONE,
7485     GR_COMBINE_OTHER_TEXTURE);
7486   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
7487   T0_INTER_T1_USING_FACTOR (factor);
7488 }
7489
7490 static void cc__t0_inter_t1_using_prim__inter_env_using_enva ()
7491 {
7492   // (t1-t0)*prim+t0, (env-cmb)*env_a+cmb
7493   if (!cmb.combine_ext)
7494   {
7495     cc_t0_inter_t1_using_prima ();
7496     return;
7497   }
7498   T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7499     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7500     GR_CMBX_ZERO, 0,
7501     GR_CMBX_B, 0);
7502   T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
7503     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
7504     GR_CMBX_TMU_CCOLOR, 0,
7505     GR_CMBX_B, 0);
7506   cmb.tex_ccolor = rdp.prim_color;
7507   cmb.tex |= 3;
7508   CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
7509     GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
7510     GR_CMBX_CONSTANT_ALPHA, 0,
7511     GR_CMBX_B, 0);
7512   cmb.ccolor = rdp.env_color;
7513 }
7514
7515 static void cc__t0_inter_t1_using_shade__inter_env_using_enva ()
7516 {
7517   // (t1-t0)*shade+t0, (env-cmb)*env_a+cmb
7518   if (!cmb.combine_ext)
7519   {
7520     cc_t0_inter_t1_using_enva ();
7521     return;
7522   }
7523   T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7524     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7525     GR_CMBX_ZERO, 0,
7526     GR_CMBX_B, 0);
7527   T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
7528     GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
7529     GR_CMBX_ITRGB, 0,
7530     GR_CMBX_B, 0);
7531   cmb.tex |= 3;
7532   CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
7533     GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
7534     GR_CMBX_CONSTANT_ALPHA, 0,
7535     GR_CMBX_B, 0);
7536   cmb.ccolor = rdp.env_color;
7537 }
7538
7539 //Added by Gonetz
7540 static void cc_t0_inter_t1_using_shade ()
7541 {
7542   if (cmb.combine_ext)
7543   {
7544     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7545       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7546       GR_CMBX_ZERO, 0,
7547       GR_CMBX_B, 0);
7548     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
7549       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
7550       GR_CMBX_ITRGB, 0,
7551       GR_CMBX_B, 0);
7552     cmb.tex |= 3;
7553     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7554       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
7555       GR_CMBX_ZERO, 1,
7556       GR_CMBX_ZERO, 0);
7557   }
7558   else
7559   {
7560     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7561       GR_COMBINE_FACTOR_ONE,
7562       GR_COMBINE_LOCAL_NONE,
7563       GR_COMBINE_OTHER_TEXTURE);
7564     T0_INTER_T1_USING_FACTOR (0x7F);
7565   }
7566 }
7567
7568 //Added by Gonetz
7569 static void cc_t1_inter_t0_using_shade ()
7570 {
7571   if (cmb.combine_ext)
7572   {
7573     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7574       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7575       GR_CMBX_ZERO, 0,
7576       GR_CMBX_B, 0);
7577     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
7578       GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
7579       GR_CMBX_ITRGB, 0,
7580       GR_CMBX_B, 0);
7581     cmb.tex |= 3;
7582     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7583       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
7584       GR_CMBX_ZERO, 1,
7585       GR_CMBX_ZERO, 0);
7586   }
7587   else
7588   {
7589     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7590       GR_COMBINE_FACTOR_ONE,
7591       GR_COMBINE_LOCAL_NONE,
7592       GR_COMBINE_OTHER_TEXTURE);
7593     T0_INTER_T1_USING_FACTOR (0x7F);
7594   }
7595 }
7596
7597 //Added by Gonetz
7598 static void cc_t1_inter_t0_using_shadea ()
7599 {
7600   if (cmb.combine_ext)
7601   {
7602     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7603       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
7604       GR_CMBX_ZERO, 1,
7605       GR_CMBX_ZERO, 0);
7606   }
7607   else
7608   {
7609     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7610       GR_COMBINE_FACTOR_ONE,
7611       GR_COMBINE_LOCAL_NONE,
7612       GR_COMBINE_OTHER_TEXTURE);
7613   }
7614   T1_INTER_T0_USING_SHADEA ();
7615 }
7616
7617 //Added by Gonetz
7618 static void cc_t0_inter_t1_using_primlod ()
7619 {
7620   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7621     GR_COMBINE_FACTOR_ONE,
7622     GR_COMBINE_LOCAL_NONE,
7623     GR_COMBINE_OTHER_TEXTURE);
7624   T0_INTER_T1_USING_FACTOR (lod_frac);
7625 }
7626
7627 //Added by Gonetz
7628 static void cc_t1_inter_t0_using_primlod ()
7629 {
7630   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7631     GR_COMBINE_FACTOR_ONE,
7632     GR_COMBINE_LOCAL_NONE,
7633     GR_COMBINE_OTHER_TEXTURE);
7634   T1_INTER_T0_USING_FACTOR (lod_frac);
7635 }
7636
7637 //Added by Gonetz
7638 static void cc_t1_inter_t0_using_t0 ()
7639 {
7640   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7641     GR_COMBINE_FACTOR_ONE,
7642     GR_COMBINE_LOCAL_NONE,
7643     GR_COMBINE_OTHER_TEXTURE);
7644   T1_INTER_T0_USING_T0 ();
7645 }
7646
7647 //Added by Gonetz
7648 static void cc_t0_inter_t1_using_k5 ()
7649 {
7650   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7651     GR_COMBINE_FACTOR_ONE,
7652     GR_COMBINE_LOCAL_NONE,
7653     GR_COMBINE_OTHER_TEXTURE);
7654   T0_INTER_T1_USING_FACTOR (rdp.K5);
7655 }
7656
7657 static void cc_t0_inter_env_using_prim ()
7658 {
7659   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7660     GR_COMBINE_FACTOR_ONE,
7661     GR_COMBINE_LOCAL_NONE,
7662     GR_COMBINE_OTHER_TEXTURE);
7663   USE_T0 ();
7664
7665   MOD_0 (TMOD_TEX_INTER_COL_USING_COL1);
7666   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
7667   MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
7668 }
7669
7670 //Added by Gonetz
7671 static void cc_t0_inter_prim_using_primlod ()
7672 {
7673   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7674     GR_COMBINE_FACTOR_ONE,
7675     GR_COMBINE_LOCAL_NONE,
7676     GR_COMBINE_OTHER_TEXTURE);
7677   USE_T0 ();
7678
7679   MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
7680   MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
7681   MOD_0_FAC (lod_frac & 0xFF);
7682 }
7683
7684 static void cc_t0_inter_shade_using_t0a ()
7685 {
7686   if (cmb.combine_ext)
7687   {
7688     CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
7689       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
7690       GR_CMBX_TEXTURE_ALPHA, 0,
7691       GR_CMBX_B, 0);
7692     USE_T0();
7693     A_USE_T0();
7694   }
7695   else
7696   {
7697     //(shade-t0)*t0a+t0 = t0*(1-t0a)+shade*t0a
7698     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7699       GR_COMBINE_FACTOR_ONE,
7700       GR_COMBINE_LOCAL_ITERATED,
7701       GR_COMBINE_OTHER_TEXTURE);
7702     rdp.best_tex = 1;
7703     cmb.tex = 1;
7704     cmb.tmu0_func = GR_COMBINE_FUNCTION_BLEND_LOCAL;
7705     cmb.tmu0_fac = GR_COMBINE_FACTOR_LOCAL_ALPHA;
7706   }
7707 }
7708
7709 static void cc_t0_inter_shade_using_primlod ()
7710 {
7711   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7712     GR_COMBINE_FACTOR_TEXTURE_RGB,
7713     GR_COMBINE_LOCAL_ITERATED,
7714     GR_COMBINE_OTHER_CONSTANT);
7715   CC_PRIMLOD();
7716   cmb.ccolor=(~cmb.ccolor)&0xFFFFFF00;
7717   MULSHADE_PRIMLOD ();
7718   USE_T0 ();
7719   //(shade-t0)*primlod+t0 = t0*(1-primlod)+shade*primlod
7720 }
7721
7722 //Added by Gonetz
7723 static void cc__env_inter_t0_using_primlod__mul_prim ()
7724 {
7725   //((t0-env)*primlod+env)*prim = t0*prim*primlod+env*prim*(1-primlod);
7726   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7727     GR_COMBINE_FACTOR_TEXTURE_RGB,
7728     GR_COMBINE_LOCAL_ITERATED,
7729     GR_COMBINE_OTHER_CONSTANT);
7730   CC_PRIM ();
7731   cmb.ccolor = ((((cmb.ccolor & 0xFF000000) >> 24) * (lod_frac & 0xFF))<<24) | ((((cmb.ccolor & 0x00FF0000) >> 16) * (lod_frac & 0xFF))<<16) | ((((cmb.ccolor & 0x0000FF00) >> 8) * (lod_frac & 0xFF))<<8);
7732   SETSHADE_PRIM ();
7733   SETSHADE_ENV ();
7734   SETSHADE_1MPRIMLOD ();
7735   USE_T0 ();
7736 }
7737
7738 //Added by Gonetz
7739 static void cc__env_inter_t0_using_shadea__mul_shade ()
7740 {
7741   //((t0-env)*shadea+env)*shade
7742   if (!cmb.combine_ext)
7743   {
7744     cc_t0_mul_shade ();
7745     return;
7746   }
7747   T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
7748     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
7749     GR_CMBX_ITALPHA, 0,
7750     GR_CMBX_B, 0);
7751   cmb.tex_ccolor = rdp.env_color;
7752   cmb.tex |= 1;
7753   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7754     GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
7755     GR_CMBX_ITRGB, 0,
7756     GR_CMBX_ZERO, 0);
7757 }
7758
7759 //Added by Gonetz
7760 static void cc_env_inter_prim_using_primlod ()
7761 {
7762   if (rdp.prim_color&0xFFFFFF00)
7763   {
7764     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7765       GR_COMBINE_FACTOR_ONE,
7766       GR_COMBINE_LOCAL_CONSTANT,
7767       GR_COMBINE_OTHER_ITERATED);
7768     SETSHADE_PRIMSUBENV ();
7769     SETSHADE_PRIMLOD ();
7770     CC_ENV ();
7771   }
7772   else
7773   {
7774     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
7775       GR_COMBINE_FACTOR_ONE,
7776       GR_COMBINE_LOCAL_ITERATED,
7777       GR_COMBINE_OTHER_CONSTANT);
7778     SETSHADE_ENV ();
7779     SETSHADE_PRIMLOD ();
7780     CC_ENV ();
7781   }
7782 }
7783
7784 static void cc_prim_inter__t0_mul_t1_add_env__using_shadea ()
7785 {
7786   if (cmb.combine_ext)
7787   {
7788     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7789       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7790       GR_CMBX_ZERO, 0,
7791       GR_CMBX_B, 0);
7792     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
7793       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
7794       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
7795       GR_CMBX_B, 0);
7796     cmb.tex_ccolor = rdp.env_color;
7797     cmb.tex |= 3;
7798   }
7799   else
7800   {
7801     T0_MUL_T1 ();
7802   }
7803   // * not guaranteed to work if another iterated alpha is set
7804   CCMB (GR_COMBINE_FUNCTION_BLEND,
7805     GR_COMBINE_FACTOR_LOCAL_ALPHA,
7806     GR_COMBINE_LOCAL_ITERATED,
7807     GR_COMBINE_OTHER_TEXTURE);
7808   SETSHADE_PRIM ();
7809 }
7810
7811 static void cc_env_inter__prim_inter_shade_using_t0__using_shadea ()
7812 {
7813   if (!cmb.combine_ext)
7814   {
7815     cc_shade_sub_prim_mul_t0_add_prim ();
7816     return;
7817   }
7818   T0CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
7819     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
7820     GR_CMBX_LOCAL_TEXTURE_RGB, 0,
7821     GR_CMBX_B, 0);
7822   cmb.tex_ccolor = rdp.prim_color;
7823   cmb.tex |= 1;
7824   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7825     GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_NEGATIVE_X,
7826     GR_CMBX_ITALPHA, 0,
7827     GR_CMBX_B, 0);
7828   CC_ENV ();
7829 }
7830
7831 static void cc_shade_inter__prim_inter_shade_using_t0__using_shadea ()
7832 {
7833   if (!cmb.combine_ext)
7834   {
7835     cc_shade_sub_prim_mul_t0_add_prim ();
7836     return;
7837   }
7838   T0CCMBEXT(GR_CMBX_ITRGB, GR_FUNC_MODE_X,
7839     GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
7840     GR_CMBX_LOCAL_TEXTURE_RGB, 0,
7841     GR_CMBX_B, 0);
7842   cmb.tex_ccolor = rdp.prim_color;
7843   cmb.tex |= 1;
7844   CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7845     GR_CMBX_ITRGB, GR_FUNC_MODE_NEGATIVE_X,
7846     GR_CMBX_ITALPHA, 0,
7847     GR_CMBX_B, 0);
7848 }
7849
7850 // ** (A-B)*C+D*E **
7851 static void cc_one_sub_env_mul_prim_add__t0_mul_env () //Aded by Gonetz
7852 {
7853   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7854     GR_COMBINE_FACTOR_TEXTURE_RGB,
7855     GR_COMBINE_LOCAL_ITERATED,
7856     GR_COMBINE_OTHER_CONSTANT);
7857   CC_ENV ();
7858   SETSHADE_1MENV ();
7859   SETSHADE_PRIM ();
7860   USE_T0 ();
7861 }
7862
7863 // ** ((A-B)*C+D)*E **
7864 static void cc_t0_sub_env_mul_prim_mul_shade_add_prim_mul_shade () //Aded by Gonetz
7865 {
7866   //(t0-env)*shade+shade, (cmb-0)*prim+0
7867   if (cmb.combine_ext)
7868   {
7869     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
7870       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
7871       GR_CMBX_ITRGB, 0,
7872       GR_CMBX_ZERO, 0);
7873     cmb.tex_ccolor = rdp.env_color;
7874     cmb.tex |= 1;
7875     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7876       GR_CMBX_ITRGB, GR_FUNC_MODE_X,
7877       GR_CMBX_CONSTANT_COLOR, 0,
7878       GR_CMBX_ZERO, 0);
7879     CC_PRIM ();
7880   }
7881   else
7882   {
7883     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
7884       GR_COMBINE_FACTOR_LOCAL,
7885       GR_COMBINE_LOCAL_ITERATED,
7886       GR_COMBINE_OTHER_TEXTURE);
7887     if (rdp.env_color & 0xFFFFFF00)
7888     {
7889       MOD_0 (TMOD_TEX_SUB_COL);
7890       MOD_0_COL (rdp.env_color & 0xFFFFFF00);
7891     }
7892     MULSHADE_PRIM ();
7893     USE_T0 ();
7894   }
7895 }
7896
7897 static void cc__t1_sub_prim_mul_t0_add_env__mul_shade () //Aded by Gonetz
7898 {
7899   // (t1-prim)*t0+env, (cmb-0)*shade+0
7900   if (cmb.combine_ext)
7901   {
7902     T1CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7903       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
7904       GR_CMBX_ZERO, 0,
7905       GR_CMBX_B, 0);
7906     T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_X,
7907       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_NEGATIVE_X,
7908       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
7909       GR_CMBX_ZERO, 0);
7910     cmb.tex_ccolor = rdp.prim_color;
7911     cmb.tex |= 3;
7912     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
7913       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
7914       GR_CMBX_ITRGB, 0,
7915       GR_CMBX_ZERO, 0);
7916     CC_ENV ();
7917   }
7918   else
7919   {
7920     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7921       GR_COMBINE_FACTOR_LOCAL,
7922       GR_COMBINE_LOCAL_ITERATED,
7923       GR_COMBINE_OTHER_TEXTURE);
7924     if (rdp.prim_color & 0xFFFFFF00)
7925     {
7926       MOD_1 (TMOD_TEX_SUB_COL);
7927       MOD_1_COL (rdp.prim_color & 0xFFFFFF00);
7928     }
7929     T0_MUL_T1 ();
7930   }
7931 }
7932
7933 // ** (A inter B using C) * D **
7934 //Added by Gonetz
7935 static void cc__t0_inter_t1_using_prima__mul_prim ()
7936 {
7937   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7938     GR_COMBINE_FACTOR_LOCAL,
7939     GR_COMBINE_LOCAL_CONSTANT,
7940     GR_COMBINE_OTHER_TEXTURE);
7941   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
7942   T0_INTER_T1_USING_FACTOR (factor);
7943   CC_PRIM ();
7944 }
7945
7946 //Added by Gonetz
7947 static void cc__t1_inter_t0_using_prima__mul_prim ()
7948 {
7949   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7950     GR_COMBINE_FACTOR_LOCAL,
7951     GR_COMBINE_LOCAL_CONSTANT,
7952     GR_COMBINE_OTHER_TEXTURE);
7953   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
7954   T1_INTER_T0_USING_FACTOR (factor);
7955   CC_PRIM ();
7956 }
7957
7958 //Added by Gonetz
7959 static void cc__t0_inter_t1_using_prim__mul_shade ()
7960 {
7961   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7962     GR_COMBINE_FACTOR_LOCAL,
7963     GR_COMBINE_LOCAL_ITERATED,
7964     GR_COMBINE_OTHER_TEXTURE);
7965   T0_INTER_T1_USING_PRIM ();
7966 }
7967
7968 //Added by Gonetz
7969 static void cc__t0_inter_t1_using_prima__mul_shade ()
7970 {
7971   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7972     GR_COMBINE_FACTOR_LOCAL,
7973     GR_COMBINE_LOCAL_ITERATED,
7974     GR_COMBINE_OTHER_TEXTURE);
7975   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
7976   T0_INTER_T1_USING_FACTOR (factor);
7977 }
7978
7979 //Added by Gonetz
7980 static void cc__t1_inter_t0_using_prima__mul_shade ()
7981 {
7982   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7983     GR_COMBINE_FACTOR_LOCAL,
7984     GR_COMBINE_LOCAL_ITERATED,
7985     GR_COMBINE_OTHER_TEXTURE);
7986   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
7987   T1_INTER_T0_USING_FACTOR (factor);
7988 }
7989
7990 static void cc__t0_inter_t1_using_env__mul_shade ()
7991 {
7992   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
7993     GR_COMBINE_FACTOR_LOCAL,
7994     GR_COMBINE_LOCAL_ITERATED,
7995     GR_COMBINE_OTHER_TEXTURE);
7996   T0_INTER_T1_USING_ENV ();
7997 }
7998
7999 static void cc__t0_inter_t1_using_enva__mul_shade ()
8000 {
8001   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8002     GR_COMBINE_FACTOR_LOCAL,
8003     GR_COMBINE_LOCAL_ITERATED,
8004     GR_COMBINE_OTHER_TEXTURE);
8005   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
8006   T0_INTER_T1_USING_FACTOR (factor);
8007 }
8008
8009 static void cc__t0_inter_t1_using_enva__mul_prim ()
8010 {
8011   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8012     GR_COMBINE_FACTOR_LOCAL,
8013     GR_COMBINE_LOCAL_CONSTANT,
8014     GR_COMBINE_OTHER_TEXTURE);
8015   CC_PRIM ();
8016   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
8017   T0_INTER_T1_USING_FACTOR (factor);
8018 }
8019
8020 //Added by Gonetz
8021 static void cc__t0_inter_t1_using_enva__mul_env ()
8022 {
8023   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8024     GR_COMBINE_FACTOR_LOCAL,
8025     GR_COMBINE_LOCAL_CONSTANT,
8026     GR_COMBINE_OTHER_TEXTURE);
8027   CC_ENV ();
8028   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
8029   T0_INTER_T1_USING_FACTOR (factor);
8030 }
8031
8032 //Added by Gonetz
8033 static void cc__t0_inter_t1_using_primlod__mul_prim ()
8034 {
8035   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8036     GR_COMBINE_FACTOR_LOCAL,
8037     GR_COMBINE_LOCAL_CONSTANT,
8038     GR_COMBINE_OTHER_TEXTURE);
8039   CC_PRIM ();
8040   T0_INTER_T1_USING_FACTOR (lod_frac);
8041 }
8042
8043 //Added by Gonetz
8044 static void cc__t0_inter_t1_using_primlod__mul_prima ()
8045 {
8046   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8047     GR_COMBINE_FACTOR_LOCAL,
8048     GR_COMBINE_LOCAL_CONSTANT,
8049     GR_COMBINE_OTHER_TEXTURE);
8050   CC_PRIMA ();
8051   T0_INTER_T1_USING_FACTOR (lod_frac);
8052 }
8053
8054 //Added by Gonetz
8055 static void cc__t1_mul_primlod_add_t0__mul_prim ()
8056 {
8057   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8058     GR_COMBINE_FACTOR_LOCAL,
8059     GR_COMBINE_LOCAL_CONSTANT,
8060     GR_COMBINE_OTHER_TEXTURE);
8061   CC_PRIM ();
8062   T1_MUL_PRIMLOD_ADD_T0 ();
8063 }
8064
8065 //Added by Gonetz
8066 static void cc__t0_inter_t1_using_primlod__mul_env ()
8067 {
8068   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8069     GR_COMBINE_FACTOR_LOCAL,
8070     GR_COMBINE_LOCAL_CONSTANT,
8071     GR_COMBINE_OTHER_TEXTURE);
8072   CC_ENV ();
8073   T0_INTER_T1_USING_FACTOR (lod_frac);
8074 }
8075
8076 //Added by Gonetz
8077 static void cc__t1_mul_primlod_add_t0__mul_env ()
8078 {
8079   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8080     GR_COMBINE_FACTOR_LOCAL,
8081     GR_COMBINE_LOCAL_CONSTANT,
8082     GR_COMBINE_OTHER_TEXTURE);
8083   CC_ENV ();
8084   T1_MUL_PRIMLOD_ADD_T0 ();
8085 }
8086
8087 //Added by Gonetz
8088 static void cc__t1_inter_t0_using_prim__mul_env ()
8089 {
8090   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8091     GR_COMBINE_FACTOR_LOCAL,
8092     GR_COMBINE_LOCAL_CONSTANT,
8093     GR_COMBINE_OTHER_TEXTURE);
8094   CC_ENV ();
8095   T1_INTER_T0_USING_PRIM ();
8096 }
8097
8098 static void cc__one_sub_shade_mul_t0_add_shade__mul_prim ()
8099 {
8100   if (cmb.combine_ext)
8101   {
8102     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
8103       GR_CMBX_ITRGB, GR_FUNC_MODE_ONE_MINUS_X,
8104       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
8105       GR_CMBX_B, 0);
8106     cmb.tex |= 1;
8107     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
8108           GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
8109           GR_CMBX_CONSTANT_COLOR, 0,
8110       GR_CMBX_ZERO, 0);
8111         CC_PRIM ();
8112   }
8113   else
8114   {
8115     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8116       GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
8117       GR_COMBINE_LOCAL_ITERATED,
8118       GR_COMBINE_OTHER_TEXTURE);
8119     USE_T0 ();
8120   }
8121 }
8122
8123 static void cc__one_sub_shade_mul_t0_add_shade__mul_env ()
8124 {
8125   if (cmb.combine_ext)
8126   {
8127     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
8128       GR_CMBX_ITRGB, GR_FUNC_MODE_ONE_MINUS_X,
8129       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
8130       GR_CMBX_B, 0);
8131     cmb.tex |= 1;
8132     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
8133           GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
8134           GR_CMBX_CONSTANT_COLOR, 0,
8135       GR_CMBX_ZERO, 0);
8136         CC_ENV ();
8137   }
8138   else
8139   {
8140     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8141       GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
8142       GR_COMBINE_LOCAL_ITERATED,
8143       GR_COMBINE_OTHER_TEXTURE);
8144     USE_T0 ();
8145   }
8146 }
8147
8148 static void cc__t1_inter_t0_using_prim__mul_shade ()
8149 {
8150   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8151     GR_COMBINE_FACTOR_LOCAL,
8152     GR_COMBINE_LOCAL_ITERATED,
8153     GR_COMBINE_OTHER_TEXTURE);
8154   T1_INTER_T0_USING_PRIM ();
8155 }
8156
8157 static void cc__t0_inter_t1_using_primlod__mul_shade ()
8158 {
8159   //*
8160   if (rdp.LOD_en && (rdp.mipmap_level == 0) && !(settings.hacks&hack_Fifa98))
8161   {
8162     cc_t0_mul_shade ();
8163     return;
8164   }
8165   //*/
8166   if (settings.ucode == 7)
8167     lod_frac = rdp.prim_lodfrac;
8168   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8169     GR_COMBINE_FACTOR_LOCAL,
8170     GR_COMBINE_LOCAL_ITERATED,
8171     GR_COMBINE_OTHER_TEXTURE);
8172   T0_INTER_T1_USING_FACTOR (lod_frac);
8173 }
8174
8175 static void cc__t1_inter_t0_using_primlod__mul_shade ()
8176 {
8177   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8178     GR_COMBINE_FACTOR_LOCAL,
8179     GR_COMBINE_LOCAL_ITERATED,
8180     GR_COMBINE_OTHER_TEXTURE);
8181   T1_INTER_T0_USING_FACTOR (lod_frac);
8182 }
8183
8184 static void cc__t0_inter_t1_using_half__mul_shade ()
8185 {
8186   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8187     GR_COMBINE_FACTOR_LOCAL,
8188     GR_COMBINE_LOCAL_ITERATED,
8189     GR_COMBINE_OTHER_TEXTURE);
8190   T0_INTER_T1_USING_FACTOR (0x7F);
8191 }
8192
8193 static void cc__t0_inter_t1_using_t0__mul_shade ()
8194 {
8195   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8196     GR_COMBINE_FACTOR_LOCAL,
8197     GR_COMBINE_LOCAL_ITERATED,
8198     GR_COMBINE_OTHER_TEXTURE);
8199   T0_INTER_T1_USING_T0();
8200 }
8201
8202 static void cc__t0_inter_t1_using_t1a__mul_shade ()
8203 {
8204   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8205     GR_COMBINE_FACTOR_LOCAL,
8206     GR_COMBINE_LOCAL_ITERATED,
8207     GR_COMBINE_OTHER_TEXTURE);
8208   T0_INTER_T1_USING_T1A();
8209 }
8210
8211 static void cc__t0_inter_t1_using_shadea__mul_shade ()
8212 {
8213   if (cmb.combine_ext)
8214   {
8215     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
8216       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
8217       GR_CMBX_ITRGB, 0,
8218       GR_CMBX_ZERO, 0);
8219   }
8220   else
8221   {
8222     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8223       GR_COMBINE_FACTOR_LOCAL,
8224       GR_COMBINE_LOCAL_ITERATED,
8225       GR_COMBINE_OTHER_TEXTURE);
8226   }
8227   T0_INTER_T1_USING_SHADEA ();
8228 }
8229
8230 static void cc__t0_inter_t1_using_k5__mul_shade ()
8231 {
8232   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8233     GR_COMBINE_FACTOR_LOCAL,
8234     GR_COMBINE_LOCAL_ITERATED,
8235     GR_COMBINE_OTHER_TEXTURE);
8236   T0_INTER_T1_USING_FACTOR (rdp.K5);
8237 }
8238
8239 static void cc__t1_inter_t0_using_k5__mul_shade ()
8240 {
8241   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8242     GR_COMBINE_FACTOR_LOCAL,
8243     GR_COMBINE_LOCAL_ITERATED,
8244     GR_COMBINE_OTHER_TEXTURE);
8245   T1_INTER_T0_USING_FACTOR (rdp.K5);
8246 }
8247
8248 static void cc_t0_inter_prim_using_prima ()
8249 {
8250   if (cmb.combine_ext)
8251   {
8252     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
8253       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
8254       GR_CMBX_TMU_CALPHA, 0,
8255       GR_CMBX_B, 0);
8256     cmb.tex_ccolor = rdp.prim_color;
8257     cmb.tex |= 1;
8258     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8259       GR_COMBINE_FACTOR_ONE,
8260       GR_COMBINE_LOCAL_NONE,
8261       GR_COMBINE_OTHER_TEXTURE);
8262   }
8263   else
8264   {
8265     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8266       GR_COMBINE_FACTOR_TEXTURE_RGB,
8267       GR_COMBINE_LOCAL_ITERATED,
8268       GR_COMBINE_OTHER_CONSTANT);
8269     CC_1SUBPRIMA ();
8270     SETSHADE_PRIM ();
8271     SETSHADE_PRIMA ();
8272     USE_T0 ();
8273   }
8274 }
8275
8276 static void cc__t0_inter_prim_using_t0a__mul_shade ()
8277 {
8278   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8279     GR_COMBINE_FACTOR_LOCAL,
8280     GR_COMBINE_LOCAL_ITERATED,
8281     GR_COMBINE_OTHER_TEXTURE);
8282   MOD_0 (TMOD_TEX_INTER_COL_USING_TEXA);
8283   MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
8284   USE_T0 ();
8285 }
8286
8287 static void cc__env_inter_prim_using_t0__mul_prim ()
8288 {
8289   // (prim-env)*t0+env, (cmb-0)*prim+0
8290   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8291     GR_COMBINE_FACTOR_LOCAL,
8292     GR_COMBINE_LOCAL_CONSTANT,
8293     GR_COMBINE_OTHER_TEXTURE);
8294   CC_PRIM ();
8295   MOD_0 (TMOD_COL_INTER_COL1_USING_TEX);
8296   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8297   MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
8298   USE_T0 ();
8299 }
8300
8301 static void cc__env_inter_prim_using_t0__mul_shade ()
8302 {
8303   // amazing... mace actually uses the blender as part of the combine
8304   if ((rdp.othermode_l & 0xFFFF0000) == 0x03820000 ||
8305     (rdp.othermode_l & 0xFFFF0000) == 0x00910000)
8306   {
8307     // blender:
8308     //  1ST = CLR_IN * A_IN + CLR_BL * 1MA
8309     //  OUT = 1ST * 0 + 1ST * 1
8310
8311     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8312       GR_COMBINE_FACTOR_LOCAL,
8313       GR_COMBINE_LOCAL_ITERATED,
8314       GR_COMBINE_OTHER_TEXTURE);
8315     MOD_0 (TMOD_COL2_INTER__COL_INTER_COL1_USING_TEX__USING_TEXA);
8316     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8317     MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
8318     MOD_0_COL2 (rdp.blend_color & 0xFFFFFF00);
8319     USE_T0 ();
8320     return;
8321   }
8322   //(prim-env)*t0+env, (shade-0)*cmb+0
8323   MOD_0 (TMOD_COL_INTER_COL1_USING_TEX);
8324   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8325   MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
8326   USE_T0 ();
8327   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8328     GR_COMBINE_FACTOR_LOCAL,
8329     GR_COMBINE_LOCAL_ITERATED,
8330     GR_COMBINE_OTHER_TEXTURE);
8331 }
8332
8333 static void cc__env_inter_one_using_t0__mul_shade ()
8334 {
8335   //(one-env)*t0+env, (cmb-0)*shade+0
8336   if (cmb.combine_ext)
8337   {
8338     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
8339       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ONE_MINUS_X,
8340       GR_CMBX_LOCAL_TEXTURE_RGB, 0,
8341       GR_CMBX_B, 0);
8342     cmb.tex_ccolor = rdp.env_color&0xFFFFFF00;
8343     cmb.tex |= 1;
8344   }
8345   else
8346   {
8347     MOD_0 (TMOD_COL_INTER_COL1_USING_TEX);
8348     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8349     MOD_0_COL1 (0xFFFFFF00);
8350     USE_T0 ();
8351   }
8352   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8353     GR_COMBINE_FACTOR_LOCAL,
8354     GR_COMBINE_LOCAL_ITERATED,
8355     GR_COMBINE_OTHER_TEXTURE);
8356 }
8357
8358 static void cc_env_inter_one_using__one_sub_t0_mul_primlod ()
8359 {
8360   if (cmb.combine_ext)
8361   {
8362     // (noise-t0)*primlod+0, (1-env)*cmb+env
8363     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
8364       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
8365       GR_CMBX_DETAIL_FACTOR, 0,
8366       GR_CMBX_ZERO, 0);
8367     cmb.tex_ccolor = rand()&0xFFFFFF00;
8368     cmb.tex |= 1;
8369     percent = (float)(lod_frac) / 255.0f;
8370     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
8371     cmb.tex |= 1;
8372   }
8373   else
8374   {
8375     USE_T0 ();
8376   }
8377   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8378     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
8379     GR_COMBINE_LOCAL_CONSTANT,
8380     GR_COMBINE_OTHER_TEXTURE);
8381   CC_ENV ();
8382 }
8383
8384 static void cc__env_inter_prim_using_prima__mul_shade ()
8385 {
8386   int primr = (rdp.prim_color>>24)&0xFF;
8387   int primg = (rdp.prim_color>>16)&0xFF;
8388   int primb = (rdp.prim_color>>8)&0xFF;
8389   int prima = rdp.prim_color&0xFF;
8390   int envr = (rdp.env_color>>24)&0xFF;
8391   int envg = (rdp.env_color>>16)&0xFF;
8392   int envb = (rdp.env_color>>8)&0xFF;
8393   int r = (((primr-envr)*prima)/256)+envr;
8394   int g = (((primg-envg)*prima)/256)+envg;
8395   int b = (((primb-envb)*prima)/256)+envb;
8396   cmb.ccolor = (r<<24) | (g<<16) | (b<<8);
8397   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8398     GR_COMBINE_FACTOR_LOCAL,
8399     GR_COMBINE_LOCAL_ITERATED,
8400     GR_COMBINE_OTHER_CONSTANT);
8401 }
8402
8403 static void cc__prim_inter_t0_using_env__mul_shade ()
8404 {
8405   // (t0-prim)*env+prim, (cmb-0)*shade+0
8406   if ((rdp.prim_color & 0xFFFFFF00) == 0)
8407   {
8408     cc_t0_mul_env_mul_shade ();
8409   }
8410   else if (cmb.combine_ext)
8411   {
8412     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
8413       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
8414       GR_CMBX_TMU_CCOLOR, 0,
8415       GR_CMBX_ZERO, 0);
8416     cmb.tex_ccolor = rdp.env_color & 0xFFFFFF00;
8417     cmb.tex |= 1;
8418     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
8419       GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
8420       GR_CMBX_ITRGB, 0,
8421       GR_CMBX_ZERO, 0);
8422     wxUint32 onesubenv = ~rdp.env_color;
8423     CC_C1MULC2(rdp.prim_color, onesubenv);
8424   }
8425   else
8426   {
8427     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8428       GR_COMBINE_FACTOR_LOCAL,
8429       GR_COMBINE_LOCAL_ITERATED,
8430       GR_COMBINE_OTHER_TEXTURE);
8431     MOD_0 (TMOD_COL_INTER_TEX_USING_COL1);
8432     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
8433     MOD_0_COL1 (rdp.env_color & 0xFFFFFF00);
8434     USE_T0 ();
8435   }
8436 }
8437
8438 static void cc__one_inter_prim_using_t1__mul_shade ()
8439 {
8440   if (cmb.combine_ext)
8441   {
8442     if ((settings.hacks&hack_BAR) && rdp.cur_tile == 1)
8443     {
8444       T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
8445         GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
8446         GR_CMBX_LOCAL_TEXTURE_RGB, 0,
8447         GR_CMBX_ZERO, 1);
8448       cmb.tex |= 1;
8449     }
8450     else
8451     {
8452       T1CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
8453         GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
8454         GR_CMBX_LOCAL_TEXTURE_RGB, 0,
8455         GR_CMBX_ZERO, 1);
8456       T0CCMBEXT(GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
8457         GR_CMBX_OTHER_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
8458         GR_CMBX_ZERO, 0,
8459         GR_CMBX_B, 0);
8460       cmb.tex |= 2;
8461     }
8462     cmb.tex_ccolor = rdp.prim_color | 0xFF;
8463     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
8464       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
8465       GR_CMBX_ITRGB, 0,
8466       GR_CMBX_ZERO, 0);
8467   }
8468   else
8469   {
8470     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8471       GR_COMBINE_FACTOR_LOCAL,
8472       GR_COMBINE_LOCAL_ITERATED,
8473       GR_COMBINE_OTHER_TEXTURE);
8474     if ((settings.hacks&hack_BAR) && rdp.cur_tile == 1)
8475     {
8476       MOD_0 (TMOD_COL_INTER_COL1_USING_TEX);
8477       MOD_0_COL (0xFFFFFF00);
8478       MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
8479       USE_T0 ();
8480     }
8481     else
8482     {
8483       MOD_1 (TMOD_COL_INTER_COL1_USING_TEX);
8484       MOD_1_COL (0xFFFFFF00);
8485       MOD_1_COL1 (rdp.prim_color & 0xFFFFFF00);
8486       USE_T1 ();
8487     }
8488   }
8489 }
8490
8491 static void cc_prim_sub__prim_sub_t0_mul_prima__mul_shade ()
8492 {
8493   // (prim-t0)*prim_a+0, (prim-cmb)*shade+0
8494   if (cmb.combine_ext)
8495   {
8496     T0CCMBEXT(GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_X,
8497       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
8498       GR_CMBX_TMU_CALPHA, 0,
8499       GR_CMBX_ZERO, 0);
8500     cmb.tex_ccolor = rdp.prim_color;
8501     cmb.tex |= 1;
8502     CCMBEXT(GR_CMBX_CONSTANT_COLOR, GR_FUNC_MODE_X,
8503       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_NEGATIVE_X,
8504       GR_CMBX_ITRGB, 0,
8505       GR_CMBX_ZERO, 0);
8506     CC_PRIM();
8507   }
8508   else
8509   {
8510     if ((rdp.prim_color & 0xFFFFFF00) == 0)
8511     {
8512       cc_t0_mul_prima_mul_shade ();
8513       return;
8514     }
8515     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8516       GR_COMBINE_FACTOR_LOCAL,
8517       GR_COMBINE_LOCAL_ITERATED,
8518       GR_COMBINE_OTHER_TEXTURE);
8519     MOD_0 (TMOD_COL_INTER_TEX_USING_COL1);
8520     MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
8521     wxUint8 prima = (wxUint8)(rdp.prim_color&0xFF);
8522     MOD_0_COL1 ((prima<<24)|(prima<<16)|(prima<<8));
8523     USE_T0 ();
8524   }
8525 }
8526
8527 static void cc__prim_inter_env_using_t0__mul_shade ()
8528 {
8529   // (env-prim)*t0+prim, (cmb-0)*shade+0
8530   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8531     GR_COMBINE_FACTOR_LOCAL,
8532     GR_COMBINE_LOCAL_ITERATED,
8533     GR_COMBINE_OTHER_TEXTURE);
8534   MOD_0 (TMOD_COL_INTER_COL1_USING_TEX);
8535   MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
8536   MOD_0_COL1 (rdp.env_color & 0xFFFFFF00);
8537   USE_T0 ();
8538 }
8539
8540 static void cc__prim_inter_one_using_env__mul_shade ()
8541 {
8542   // (one-prim)*env+prim, (cmb-0)*shade+0
8543   if ((rdp.prim_color&0xFFFFFF00) == 0)
8544   {
8545     cc_env_mul_shade ();
8546     return;
8547   }
8548   if ((rdp.env_color&0xFFFFFF00) == 0)
8549   {
8550     cc_prim_mul_shade ();
8551     return;
8552   }
8553   if ((rdp.prim_color&0xFFFFFF00) == 0xFFFFFF00 || (rdp.env_color&0xFFFFFF00) == 0xFFFFFF00)
8554   {
8555     cc_shade ();
8556     return;
8557   }
8558   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8559     GR_COMBINE_FACTOR_LOCAL,
8560     GR_COMBINE_LOCAL_ITERATED,
8561     GR_COMBINE_OTHER_CONSTANT);
8562   CC_1SUBPRIM ();
8563   CC_C1MULC2 (cmb.ccolor, rdp.env_color);
8564   cmb.ccolor=(wxUint8)( min(255, (int)((cmb.ccolor & 0xFF000000) >> 24) + (int)((rdp.prim_color & 0xFF000000) >> 24)) ) << 24 |
8565   (wxUint8)( min(255, (int)((cmb.ccolor & 0x00FF0000) >> 16) + (int)((rdp.prim_color & 0x00FF0000) >> 16)) ) << 16 |
8566   (wxUint8)( min(255, (int)((cmb.ccolor & 0x0000FF00) >>  8) + (int)((rdp.prim_color & 0x0000FF00) >>  8)) ) <<  8 ;
8567 }
8568
8569 static void cc__env_inter_prim_using_t0a__mul_t0 ()
8570 {
8571   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8572     GR_COMBINE_FACTOR_ONE,
8573     GR_COMBINE_LOCAL_NONE,
8574     GR_COMBINE_OTHER_TEXTURE);
8575   MOD_0 (TMOD_COL_INTER_COL1_USING_TEXA__MUL_TEX);
8576   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8577   MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
8578   USE_T0 ();
8579 }
8580
8581 static void cc__env_inter_prim_using_t0a__mul_prim ()
8582 {
8583   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8584     GR_COMBINE_FACTOR_LOCAL,
8585     GR_COMBINE_LOCAL_CONSTANT,
8586     GR_COMBINE_OTHER_TEXTURE);
8587   CC_PRIM ();
8588   MOD_0 (TMOD_COL_INTER_COL1_USING_TEXA);
8589   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8590   MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
8591   USE_T0 ();
8592 }
8593
8594 static void cc__env_inter_prim_using__t0_sub_shade_mul_primlod_add_env ()
8595 {
8596   // (t0-shade)*lodf+env, (prim-env)*cmb+env
8597   if (cmb.combine_ext)
8598   {
8599     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
8600       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
8601       GR_CMBX_DETAIL_FACTOR, 0,
8602       GR_CMBX_B, 0);
8603     cmb.tex_ccolor = rdp.env_color;
8604     percent = (float)lod_frac / 255.0f;
8605     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
8606     cmb.tex |= 1;
8607     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
8608       GR_COMBINE_FACTOR_TEXTURE_RGB,
8609       GR_COMBINE_LOCAL_ITERATED,
8610       GR_COMBINE_OTHER_CONSTANT);
8611     CC_PRIM ();
8612     SETSHADE_ENV ();
8613   }
8614   else
8615   {
8616     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
8617       GR_COMBINE_FACTOR_ONE,//TEXTURE_RGB,
8618       GR_COMBINE_LOCAL_ITERATED,
8619       GR_COMBINE_OTHER_TEXTURE);//CONSTANT);
8620     MOD_0 (TMOD_COL_INTER_COL1_USING_TEX);
8621     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8622     MOD_0_COL1 (rdp.prim_color & 0xFFFFFF00);
8623     USE_T0 ();
8624     MULSHADE_PRIMSUBENV ();
8625     MULSHADE_PRIMLOD();
8626     SUBSHADE_PRIMSUBENV ();
8627   }
8628 }
8629
8630 static void cc__prim_inter_t0_using_t0__mul_shade ()
8631 {
8632   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8633     GR_COMBINE_FACTOR_LOCAL,
8634     GR_COMBINE_LOCAL_ITERATED,
8635     GR_COMBINE_OTHER_TEXTURE);
8636   MOD_0 (TMOD_COL_INTER_TEX_USING_TEX);
8637   MOD_0_COL (rdp.prim_color & 0xFFFFFF00);
8638   USE_T0 ();
8639 }
8640
8641 static void cc__env_inter_t0_using_t0a__mul_shade ()
8642 {
8643   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8644     GR_COMBINE_FACTOR_LOCAL,
8645     GR_COMBINE_LOCAL_ITERATED,
8646     GR_COMBINE_OTHER_TEXTURE);
8647   MOD_0 (TMOD_COL_INTER_TEX_USING_TEXA);
8648   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8649   USE_T0 ();
8650 }
8651
8652 static void cc__env_inter_t0_using_prima__mul_shade ()
8653 {
8654   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8655     GR_COMBINE_FACTOR_LOCAL,
8656     GR_COMBINE_LOCAL_ITERATED,
8657     GR_COMBINE_OTHER_TEXTURE);
8658   MOD_0 (TMOD_COL_INTER_TEX_USING_COL1);
8659   MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8660   wxUint32 prima = rdp.prim_color & 0xFF;
8661   MOD_0_COL1 ((prima<<24)|(prima|16)|(prima<<8));
8662   USE_T0 ();
8663 }
8664
8665 static void cc_shade_mul_prima ()
8666 {
8667   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8668     GR_COMBINE_FACTOR_ONE,
8669     GR_COMBINE_LOCAL_NONE,
8670     GR_COMBINE_OTHER_ITERATED);
8671   MULSHADE_PRIMA ();
8672 }
8673
8674 static void cc_shade_mul_shadea ()
8675 {
8676   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8677     GR_COMBINE_FACTOR_ONE,
8678     GR_COMBINE_LOCAL_NONE,
8679     GR_COMBINE_OTHER_ITERATED);
8680   MULSHADE_SHADEA ();
8681 }
8682
8683 static void cc__t0_mul_shade__inter_env_using_enva ()
8684 {
8685   // (t0-0)*shade+0, (env-cmb)*env_a+cmb    ** INC **
8686   wxUint32 enva  = rdp.env_color&0xFF;
8687   if (enva == 0xFF)
8688     cc_env ();
8689   else if (enva == 0)
8690     cc_t0_mul_shade ();
8691   else if (cmb.combine_ext)
8692   {
8693     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
8694       GR_CMBX_TMU_CCOLOR, GR_FUNC_MODE_ZERO,
8695       GR_CMBX_ITRGB, 0,
8696       GR_CMBX_B, 0);
8697     cmb.tex |= 1;
8698     CCMBEXT(GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_X,
8699       GR_CMBX_ITRGB, GR_FUNC_MODE_ZERO,
8700       GR_CMBX_ZERO, 1,
8701       GR_CMBX_ZERO, 0);
8702     MULSHADE_1MENVA ();
8703     CC_COLMULBYTE(rdp.env_color, (rdp.env_color&0xFF));
8704     cmb.tex_ccolor = cmb.ccolor;
8705   }
8706   else
8707   {
8708     CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8709       GR_COMBINE_FACTOR_LOCAL,
8710       GR_COMBINE_LOCAL_ITERATED,
8711       GR_COMBINE_OTHER_TEXTURE);
8712     INTERSHADE_2 (rdp.env_color & 0xFFFFFF00, rdp.env_color & 0xFF);
8713     USE_T0 ();
8714     MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
8715     MOD_0_COL (rdp.env_color & 0xFFFFFF00);
8716     MOD_0_FAC (rdp.env_color & 0xFF);
8717   }
8718 }
8719
8720 static void cc__t0_mul_shade__inter_one_using_enva ()
8721 {
8722   CCMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8723     GR_COMBINE_FACTOR_TEXTURE_RGB,
8724     GR_COMBINE_LOCAL_CONSTANT,
8725     GR_COMBINE_OTHER_ITERATED);
8726   CC_ENVA ();
8727   MULSHADE_1MENVA ();
8728   USE_T0 ();
8729 }
8730
8731 static void cc__t0_mul_shade__inter_one_using_shadea ()
8732 {
8733   if (cmb.combine_ext)
8734   {
8735     T0CCMBEXT(GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_ZERO,
8736       GR_CMBX_LOCAL_TEXTURE_RGB, GR_FUNC_MODE_X,
8737       GR_CMBX_ITRGB, 0,
8738       GR_CMBX_ZERO, 0);
8739     cmb.tex |= 1;
8740     CCMBEXT(GR_CMBX_ZERO, GR_FUNC_MODE_X,
8741       GR_CMBX_TEXTURE_RGB, GR_FUNC_MODE_ONE_MINUS_X,
8742       GR_CMBX_ITALPHA, 0,
8743       GR_CMBX_B, 0);
8744   }
8745   else
8746   {
8747     cc_t0_mul_shade ();
8748   }
8749 }
8750
8751 static void cc__prim_mul_shade__inter_env_using_enva ()
8752 {
8753   CCMB (GR_COMBINE_FUNCTION_BLEND,
8754     GR_COMBINE_FACTOR_LOCAL_ALPHA,
8755     GR_COMBINE_LOCAL_ITERATED,
8756     GR_COMBINE_OTHER_CONSTANT);
8757   CC_ENV ();
8758   MULSHADE_PRIM ();
8759   SETSHADE_A_ENV ();
8760 }
8761
8762 static void cc__prim_mul_shade__inter_env_using__prim_mul_shade_alpha ()
8763 {
8764   CCMB (GR_COMBINE_FUNCTION_BLEND,
8765     GR_COMBINE_FACTOR_LOCAL_ALPHA,
8766     GR_COMBINE_LOCAL_ITERATED,
8767     GR_COMBINE_OTHER_CONSTANT);
8768   CC_ENV ();
8769   MULSHADE_PRIM ();
8770   MULSHADE_A_PRIM ();
8771 }
8772
8773
8774 //****************************************************************
8775
8776 static void ac_one ()
8777 {
8778   ACMB (GR_COMBINE_FUNCTION_LOCAL,
8779     GR_COMBINE_FACTOR_NONE,
8780     GR_COMBINE_LOCAL_CONSTANT,
8781     GR_COMBINE_OTHER_NONE);
8782   cmb.ccolor |= 0xFF;
8783 }
8784
8785 static void ac_t0 ()
8786 {
8787   if ((rdp.othermode_l & 0x4000) && (rdp.cycle_mode < 2))
8788   {
8789     wxUint32 blend_mode = (rdp.othermode_l >> 16);
8790     if (blend_mode == 0x0550)
8791     {
8792       ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8793         GR_COMBINE_FACTOR_LOCAL,
8794         GR_COMBINE_LOCAL_CONSTANT,
8795         GR_COMBINE_OTHER_TEXTURE);
8796       CA(rdp.fog_color);
8797     }
8798     else if (blend_mode == 0x55f0) //cmem*afog + cfog*1ma
8799     {
8800       ACMB (GR_COMBINE_FUNCTION_LOCAL,
8801         GR_COMBINE_FACTOR_ONE,
8802         GR_COMBINE_LOCAL_CONSTANT,
8803         GR_COMBINE_OTHER_NONE);
8804       CA(~rdp.fog_color);
8805     }
8806     else
8807     {
8808       ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8809         GR_COMBINE_FACTOR_ONE,
8810         GR_COMBINE_LOCAL_NONE,
8811         GR_COMBINE_OTHER_TEXTURE);
8812     }
8813   }
8814   else
8815   {
8816     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8817       GR_COMBINE_FACTOR_ONE,
8818       GR_COMBINE_LOCAL_NONE,
8819       GR_COMBINE_OTHER_TEXTURE);
8820   }
8821   A_USE_T0 ();
8822 }
8823
8824 static void ac_zero ()
8825 {
8826   if (cmb.tex > 0)
8827   {
8828     ac_t0 ();
8829     return;
8830   }
8831   ACMB (GR_COMBINE_FUNCTION_LOCAL,
8832     GR_COMBINE_FACTOR_NONE,
8833     GR_COMBINE_LOCAL_CONSTANT,
8834     GR_COMBINE_OTHER_NONE);
8835   cmb.ccolor &= 0xFFFFFF00;
8836 }
8837
8838 static void ac_t1 ()
8839 {
8840   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8841     GR_COMBINE_FACTOR_ONE,
8842     GR_COMBINE_LOCAL_NONE,
8843     GR_COMBINE_OTHER_TEXTURE);
8844   if ((settings.hacks&hack_BAR) && rdp.tiles[rdp.cur_tile].format == 3)
8845     A_USE_T0 ();
8846   else
8847     A_USE_T1 ();
8848 }
8849
8850 static void ac_prim ()
8851 {
8852   ACMB (GR_COMBINE_FUNCTION_LOCAL,
8853     GR_COMBINE_FACTOR_NONE,
8854     GR_COMBINE_LOCAL_CONSTANT,
8855     GR_COMBINE_OTHER_NONE);
8856   CA_PRIM ();
8857 }
8858
8859 static void ac_primlod ()
8860 {
8861   ACMB (GR_COMBINE_FUNCTION_LOCAL,
8862     GR_COMBINE_FACTOR_NONE,
8863     GR_COMBINE_LOCAL_CONSTANT,
8864     GR_COMBINE_OTHER_NONE);
8865   CA_PRIMLOD ();
8866 }
8867
8868 static void ac_one_sub_t0 ()
8869 {
8870     ACMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
8871       GR_COMBINE_FACTOR_TEXTURE_ALPHA,
8872       GR_COMBINE_LOCAL_CONSTANT,
8873       GR_COMBINE_OTHER_NONE);
8874     CA (0xFF);
8875     A_USE_T0 ();
8876 }
8877
8878 static void ac_one_sub_prim ()
8879 {
8880   ACMB (GR_COMBINE_FUNCTION_LOCAL,
8881     GR_COMBINE_FACTOR_NONE,
8882     GR_COMBINE_LOCAL_CONSTANT,
8883     GR_COMBINE_OTHER_NONE);
8884   CA_INVPRIM ();
8885 }
8886
8887 static void ac_env ()
8888 {
8889   ACMB (GR_COMBINE_FUNCTION_LOCAL,
8890     GR_COMBINE_FACTOR_NONE,
8891     GR_COMBINE_LOCAL_CONSTANT,
8892     GR_COMBINE_OTHER_NONE);
8893   CA_ENV ();
8894 }
8895
8896 static void ac_shade ()
8897 {
8898   ACMB (GR_COMBINE_FUNCTION_LOCAL,
8899     GR_COMBINE_FACTOR_NONE,
8900     GR_COMBINE_LOCAL_ITERATED,
8901     GR_COMBINE_OTHER_NONE);
8902 }
8903
8904 // ** A+B **
8905 static void ac_t0_add_t1 ()  //Aded by Gonetz
8906 {
8907   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8908     GR_COMBINE_FACTOR_ONE,
8909     GR_COMBINE_LOCAL_NONE,
8910     GR_COMBINE_OTHER_TEXTURE);
8911   A_T0_ADD_T1 ();
8912 }
8913
8914 static void ac__t0_mul_prim__add__t1_mul_primlod ()  //Aded by Gonetz
8915 {
8916   if (lod_frac == 0)
8917   {
8918     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8919       GR_COMBINE_FACTOR_LOCAL,
8920       GR_COMBINE_LOCAL_CONSTANT,
8921       GR_COMBINE_OTHER_TEXTURE);
8922     CA_PRIM ();
8923     A_USE_T0 ();
8924   }
8925   else if ((rdp.prim_color&0xFF) == 0)
8926   {
8927     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8928       GR_COMBINE_FACTOR_LOCAL,
8929       GR_COMBINE_LOCAL_CONSTANT,
8930       GR_COMBINE_OTHER_TEXTURE);
8931     CA_PRIMLOD ();
8932     A_USE_T1 ();
8933   }
8934   else if ((rdp.prim_color&0xFF) == 0xFF)
8935   {
8936     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8937       GR_COMBINE_FACTOR_ONE,
8938       GR_COMBINE_LOCAL_NONE,
8939       GR_COMBINE_OTHER_TEXTURE);
8940     A_T1_MUL_PRIMLOD_ADD_T0();
8941   }
8942   else
8943   {
8944     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
8945       GR_COMBINE_FACTOR_LOCAL,
8946       GR_COMBINE_LOCAL_CONSTANT,
8947       GR_COMBINE_OTHER_TEXTURE);
8948     CA_PRIM ();
8949     A_T0_ADD_T1 ();
8950   }
8951 }
8952
8953 static void ac_t0_add_prim () //Aded by Gonetz
8954 {
8955   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8956     GR_COMBINE_FACTOR_ONE,
8957     GR_COMBINE_LOCAL_CONSTANT,
8958     GR_COMBINE_OTHER_TEXTURE);
8959   CA_PRIM ();
8960   A_USE_T0 ();
8961 }
8962
8963 static void ac_t0_add_env () //Aded by Gonetz
8964 {
8965   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8966     GR_COMBINE_FACTOR_ONE,
8967     GR_COMBINE_LOCAL_CONSTANT,
8968     GR_COMBINE_OTHER_TEXTURE);
8969   CA_ENV ();
8970   A_USE_T0 ();
8971 }
8972
8973 static void ac_t1_add_env ()  //Added by Gonetz
8974 {
8975 ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8976 GR_COMBINE_FACTOR_ONE,
8977 GR_COMBINE_LOCAL_CONSTANT,
8978 GR_COMBINE_OTHER_TEXTURE);
8979 CA_ENV ();
8980 A_USE_T1 ();
8981 }
8982
8983 static void ac__t0_add_t1__add_prim () //Aded by Gonetz
8984 {
8985   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8986     GR_COMBINE_FACTOR_ONE,
8987     GR_COMBINE_LOCAL_CONSTANT,
8988     GR_COMBINE_OTHER_TEXTURE);
8989   CA_PRIM ();
8990   A_T0_ADD_T1 ();
8991 }
8992
8993 static void ac_prim_add_shade () //Aded by Gonetz
8994 {
8995   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
8996     GR_COMBINE_FACTOR_ONE,
8997     GR_COMBINE_LOCAL_ITERATED,
8998     GR_COMBINE_OTHER_CONSTANT);
8999   CA_PRIM ();
9000 }
9001
9002 static void ac_env_add_shade () //Aded by Gonetz
9003 {
9004   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9005     GR_COMBINE_FACTOR_ONE,
9006     GR_COMBINE_LOCAL_ITERATED,
9007     GR_COMBINE_OTHER_CONSTANT);
9008   CA_ENV ();
9009 }
9010
9011 // ** A*B **
9012 static void ac_t0_mul_t0 () //Added by Gonetz
9013 {
9014   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9015     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9016     GR_COMBINE_LOCAL_NONE,
9017     GR_COMBINE_OTHER_TEXTURE);
9018   A_USE_T0 ();
9019 }
9020
9021 static void ac_t0_mul_t1 ()
9022 {
9023   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9024     GR_COMBINE_FACTOR_ONE,
9025     GR_COMBINE_LOCAL_NONE,
9026     GR_COMBINE_OTHER_TEXTURE);
9027   A_T0_MUL_T1 ();
9028 }
9029
9030 static void ac_t0_mul_t1_add_t1 ()
9031 {
9032   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9033     GR_COMBINE_FACTOR_ONE,
9034     GR_COMBINE_LOCAL_NONE,
9035     GR_COMBINE_OTHER_TEXTURE);
9036   if (cmb.combine_ext)
9037   {
9038     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9039       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9040       GR_CMBX_ZERO, 0,
9041       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9042     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9043       GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9044       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0,
9045       GR_CMBX_B, 0);
9046     cmb.tex |= 3;
9047   }
9048   else
9049   {
9050     A_T0_MUL_T1 ();
9051   }
9052 }
9053
9054 static void ac_t0_mul_t1_add_prim ()
9055 {
9056   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9057     GR_COMBINE_FACTOR_ONE,
9058     GR_COMBINE_LOCAL_CONSTANT,
9059     GR_COMBINE_OTHER_TEXTURE);
9060   CA_PRIM ();
9061   A_T0_MUL_T1 ();
9062 }
9063
9064 static void ac_t0_mul_prim ()
9065 {
9066   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9067     GR_COMBINE_FACTOR_LOCAL,
9068     GR_COMBINE_LOCAL_CONSTANT,
9069     GR_COMBINE_OTHER_TEXTURE);
9070   CA_PRIM ();
9071   A_USE_T0 ();
9072 }
9073
9074 static void ac_t0_mul_prim_mul_primlod ()
9075 {
9076   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9077     GR_COMBINE_FACTOR_LOCAL,
9078     GR_COMBINE_LOCAL_CONSTANT,
9079     GR_COMBINE_OTHER_TEXTURE);
9080   CA_PRIM_MUL_PRIMLOD ();
9081   A_USE_T0 ();
9082 }
9083
9084 static void ac_t1_mul_prim ()
9085 {
9086   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9087     GR_COMBINE_FACTOR_LOCAL,
9088     GR_COMBINE_LOCAL_CONSTANT,
9089     GR_COMBINE_OTHER_TEXTURE);
9090   CA_PRIM ();
9091   if (rdp.cycle_mode == 0)
9092     A_USE_T0 ();
9093   else
9094     A_USE_T1 ();
9095 }
9096
9097 //Added by Gonetz
9098 static void ac__t1_sub_one_mul_primlod_add_t0__mul_prim ()
9099 {
9100   if (cmb.combine_ext)
9101   {
9102     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9103       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9104       GR_CMBX_ZERO, 0,
9105       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9106     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9107       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
9108       GR_CMBX_DETAIL_FACTOR, 0,
9109       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9110     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (0xFF) ;
9111     percent = (float)lod_frac / 255.0f;
9112   }
9113   else
9114   {
9115     cmb.tmu1_a_func = GR_COMBINE_FUNCTION_BLEND_LOCAL;
9116     cmb.tmu1_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR;
9117     percent = (255 - lod_frac) / 255.0f;
9118     cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA;
9119     cmb.tmu0_a_fac = GR_COMBINE_FACTOR_OTHER_ALPHA;
9120   }
9121   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9122     GR_COMBINE_FACTOR_LOCAL,
9123     GR_COMBINE_LOCAL_CONSTANT,
9124     GR_COMBINE_OTHER_TEXTURE);
9125   CA_PRIM ();
9126   cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9127   cmb.tex |= 3;
9128 }
9129
9130 static void ac__t0_sub_t1_mul_enva_add_t0__mul_prim ()
9131 {
9132   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9133     GR_COMBINE_FACTOR_LOCAL,
9134     GR_COMBINE_LOCAL_CONSTANT,
9135     GR_COMBINE_OTHER_TEXTURE);
9136   CA_PRIM ();
9137   if (cmb.combine_ext)
9138   {
9139     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9140       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9141       GR_CMBX_ZERO, 0,
9142       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9143     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
9144       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9145       GR_CMBX_TMU_CALPHA, 0,
9146       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9147     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF) ;
9148     cmb.tex |= 3;
9149   }
9150   else
9151   {
9152     A_T0_MUL_T1 ();
9153   }
9154 }
9155
9156 static void ac__t0_sub_one_mul_enva_add_t0__mul_prim ()
9157 {
9158   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9159     GR_COMBINE_FACTOR_LOCAL,
9160     GR_COMBINE_LOCAL_CONSTANT,
9161     GR_COMBINE_OTHER_TEXTURE);
9162   CA_PRIM ();
9163   if (cmb.combine_ext)
9164   {
9165     T0ACMBEXT(GR_CMBX_ITALPHA, GR_FUNC_MODE_NEGATIVE_X,
9166       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9167       GR_CMBX_TMU_CALPHA, 0,
9168       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9169     SETSHADE_A(0xFF);
9170     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF) ;
9171     cmb.tex |= 1;
9172   }
9173   else
9174   {
9175     A_USE_T0 ();
9176   }
9177 }
9178
9179 static void ac__t0_sub_t1_mul_primlod_add_t0__mul_prim ()
9180 {
9181   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9182     GR_COMBINE_FACTOR_LOCAL,
9183     GR_COMBINE_LOCAL_CONSTANT,
9184     GR_COMBINE_OTHER_TEXTURE);
9185   CA_PRIM ();
9186   if (cmb.combine_ext)
9187   {
9188     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9189       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9190       GR_CMBX_ZERO, 0,
9191       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9192     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
9193       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9194       GR_CMBX_DETAIL_FACTOR, 0,
9195       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9196     cmb.tex |= 3;
9197     percent = (float)lod_frac / 255.0f;
9198     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9199   }
9200   else
9201   {
9202     A_T0_INTER_T1_USING_FACTOR (lod_frac);
9203   }
9204 }
9205
9206 static void ac__t1_sub_prim_mul_primlod_add_t0__mul_prim ()
9207 {
9208   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9209     GR_COMBINE_FACTOR_LOCAL,
9210     GR_COMBINE_LOCAL_CONSTANT,
9211     GR_COMBINE_OTHER_TEXTURE);
9212   CA_PRIM ();
9213   if (cmb.combine_ext)
9214   {
9215     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9216       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9217       GR_CMBX_ZERO, 0,
9218       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9219     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9220       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
9221       GR_CMBX_DETAIL_FACTOR, 0,
9222       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9223     cmb.tex |= 3;
9224     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF);
9225     percent = (float)lod_frac / 255.0f;
9226     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9227   }
9228   else
9229   {
9230     A_T0_INTER_T1_USING_FACTOR (lod_frac);
9231   }
9232 }
9233
9234 static void ac__t1_sub_t0_mul_enva_add_t1__mul_prim ()
9235 {
9236   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9237     GR_COMBINE_FACTOR_LOCAL,
9238     GR_COMBINE_LOCAL_CONSTANT,
9239     GR_COMBINE_OTHER_TEXTURE);
9240   CA_PRIM ();
9241   if (cmb.combine_ext)
9242   {
9243     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9244       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9245       GR_CMBX_ZERO, 0,
9246       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9247     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
9248       GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9249       GR_CMBX_TMU_CALPHA, 0,
9250       GR_CMBX_B, 0);
9251     cmb.tex |= 3;
9252     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF);
9253   }
9254   else
9255   {
9256     wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
9257     A_T0_INTER_T1_USING_FACTOR (factor);
9258   }
9259 }
9260
9261 static void ac__t1_sub_t0_mul_primlod__mul_env_add_prim ()
9262 {
9263   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9264     GR_COMBINE_FACTOR_ONE,
9265     GR_COMBINE_LOCAL_CONSTANT,
9266     GR_COMBINE_OTHER_TEXTURE);
9267   CA_PRIM ();
9268   if (cmb.combine_ext)
9269   {
9270     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9271       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9272       GR_CMBX_ZERO, 0,
9273       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9274     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9275       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
9276       GR_CMBX_TMU_CALPHA, 0,
9277       GR_CMBX_ZERO, 0);
9278     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (wxUint32)((float)(rdp.env_color&0xFF)*(float)rdp.prim_lodfrac/255.0f);
9279   }
9280   else
9281   {
9282     cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL;
9283     cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL;
9284     cmb.tmu0_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR;
9285     percent = (rdp.prim_lodfrac * (rdp.env_color&0xFF)) / 65025.0f;
9286     cmb.dc0_detailmax = cmb.dc1_detailmax = percent; \
9287   }
9288   cmb.tex |= 3;
9289 }
9290
9291 static void ac__t0_sub_one_mul_enva_add_t1__mul_prim ()
9292 {
9293   if (cmb.combine_ext)
9294   {
9295     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9296       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9297       GR_CMBX_ZERO, 0,
9298       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9299     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9300       GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9301       GR_CMBX_TMU_CALPHA, 0,
9302       GR_CMBX_B, 0);
9303     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF) ;
9304     cmb.tex |= 3;
9305     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9306       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
9307       GR_CMBX_ITALPHA, 0,
9308       GR_CMBX_ZERO, 0);
9309     CA_ENV ();
9310     SETSHADE_A_PRIM ();
9311   }
9312   else
9313   {
9314     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9315       GR_COMBINE_FACTOR_LOCAL,
9316       GR_COMBINE_LOCAL_ITERATED,
9317       GR_COMBINE_OTHER_TEXTURE);
9318     SETSHADE_A_PRIM ();
9319     SETSHADE_A_ENV ();
9320     A_T0_MUL_T1 ();
9321   }
9322 }
9323
9324 static void ac__t1_mul_prima_add_t0__mul_env ()
9325 {
9326   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9327     GR_COMBINE_FACTOR_LOCAL,
9328     GR_COMBINE_LOCAL_CONSTANT,
9329     GR_COMBINE_OTHER_TEXTURE);
9330   CA_ENV ();
9331   A_T1_MUL_PRIMA_ADD_T0 ();
9332 }
9333
9334 static void ac__t1_mul_enva_add_t0__mul_prim ()
9335 {
9336   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9337     GR_COMBINE_FACTOR_LOCAL,
9338     GR_COMBINE_LOCAL_CONSTANT,
9339     GR_COMBINE_OTHER_TEXTURE);
9340   CA_PRIM ();
9341   A_T1_MUL_ENVA_ADD_T0 ();
9342 }
9343
9344 static void ac_t0_mul_primlod ()
9345 {
9346   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9347     GR_COMBINE_FACTOR_LOCAL,
9348     GR_COMBINE_LOCAL_CONSTANT,
9349     GR_COMBINE_OTHER_TEXTURE);
9350   CA_PRIMLOD ();
9351   A_USE_T0 ();
9352 }
9353
9354 static void ac_t1_mul_primlod ()
9355 {
9356   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9357     GR_COMBINE_FACTOR_LOCAL,
9358     GR_COMBINE_LOCAL_CONSTANT,
9359     GR_COMBINE_OTHER_TEXTURE);
9360   CA_PRIMLOD ();
9361   A_USE_T1 ();
9362 }
9363
9364 //Added by Gonetz
9365 static void ac__t0_add_t1__mul_prim ()
9366 {
9367   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9368     GR_COMBINE_FACTOR_LOCAL,
9369     GR_COMBINE_LOCAL_CONSTANT,
9370     GR_COMBINE_OTHER_TEXTURE);
9371   CA_PRIM ();
9372   A_T0_ADD_T1 ();
9373 }
9374
9375 //Added by Gonetz
9376 static void ac__t0_add_t1__mul_primlod ()
9377 {
9378   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9379     GR_COMBINE_FACTOR_LOCAL,
9380     GR_COMBINE_LOCAL_CONSTANT,
9381     GR_COMBINE_OTHER_TEXTURE);
9382   CA_PRIMLOD ();
9383   A_T0_ADD_T1 ();
9384 }
9385
9386 //Added by Gonetz
9387 static void ac__t0_mul_t1__mul_primlod ()
9388 {
9389   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9390     GR_COMBINE_FACTOR_LOCAL,
9391     GR_COMBINE_LOCAL_CONSTANT,
9392     GR_COMBINE_OTHER_TEXTURE);
9393   CA_PRIMLOD ();
9394   A_T0_MUL_T1 ();
9395 }
9396
9397 static void ac_t0_mul_env ()
9398 {
9399   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9400     GR_COMBINE_FACTOR_LOCAL,
9401     GR_COMBINE_LOCAL_CONSTANT,
9402     GR_COMBINE_OTHER_TEXTURE);
9403   CA_ENV ();
9404   A_USE_T0 ();
9405 }
9406
9407 static void ac_t0_mul_env_mul_primlod ()
9408 {
9409   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9410     GR_COMBINE_FACTOR_LOCAL,
9411     GR_COMBINE_LOCAL_CONSTANT,
9412     GR_COMBINE_OTHER_TEXTURE);
9413   CA_ENV_MUL_PRIMLOD ();
9414   A_USE_T0 ();
9415 }
9416
9417 static void ac_t1_mul_env () //Added by Gonetz
9418 {
9419   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9420     GR_COMBINE_FACTOR_LOCAL,
9421     GR_COMBINE_LOCAL_CONSTANT,
9422     GR_COMBINE_OTHER_TEXTURE);
9423   CA_ENV ();
9424   //  if ((settings.hacks&hack_Powerpuff) && (rdp.last_tile == 0))
9425   if (rdp.cycle_mode == 0)
9426     A_USE_T0 ();
9427   else
9428     A_USE_T1 ();
9429 }
9430
9431 static void ac__t1_sub_one_mul_primlod_add_t0__mul_env ()
9432 {
9433   if (cmb.combine_ext)
9434   {
9435     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9436       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9437       GR_CMBX_ZERO, 0,
9438       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9439     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9440       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
9441       GR_CMBX_DETAIL_FACTOR, 0,
9442       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9443     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (0xFF) ;
9444     percent = (float)lod_frac / 255.0f;
9445   }
9446   else
9447   {
9448     cmb.tmu1_a_func = GR_COMBINE_FUNCTION_BLEND_LOCAL;
9449     cmb.tmu1_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR;
9450     percent = (255 - lod_frac) / 255.0f;
9451     cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA;
9452     cmb.tmu0_a_fac = GR_COMBINE_FACTOR_OTHER_ALPHA;
9453   }
9454   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9455     GR_COMBINE_FACTOR_LOCAL,
9456     GR_COMBINE_LOCAL_CONSTANT,
9457     GR_COMBINE_OTHER_TEXTURE);
9458   CA_ENV ();
9459   cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9460   cmb.tex |= 3;
9461 }
9462
9463 static void ac_t0_mul_shade ()
9464 {
9465   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9466     GR_COMBINE_FACTOR_LOCAL,
9467     GR_COMBINE_LOCAL_ITERATED,
9468     GR_COMBINE_OTHER_TEXTURE);
9469   A_USE_T0 ();
9470 }
9471
9472 static void ac_t1_mul_shade ()
9473 {
9474   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9475     GR_COMBINE_FACTOR_LOCAL,
9476     GR_COMBINE_LOCAL_ITERATED,
9477     GR_COMBINE_OTHER_TEXTURE);
9478   A_USE_T1 ();
9479 }
9480
9481 //Added by Gonetz
9482 static void ac__t0_add_t1__mul_shade ()
9483 {
9484   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9485     GR_COMBINE_FACTOR_LOCAL,
9486     GR_COMBINE_LOCAL_ITERATED,
9487     GR_COMBINE_OTHER_TEXTURE);
9488   A_T0_ADD_T1 ();
9489 }
9490
9491 static void ac__t0_mul_primlod_add_t0__mul_shade ()
9492 {
9493   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9494     GR_COMBINE_FACTOR_LOCAL,
9495     GR_COMBINE_LOCAL_ITERATED,
9496     GR_COMBINE_OTHER_TEXTURE);
9497   if (cmb.combine_ext)
9498   {
9499     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9500       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9501       GR_CMBX_DETAIL_FACTOR, 0,
9502       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9503     cmb.tex |= 1;
9504     percent = (float)lod_frac / 255.0f;
9505     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9506   }
9507   else
9508   {
9509     A_USE_T0 ();
9510   }
9511 }
9512
9513 static void ac__t1_mul_prima_add_t0__mul_shade ()
9514 {
9515   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9516     GR_COMBINE_FACTOR_LOCAL,
9517     GR_COMBINE_LOCAL_ITERATED,
9518     GR_COMBINE_OTHER_TEXTURE);
9519   A_T1_MUL_PRIMA_ADD_T0 ();
9520 }
9521
9522 //Added by Gonetz
9523 static void ac__t0_sub_t1__mul_shade ()
9524 {
9525   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9526     GR_COMBINE_FACTOR_LOCAL,
9527     GR_COMBINE_LOCAL_ITERATED,
9528     GR_COMBINE_OTHER_TEXTURE);
9529   if (cmb.combine_ext)
9530   {
9531     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9532       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9533       GR_CMBX_ZERO, 0,
9534       GR_CMBX_B, 0);
9535     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9536       GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
9537       GR_CMBX_ZERO, 1,
9538       GR_CMBX_ZERO, 0);
9539     cmb.tex |= 3;
9540   }
9541   else
9542   {
9543     A_T0_SUB_T1 ();
9544   }
9545 }
9546
9547 static void ac__t1_mul_t1_add_t1__mul_shade ()
9548 {
9549   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9550     GR_COMBINE_FACTOR_LOCAL,
9551     GR_COMBINE_LOCAL_ITERATED,
9552     GR_COMBINE_OTHER_TEXTURE);
9553   if (cmb.combine_ext)
9554   {
9555     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9556       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9557       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0,
9558       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9559     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9560       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9561       GR_CMBX_ZERO, 1,
9562       GR_CMBX_ZERO, 0);
9563     cmb.tex |= 2;
9564   }
9565   else
9566   {
9567     A_USE_T1 ();
9568   }
9569 }
9570
9571 static void ac__t1_mul_enva_add_t0__mul_shade ()
9572 {
9573   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9574     GR_COMBINE_FACTOR_LOCAL,
9575     GR_COMBINE_LOCAL_ITERATED,
9576     GR_COMBINE_OTHER_TEXTURE);
9577   A_T1_MUL_ENVA_ADD_T0 ();
9578 }
9579
9580 static void ac__t1_sub_one_mul_primlod_add_t0__mul_shade ()
9581 {
9582   if (cmb.combine_ext)
9583   {
9584     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9585       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9586       GR_CMBX_ZERO, 0,
9587       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9588     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9589       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
9590       GR_CMBX_DETAIL_FACTOR, 0,
9591       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9592     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (0xFF) ;
9593     percent = (float)lod_frac / 255.0f;
9594   }
9595   else
9596   {
9597     cmb.tmu1_a_func = GR_COMBINE_FUNCTION_BLEND_LOCAL;
9598     cmb.tmu1_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR;
9599     percent = (255 - lod_frac) / 255.0f;
9600     cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA;
9601     cmb.tmu0_a_fac = GR_COMBINE_FACTOR_OTHER_ALPHA;
9602   }
9603   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9604     GR_COMBINE_FACTOR_LOCAL,
9605     GR_COMBINE_LOCAL_ITERATED,
9606     GR_COMBINE_OTHER_TEXTURE);
9607   cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9608   cmb.tex |= 3;
9609 }
9610
9611 static void ac__t1_sub_shade_mul_primlod_add_t0__mul_shade ()
9612 {
9613   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9614     GR_COMBINE_FACTOR_LOCAL,
9615     GR_COMBINE_LOCAL_CONSTANT,
9616     GR_COMBINE_OTHER_TEXTURE);
9617   CA_PRIM ();
9618   if (cmb.combine_ext)
9619   {
9620     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9621       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9622       GR_CMBX_ZERO, 0,
9623       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9624     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9625       GR_CMBX_ITALPHA, GR_FUNC_MODE_NEGATIVE_X,
9626       GR_CMBX_DETAIL_FACTOR, 0,
9627       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9628     cmb.tex |= 3;
9629     percent = (float)lod_frac / 255.0f;
9630     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9631   }
9632   else
9633   {
9634     A_T0_INTER_T1_USING_FACTOR (lod_frac);
9635   }
9636 }
9637
9638 //Added by Gonetz
9639 static void ac_prim_mul_prim ()
9640 {
9641   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9642     GR_COMBINE_FACTOR_LOCAL,
9643     GR_COMBINE_LOCAL_CONSTANT,
9644     GR_COMBINE_OTHER_ITERATED);
9645   CA_PRIM ();
9646   SETSHADE_A_PRIM ();
9647 }
9648
9649 //Added by Gonetz
9650 static void ac_prim_mul_primlod ()
9651 {
9652   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9653     GR_COMBINE_FACTOR_LOCAL,
9654     GR_COMBINE_LOCAL_CONSTANT,
9655     GR_COMBINE_OTHER_ITERATED);
9656   CA_PRIMLOD ();
9657   SETSHADE_A_PRIM ();
9658 }
9659
9660 static void ac_prim_mul_env ()
9661 {
9662   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9663     GR_COMBINE_FACTOR_LOCAL,
9664     GR_COMBINE_LOCAL_CONSTANT,
9665     GR_COMBINE_OTHER_ITERATED);
9666   CA_ENV ();
9667   SETSHADE_A_PRIM ();
9668 }
9669
9670 static void ac__prim_sub_one_mul_primlod_add_t0__mul_env ()
9671 {
9672   if (cmb.combine_ext)
9673   {
9674     T0ACMBEXT(GR_CMBX_ITALPHA, GR_FUNC_MODE_X,
9675       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
9676       GR_CMBX_DETAIL_FACTOR, 0,
9677       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9678     SETSHADE_A_PRIM ();
9679     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (0xFF) ;
9680     percent = (float)lod_frac / 255.0f;
9681     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9682     cmb.tex |= 1;
9683   }
9684   else
9685   {
9686     A_USE_T0 ();
9687   }
9688   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9689     GR_COMBINE_FACTOR_LOCAL,
9690     GR_COMBINE_LOCAL_CONSTANT,
9691     GR_COMBINE_OTHER_TEXTURE);
9692   CA_ENV ();
9693 }
9694
9695 static void ac_prim_mul_shade ()
9696 {
9697   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9698     GR_COMBINE_FACTOR_LOCAL,
9699     GR_COMBINE_LOCAL_CONSTANT,
9700     GR_COMBINE_OTHER_ITERATED);
9701   CA_PRIM ();
9702 }
9703
9704 static void ac_env_mul_shade ()
9705 {
9706   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9707     GR_COMBINE_FACTOR_LOCAL,
9708     GR_COMBINE_LOCAL_CONSTANT,
9709     GR_COMBINE_OTHER_ITERATED);
9710   CA_ENV ();
9711 }
9712
9713 static void ac_primlod_mul_shade ()
9714 {
9715   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9716     GR_COMBINE_FACTOR_LOCAL,
9717     GR_COMBINE_LOCAL_CONSTANT,
9718     GR_COMBINE_OTHER_ITERATED);
9719   CA_PRIMLOD ();
9720 }
9721
9722 // ** A-B **
9723 static void ac_prim_sub_t0 ()
9724 {
9725   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9726     GR_COMBINE_FACTOR_ONE,
9727     GR_COMBINE_LOCAL_NONE,
9728     GR_COMBINE_OTHER_TEXTURE);
9729   A_USE_T0 ();
9730
9731   MOD_0 (TMOD_FULL_COLOR_SUB_TEX);
9732   MOD_0_COL (rdp.prim_color);
9733 }
9734
9735 // ** A*B+C **
9736 static void ac_t0_mul_prim_add_t0 ()
9737 {
9738   if (cmb.combine_ext)
9739   {
9740     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9741       GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9742       GR_CMBX_CONSTANT_ALPHA, 0,
9743       GR_CMBX_B, 0);
9744     CA_PRIM ();
9745     A_USE_T0 ();
9746   }
9747   else
9748     ac_t0();
9749 }
9750
9751 static void ac_t1_mul_prim_add_t0 ()
9752 {
9753   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9754     GR_COMBINE_FACTOR_ONE,
9755     GR_COMBINE_LOCAL_NONE,
9756     GR_COMBINE_OTHER_TEXTURE);
9757   A_T1_MUL_PRIMA_ADD_T0 ();
9758 }
9759
9760 static void ac__t0_inter_t1_using_t1a__mul_prim_add__t0_inter_t1_using_t1a ()
9761 {
9762   if (cmb.combine_ext)
9763   {
9764     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9765       GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9766       GR_CMBX_CONSTANT_ALPHA, 0,
9767       GR_CMBX_B, 0);
9768     CA_PRIM ();
9769   }
9770   else
9771   {
9772     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9773       GR_COMBINE_FACTOR_LOCAL,
9774       GR_COMBINE_LOCAL_CONSTANT,
9775       GR_COMBINE_OTHER_TEXTURE);
9776     CA_PRIM ();
9777   }
9778   A_T0_INTER_T1_USING_T1A ();
9779 }
9780
9781 static void ac__t1_inter_t0_using_t0a__mul_prim_add__t1_inter_t0_using_t0a ()
9782 {
9783   if (cmb.combine_ext)
9784   {
9785     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9786       GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9787       GR_CMBX_CONSTANT_ALPHA, 0,
9788       GR_CMBX_B, 0);
9789     CA_PRIM ();
9790   }
9791   else
9792   {
9793     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9794       GR_COMBINE_FACTOR_LOCAL,
9795       GR_COMBINE_LOCAL_CONSTANT,
9796       GR_COMBINE_OTHER_TEXTURE);
9797     CA_PRIM ();
9798   }
9799   A_T1_INTER_T0_USING_T0A ();
9800 }
9801
9802 //Added by Gonetz
9803 static void ac_t0_mul_prim_add_env ()
9804 {
9805   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9806     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9807     GR_COMBINE_LOCAL_CONSTANT,
9808     GR_COMBINE_OTHER_ITERATED);
9809   SETSHADE_A_PRIM ();
9810   CA_ENV ();
9811   A_USE_T0 ();
9812 }
9813
9814 //Added by Gonetz
9815 static void ac__t0_add_t1__mul_prim_add_env ()
9816 {
9817   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9818     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9819     GR_COMBINE_LOCAL_CONSTANT,
9820     GR_COMBINE_OTHER_ITERATED);
9821   SETSHADE_A_PRIM ();
9822   CA_ENV ();
9823   A_T0_ADD_T1 ();
9824 }
9825
9826 //Aded by Gonetz
9827 static void ac__t0_inter_t1_using_enva__mul_prim_add_env ()
9828 {
9829   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9830     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9831     GR_COMBINE_LOCAL_CONSTANT,
9832     GR_COMBINE_OTHER_ITERATED);
9833   SETSHADE_A_PRIM ();
9834   CA_ENV ();
9835   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
9836   A_T0_INTER_T1_USING_FACTOR (factor);
9837 }
9838
9839 //Aded by Gonetz
9840 static void ac_t0_mul_primlod_add_t0 ()
9841 {
9842   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9843     GR_COMBINE_FACTOR_ONE,
9844     GR_COMBINE_LOCAL_NONE,
9845     GR_COMBINE_OTHER_TEXTURE);
9846   if (cmb.combine_ext)
9847   {
9848     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
9849       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9850       GR_CMBX_DETAIL_FACTOR, 0,
9851       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
9852     cmb.tex |= 1;
9853     percent = (float)lod_frac / 255.0f;
9854     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9855   }
9856   else
9857   {
9858     A_USE_T0 ();
9859   }
9860 }
9861
9862 //Aded by Gonetz
9863 static void ac_t1_mul_primlod_add_t0 ()
9864 {
9865   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
9866     GR_COMBINE_FACTOR_ONE,
9867     GR_COMBINE_LOCAL_NONE,
9868     GR_COMBINE_OTHER_TEXTURE);
9869   A_T1_MUL_PRIMLOD_ADD_T0 ();
9870 }
9871
9872 //Aded by Gonetz
9873 static void ac_t0_mul_primlod_add_prim ()
9874 {
9875   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9876     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9877     GR_COMBINE_LOCAL_ITERATED,
9878     GR_COMBINE_OTHER_CONSTANT);
9879   CA_PRIMLOD ();
9880   SETSHADE_A_PRIM ();
9881   A_USE_T0 ();
9882 }
9883
9884 static void ac_t0_mul_primlod_add_env ()
9885 {
9886   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9887     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9888     GR_COMBINE_LOCAL_ITERATED,
9889     GR_COMBINE_OTHER_CONSTANT);
9890   CA_PRIMLOD ();
9891   SETSHADE_A_ENV ();
9892   A_USE_T0 ();
9893 }
9894
9895 //Aded by Gonetz
9896 static void ac__t0_add_t1__mul_primlod_add_prim ()
9897 {
9898   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9899     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9900     GR_COMBINE_LOCAL_ITERATED,
9901     GR_COMBINE_OTHER_CONSTANT);
9902   CA_PRIMLOD ();
9903   SETSHADE_A_PRIM ();
9904   A_T0_ADD_T1 ();
9905 }
9906
9907 //Added by Gonetz
9908 static void ac_t0_mul_env_add_prim ()
9909 {
9910   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9911     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9912     GR_COMBINE_LOCAL_CONSTANT,
9913     GR_COMBINE_OTHER_ITERATED);
9914   SETSHADE_A_ENV ();
9915   CA_PRIM ();
9916   A_USE_T0 ();
9917 }
9918
9919 //Added by Gonetz
9920 static void ac_t1_mul_prim_add_prim ()
9921 {
9922   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9923     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9924     GR_COMBINE_LOCAL_CONSTANT,
9925     GR_COMBINE_OTHER_ITERATED);
9926   SETSHADE_A_PRIM ();
9927   CA_PRIM ();
9928   A_USE_T1 ();
9929 }
9930
9931 //Added by Gonetz
9932 static void ac_prim_mul_shade_add_shade ()
9933 {
9934   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9935     GR_COMBINE_FACTOR_LOCAL,
9936     GR_COMBINE_LOCAL_ITERATED,
9937     GR_COMBINE_OTHER_CONSTANT);
9938   CA_PRIM ();
9939 }
9940
9941 //Added by Gonetz
9942 static void ac_t0_mul_shade_add_prim ()
9943 {
9944   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9945     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9946     GR_COMBINE_LOCAL_CONSTANT,
9947     GR_COMBINE_OTHER_ITERATED);
9948   CA_PRIM ();
9949   A_USE_T0 ();
9950 }
9951
9952 static void ac_t0_mul_shade_add_env ()
9953 {
9954   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9955     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9956     GR_COMBINE_LOCAL_CONSTANT,
9957     GR_COMBINE_OTHER_ITERATED);
9958   CA_ENV ();
9959   A_USE_T0 ();
9960 }
9961
9962 static void ac_one_sub_prim_mul__t0_mul_t1__add__prim_mul_shade ()
9963 {
9964   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9965     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9966     GR_COMBINE_LOCAL_ITERATED,
9967     GR_COMBINE_OTHER_CONSTANT);
9968   CA_INVPRIM ();
9969   MULSHADE_A_PRIM ();
9970   A_T0_MUL_T1 ();
9971 }
9972
9973 // ** A*B+C*D **
9974 static void ac_t0_mul_prim_add_shade_mul_one_minus_prim ()
9975 {
9976   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
9977     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
9978     GR_COMBINE_LOCAL_ITERATED,
9979     GR_COMBINE_OTHER_CONSTANT);
9980   MULSHADE_A_1MPRIM ();
9981   CA_PRIM ();
9982   A_USE_T0 ();
9983 }
9984
9985 // ** (A*B+C)*D **
9986 static void ac__t0_mul_primlod_add_shade__mul_shade ()
9987 {
9988   if (cmb.combine_ext)
9989   {
9990     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9991       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
9992       GR_CMBX_DETAIL_FACTOR, 0,
9993       GR_CMBX_B, 0);
9994     cmb.tex |= 1;
9995     percent = (float)lod_frac / 255.0f;
9996     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
9997     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
9998       GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
9999       GR_CMBX_ITALPHA, 0,
10000       GR_CMBX_ZERO, 0);
10001   }
10002   else
10003   {
10004     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10005       GR_COMBINE_FACTOR_LOCAL,
10006       GR_COMBINE_LOCAL_ITERATED,
10007       GR_COMBINE_OTHER_TEXTURE);
10008     A_USE_T0 ();
10009   }
10010 }
10011
10012 static void ac__t1_mul_primlod_add_shade__mul_shade ()
10013 {
10014   if (cmb.combine_ext)
10015   {
10016     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10017       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10018       GR_CMBX_ZERO, 0,
10019       GR_CMBX_B, 0);
10020     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10021       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
10022       GR_CMBX_DETAIL_FACTOR, 0,
10023       GR_CMBX_B, 0);
10024     cmb.tex |= 2;
10025     percent = (float)lod_frac / 255.0f;
10026     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
10027     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10028       GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
10029       GR_CMBX_ITALPHA, 0,
10030       GR_CMBX_ZERO, 0);
10031   }
10032   else
10033   {
10034     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10035       GR_COMBINE_FACTOR_LOCAL,
10036       GR_COMBINE_LOCAL_ITERATED,
10037       GR_COMBINE_OTHER_TEXTURE);
10038     A_USE_T1 ();
10039   }
10040 }
10041
10042 // ** ((A-B)*C+D)+E **
10043 static void ac__t0_sub_t1_mul_prim_add_shade__mul_shade ()
10044  //(t0-t1)*prim+shade, (cmb-0)*shade+0
10045 {
10046   if (cmb.combine_ext)
10047   {
10048     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10049       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10050       GR_CMBX_ZERO, 0,
10051       GR_CMBX_B, 0);
10052     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10053       GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10054       GR_CMBX_TMU_CALPHA, 0,
10055       GR_CMBX_ZERO, 0);
10056     cmb.tex |= 3;
10057     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF);
10058     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10059       GR_CMBX_ITALPHA, GR_FUNC_MODE_X,
10060       GR_CMBX_ITALPHA, 0,
10061       GR_CMBX_ZERO, 0);
10062   }
10063   else
10064   {
10065     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA,
10066       GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10067       GR_COMBINE_LOCAL_ITERATED,
10068       GR_COMBINE_OTHER_CONSTANT);
10069     CA_PRIM ();
10070     A_T1_SUB_T0 ();
10071   }
10072 }
10073
10074 static void ac__t1_sub_t0_mul_prim_add_shade__mul_shade ()
10075  //(t1-t0)*prim+shade, (cmb-0)*shade+0
10076 {
10077   if (cmb.combine_ext)
10078   {
10079     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10080       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10081       GR_CMBX_ZERO, 0,
10082       GR_CMBX_B, 0);
10083     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10084       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10085       GR_CMBX_TMU_CALPHA, 0,
10086       GR_CMBX_ZERO, 0);
10087     cmb.tex |= 3;
10088     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF);
10089     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10090       GR_CMBX_ITALPHA, GR_FUNC_MODE_X,
10091       GR_CMBX_ITALPHA, 0,
10092       GR_CMBX_ZERO, 0);
10093   }
10094   else
10095   {
10096     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA,
10097       GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10098       GR_COMBINE_LOCAL_ITERATED,
10099       GR_COMBINE_OTHER_CONSTANT);
10100     CA_PRIM ();
10101     A_T1_SUB_T0 ();
10102   }
10103 }
10104
10105 // ** A*B*C **
10106 static void ac__t0_mul_t1__mul_prim ()
10107 {
10108   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10109     GR_COMBINE_FACTOR_LOCAL,
10110     GR_COMBINE_LOCAL_CONSTANT,
10111     GR_COMBINE_OTHER_TEXTURE);
10112   CA_PRIM ();
10113   if (voodoo.sup_large_tex || rdp.tiles[1].lr_s < 256) //hack for RR64 pause screen
10114   {
10115     A_T0_MUL_T1 ();
10116   }
10117   else
10118   {
10119     A_USE_T0 ();
10120   }
10121 }
10122
10123 static void ac__t0_mul_t1__mul_env ()
10124 {
10125   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10126     GR_COMBINE_FACTOR_LOCAL,
10127     GR_COMBINE_LOCAL_CONSTANT,
10128     GR_COMBINE_OTHER_TEXTURE);
10129   CA_ENV ();
10130   A_T0_MUL_T1 ();
10131 }
10132
10133 static void ac__t0_mul_t1__mul_env_mul_shade ()
10134 {
10135   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10136     GR_COMBINE_FACTOR_LOCAL,
10137     GR_COMBINE_LOCAL_ITERATED,
10138     GR_COMBINE_OTHER_TEXTURE);
10139   MULSHADE_A_ENV ();
10140   A_T0_MUL_T1 ();
10141 }
10142
10143 static void ac__t0_mul_t1__mul_prim_mul_shade ()
10144 {
10145   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10146     GR_COMBINE_FACTOR_LOCAL,
10147     GR_COMBINE_LOCAL_ITERATED,
10148     GR_COMBINE_OTHER_TEXTURE);
10149   MULSHADE_A_PRIM ();
10150   A_T0_MUL_T1 ();
10151 }
10152
10153 static void ac__t0_mul_t1__mul_shade ()
10154 {
10155   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10156     GR_COMBINE_FACTOR_LOCAL,
10157     GR_COMBINE_LOCAL_ITERATED,
10158     GR_COMBINE_OTHER_TEXTURE);
10159   A_T0_MUL_T1 ();
10160 }
10161
10162 static void ac__t0_add_prim_mul_shade__mul_shade ()
10163 {
10164   // (shade-0)*prim+t0, (cmb-0)*shade+0
10165   if (cmb.combine_ext)
10166   {
10167     T0ACMBEXT(GR_CMBX_ITALPHA, GR_FUNC_MODE_X,
10168       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10169       GR_CMBX_TMU_CALPHA, 0,
10170       GR_CMBX_B, 0);
10171     cmb.tex |= 1;
10172     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF);
10173     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10174       GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
10175       GR_CMBX_ITALPHA, 0,
10176       GR_CMBX_ZERO, 0);
10177   }
10178   else
10179   {
10180     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10181       GR_COMBINE_FACTOR_ONE,
10182       GR_COMBINE_LOCAL_ITERATED,
10183       GR_COMBINE_OTHER_TEXTURE);
10184     MULSHADE_A_PRIM ();
10185     A_USE_T0();
10186   }
10187 }
10188
10189 //Added by Gonetz
10190 static void ac_t0_mul_prim_mul_prim ()
10191 {
10192   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10193     GR_COMBINE_FACTOR_LOCAL,
10194     GR_COMBINE_LOCAL_ITERATED,
10195     GR_COMBINE_OTHER_TEXTURE);
10196   SETSHADE_A_PRIM ();
10197   SETSHADE_A_PRIM ();
10198   A_USE_T0 ();
10199 }
10200
10201 static void ac_t0_mul_prim_mul_env ()
10202 {
10203   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10204     GR_COMBINE_FACTOR_LOCAL,
10205     GR_COMBINE_LOCAL_CONSTANT,
10206     GR_COMBINE_OTHER_TEXTURE);
10207   CA_PRIMENV();
10208   A_USE_T0 ();
10209 }
10210
10211 static void ac_t0_mul_prim_mul_shade ()
10212 {
10213   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10214     GR_COMBINE_FACTOR_LOCAL,
10215     GR_COMBINE_LOCAL_ITERATED,
10216     GR_COMBINE_OTHER_TEXTURE);
10217   MULSHADE_A_PRIM ();
10218   A_USE_T0 ();
10219 }
10220
10221 static void ac_t1_mul_prim_mul_shade ()
10222 {
10223   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10224     GR_COMBINE_FACTOR_LOCAL,
10225     GR_COMBINE_LOCAL_ITERATED,
10226     GR_COMBINE_OTHER_TEXTURE);
10227   MULSHADE_A_PRIM ();
10228   A_USE_T1 ();
10229 }
10230
10231 static void ac_t0_mul_env_mul_shade ()
10232 {
10233   if (rdp.cur_image && (rdp.cur_image->format != 0))
10234   {
10235     ac_shade ();
10236     return;
10237   }
10238
10239   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10240     GR_COMBINE_FACTOR_LOCAL,
10241     GR_COMBINE_LOCAL_ITERATED,
10242     GR_COMBINE_OTHER_TEXTURE);
10243   MULSHADE_A_ENV ();
10244   A_USE_T0 ();
10245 }
10246
10247 static void ac_t1_mul_env_mul_shade ()
10248 {
10249   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10250     GR_COMBINE_FACTOR_LOCAL,
10251     GR_COMBINE_LOCAL_ITERATED,
10252     GR_COMBINE_OTHER_TEXTURE);
10253   MULSHADE_A_ENV ();
10254   A_USE_T1 ();
10255 }
10256
10257 static void ac_t0_mul_primlod_mul_prim () //Aded by Gonetz
10258 {
10259   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10260     GR_COMBINE_FACTOR_LOCAL,
10261     GR_COMBINE_LOCAL_CONSTANT,
10262     GR_COMBINE_OTHER_TEXTURE);
10263   cmb.ccolor |= (wxUint32)(lod_frac * (rdp.prim_color&0xFF) / 255);
10264   A_USE_T0 ();
10265 }
10266
10267 // ** (A+B)*C **
10268 static void ac_prim_add_env_mul_t0 () //Aded by Gonetz
10269 {
10270   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10271     GR_COMBINE_FACTOR_LOCAL,
10272     GR_COMBINE_LOCAL_ITERATED,
10273     GR_COMBINE_OTHER_TEXTURE);
10274   SETSHADE_A_PRIM ();
10275   ADDSHADE_A_ENV ();
10276   A_USE_T0 ();
10277 }
10278
10279 static void ac_t1_add_prim_mul_env () //Aded by Gonetz
10280 {
10281   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10282     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10283     GR_COMBINE_LOCAL_ITERATED,
10284     GR_COMBINE_OTHER_CONSTANT);
10285   CA_ENV ();
10286   SETSHADE_A_PRIM ();
10287   SETSHADE_A_ENV ();
10288   A_USE_T1 ();
10289   //(t1+prim)*env = t1*env + prim*env
10290 }
10291
10292 // ** (A-B)*C **
10293 static void ac_t0_sub_prim_mul_shade ()
10294 {
10295   if (cmb.combine_ext)
10296   {
10297     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10298       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
10299       GR_CMBX_ITALPHA, 0,
10300       GR_CMBX_ZERO, 0);
10301     cmb.tex |= 1;
10302     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF);
10303     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10304       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
10305       GR_CMBX_ZERO, 1,
10306       GR_CMBX_ZERO, 0);
10307   } else {
10308     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
10309       GR_COMBINE_FACTOR_ONE,
10310       GR_COMBINE_LOCAL_ITERATED,
10311       GR_COMBINE_OTHER_TEXTURE);
10312     MULSHADE_A_PRIM ();
10313     A_USE_T0 ();
10314   }
10315 }
10316
10317 static void ac_t0_sub_prim_mul_shade_mul_env ()
10318 {
10319   if (cmb.combine_ext)
10320   {
10321     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10322       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
10323       GR_CMBX_ITALPHA, 0,
10324       GR_CMBX_ZERO, 0);
10325     cmb.tex |= 1;
10326     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF);
10327     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10328       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
10329       GR_CMBX_CONSTANT_ALPHA, 0,
10330       GR_CMBX_ZERO, 0);
10331     CA_ENV ();
10332   } else {
10333     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
10334       GR_COMBINE_FACTOR_ONE,
10335       GR_COMBINE_LOCAL_ITERATED,
10336       GR_COMBINE_OTHER_TEXTURE);
10337     MULSHADE_A_PRIM ();
10338     MULSHADE_A_ENV ();
10339     A_USE_T0 ();
10340   }
10341 }
10342
10343 static void ac_t0_sub_shade_mul_prim ()
10344 {
10345   if (cmb.combine_ext)
10346   {
10347     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10348       GR_CMBX_ITALPHA, GR_FUNC_MODE_NEGATIVE_X,
10349       GR_CMBX_TMU_CALPHA, 0,
10350       GR_CMBX_ZERO, 0);
10351     cmb.tex |= 1;
10352     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF);
10353     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10354       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
10355       GR_CMBX_ZERO, 1,
10356       GR_CMBX_ZERO, 0);
10357   } else {
10358     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
10359       GR_COMBINE_FACTOR_ONE,
10360       GR_COMBINE_LOCAL_ITERATED,
10361       GR_COMBINE_OTHER_TEXTURE);
10362     MULSHADE_A_PRIM ();
10363     A_USE_T0 ();
10364   }
10365 }
10366
10367 static void ac__t0_mul_t1__sub_prim_mul_shade ()  //Aded by Gonetz
10368 {
10369   if (cmb.combine_ext)
10370   {
10371     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10372       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10373       GR_CMBX_ITALPHA, 0,
10374       GR_CMBX_ZERO, 0);
10375     CA_PRIM();
10376   }
10377   else
10378   {
10379     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10380       GR_COMBINE_FACTOR_LOCAL,
10381       GR_COMBINE_LOCAL_ITERATED,
10382       GR_COMBINE_OTHER_TEXTURE);
10383   }
10384   A_T0_MUL_T1 ();
10385 }
10386
10387 static void ac__one_sub_t1_mul_t0_add_shade__sub_prim_mul_shade ()  //Aded by Gonetz
10388 {
10389   // (1-t1)*t0+shade, (cmb-prim)*shade+0
10390   if (cmb.combine_ext)
10391   {
10392     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10393       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10394       GR_CMBX_ZERO, 0,
10395       GR_CMBX_B, 0);
10396     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_ONE_MINUS_X,
10397       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
10398       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0,
10399       GR_CMBX_B, 0);
10400     cmb.tex |= 3;
10401     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10402       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10403       GR_CMBX_ITALPHA, 0,
10404       GR_CMBX_ZERO, 0);
10405     CA_PRIM();
10406   }
10407   else
10408   {
10409     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10410       GR_COMBINE_FACTOR_LOCAL,
10411       GR_COMBINE_LOCAL_ITERATED,
10412       GR_COMBINE_OTHER_TEXTURE);
10413     A_T0_MUL_T1 ();
10414   }
10415 }
10416
10417 static void ac__t1_mul_primlod_add_t0__sub_prim_mul_shade ()
10418 {
10419   if (cmb.combine_ext)
10420   {
10421     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10422       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10423       GR_CMBX_ITALPHA, 0,
10424       GR_CMBX_ZERO, 0);
10425     CA_PRIM ();
10426   }
10427   else
10428   {
10429     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10430       GR_COMBINE_FACTOR_LOCAL,
10431       GR_COMBINE_LOCAL_ITERATED,
10432       GR_COMBINE_OTHER_TEXTURE);
10433   }
10434   A_T1_MUL_PRIMLOD_ADD_T0 ();
10435 }
10436
10437 static void ac__t1_mul_primlod_add_t0__sub_env_mul_prim ()  //Aded by Gonetz
10438 {
10439   if (cmb.combine_ext)
10440   {
10441     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10442       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10443       GR_CMBX_ITALPHA, 0,
10444       GR_CMBX_ZERO, 0);
10445     CA_ENV ();
10446     SETSHADE_A_PRIM ();
10447   }
10448   else
10449   {
10450     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10451       GR_COMBINE_FACTOR_LOCAL,
10452       GR_COMBINE_LOCAL_CONSTANT,
10453       GR_COMBINE_OTHER_TEXTURE);
10454     CA_PRIM ();
10455   }
10456   A_T1_MUL_PRIMLOD_ADD_T0 ();
10457 }
10458
10459 static void ac__t1_mul_prima_add_t0__sub_env_mul_shade ()  //Aded by Gonetz
10460 {
10461   if (cmb.combine_ext)
10462   {
10463     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10464       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10465       GR_CMBX_ITALPHA, 0,
10466       GR_CMBX_ZERO, 0);
10467     CA_ENV ();
10468   }
10469   else
10470   {
10471     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10472       GR_COMBINE_FACTOR_LOCAL,
10473       GR_COMBINE_LOCAL_ITERATED,
10474       GR_COMBINE_OTHER_TEXTURE);
10475   }
10476   A_T1_MUL_PRIMA_ADD_T0 ();
10477 }
10478
10479 static void ac_one_sub_t0_mul_prim ()  //Aded by Gonetz
10480 {
10481   ACMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
10482     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10483     GR_COMBINE_LOCAL_CONSTANT,
10484     GR_COMBINE_OTHER_NONE);
10485   CA_PRIM ();
10486   A_USE_T0 ();
10487 }
10488
10489 static void ac_one_sub_t0_mul_shade ()  //Aded by Gonetz
10490 {
10491   if (rdp.aTBuffTex[0] || rdp.aTBuffTex[1])
10492   {
10493     ACMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
10494       GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10495       GR_COMBINE_LOCAL_ITERATED,
10496       GR_COMBINE_OTHER_NONE);
10497     A_USE_T0 ();
10498   }
10499   else
10500     ac_zero();
10501 }
10502
10503 static void ac_one_sub_prim_mul_t0 ()  //Aded by Gonetz
10504 {
10505   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10506     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
10507     GR_COMBINE_LOCAL_CONSTANT,
10508     GR_COMBINE_OTHER_TEXTURE);
10509   CA_PRIM ();
10510   A_USE_T0 ();
10511 }
10512
10513 static void ac_one_sub_env_mul_t0 ()  //Aded by Gonetz
10514 {
10515   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10516     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
10517     GR_COMBINE_LOCAL_CONSTANT,
10518     GR_COMBINE_OTHER_TEXTURE);
10519   CA_ENV ();
10520   A_USE_T0 ();
10521 }
10522
10523 static void ac_one_sub_shade_mul_t0 ()  //Aded by Gonetz
10524 {
10525   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10526     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
10527     GR_COMBINE_LOCAL_ITERATED,
10528     GR_COMBINE_OTHER_TEXTURE);
10529   A_USE_T0 ();
10530 }
10531
10532 static void ac_one_sub_shade_mul_env ()  //Aded by Gonetz
10533 {
10534   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10535     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
10536     GR_COMBINE_LOCAL_ITERATED,
10537     GR_COMBINE_OTHER_CONSTANT);
10538   CA_ENV ();
10539 }
10540
10541 static void ac_prim_sub_shade_mul_t0 ()  //Aded by Gonetz
10542 {
10543   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
10544     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10545     GR_COMBINE_LOCAL_ITERATED,
10546     GR_COMBINE_OTHER_CONSTANT);
10547   CA_PRIM ();
10548   A_USE_T0 ();
10549 }
10550
10551 static void ac_prim_sub_shade_mul_prim ()  //Aded by Gonetz
10552 {
10553   if (cmb.combine_ext)
10554   {
10555     ACMBEXT(GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_X,
10556       GR_CMBX_ITALPHA, GR_FUNC_MODE_NEGATIVE_X,
10557       GR_CMBX_CONSTANT_ALPHA, 0,
10558       GR_CMBX_ZERO, 0);
10559     CA_PRIM();
10560   }
10561   else
10562   {
10563     if (!(rdp.prim_color & 0xFF))
10564     {
10565       ac_zero();
10566     }
10567     else
10568     {
10569       ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
10570         GR_COMBINE_FACTOR_ONE,
10571         GR_COMBINE_LOCAL_ITERATED,
10572         GR_COMBINE_OTHER_CONSTANT);
10573       CA_PRIM();
10574     }
10575   }
10576 }
10577
10578 static void ac_shade_sub_env_mul_t0 ()  //Aded by Gonetz
10579 {
10580   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
10581     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10582     GR_COMBINE_LOCAL_CONSTANT,
10583     GR_COMBINE_OTHER_ITERATED);
10584   CA_ENV ();
10585   A_USE_T0 ();
10586 }
10587
10588 // ** (A-B)*C*D **
10589 static void ac_one_sub_t0_mul_prim_mul_shade ()  //Aded by Gonetz
10590 {
10591   ACMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
10592     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10593     GR_COMBINE_LOCAL_ITERATED,
10594     GR_COMBINE_OTHER_NONE);
10595   MULSHADE_A_PRIM ();
10596   A_USE_T0 ();
10597 }
10598
10599 // ** (A+B)*C*D **
10600 static void ac_one_plus_env_mul_prim_mul_shade ()
10601 {
10602   if (cmb.combine_ext)
10603   {
10604     ACMBEXT(GR_CMBX_ZERO, GR_FUNC_MODE_ONE_MINUS_X,
10605       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_X,
10606       GR_CMBX_ITALPHA, 0,
10607       GR_CMBX_ZERO, 0);
10608     MULSHADE_A_PRIM ();
10609     CA_ENV();
10610   }
10611   else
10612     ac_prim_mul_shade ();
10613 }
10614
10615 // ** (A-B)*C+A **
10616 static void ac__t0_mul_t1__sub_env_mul_prim_add__t0_mul_t1 ()  //Aded by Gonetz
10617 {
10618   if (cmb.combine_ext)
10619   {
10620     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10621       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10622       GR_CMBX_ITALPHA, 0,
10623       GR_CMBX_TEXTURE_ALPHA, 0);
10624     CA_ENV();
10625     SETSHADE_A_PRIM ();
10626   }
10627   else
10628   {
10629     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10630       GR_COMBINE_FACTOR_ONE,
10631       GR_COMBINE_LOCAL_NONE,
10632       GR_COMBINE_OTHER_TEXTURE);
10633   }
10634   A_T0_MUL_T1 ();
10635 }
10636
10637 // ** (A-B)*C+D **
10638 static void ac__t0_sub_prim_mul_shade_add_shade__mul_env ()  //Aded by Gonetz
10639 {
10640   if (cmb.combine_ext)
10641   {
10642     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10643       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
10644       GR_CMBX_ITALPHA, 0,
10645       GR_CMBX_ITALPHA, 0);
10646     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF) ;
10647     cmb.tex |= 1;
10648     ACMBEXT(GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
10649       GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10650       GR_CMBX_CONSTANT_ALPHA, 0,
10651       GR_CMBX_ZERO, 0);
10652     CA_ENV();
10653   }
10654   else
10655   {
10656     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10657       GR_COMBINE_FACTOR_LOCAL,
10658       GR_COMBINE_LOCAL_ITERATED,
10659       GR_COMBINE_OTHER_TEXTURE);
10660     MULSHADE_A_ENV ();
10661     MOD_0 (TMOD_TEX_SUB_COL);
10662     MOD_0_COL (rdp.prim_color & 0xFF);
10663     A_USE_T0 ();
10664   }
10665 }
10666
10667 static void ac_t0_sub_t1_mul_env_add_env ()  //Aded by Gonetz
10668 {
10669     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10670       GR_COMBINE_FACTOR_LOCAL,
10671       GR_COMBINE_LOCAL_CONSTANT,
10672       GR_COMBINE_OTHER_TEXTURE);
10673     CA_ENV();
10674     A_T0_SUB_T1 ();
10675 }
10676
10677 static void ac_t0_sub_one_mul_enva_add_t1 ()  //Aded by Gonetz
10678 {
10679   if (cmb.combine_ext)
10680   {
10681     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10682       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10683       GR_CMBX_ZERO, 0,
10684       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
10685     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10686       GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10687       GR_CMBX_TMU_CALPHA, 0,
10688       GR_CMBX_B, 0);
10689     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF) ;
10690     cmb.tex |= 3;
10691     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
10692       GR_COMBINE_FACTOR_ONE,
10693       GR_COMBINE_LOCAL_CONSTANT,
10694       GR_COMBINE_OTHER_TEXTURE);
10695     CA_ENV();
10696   }
10697   else
10698   {
10699     ac__t0_mul_t1__mul_env ();
10700   }
10701 }
10702
10703 static void ac_t1_sub_one_mul_enva_add_t0 ()  //Aded by Gonetz
10704 {
10705   if (cmb.combine_ext)
10706   {
10707     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10708       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10709       GR_CMBX_ZERO, 0,
10710       GR_CMBX_B, 0);
10711     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10712       GR_CMBX_ITALPHA, GR_FUNC_MODE_NEGATIVE_X,
10713       GR_CMBX_TMU_CALPHA, 0,
10714       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
10715     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF) ;
10716     SETSHADE_A (0xFF);
10717     cmb.tex |= 3;
10718     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10719       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
10720       GR_CMBX_ZERO, 1,
10721       GR_CMBX_ZERO, 0);
10722   }
10723   else
10724   {
10725     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10726       GR_COMBINE_FACTOR_ONE,
10727       GR_COMBINE_LOCAL_NONE,
10728       GR_COMBINE_OTHER_TEXTURE);
10729     A_USE_T0 ();
10730   }
10731 }
10732
10733 static void ac_t1_sub_one_mul_primlod_add_t0 ()  //Aded by Gonetz
10734 {
10735   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10736     GR_COMBINE_FACTOR_ONE,
10737     GR_COMBINE_LOCAL_NONE,
10738     GR_COMBINE_OTHER_TEXTURE);
10739   if (cmb.combine_ext)
10740   {
10741     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10742       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10743       GR_CMBX_ZERO, 0,
10744       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
10745     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10746       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
10747       GR_CMBX_DETAIL_FACTOR, 0,
10748       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
10749     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (0xFF) ;
10750     percent = (float)lod_frac / 255.0f;
10751     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
10752     cmb.tex |= 3;
10753   }
10754   else
10755   {
10756     //    A_T0_MUL_T1 ();
10757     //    A_T1_MUL_PRIMLOD_ADD_T0 ();
10758     cmb.tmu1_a_func = GR_COMBINE_FUNCTION_BLEND_LOCAL;
10759     cmb.tmu1_a_fac = GR_COMBINE_FACTOR_DETAIL_FACTOR;
10760     percent = (255 - lod_frac) / 255.0f;
10761     cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA;
10762     cmb.tmu0_a_fac = GR_COMBINE_FACTOR_OTHER_ALPHA;
10763     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
10764     cmb.tex |= 3;
10765   }
10766 }
10767
10768 static void ac_t1_sub_prim_mul_shade_add_prim ()  //Aded by Gonetz
10769 {
10770   if (cmb.combine_ext)
10771   {
10772     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10773       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
10774       GR_CMBX_ITALPHA, 0,
10775       GR_CMBX_B, 0);
10776     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10777       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10778       GR_CMBX_ZERO, 1,
10779       GR_CMBX_ZERO, 0);
10780     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.prim_color&0xFF) ;
10781     cmb.tex |= 2;
10782     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10783       GR_CMBX_ZERO, GR_FUNC_MODE_X,
10784       GR_CMBX_ZERO, 1,
10785       GR_CMBX_ZERO, 0);
10786   }
10787   else
10788   {
10789     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10790       GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10791       GR_COMBINE_LOCAL_CONSTANT,
10792       GR_COMBINE_OTHER_ITERATED);
10793     CA_PRIM ();
10794     MOD_1 (TMOD_TEX_SUB_COL);
10795     MOD_1_COL (rdp.prim_color & 0xFF);
10796     A_USE_T1 ();
10797   }
10798 }
10799
10800 static void ac_t0_sub_env_mul_prim_add_env ()  //Aded by Gonetz
10801 {
10802   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10803     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10804     GR_COMBINE_LOCAL_CONSTANT,
10805     GR_COMBINE_OTHER_ITERATED);
10806   SETSHADE_A_PRIM ();
10807   CA_ENV1MPRIM ();
10808   A_USE_T0 ();
10809   //(t0-env)*prim+env == t0*prim + env*(1-prim)
10810 }
10811
10812 static void ac_t0_sub_env_mul_shadea_add_env ()  //Aded by Gonetz
10813 {
10814   if (!cmb.combine_ext)
10815   {
10816     ac_t0_mul_shade ();
10817     return;
10818   }
10819   T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10820     GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10821     GR_CMBX_ZERO, 1,
10822     GR_CMBX_ZERO, 0);
10823   cmb.tex |= 1;
10824   ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10825     GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
10826     GR_CMBX_ITALPHA, 0,
10827     GR_CMBX_B, 0);
10828   CA_ENV ();
10829 }
10830
10831 static void ac__one_sub_t0_mul_t1_add_t0__mul_prim ()  //Aded by Gonetz
10832 {
10833   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
10834     GR_COMBINE_FACTOR_LOCAL,
10835     GR_COMBINE_LOCAL_CONSTANT,
10836     GR_COMBINE_OTHER_TEXTURE);
10837   CA_PRIM ();
10838   rdp.best_tex = 0;
10839   cmb.tex |= 3;
10840   cmb.tmu1_a_func = GR_COMBINE_FUNCTION_LOCAL;
10841   cmb.tmu0_a_func = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
10842   cmb.tmu0_a_fac = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA;
10843 }
10844
10845 static void ac_one_sub_t0_mul_prim_add_t0 ()  //Aded by Gonetz
10846 {
10847   ACMB (GR_COMBINE_FUNCTION_BLEND,
10848     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10849     GR_COMBINE_LOCAL_ITERATED,
10850     GR_COMBINE_OTHER_CONSTANT);
10851   SETSHADE_A_PRIM ();
10852   CA (0xFF);
10853   A_USE_T0 ();
10854 }
10855
10856 static void ac_one_sub_t0_mul_env_add_t0 ()  //Aded by Gonetz
10857 {
10858   ACMB (GR_COMBINE_FUNCTION_BLEND,
10859     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10860     GR_COMBINE_LOCAL_ITERATED,
10861     GR_COMBINE_OTHER_CONSTANT);
10862   SETSHADE_A_ENV ();
10863   CA (0xFF);
10864   A_USE_T0 ();
10865 }
10866
10867 static void ac_one_sub_t0_mul_primlod_add_prim ()  //Aded by Gonetz
10868 {
10869   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10870     GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA,
10871     GR_COMBINE_LOCAL_ITERATED,
10872     GR_COMBINE_OTHER_CONSTANT);
10873   SETSHADE_A_PRIM ();
10874   CA_PRIMLOD();
10875   A_USE_T0 ();
10876 }
10877
10878 static void ac_prim_sub_t0_mul_env_add_t0 ()  //Aded by Gonetz
10879 {
10880   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10881     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10882     GR_COMBINE_LOCAL_ITERATED,
10883     GR_COMBINE_OTHER_CONSTANT);
10884   CA_INVENV ();
10885   SETSHADE_A_PRIM ();
10886   SETSHADE_A_ENV ();
10887   A_USE_T0 ();
10888   //(prim-t0)*env+t0 = prim*env + t0*(1-env)
10889 }
10890
10891 static void ac_prim_sub_env_mul_t0_add_env ()
10892 {
10893   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
10894     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10895     GR_COMBINE_LOCAL_ITERATED,
10896     GR_COMBINE_OTHER_CONSTANT);
10897   CA_PRIM ();
10898   SETSHADE_A_ENV ();
10899   A_USE_T0 ();
10900 }
10901
10902 static void ac_prim_sub_env_mul_t1_add_env ()
10903 {
10904   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
10905     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10906     GR_COMBINE_LOCAL_ITERATED,
10907     GR_COMBINE_OTHER_CONSTANT);
10908   CA_PRIM ();
10909   SETSHADE_A_ENV ();
10910   A_USE_T1 ();
10911 }
10912
10913 static void ac_prim_sub_env_mul_t0_add_one ()
10914 {
10915   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10916     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10917     GR_COMBINE_LOCAL_CONSTANT,
10918     GR_COMBINE_OTHER_ITERATED);
10919   CA (0xFF);
10920   SETSHADE_A_PRIMSUBENV ();
10921   A_USE_T0 ();
10922 }
10923
10924 //Added by Gonetz
10925 static void ac_prim_sub_env_mul_shade_add_env ()
10926 {
10927   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10928     GR_COMBINE_FACTOR_ONE,
10929     GR_COMBINE_LOCAL_CONSTANT,
10930     GR_COMBINE_OTHER_ITERATED);
10931   CA_ENV ();
10932   MULSHADE_A_PRIMSUBENV ();
10933 }
10934
10935 //Added by Gonetz
10936 static void ac_prim_sub_env_mul_shade_add_env_mul_t1 ()
10937 {
10938   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10939     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10940     GR_COMBINE_LOCAL_CONSTANT,
10941     GR_COMBINE_OTHER_ITERATED);
10942   CA_ENV ();
10943   MULSHADE_A_PRIMSUBENV ();
10944   A_USE_T1 ();
10945 }
10946
10947 //Added by Gonetz
10948 static void ac_prim_sub_shade_mul_t0_add_shade ()
10949 {
10950   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
10951     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10952     GR_COMBINE_LOCAL_ITERATED,
10953     GR_COMBINE_OTHER_CONSTANT);
10954   CA_PRIM ();
10955   A_USE_T0 ();
10956 }
10957
10958 //Added by Gonetz
10959 static void ac_one_sub_shade_mul_t1_add_shade ()
10960 {
10961   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10962     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA,
10963     GR_COMBINE_LOCAL_ITERATED,
10964     GR_COMBINE_OTHER_TEXTURE);
10965   A_USE_T1 ();
10966 }
10967
10968 //Added by Gonetz
10969 static void ac_one_sub_env_mul_shade_add_env ()
10970 {
10971   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
10972     GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA,
10973     GR_COMBINE_LOCAL_CONSTANT,
10974     GR_COMBINE_OTHER_ITERATED);
10975   CA_ENV ();
10976 }
10977
10978 //Added by Gonetz
10979 static void ac_env_sub_prim_mul_t0_add_prim ()
10980 {
10981   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
10982     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
10983     GR_COMBINE_LOCAL_ITERATED,
10984     GR_COMBINE_OTHER_CONSTANT);
10985   CA_ENV ();
10986   SETSHADE_A_PRIM ();
10987   A_USE_T0 ();
10988 }
10989
10990 static void ac_one_sub_t1_add_t0_mul_env ()
10991 {
10992   if (cmb.combine_ext)
10993   {
10994     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10995       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
10996       GR_CMBX_ZERO, 0,
10997       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
10998     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
10999       GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
11000       GR_CMBX_TMU_CALPHA, 0,
11001       GR_CMBX_B, 1);
11002     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF);
11003     cmb.tex |= 3;
11004     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11005       GR_COMBINE_FACTOR_ONE,
11006       GR_COMBINE_LOCAL_NONE,
11007       GR_COMBINE_OTHER_TEXTURE);
11008   }
11009   else
11010   {
11011     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11012       GR_COMBINE_FACTOR_LOCAL,
11013       GR_COMBINE_LOCAL_CONSTANT,
11014       GR_COMBINE_OTHER_TEXTURE);
11015     CA_ENV ();
11016     A_T0_ADD_T1();
11017     cmb.tmu1_a_invert = FXTRUE;
11018   }
11019 }
11020
11021 static void ac_env_sub_prim_mul_shade_add_prim () //Added by Gonetz
11022 {
11023   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
11024     GR_COMBINE_FACTOR_ONE,
11025     GR_COMBINE_LOCAL_CONSTANT,
11026     GR_COMBINE_OTHER_ITERATED);
11027   CA_PRIM ();
11028   MULSHADE_A_ENVSUBPRIM ();
11029 }
11030
11031 static void ac_env_sub_primshade_mul_t1_add_primshade ()
11032 {
11033   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
11034     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11035     GR_COMBINE_LOCAL_ITERATED,
11036     GR_COMBINE_OTHER_CONSTANT);
11037   CA_ENV ();
11038   MULSHADE_A_PRIM ();
11039   A_USE_T1 ();
11040 }
11041
11042 static void ac_one_sub_prim_mul_t0_add_prim ()
11043 {
11044   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
11045     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11046     GR_COMBINE_LOCAL_ITERATED,
11047     GR_COMBINE_OTHER_CONSTANT);
11048   CA (0xFF);
11049   SETSHADE_A_PRIM ();
11050   A_USE_T0 ();
11051 }
11052
11053 static void ac_one_sub_prim_mul_t0_add__prim_mul_env ()
11054 {
11055   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
11056     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11057     GR_COMBINE_LOCAL_ITERATED,
11058     GR_COMBINE_OTHER_CONSTANT);
11059   CA_INVPRIM ();
11060   SETSHADE_A_PRIM ();
11061   SETSHADE_A_ENV ();
11062   A_USE_T0 ();
11063 }
11064
11065 static void ac_shade_sub_t0_mul_primlod_add_prim ()
11066 {
11067   if (cmb.combine_ext)
11068   {
11069     T0ACMBEXT(GR_CMBX_ITALPHA, GR_FUNC_MODE_X,
11070       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
11071       GR_CMBX_TMU_CALPHA, 0,
11072       GR_CMBX_ZERO, 0);
11073     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (lod_frac&0xFF);
11074     cmb.tex |= 1;
11075     ACMBEXT(GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_X,
11076       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
11077       GR_CMBX_ZERO, 1,
11078       GR_CMBX_TEXTURE_ALPHA, 0);
11079     CA_PRIM ();
11080   }
11081   else
11082     ac_t0();
11083 }
11084
11085 static void ac_shade_sub_env_mul_t0_add_prim ()
11086 {
11087   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
11088     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11089     GR_COMBINE_LOCAL_CONSTANT,
11090     GR_COMBINE_OTHER_ITERATED);
11091   SUBSHADE_A_ENV ();
11092   CA_PRIM ();
11093   A_USE_T0 ();
11094 }
11095
11096 // ** A inter B using C **
11097 static void ac_t0_inter_t1_using_prima ()
11098 {
11099   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11100     GR_COMBINE_FACTOR_ONE,
11101     GR_COMBINE_LOCAL_NONE,
11102     GR_COMBINE_OTHER_TEXTURE);
11103   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
11104   A_T0_INTER_T1_USING_FACTOR (factor);
11105 }
11106
11107 static void ac_t1_inter_t0_using_prima ()
11108 {
11109   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11110     GR_COMBINE_FACTOR_ONE,
11111     GR_COMBINE_LOCAL_NONE,
11112     GR_COMBINE_OTHER_TEXTURE);
11113   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
11114   A_T1_INTER_T0_USING_FACTOR (factor);
11115 }
11116
11117 static void ac_t0_inter_t1_using_primlod ()
11118 {
11119   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11120     GR_COMBINE_FACTOR_ONE,
11121     GR_COMBINE_LOCAL_NONE,
11122     GR_COMBINE_OTHER_TEXTURE);
11123   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11124 }
11125
11126 static void ac_t0_inter_t1_using_enva ()
11127 {
11128   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11129     GR_COMBINE_FACTOR_ONE,
11130     GR_COMBINE_LOCAL_NONE,
11131     GR_COMBINE_OTHER_TEXTURE);
11132   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
11133   A_T0_INTER_T1_USING_FACTOR (factor);
11134 }
11135
11136 static void ac_t1_inter_t0_using_enva ()
11137 {
11138   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11139     GR_COMBINE_FACTOR_ONE,
11140     GR_COMBINE_LOCAL_NONE,
11141     GR_COMBINE_OTHER_TEXTURE);
11142   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
11143   A_T1_INTER_T0_USING_FACTOR (factor);
11144 }
11145
11146 //Added by Gonetz
11147 static void ac_t0_inter_t1_using_t0a ()
11148 {
11149   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11150     GR_COMBINE_FACTOR_ONE,
11151     GR_COMBINE_LOCAL_NONE,
11152     GR_COMBINE_OTHER_TEXTURE);
11153   A_T0_INTER_T1_USING_T0A ();
11154 }
11155
11156 //Added by Gonetz
11157 static void ac_t0_inter_t1_using_t1a ()
11158 {
11159   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11160     GR_COMBINE_FACTOR_ONE,
11161     GR_COMBINE_LOCAL_NONE,
11162     GR_COMBINE_OTHER_TEXTURE);
11163   A_T0_INTER_T1_USING_T1A ();
11164 }
11165
11166 //Added by Gonetz
11167 static void ac_t0_inter_t1_using_shadea ()
11168 {
11169   if (cmb.combine_ext)
11170   {
11171     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11172       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
11173       GR_CMBX_ZERO, 1,
11174       GR_CMBX_ZERO, 0);
11175   }
11176   else
11177   {
11178     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11179       GR_COMBINE_FACTOR_ONE,
11180       GR_COMBINE_LOCAL_NONE,
11181       GR_COMBINE_OTHER_TEXTURE);
11182   }
11183   A_T0_INTER_T1_USING_SHADEA ();
11184 }
11185
11186 // ** (A inter B using C) * D **
11187
11188 static void ac__t0_inter_t1_using_primlod__mul_prim ()
11189 {
11190   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11191     GR_COMBINE_FACTOR_LOCAL,
11192     GR_COMBINE_LOCAL_CONSTANT,
11193     GR_COMBINE_OTHER_TEXTURE);
11194   CA_PRIM ();
11195   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11196 }
11197
11198 static void ac__t1_mul_primlod_add_t0__mul_prim ()
11199 {
11200   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11201     GR_COMBINE_FACTOR_LOCAL,
11202     GR_COMBINE_LOCAL_CONSTANT,
11203     GR_COMBINE_OTHER_TEXTURE);
11204   CA_PRIM ();
11205   A_T1_MUL_PRIMLOD_ADD_T0 ();
11206 }
11207
11208 static void ac__t0_inter_t1_using_primlod__mul_env ()
11209 {
11210   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11211     GR_COMBINE_FACTOR_LOCAL,
11212     GR_COMBINE_LOCAL_CONSTANT,
11213     GR_COMBINE_OTHER_TEXTURE);
11214   CA_ENV ();
11215   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11216 }
11217
11218 static void ac__t1_mul_primlod_add_t0__mul_env ()
11219 {
11220   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11221     GR_COMBINE_FACTOR_LOCAL,
11222     GR_COMBINE_LOCAL_CONSTANT,
11223     GR_COMBINE_OTHER_TEXTURE);
11224   CA_ENV ();
11225   A_T1_MUL_PRIMLOD_ADD_T0 ();
11226 }
11227
11228 static void ac__t0_inter_t1_using_primlod__mul_shade ()
11229 {
11230   if (settings.hacks & hack_Makers)
11231   {
11232     //rolling rock issue - it has zero shade alpha and thus rejected by alpha compare
11233     ac_t0_inter_t1_using_primlod();
11234     return;
11235   }
11236   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11237     GR_COMBINE_FACTOR_LOCAL,
11238     GR_COMBINE_LOCAL_ITERATED,
11239     GR_COMBINE_OTHER_TEXTURE);
11240   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11241 }
11242
11243 static void ac__t1_mul_primlod_add_t0__mul_shade ()
11244 {
11245   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11246     GR_COMBINE_FACTOR_LOCAL,
11247     GR_COMBINE_LOCAL_ITERATED,
11248     GR_COMBINE_OTHER_TEXTURE);
11249   A_T1_MUL_PRIMLOD_ADD_T0 ();
11250 }
11251
11252 //Added by Gonetz
11253 static void ac__t0_inter_t1_using_prima__mul_env ()
11254 {
11255   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11256     GR_COMBINE_FACTOR_LOCAL,
11257     GR_COMBINE_LOCAL_CONSTANT,
11258     GR_COMBINE_OTHER_TEXTURE);
11259   CA_ENV ();
11260   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
11261   A_T0_INTER_T1_USING_FACTOR (factor);
11262 }
11263
11264 //Added by Gonetz
11265 static void ac__t1_inter_t0_using_t0a__mul_prim ()
11266 {
11267   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11268     GR_COMBINE_FACTOR_LOCAL,
11269     GR_COMBINE_LOCAL_CONSTANT,
11270     GR_COMBINE_OTHER_TEXTURE);
11271   CA_PRIM ();
11272   A_T1_INTER_T0_USING_T0A ();
11273 }
11274
11275 static void ac__t1_inter_t0_using_primlod__mul_prim ()
11276 {
11277   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11278     GR_COMBINE_FACTOR_LOCAL,
11279     GR_COMBINE_LOCAL_CONSTANT,
11280     GR_COMBINE_OTHER_TEXTURE);
11281   CA_PRIM ();
11282   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11283 }
11284
11285 static void ac__t1_inter_t0_using_prima__mul_env ()
11286 {
11287   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11288     GR_COMBINE_FACTOR_LOCAL,
11289     GR_COMBINE_LOCAL_CONSTANT,
11290     GR_COMBINE_OTHER_TEXTURE);
11291   CA_ENV ();
11292   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
11293   A_T1_INTER_T0_USING_FACTOR (factor);
11294 }
11295
11296 //Added by Gonetz
11297 static void ac__t0_inter_t1_using_prima__mul_shade ()
11298 {
11299   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11300     GR_COMBINE_FACTOR_LOCAL,
11301     GR_COMBINE_LOCAL_ITERATED,
11302     GR_COMBINE_OTHER_TEXTURE);
11303   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
11304   A_T0_INTER_T1_USING_FACTOR (factor);
11305 }
11306
11307 static void ac__t1_inter_t0_using_prima__mul_shade ()
11308 {
11309   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11310     GR_COMBINE_FACTOR_LOCAL,
11311     GR_COMBINE_LOCAL_ITERATED,
11312     GR_COMBINE_OTHER_TEXTURE);
11313   wxUint8 factor = (wxUint8)(rdp.prim_color&0xFF);
11314   A_T1_INTER_T0_USING_FACTOR (factor);
11315 }
11316
11317 static void ac__t0_inter_t1_using_enva__mul_prim ()
11318 {
11319   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11320     GR_COMBINE_FACTOR_LOCAL,
11321     GR_COMBINE_LOCAL_CONSTANT,
11322     GR_COMBINE_OTHER_TEXTURE);
11323   CA_PRIM ();
11324   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
11325   A_T0_INTER_T1_USING_FACTOR (factor);
11326 }
11327
11328 static void ac__env_sub_one_mul_t1_add_t0__mul_prim ()
11329 {
11330   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11331     GR_COMBINE_FACTOR_LOCAL,
11332     GR_COMBINE_LOCAL_CONSTANT,
11333     GR_COMBINE_OTHER_TEXTURE);
11334   CA_PRIM ();
11335   if (cmb.combine_ext)
11336   {
11337     T1ACMBEXT(GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_X,
11338       GR_CMBX_ITALPHA, GR_FUNC_MODE_NEGATIVE_X,
11339       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0,
11340       GR_CMBX_ZERO, 0);
11341     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11342       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11343       GR_CMBX_ZERO, 1,
11344       GR_CMBX_ZERO, 0);
11345     SETSHADE_A(0xFF);
11346     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (rdp.env_color&0xFF) ;
11347     cmb.tex |= 3;
11348   }
11349   else
11350   {
11351     wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
11352     A_T0_INTER_T1_USING_FACTOR (factor);
11353   }
11354 }
11355
11356 static void ac__t0_inter_t1_using_enva__mul_primlod ()
11357 {
11358   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11359     GR_COMBINE_FACTOR_LOCAL,
11360     GR_COMBINE_LOCAL_CONSTANT,
11361     GR_COMBINE_OTHER_TEXTURE);
11362   CA_PRIMLOD ();
11363   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
11364   A_T0_INTER_T1_USING_FACTOR (factor);
11365 }
11366
11367 static void ac__t1_mul_enva_add_t0__sub_prim_mul_shade ()
11368 {
11369   if (cmb.combine_ext)
11370   {
11371     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11372       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
11373       GR_CMBX_ITALPHA, 0,
11374       GR_CMBX_ZERO, 0);
11375     CA_PRIM ();
11376   }
11377   else
11378   {
11379     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL,
11380       GR_COMBINE_FACTOR_LOCAL,
11381       GR_COMBINE_LOCAL_ITERATED,
11382       GR_COMBINE_OTHER_TEXTURE);
11383     MULSHADE_A_PRIM ();
11384   }
11385   A_T1_MUL_ENVA_ADD_T0 ();
11386 }
11387
11388 //Added by Gonetz
11389 static void ac__t0_inter_t1_using_t0a__mul_prim ()
11390 {
11391   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11392     GR_COMBINE_FACTOR_LOCAL,
11393     GR_COMBINE_LOCAL_CONSTANT,
11394     GR_COMBINE_OTHER_TEXTURE);
11395   CA_PRIM ();
11396   A_T0_INTER_T1_USING_T0A ();
11397 }
11398
11399 //Added by Gonetz
11400 static void ac__t0_inter_t1_using_t1a__mul_prim ()
11401 {
11402   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11403     GR_COMBINE_FACTOR_LOCAL,
11404     GR_COMBINE_LOCAL_CONSTANT,
11405     GR_COMBINE_OTHER_TEXTURE);
11406   CA_PRIM ();
11407   A_T0_INTER_T1_USING_T1A ();
11408 }
11409
11410 static void ac__t0_inter_t1_using_t1a__mul_shade ()
11411 {
11412   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11413     GR_COMBINE_FACTOR_LOCAL,
11414     GR_COMBINE_LOCAL_ITERATED,
11415     GR_COMBINE_OTHER_TEXTURE);
11416   A_T0_INTER_T1_USING_T1A ();
11417 }
11418
11419 //Added by Gonetz
11420 static void ac__t0_inter_t1_using_shadea__mul_prim ()
11421 {
11422   if (cmb.combine_ext)
11423   {
11424     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11425       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
11426       GR_CMBX_CONSTANT_ALPHA, 0,
11427       GR_CMBX_ZERO, 0);
11428     A_T0_INTER_T1_USING_SHADEA ();
11429   }
11430   else
11431   {
11432     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11433       GR_COMBINE_FACTOR_LOCAL,
11434       GR_COMBINE_LOCAL_CONSTANT,
11435       GR_COMBINE_OTHER_TEXTURE);
11436     A_T0_INTER_T1_USING_FACTOR (0x7F);
11437   }
11438   CA_PRIM ();
11439 }
11440
11441 //Added by Gonetz
11442 static void ac__t0_inter_t1_using_shadea__mul_env ()
11443 {
11444   if (cmb.combine_ext)
11445   {
11446     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11447       GR_CMBX_ITALPHA, GR_FUNC_MODE_ZERO,
11448       GR_CMBX_CONSTANT_ALPHA, 0,
11449       GR_CMBX_ZERO, 0);
11450     A_T0_INTER_T1_USING_SHADEA ();
11451   }
11452   else
11453   {
11454     ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11455       GR_COMBINE_FACTOR_LOCAL,
11456       GR_COMBINE_LOCAL_CONSTANT,
11457       GR_COMBINE_OTHER_TEXTURE);
11458     A_T0_INTER_T1_USING_FACTOR (0x7F);
11459   }
11460   CA_ENV ();
11461 }
11462
11463 static void ac__t0_inter_t1_using_primlod__sub_env_mul_shade_add_shade ()
11464 {
11465   if (cmb.combine_ext)
11466   {
11467     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11468       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_NEGATIVE_X,
11469       GR_CMBX_ITALPHA, 0,
11470       GR_CMBX_ALOCAL, 0);
11471     CA_ENV ();
11472     A_T0_INTER_T1_USING_FACTOR (lod_frac);
11473   }
11474   else
11475     ac__t0_inter_t1_using_primlod__mul_shade ();
11476 }
11477
11478 //Added by Gonetz
11479 static void ac__t0_inter_t1_using_enva__mul_shade ()
11480 {
11481   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11482     GR_COMBINE_FACTOR_LOCAL,
11483     GR_COMBINE_LOCAL_ITERATED,
11484     GR_COMBINE_OTHER_TEXTURE);
11485   wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
11486   A_T0_INTER_T1_USING_FACTOR (factor);
11487 }
11488
11489 static void ac__t0_inter_t1_using_primlod__mul_prim_add_env ()
11490 {
11491   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
11492     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11493     GR_COMBINE_LOCAL_CONSTANT,
11494     GR_COMBINE_OTHER_ITERATED);
11495   CA_ENV ();
11496   SETSHADE_A_PRIM ();
11497   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11498 }
11499
11500 //Added by Gonetz
11501 static void ac__t0_inter_t1_using_primlod__mul_shade_add_prim ()
11502 {
11503   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
11504     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11505     GR_COMBINE_LOCAL_CONSTANT,
11506     GR_COMBINE_OTHER_ITERATED);
11507   CA_PRIM ();
11508   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11509 }
11510
11511 //Added by Gonetz
11512 static void ac__t0_inter_t1_using_primlod__mul_env_add__t0_inter_t1_using_primlod ()
11513 {
11514   if (cmb.combine_ext)
11515   {
11516     ACMBEXT(GR_CMBX_ZERO, GR_FUNC_MODE_ZERO,
11517       GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11518       GR_CMBX_CONSTANT_ALPHA, 0,
11519       GR_CMBX_B, 0);
11520     CA_ENV ();
11521   }
11522   else
11523   {
11524     ACMB (GR_COMBINE_FUNCTION_BLEND,
11525       GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11526       GR_COMBINE_LOCAL_CONSTANT,
11527       GR_COMBINE_OTHER_ITERATED);
11528     SETSHADE_A_ENV ();
11529     CA (0xFF);
11530   }
11531   A_T0_INTER_T1_USING_FACTOR (lod_frac);
11532 }
11533
11534 static void ac__t1_sub_one_mul_enva_add_t0__mul_prim ()
11535 {
11536   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11537     GR_COMBINE_FACTOR_LOCAL,
11538     GR_COMBINE_LOCAL_CONSTANT,
11539     GR_COMBINE_OTHER_TEXTURE);
11540   CA_PRIM ();
11541   if (cmb.combine_ext)
11542   {
11543     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
11544       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
11545       GR_CMBX_ZERO, 0,
11546       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
11547     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11548       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
11549       GR_CMBX_DETAIL_FACTOR, 0,
11550       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
11551     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (0xFF) ;
11552     cmb.tex |= 3;
11553     cmb.dc0_detailmax = cmb.dc1_detailmax = (float)(rdp.env_color&0xFF) / 255.0f;
11554   }
11555   else
11556   {
11557     // (t1-1)*env+t0, (cmb-0)*prim+0
11558     A_T0_MUL_T1 ();
11559
11560     MOD_1 (TMOD_TEX_SCALE_FAC_ADD_FAC);
11561     MOD_1_FAC (rdp.env_color & 0xFF);
11562   }
11563 }
11564
11565 static void ac__one_inter_t0_using_prim__mul_env ()
11566 {
11567   if (cmb.combine_ext)
11568   {
11569     T0ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11570       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
11571       GR_CMBX_DETAIL_FACTOR, 0,
11572       GR_CMBX_B, 0);
11573     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | (0xFF) ;
11574     cmb.tex |= 1;
11575     cmb.dc0_detailmax = cmb.dc1_detailmax = (float)(rdp.prim_color&0xFF) / 255.0f;
11576     ACMBEXT(GR_CMBX_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11577       GR_CMBX_CONSTANT_ALPHA, GR_FUNC_MODE_ZERO,
11578       GR_CMBX_CONSTANT_ALPHA, 0,
11579       GR_CMBX_ZERO, 0);
11580     CA_ENV ();
11581   }
11582   else
11583   {
11584         ac_t0_mul_prim_add_env ();
11585   }
11586 }
11587
11588 static void ac__t1_sub_one_mul_enva_add_t0__mul_shade ()
11589 {
11590   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER,
11591     GR_COMBINE_FACTOR_LOCAL,
11592     GR_COMBINE_LOCAL_ITERATED,
11593     GR_COMBINE_OTHER_TEXTURE);
11594   CA_PRIM ();
11595   if (cmb.combine_ext)
11596   {
11597     T1ACMBEXT(GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
11598       GR_CMBX_LOCAL_TEXTURE_ALPHA, GR_FUNC_MODE_ZERO,
11599       GR_CMBX_ZERO, 0,
11600       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
11601     T0ACMBEXT(GR_CMBX_OTHER_TEXTURE_ALPHA, GR_FUNC_MODE_X,
11602       GR_CMBX_TMU_CALPHA, GR_FUNC_MODE_NEGATIVE_X,
11603       GR_CMBX_DETAIL_FACTOR, 0,
11604       GR_CMBX_LOCAL_TEXTURE_ALPHA, 0);
11605     cmb.tex_ccolor = (cmb.tex_ccolor&0xFFFFFF00) | 0xFF ;
11606     percent = (rdp.env_color&0xFF) / 255.0f;
11607     cmb.dc0_detailmax = cmb.dc1_detailmax = percent;
11608     cmb.tex |= 3;
11609   }
11610   else
11611   {
11612     wxUint8 factor = (wxUint8)(rdp.env_color&0xFF);
11613     A_T0_INTER_T1_USING_FACTOR (factor);
11614   }
11615 }
11616
11617 static void ac_zero_sub_prim_mul_t0_add_prim ()
11618 {
11619   ACMB (GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
11620     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11621     GR_COMBINE_LOCAL_CONSTANT,
11622     GR_COMBINE_OTHER_ITERATED);
11623   SETSHADE_A (0);
11624   CA_PRIM ();
11625   A_USE_T0 ();
11626 }
11627
11628 static void ac_one_sub_t0_mul_primshade ()
11629 {
11630   ACMB (GR_COMBINE_FUNCTION_BLEND_LOCAL,
11631     GR_COMBINE_FACTOR_TEXTURE_ALPHA,
11632     GR_COMBINE_LOCAL_ITERATED,
11633     GR_COMBINE_OTHER_NONE);
11634   MULSHADE_A_PRIM ();
11635   A_USE_T0 ();
11636 }
11637
11638 //****************************************************************
11639 // Combine List
11640 //
11641 // 3/13/02: I have converted the combine descriptions, now using
11642 //  the correct values for each slot, instead of a one-for-all-
11643 //  slot version.  All of the descriptions marked with 'z' have
11644 //  not yet been converted or checked.  I have not totally redone
11645 //  the modes, because they should be for the most part correct
11646 //  as they are, even with the wrong descriptions. [Dave2001]
11647 //****************************************************************
11648
11649 typedef void (*cmb_func)();
11650 typedef struct {
11651   wxUint32 key;
11652   cmb_func func;
11653 } COMBINER;
11654
11655 static COMBINER color_cmb_list[] = {
11656   // { #CCSTART }
11657   // intro, Aidyn Chronicles. Added by Gonetz
11658   // (0-cmb)*env+cmb, (t1-t0)*0+t0
11659   {0x05083812, cc_t0},
11660   //terminal, Spacestation Silicon Valley. Added by Gonetz
11661   // (0-0)*0+cmb, (0-0)*0+prim
11662   {0x1fff7fff, cc_prim},
11663   //chip in Spacestation Silicon Valley intro. Added by Gonetz
11664   // (0-0)*0+cmb, (prim-0)*shade+0
11665   {0x1fffe4f3, cc_prim_mul_shade},
11666   // car, beetle adventure racing. Added by Gonetz
11667   // (t1-t0)*t0+t0, (cmb-shade)*prima+shade **can work incorrect**
11668   {0x21128a40, cc__t0_inter_t1_using_t0__sub_shade_mul_prima_add_shade},
11669   // Treasure opening, zelda
11670   // (t1-prim)*t0+t0, (prim-env)*cmb+env
11671   {0x2132a053, cc_prim_sub_env_mul__t1_sub_prim_mul_t0_add_t0__add_env},
11672   // yellow carpet, Pokemon Stadium 2
11673   // (t1-env)*t0+t0, (cmb-0)*shade+0
11674   {0x2152e4f0, cc__t1_sub_env_mul_t0_add_t0__mul_shade},
11675   // Water, doubut no mori
11676   // (t1-0)*t0+t0, (prim-0)*shade+cmb
11677   {0x21f204f3, cc__t1_mul_t0_add_t0__add_prim_mul_shade},
11678   // enemy transparent, paper mario. Addd by Gonetz
11679   // (t1-t0)*t1+t0, (env-prim)*cmb+prim
11680   {0x22126035, cc_env_sub_prim_mul__t0_inter_t1_using_t1__add_prim},
11681   // snowhead temple, zelda 2. Addd by Gonetz
11682   // (t1-t0)*t1+t0, (cmb-0)*shade+prim
11683   {0x221264f0, cc__t0_inter_t1_using_t1__mul_shade_add_prim},
11684   // snowhead temple entrance, zelda 2. Addd by Gonetz
11685   // (t1-t0)*t1+t0, (cmb-0)*prim+shade
11686   {0x221283f0, cc__t0_inter_t1_using_t1__mul_prim_add_shade},
11687   // teleportation, Spacestation Silicon Valley. Added by Gonetz
11688   // (t1-t0)*t1+t0, (prim-env)*cmb+env
11689   {0x2212a053, cc_prim_sub_env_mul__t0_inter_t1_using_t1__add_env},
11690   // pokemon fainted, Pokemon Stadium 2
11691   // (prim-t0)*t1+t0
11692   {0x22132213, cc_prim_sub_t0_mul_t1_add_t0},
11693   // attack, Ogre Battle 64
11694   // (1-t0)*t1+t0, (cmb-0)*prim+0
11695   {0x2216e3f0, cc__t0_inter_one_using_t1__mul_prim},
11696   // Some gannon spell, zelda
11697   // (t1-0)*t1+t0, (prim-0)*cmb+0
11698   {0x22f2e0f3, cc__t1_mul_t1_add_t0__mul_prim},
11699   // battle tanks 2 [Ogy]
11700   // (1-0)*t1+t0, (env-prim)*cmb+prim
11701   {0x22f66035, cc_env_sub_prim_mul__t0_add_t1__add_prim},
11702   // GASP Fighters
11703   // (1-0)*t1+t0, (shade-0)*cmb+0
11704   {0x22f6e0f4, cc__t0_add_t1__mul_shade},
11705   // parts of a car, F1 World Grand Prix. Added by Gonetz
11706   // (1-0)*t1+t0, (cmb-0)*shade+0
11707   {0x22f6e4f0, cc__t0_add_t1__mul_shade},
11708   // ???, zelda
11709   // (noise-0)*t1+t0, (prim-env)*cmb+env
11710   {0x22f7a053, cc_prim_sub_env_mul__t0_add_t1__add_env},
11711   // flashing arrow over buoy, wave race. Added by Gonetz
11712   // (t1-t0)*prim+t0, (env-cmb)*enva+cmb     ** INC **
11713   {0x23120c05, cc__t0_inter_t1_using_prim__inter_env_using_enva},
11714   // ground, zelda2. Added by Gonetz
11715   // (t1-t0)*prim+t0, (cmb-0)*shade+0
11716   {0x2312e4f0, cc__t0_inter_t1_using_prim__mul_shade},
11717   // wwf rules
11718   // (env-t0)*prim+t0
11719   {0x23152315, cc_t0_inter_env_using_prim},
11720   // Paper Mario
11721   // (1-t0)*prim+t0, (1-t0)*t0+cmb ** INC **
11722   {0x23160116, cc_t0_add_prim_mul_one_sub_t0_add_t0},
11723   // intro, castlevania. Added by Gonetz
11724   // (1-t0)*prim+t0
11725   {0x23162316, cc_one_sub_t0_mul_prim_add_t0},
11726   // Explosions, aerofighter's assault
11727   // (1-t0)*prim+t0, (shade-0)*cmb+0
11728   {0x2316e0f4, cc_t0_mul_shade},
11729   //beetle adventure racing. Added by Gonetz
11730   // (1-t0)*prim+t0, (cmb-0)*shade+0  **INC**
11731   {0x2316e4f0, cc__t0_inter_one_using_prim__mul_shade},
11732   // Unknown player background, smash bros
11733   // (noise-t0)*prim+t0   ** INC **
11734   //    {0x23172317, cc_t0},
11735   {0x23172317, cc_t0_inter_noise_using_prim},
11736   // paper mario. Added by Gonetz
11737   // (noise-prim)*prim+t0   ** INC **
11738   {0x23372337, cc_t0_add_prim},
11739   // strange mirror in stone temple, zelda 2. Added by Gonetz
11740   // (prim-env)*prim+t0, (cmb-0)*prim+0  ** INC **
11741   {0x2353e3f0, cc__prim_sub_env_mul_prim_add_t0__mul_prim},
11742   // Gilded sword, zelda 2. Added by Gonetz
11743   // (shade-env)*prim+t0, (cmb-0)*shade+env  ** INC **
11744   {0x2354a4f0, cc__t0_add_prim_mul_shade__mul_shade_add_env},
11745   // Razor sword, zelda 2. Added by Gonetz
11746   // (shade-env)*prim+t0, (cmb-0)*shade+0  ** INC **
11747   {0x2354e4f0, cc__t0_add_prim_mul_shade__mul_shade},
11748   // menu, Mischief Makers. Added by Gonetz
11749   // (0-env)*prim+t0, (cmb-0)*shade+0
11750   {0x235f235f, cc_t0_sub__prim_mul_env},
11751   // Deadly Arts logo. Added by Gonetz
11752   // (t0-0)*prim+t0
11753   {0x23f123f1, cc_t0_mul_prim},
11754   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
11755   // (shade-0)*prim+t0, (cmb-0)*shade+0  ** INC **
11756   {0x23f4e4f0, cc_t0_mul_shade},
11757   // Mischief Makers logo. Added by Gonetz
11758   // (env-0)*prim+t0
11759   {0x23f523f5, cc_prim_mul_env_add_t0},
11760   // Taken out bomb, zelda
11761   // (1-0)*prim+t0
11762   {0x23f623f6, cc_t0_add_prim},
11763   // waterfall,  Dobutsu_no_Mori
11764   // (1-0)*prim+t0, (cmb-0)*shade+t0
11765   {0x23f624f0, cc__t0_add_prim__mul_shade_add_t0},
11766   // waterfall,  Dobutsu_no_Mori
11767   // (1-0)*prim+t0, (cmb-0)*shade+t1
11768   {0x23f644f0, cc__t0_add_prim__mul_shade_add_t1},
11769   // Jabu-Jabu's Belly, zelda
11770   // (noise-0)*prim+t0
11771   {0x23f723f7, cc_t0_add_prim},
11772   // carmagedon
11773   // (0-0)*prim+t0
11774   {0x23ff23ff, cc_t0},
11775   // water, diddy kong racing. Added by Gonetz
11776   // (t1-t0)*shade+t0, (env-cmb)*env_a+cmb **INC**
11777   {0x24120c05, cc__t0_inter_t1_using_shade__inter_env_using_enva},
11778   // Advertisement hoarding, Mia Soccer. Added by Gonetz
11779   // (t1-t0)*shade+t0, (1-0)*cmb+0
11780   {0x2412e0f6, cc_t0_inter_t1_using_shade},
11781   // ground, f-zero x
11782   // (prim-t0)*shade+t0 ** INC **
11783   {0x24132413, cc__one_sub_prim_mul_shade__mul_t0_add__prim_mul_shade},
11784   // intro, F1 Racing Championship. Added by Gonetz
11785   // (env-t0)*shade+t0  ** INC *
11786   {0x24152415, cc_one_sub_t0_mul_shade_add_t0},
11787   // Sky, pilotwings
11788   // (1-t0)*shade+t0
11789   {0x24162416, cc_one_sub_t0_mul_shade_add_t0},
11790   // zelda 2 [Ogy]. Added by Gonetz
11791   // (prim-env)*shade+t0, (prim-prim)*shade+cmb ** INC ** ?
11792   {0x24530433, cc_prim_sub_env_mul_shade_add_t0},
11793   // waves, Dr. Mario
11794   // (0-center)*shade+t0
11795   {0x246f246f, cc_t0_sub__shade_mul_center},
11796   // lums, Rayman2. Added by Gonetz
11797   // (t0-0)*shade+t0  ** INC **
11798   {0x24f124f1, cc_t0}, //this one works better
11799   //    {0x24f124f1, cc_t0_mul_shade},
11800   // Goemon, mystical ninja. Added by Gonetz
11801   // (prim-0)*shade+t0
11802   {0x24f324f3, cc_prim_mul_shade_add_t0},
11803   // Sky, waverace
11804   //z (t1-t0)*env+t0      ** INC **
11805   {0x25122512, cc_t0_inter_t1_using_env},
11806   // Rare logo, Jet Force. Added by Gonetz
11807   // (t1-t0)*env+t0, (cmb-0)*prim+0      ** INC **
11808   {0x2512e3f0, cc__t0_inter_t1_using_enva__mul_prim},
11809   // ridge recer, unimp log. Added by Gonetz
11810   // (t1-t0)*env+t0, (cmb-0)*shade+0      ** INC **
11811   {0x2512e4f0, cc__t0_inter_t1_using_env__mul_shade},
11812   // menu, Mischief Makers. Added by Gonetz
11813   //(prim-t0)*env+t0      ** INC **
11814   {0x25132513, cc_one_sub_env_mul_t0_add_prim_mul_env},
11815   // Battle border, quest64
11816   // (1-t0)*env+t0
11817   {0x25162516, cc_one_sub_env_mul_t0_add_env},
11818   // Paper Mario
11819   // (noise-t0)*env+t0
11820   {0x25172517, cc_t0_inter_noise_using_env},
11821   // the lamp in the bomb shop in town, zelda 2 [Ogy]. Added by Gonetz
11822   // (t0-t1)*env+t0, (1-env)*prim+cmb      ** INC **
11823   {0x25210356, cc_one_sub_env_mul_prim_add__t0_inter_t1_using_env},
11824   // Darmani's necklace, zelda 2 [Ogy]. Added by Gonetz
11825   // (prim-shade)*env+t0, (cmb-0)*shade+0      ** INC **
11826   {0x2543e4f0, cc_t0_mul_shade_add_prim_mul_env},
11827   //    {0x2543e4f0, cc_t0_mul_shade},
11828   // mystical ninja. Added by Gonetz
11829   // (1-0)*env+t0
11830   {0x25f625f6, cc_t0_add_env},
11831   // smoke, Starshot. Added by Gonetz
11832   // (1-0)*env+t0, (1-0)*cmb+0
11833   {0x25f6e0f6, cc_t0_add_env},
11834   // mega shock, Paper Mario. Added by Gonetz
11835   // (t1-0)*scale+t0, (env-center)*cmb+prim
11836   {0x26f26065, cc__t0_add__t1_mul_scale__mul_env_sub_center_add_prim},
11837   // character select, Duck Dodgers. Added by Gonetz
11838   // (prim-t0)*t0_alpha+t0, (cmb-0)*shade+0   **INC**
11839   {0x2813e4f0, cc__t0_inter_prim_using_t0a__mul_shade},
11840   // intro, Duck Dodgers. Added by Gonetz
11841   // (shade-t0)*t0_alpha+t0   **INC**
11842   {0x28142814, cc_t0_inter_shade_using_t0a},
11843   // vermilion gym torches, Pokemon Stadium 2.
11844   // (prim-env)*t0_a+t0, (cmb-cmb)*cmb+cmb
11845   {0x28530000, cc_prim_sub_env_mul_t0a_add_t0},
11846   // F1 World Grand Prix. Added by Gonetz
11847   // (prim-0)*t0_a+t0, (cmb-0)*shade+0   ** INC **
11848   {0x28f3e4f0, cc__t0a_mul_prim_add_t0__mul_shade},
11849   // battle tanks 2 [Ogy]
11850   // (env-0)*t0_a+t0, (cmb-0)*shade+0
11851   {0x28f5e4f0, cc__t0a_mul_env_add_t0__mul_shade},
11852   // blastcorps, unimp log. Added by Gonetz
11853   // (t1-t0)*t1_alpha+t0
11854   {0x29122912, cc_t0_inter_t1_using_t1a},
11855   // paper mario. Added by Gonetz
11856   // (t1-t0)*t1_alpha+t0, (cmb-env)*env_a+env
11857   {0x2912ac50, cc__t0_inter_t1_using_t1a__sub_env_mul_enva_add_env},
11858   // Rally 2000. Added by Gonetz
11859   // (t1-t0)*t1_alpha+t0, (cmb-0)*shade+0
11860   {0x2912e4f0, cc__t0_inter_t1_using_t1a__mul_shade},
11861   // ??? in zelda ending, zelda
11862   // (1-0)*t1_alpha+t0, (prim-env)*cmb+env
11863   {0x29f6a053, cc_prim_sub_env_mul__t0_add_t1a__add_env},
11864   // Sky, zelda
11865   //z (t1-t0)*prim_a+t0
11866   {0x2a122a12, cc_t0_inter_t1_using_prima},
11867   // battle tanks [Ogy]
11868   // (t1-t0)*prim_a+t0, (env-prim)*cmb+prim
11869   {0x2a126035, cc_env_sub_prim_mul__t0_inter_t1_using_prima__add_prim},
11870   // clothes, zelda 2. Added by Gonetz
11871   // (t1-t0)*prim_a+t0, (prim-env)*cmb+env
11872   {0x2a12a053, cc_prim_sub_env_mul__t0_inter_t1_using_prima__add_env},
11873   // N64 BIOS
11874   // (t1-t0)*prim_a+t0, (cmb-0)*shade+0
11875   {0x2a12e0f4, cc__t0_inter_t1_using_prima__mul_shade},
11876   // flame, Doraemon 2. Added by Gonetz
11877   // (t1-t0)*prim_a+t0, (cmb-0)*prim+0
11878   {0x2a12e3f0, cc__t0_inter_t1_using_prima__mul_prim},
11879   // logo, PD. Added by Gonetz
11880   // (t1-t0)*prim_a+t0, (cmb-0)*shade+0
11881   {0x2a12e4f0, cc__t0_inter_t1_using_prima__mul_shade},
11882   // Pikachu
11883   // (prim-t0)*prim_a+t0, (env-cmb)*enva+cmb
11884   {0x2a130c05, cc__t0_inter_prim_using_prima__inter_env_using_enva},
11885   // 1080 snowboarding [Ogy] - 7/03/02 fixed by Dave2001. 15 Mar 2005 fixed by Gonetz.
11886   // (prim-t0)*prim_a+t0
11887   {0x2a132a13, cc_t0_inter_prim_using_prima},
11888   // menu background, Paper Mario
11889   // (prim-t0)*prim_a+t0, (prim-t1)*prim_a+t1
11890   {0x2a134a23, cc_t0_inter_prim_using_prima},
11891   //    {0x2a134a23, cc_t0},
11892   // Mickey USA
11893   // (prim-t0)*prim_a+t0, (cmb-0)*shade+0  ** INC **
11894   {0x2a13e4f0, cc_t0_mul_shade},
11895   // gunfire, Sin and Punishmen. Added by Gonetz
11896   // (env-t0)*prima+t0 **INC**
11897   {0x2a152a15, cc_t0_inter_env_using_prima},
11898   // Mystical Ninja
11899   // (0-t0)*prima+t0, (prim-env)*cmb+env ** INC **
11900   {0x2a1fa053, cc_prim_sub_env_mul__t0_sub_t0_mul_prima__add_env},
11901   // foresight attack, Pokemon Stadium 2.
11902   // (t1-prim)*prim_a+t0, (prim-env)*cmb+env
11903   {0x2a32a053, cc_prim_sub_env_mul__t1_sub_prim_mul_prima_add_t0__add_env},
11904   // arena, Pokemon Stadium 2. Added by Gonetz
11905   // (shade-prim)*prim_a+t0  ** INC **
11906   {0x2a342a34, cc_t0_mul_shade},
11907   // Torches, Paper Mario
11908   // (t1-k4)*prim_a+t0, (t1-k4)*cmb_a+cmb  ** INC **
11909   {0x2a720772, cc_t1_sub_k4_mul_prima_add_t0},
11910   // GASP Fighters. Added by Gonetz
11911   // (t0-0)*prim_a+t0, (cmb-center)*scale+0  ** INC **
11912   {0x2af1e660, cc__t0_mul_prima_add_t0__sub_center_mul_scale},
11913   // F1 World Grand Prix. Added by Gonetz
11914   // (t1-0)*prim_a+t0, (cmb-0)*shade+env
11915   {0x2af2a4f0, cc__t1_mul_prima_add_t0__mul_shade_add_env},
11916   // tidal wave, Paper Mario. Added by Gonetz
11917   // (prim-0)*prim_a+t0
11918   {0x2af32af3, cc_prim_mul_prima_add_t0},
11919   //Spacestation Silicon Valley intro. Added by Gonetz
11920   // (t1-t0)*shade_alpha+t0, (prim-shade)*cmb+shade  ** INC **
11921   {0x2b128043, cc_prim_sub_shade_mul__t0_inter_t1_using_shadea__add_shade},
11922   // water, Rocket Robot in Wheels
11923   // (t1-t0)*shade_alpha+t0, (env-shade)*cmb+shade  ** INC **
11924   {0x2b128045, cc_env_sub_shade_mul__t0_inter_t1_using_shadea__add_shade},
11925   // arena, Pokemon Stadium 2
11926   // (t1-t0)*shade_alpha+t0, (cmb-prim)*env+shade  ** INC **
11927   {0x2b128530, cc__t0_inter_t1_using_shadea__sub_prim_mul_env_add_shade},
11928   // Rocket Robot in Wheels intro
11929   // (t1-t0)*shade_a+t0, (shade-0)*cmb+0  ** INC **
11930   {0x2b12e0f4, cc__t0_inter_t1_using_shadea__mul_shade},
11931   // water, Mickey USA
11932   // (t1-t0)*shade_a+t0, (cmb-0)*shade+0  ** INC **
11933   {0x2b12e4f0, cc__t0_inter_t1_using_shadea__mul_shade},
11934   // Extreme G. Added by Gonetz
11935   // (shade-t0)*shade_alpha+t0
11936   {0x2b142b14, cc_shade_sub_t0_mul_shadea_add_t0},
11937   // Jet Force Gemini. Added by Gonetz
11938   // (shade-t0)*shade_alpha+t0, (cmb-0)*prim+0  ** INC **
11939   {0x2b14e3f0, cc_t0_mul_prim_add_shade_mul_shadea_mul_prim},
11940   // V8-2
11941   // (env-t0)*shade_alpha+t0, (cmb-0)*shade+0  ** INC **
11942   {0x2b15e4f0, cc__t0_inter_env_using_shadea__mul_shade},
11943   // Earthquake pokemon attack, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
11944   // (t1-0)*shade_alpha+t0, (prim-env)*cmb+env ** INC **
11945   {0x2bf2a053, cc_prim_sub_env_mul__t0_add_t1__add_env},
11946   // pads, Pokemon Stadium 2. Added by Gonetz
11947   // (0-0)*shade_alpha+t0, (prim-env)*cmba+env
11948   {0x2bffa753, cc_prim_sub_env_mul_t0a_add_env},
11949   // paper mario. Added by Gonetz
11950   // (t1-t0)*env_a+t0, (1-cmb)*prim+cmb
11951   {0x2c120306, cc_one_sub__t0_inter_t1_using_enva__mul_prim_add__t0_inter_t1_using_enva},
11952   // Amoeba boss, water temple, zelda
11953   // (t1-t0)*env_a+t0, (cmb-env)*prim+t0  ** INC **
11954   {0x2c122350, cc__t0_inter_t1_using_enva__sub_env},
11955   // paper mario. Added by Gonetz
11956   // (t1-t0)*env_a+t0
11957   {0x2c122c12, cc_t0_inter_t1_using_enva},
11958   // paper mario. Added by Gonetz
11959   // (t1-t0)*env_a+t0, (1-prim)*cmb+prim
11960   {0x2c126036, cc_one_sub_prim_mul__t0_inter_t1_using_enva__add_prim},
11961   //Arena, Pokemon Stadium 2
11962   // (t1-t0)*env_a+t0, (cmb-0)*shade+prim
11963   {0x2c1264f0, cc__t0_inter_t1_using_enva__mul_shade_add_prim},
11964   // water, jet force. Added by Gonetz
11965   // (t1-t0)*env_a+t0, (prim-shade)*cmb+shade
11966   {0x2c128043, cc_prim_sub_shade_mul__t0_inter_t1_using_enva__add_shade},
11967   // Faries, zelda
11968   //z (t1-t0)*env_a+t0, (prim-env)*cmb+env
11969   {0x2c12a053, cc_prim_sub_env_mul__t0_inter_t1_using_enva__add_env},
11970   // paper mario. Added by Gonetz
11971   // (t1-t0)*env_a+t0, (prim-center)*cmb+env
11972   {0x2c12a063, cc_prim_sub_center_mul__t0_inter_t1_using_enva__add_env},
11973   // pads, Pokemon Stadium 2. Added by Gonetz
11974   // (t1-t0)*env_a+t0, (cmb-prim)*shade+env  ** INC **
11975   {0x2c12a430, cc__t0_inter_t1_using_enva__mul_shade_add_env},
11976   // Scary dead thing boss, zelda
11977   // (t1-t0)*env_a+t0, (cmb-t1)*cmb_a+env
11978   {0x2c12a720, cc__t0_inter_t1_using_enva__mul_env},
11979   // something in a menu, PokemonStadium2, [Raziel64]
11980   // (t1-t0)*env_a+t0, (prim-env)*cmb_a+env
11981   {0x2c12a753, cc_prim_sub_env_mul__t0_inter_t1_using_enva_alpha__add_env},
11982   // Arena, pokemon Stadium
11983   // (t1-t0)*env_a+t0, (cmb-shade)*prim+0
11984   {0x2c12e340, cc__t0_inter_t1_using_enva__sub_shade_mul_prim},
11985   // Water in zora's place, zelda
11986   // (t1-t0)*env_a+t0, (cmb-0)*prim+0
11987   {0x2c12e3f0, cc__t0_inter_t1_using_enva__mul_prim},
11988   // Ground, zelda
11989   //z (t1-t0)*env_a+t0, (cmb-k5)*shade+cmb_a
11990   {0x2c12e4f0, cc__t0_inter_t1_using_enva__mul_shade},
11991   // zelda, uninmp log.  Added by Gonetz
11992   //(t1-t0)*env_a+t0, (cmb-0)*env+0
11993   {0x2c12e5f0, cc__t0_inter_t1_using_enva__mul_env},
11994   // Spheres, waverace
11995   //z (env-t0)*env_a+t0
11996   {0x2c152c15, cc_t0_inter_env_using_enva},//cc_t0},
11997   // backgrounds, Mario Golf. Added by Gonetz
11998   // (env-t0)*env_a+t0, (shade-0)*cmb+0
11999   {0x2c15e0f4, cc__t0_inter_env_using_enva__mul_shade},
12000   // ground on Volcano level, DKR, [Raziel64]
12001   // (env-t0)*env_a+t0, (cmb-0)*shade+0
12002   {0x2c15e4f0, cc__t0_inter_env_using_enva__mul_shade},
12003   // Nintendo 'N', zelda
12004   //z (t0-prim)*env_a+t0, (prim-env)*cmb+env
12005   {0x2c31a053, cc_prim_sub_env_mul__t0_sub_prim_mul_enva_add_t0__add_env},
12006   // Nintendo title & saria's song, zelda
12007   //z (t1-prim)*env_a+t0, (prim-env)*cmb+env
12008   {0x2c32a053, cc_prim_sub_env_mul__t1_sub_prim_mul_enva_add_t0__add_env},
12009   // Hover boots flying, zelda
12010   // (t1-prim)*env_a+t0, (prim-0)*cmb+env
12011   {0x2c32a0f3, cc__t1_sub_prim_mul_enva_add_t0__mul_prim_add_env},
12012   // star beam, paper mario
12013   // (prim-env)*env_a+t0
12014   {0x2c532c53, cc_prim_sub_env_mul_enva_add_t0},
12015   // Kotake & koume's hair, zelda
12016   // (t1-0)*env_a+t0, (prim-env)*cmb+env
12017   {0x2cf2a053, cc_prim_sub_env_mul__t1_mul_enva_add_t0__add_env},
12018   //Goldeneye, [Jeremy]. Added by Gonetz
12019   // (t0-t0)*lodf+t0, (cmb-0)*prim+0
12020   {0x2d11e3f0, cc_t0_mul_prim},
12021   // Pilot wings
12022   // (t1-t0)*lodf+t0, (one-cmb)*prim+cmb
12023   {0x2d120306, cc_one_sub_prim_mul__t0_inter_t1_using_primlod__add_prim},
12024   // Pilot wings
12025   // (t1-t0)*lodf+t0, (one-cmb)*shade+cmb
12026   {0x2d120406, cc_one_sub_shade_mul__t0_inter_t1_using_primlod__add_shade},
12027   // Indy Racing 2000. Added by Gonetz
12028   // (t1-t0)*lodf+t0, (env-cmb)*prima+cmb  ** INC **
12029   {0x2d120a05, cc_t0_inter_t1_using_primlod},
12030   // (t1-t0)*lodf+t0
12031   {0x2d122d12, cc_t0_inter_t1_using_primlod},
12032   //broken wall, beetle adventure racing. Added by Gonetz
12033   // (t1-t0)*lodf+t0, (shade-prim)*cmb+prim
12034   {0x2d126034, cc_shade_sub_prim_mul__t0_inter_t1_using_primlod__add_prim},
12035   //Intro, CBFD. Added by Gonetz
12036   // (t1-t0)*lodf+t0, (shade-env)*cmb+prim
12037   //    {0x2d126054, cc_shade_sub_env_mul_t0_add_prim},
12038   {0x2d126054, cc_shade_sub_env_mul__t0_inter_t1_using_primlod__add_prim},
12039   // bassmasters 2000 [Ogy]
12040   // (t1-t0)*lodf+t0, (env-0)*cmb+prim  ** INC **
12041   {0x2d1260f5, cc_t0_mul_env_add_prim},
12042   // sign, CBFD. Added by Gonetz
12043   // (t1-t0)*lodf+t0, (cmb-env)*shade+prim ** INC **
12044   {0x2d126450, cc__t0_inter_t1_using_primlod__sub_env_mul_shade_add_prim},
12045   //    {0x2d126450, cc_t0_sub_env_mul_shade_add_prim},
12046   // landscape, Cruis'n Exotica. Added by Gonetz
12047   // (t1-t0)*lodf+t0, (cmb-0)*shade+prim
12048   {0x2d1264f0, cc__t0_inter_t1_using_primlod__mul_shade_add_prim},
12049   // blast corps [Ogy]
12050   // (t1-t0)*lodf+t0, (0-0)*0+shade
12051   {0x2d129fff, cc__t0_inter_t1_using_primlod__mul_shade},
12052   // End of level, zelda
12053   // (t1-t0)*lodf+t0, (prim-env)*cmb+env
12054   {0x2d12a053, cc_prim_sub_env_mul__t0_inter_t1_using_primlod__add_env},
12055   // Rocket Robot in Wheels intro
12056   // (t1-t0)*lodf+t0, (shade-env)*cmb+env
12057   {0x2d12a054, cc_shade_sub_env_mul__t0_inter_t1_using_primlod__add_env},
12058   // basket, Fox Sport
12059   // (t1-t0)*lodf+t0, (prim-env)*t0+env
12060   {0x2d12a153, cc_prim_sub_env_mul__t0_inter_t1_using_primlod__add_env},
12061   // paper mario. Added by Gonetz
12062   // (t1-t0)*lodf+t0, (cmb-0)*prim+env    ** INC **
12063   {0x2d12a3f0, cc__t0_inter_t1_using_primlod__mul_prim_add_env},
12064   // Tony Hawk Pro Skater
12065   // (t1-t0)*lodf+t0, (cmb-0)*shade+env
12066   {0x2d12a4f0, cc__t0_inter_t1_using_primlod__mul_shade_add_env},
12067   // part of a building, Spiderman. Added by Gonetz
12068   // (t1-t0)*lodf+t0, (cmb-env)*cmba+env    ** INC **
12069   {0x2d12a750, cc_t0_inter_t1_using_primlod},
12070   // Mike Piazza's Strike Zone
12071   // (t1-t0)*lodf+t0, (shade-prim)*cmb+0
12072   {0x2d12e034, cc_shade_sub_prim_mul__t0_inter_t1_using_primlod},
12073   // intro, F1 Racing Championship. Added by Gonetz
12074   // (t1-t0)*lodf+t0, (shade-env)*cmb+0
12075   {0x2d12e054, cc_shade_sub_env_mul__t0_inter_t1_using_primlod},
12076   // stands, F1 Racing Championship. Added by Gonetz
12077   // (t1-t0)*lodf+t0, (1-env)*cmb+0
12078   {0x2d12e056, cc_one_sub_env_mul__t0_inter_t1_using_primlod},
12079   // court, Mario Tennis. Added by Gonetz
12080   // (t1-t0)*lodf+t0, (prim-0)*cmb+0
12081   {0x2d12e0f3, cc__t0_inter_t1_using_primlod__mul_prim},
12082   // Rocket Robot in Wheels intro
12083   // (t1-t0)*lodf+t0, (shade-0)*cmb+0
12084   {0x2d12e0f4, cc__t0_inter_t1_using_primlod__mul_shade},
12085   // Pilot wings
12086   // (t1-t0)*lodf+t0, (cmb-0)*t0+0 ** INC **
12087   {0x2d12e1f0, cc_t0_inter_t1_using_primlod},
12088   // cars wheels, SF Rush 2049. Added by Gonetz
12089   // (t1-t0)*lodf+t0, (cmb-0)*prim+0
12090   {0x2d12e3f0, cc__t0_inter_t1_using_primlod__mul_prim},
12091   // Bridge, sf rush
12092   // (t1-t0)*lodf+t0, (cmb-0)*shade+0
12093   //    {0x2d12e4f0, cc_t0_mul_shade},
12094   {0x2d12e4f0, cc__t0_inter_t1_using_primlod__mul_shade},
12095   // blast corps [Ogy]
12096   // (t1-t0)*lodf+t0, (t0-0)*shade+0
12097   {0x2d12e4f1, cc_t0_mul_shade},
12098   // field, Mike Piazza's Strike Zone
12099   // (t1-t0)*lodf+t0, (cmb-prim)*env+0   ** INC **
12100   {0x2d12e530, cc__t0_inter_t1_using_primlod__mul_env},
12101   // radar, Perfect Dark
12102   // (t1-t0)*lodf+t0, (cmb-0)*env+0
12103   {0x2d12e5f0, cc__t0_inter_t1_using_primlod__mul_env},
12104   // planet, Blast Corps
12105   // (t1-t0)*lodf+t0, (cmb-0)*prima+0
12106   {0x2d12eaf0, cc__t0_inter_t1_using_primlod__mul_prima},
12107   // zelda 2. Added by Gonetz
12108   // (t0-t0)*primlod+t0, (prim-env)*cmb+env
12109   {0x2e11a053, cc_prim_sub_env_mul_t0_add_env},
12110   // zelda 2. Added by Gonetz
12111   // (t1-t0)*primlod+t0, (0-0)*shade+cmb
12112   {0x2e1204ff, cc_t0_inter_t1_using_primlod},
12113   // zelda 2. Added by Gonetz
12114   // (t1-t0)*primlod+t0, (env-prim)*primlod+cmb
12115   {0x2e120d35, cc_prim_sub_env_mul_primlod_add__t0_inter_t1_using_primlod},
12116   // lamppost, Ridge Racer. Added by Gonetz
12117   // (t1-t0)*primlod+t0
12118   {0x2e122e12, cc_t0_inter_t1_using_primlod},
12119   // Hearts, zelda
12120   //z (t1-t0)*primlod+t0, (shade-prim)*cmb+prim
12121   {0x2e126034, cc_shade_sub_prim_mul__t0_inter_t1_using_primlod__add_prim},
12122   // Sunny Day, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
12123   // (t1-t0)*primlod+t0, (env-prim)*cmb+prim
12124   {0x2e126035, cc_env_sub_prim_mul__t0_inter_t1_using_primlod__add_prim},
12125   // snowhead temple, zelda 2. Added by Gonetz
12126   // (t1-t0)*primlod+t0, (cmb-env)*shade+prim  ** INC **
12127   {0x2e126450, cc__t0_inter_t1_using_primlod__mul_shade_add_prim},
12128   // snow on a wall, snowhead temple, zelda 2. Added by Gonetz
12129   // (t1-t0)*primlod+t0, (cmb-0)*shade+prim
12130   {0x2e1264f0, cc__t0_inter_t1_using_primlod__mul_shade_add_prim},
12131   // Morning Sun, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
12132   // (t1-t0)*primlod+t0, (cmb-0)*0+prim
12133   {0x2e127ff0, cc_prim},
12134   // arena, Pokemon Stadium 2. Added by Gonetz
12135   // (t1-t0)*primlod+t0, (cmb-prim)*shade+shade  ** INC **
12136   {0x2e128430, cc__t0_inter_t1_using_primlod__mul_shade},
12137   // Pokemon Stadium 2. Added by Gonetz
12138   // (t1-t0)*primlod+t0, (cmb-env)*cmb+env  ** INC **
12139   {0x2e12a050, cc_t0_inter_t1_using_primlod},
12140   // End of level heart, zelda
12141   // (t1-t0)*primlod+t0, (prim-env)*cmb+env
12142   {0x2e12a053, cc_prim_sub_env_mul__t0_inter_t1_using_primlod__add_env},
12143   // Huge turtle appearance, zelda 2. Added by Gonetz
12144   // (t1-t0)*primlod+t0, (1-env)*cmb+env
12145   {0x2e12a056, cc_one_sub_env_mul__t0_inter_t1_using_primlod__add_env},
12146   // frozen octorok, zelda 2. Added by Gonetz
12147   // (t1-t0)*primlod+t0, (prim-env)*t1+env
12148   {0x2e12a253, cc_prim_sub_env_mul_t1_add_env},
12149   // fall headwaters, zelda 2. Added by Gonetz
12150   // (t1-t0)*primlod+t0, (cmb-env)*shade+env  ** INC **
12151   {0x2e12a450, cc__t0_inter_t1_using_primlod__sub_env_mul_shade_add_env},
12152   // Fissure attack, pokemon stadium 2
12153   // (t1-t0)*primlod+t0, (prim-env)*cmb_a+env
12154   {0x2e12a753, cc_prim_sub_env_mul__t0_inter_t1_using_primlod__add_env},
12155   // zelda 2. Added by Gonetz
12156   // (t1-t0)*primlod+t0, (cmb-0)*t1+0  ** INC ** ?
12157   {0x2e12e2f0, cc_t0_inter_t1_using_primlod},
12158   // zelda 2. Added by Gonetz
12159   // (t1-t0)*primlod+t0, (cmb-0)*prim+0
12160   {0x2e12e3f0, cc__t0_inter_t1_using_primlod__mul_prim},
12161   // sky, PGA European Tour
12162   // (t1-t0)*primlod+t0, (cmb-env)*shade+0  ** INC **
12163   {0x2e12e450, cc__t0_inter_t1_using_primlod__mul_shade},
12164   // Kirby's pool, smash bros
12165   // (t1-t0)*primlod+t0, (cmb-0)*shade+0
12166   {0x2e12e4f0, cc__t0_inter_t1_using_primlod__mul_shade},
12167   //Spacestation Silicon Valley intro. Added by Gonetz
12168   // (prim-t0)*primlod+t0, (cmb-0)*shade+0  **INC**
12169   {0x2e132e13, cc_t0_inter_prim_using_primlod},
12170   // explosions, daikatana. Added by Gonetz
12171   // (prim-t0)*primlod+t0, (cmb-0)*shade+0  **INC**
12172   {0x2e13e4f0, cc_t0_mul_shade},
12173   //Mike Piazza's Strike Zone logo. Added by Gonetz
12174   // (shade-t0)*primlod+t0
12175   {0x2e142e14, cc_t0_inter_shade_using_primlod},
12176   // Cartridge color (transfer pak}, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
12177   // (1-t0)*primlod+t0
12178   {0x2e162e16, cc_one_sub_t0_mul_primlod_add_t0},
12179   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
12180   // (1-t0)*primlod+t0, (prim-0)*cmb+0
12181   {0x2e16e0f3, cc__t0_inter_one_using_primlod__mul_prim},
12182   // Spider Web attack, Pokemon Stadium 2.
12183   // (1-t0)*primlod+t0, (cmb-0)*prim+0
12184   {0x2e16e3f0, cc__t0_inter_one_using_primlod__mul_prim},
12185   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
12186   // (1-t0)*primlod+t0, (cmb-0)*shade+0
12187   {0x2e16e4f0, cc__t0_inter_one_using_primlod__mul_shade},
12188   // zelda 2. Added by Gonetz
12189   // (t1-t1)*primlod+t0, (prim-env)*cmb+env
12190   {0x2e22a053, cc_prim_sub_env_mul_t0_add_env},
12191   // Shadow Ball, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
12192   // (0-t1)*primlod+t0, (prim-env)*cmb+env  ** INC **
12193   {0x2e2fa053, cc_prim_sub_env_mul_t0_add_env},
12194   // Skulltula coin solid, zelda
12195   // (t0-prim)*primlod+t0, (prim-env)*cmb+env
12196   {0x2e31a053, cc_prim_sub_env_mul__t0_sub_prim_mul_primlod_add_t0__add_env},
12197   // Triforce lines, zelda
12198   // (t1-prim)*primlod+t0, (prim-shade)*cmb+shade
12199   {0x2e328043, cc_prim_sub_shade_mul__t1_sub_prim_mul_primlod_add_t0__add_shade},
12200   // moon when majora defeated, zelda 2. Added by Gonetz
12201   // (t1-prim)*primlod+t0, (1-shade)*cmb+shade
12202   {0x2e328046, cc_one_sub_shade_mul__t1_sub_prim_mul_primlod_add_t0__add_shade},
12203   // Fire, zelda
12204   //z (t1-prim)*primlod+t0, (prim-env)*cmb+env    ** INC **
12205   {0x2e32a053, cc_prim_sub_env_mul__t1_sub_prim_mul_primlod_add_t0__add_env},
12206   // zelda 2 [Ogy]. Added by Gonetz
12207   // (t1-prim)*primlod+t0, (shade-env)*cmb+env
12208   {0x2e32a054, cc_shade_sub_env_mul__t1_sub_prim_mul_primlod_add_t0__add_env},
12209   // Scary face, pokemon stadium 2
12210   // (t1-prim)*primlod+t0, (1-env)*cmb+env
12211   {0x2e32a056, cc_one_sub_env_mul__t1_sub_prim_mul_primlod_add_t0__add_env},
12212   // zelda 2. Added by Gonetz
12213   // (t1-prim)*primlod+t0, (prim-0)*cmb+env
12214   {0x2e32a0f3, cc__t1_sub_prim_mul_primlod_add_t0__mul_prim_add_env},
12215   // zelda 2. Added by Gonetz
12216   // (t1-0)*primlod+t0, (prim-env)*cmb+env
12217   {0x2ef2a053, cc_prim_sub_env_mul__t1_mul_primlod_add_t0__add_env},
12218   // zelda 2. Added by Gonetz
12219   // (t1-0)*primlod+t0, (cmb-0)*prim+0
12220   {0x2ef2e3f0, cc__t1_mul_primlod_add_t0__mul_prim},
12221   // zelda 2. Added by Gonetz
12222   // (t1-0)*primlod+t0, (cmb-0)*env+0
12223   {0x2ef2e5f0, cc__t1_mul_primlod_add_t0__mul_env},
12224   // gun, Doom64. Added by Gonetz
12225   // (1-0)*primlod+t0, (cmb-0)*prim+env
12226   {0x2ef6a3f0, cc__t0_add_primlod__mul_prim_add_env},
12227   // walls, Doom64. Added by Gonetz
12228   // (1-0)*primlod+t0, (cmb-0)*shade+env
12229   {0x2ef6a4f0, cc__t0_add_primlod__mul_shade_add_env},
12230   // Pokemon Stadium 2. Added by Gonetz
12231   // (noise-0)*primlod+t0, (prim-env)*cmb+env  ** INC **
12232   {0x2ef7a053, cc_prim_sub_env_mul_t0_add_env},
12233   // Tony Hawk's Pro Skater. Added by Gonetz
12234   // (t1-t0)*k5+t0
12235   {0x2f122f12, cc_t0_inter_t1_using_k5},
12236   // F1 World Grand Prix. Added by Gonetz
12237   // (t1-t0)*k5+t0, (cmb-0)*shade+0    **INC**
12238   {0x2f12e4f0, cc__t0_inter_t1_using_k5__mul_shade},
12239   // Turok 3 [scorpiove]. Added by Gonetz
12240   // (t0-k4)*k5+t0
12241   {0x2f712f71, cc_t0},
12242   // THPS 3
12243   // (env-0)*k5+t0,
12244   {0x2ff52ff5, cc_t0_add_env_mul_k5},
12245   // super bowling
12246   // (0-0)*k5+t0,
12247   {0x2fff0000, cc_t0},
12248   // super bowling
12249   // (0-0)*k5+t0
12250   {0x2fff2fff, cc_t0},
12251   // Moonlight attack, pokemon stadium 2
12252   // (t1-t0)*0+t0, (prim-env)*cmb+env
12253   {0x3f12a053, cc_prim_sub_env_mul_t0_add_env},
12254   //C&C shadows
12255   //(1-env)*0+t0
12256   {0x3f563f56, cc_t0},
12257   // RARE logo, blast corps. Added by Gonetz
12258   // (t0-0)*0+t0
12259   {0x3ff13ff1, cc_t0},
12260   // the ground below the scarecrow in the trading post in town, zelda 2 [Ogy]. Added by Gonetz
12261   // (t1-0)*0+t0, (cmb-0)*shade+0
12262   {0x3ff2e4f0, cc_t0_mul_shade},
12263   // intro, background, Dezaemon 3D
12264   // (1-0)*0+t0
12265   {0x3ff63ff6, cc_t0},
12266   // intro of WWF WrestleMania 2000
12267   // ((0-0)*0+t0, (env-cmb)*prim+cmb
12268   {0x3fff0305, cc_env_sub_t0_mul_prim_add_t0},
12269   // pistol fire, Turok
12270   // ((0-0)*0+t0, (env-cmb)*shade+cmb
12271   {0x3fff0405, cc_env_sub_t0_mul_shade_add_t0},
12272   // Tony Hawk's Pro Skater. Added by Gonetz
12273   // ((0-0)*0+t0, (t1-0)*shade+cmb ** INC **
12274   {0x3fff04f2, cc_t0},
12275   // Dr. Mario [Ogy]. Added by Gonetz
12276   // ((0-0)*0+t0, (prim-cmb)*env+cmb
12277   {0x3fff0503, cc_prim_sub_t0_mul_env_add_t0},
12278   // Stained glass, quest64
12279   // (0-0)*0+t0, (1-0)*env+cmb
12280   {0x3fff05f6, cc_t0_add_env},
12281   // Health bar, killer instinct gold
12282   // (0-0)*0+t0, (prim-env)*prim_a+cmb
12283   {0x3fff0a53, cc_prim_sub_env_mul_prima_add_t0},
12284   // Runes, Turok - Dinosaur Hunter. Added by Gonetz
12285   // (0-0)*0+t0, (env-cmb)*env_a+cmb
12286   {0x3fff0c05, cc_t0_inter_env_using_enva},
12287   // intro, Mission Impossible. Added by Gonetz
12288   // (k5-k5)*0+t0, (0-0)*scale+t0
12289   {0x3fff26ff, cc_t0},
12290   // V8-2
12291   // (0-0)*0+t0, (t0-k4)*k5+t0
12292   {0x3fff2f71, cc_t0_sub_k4_mul_k5_add_t0},
12293   // TM, mario
12294   //z (k5-k5)*0+t0
12295   {0x3fff3fff, cc_t0},
12296   // Intro, CBFD. Added by Gonetz
12297   // ((0-0)*0+t0, (shade-env)*cmb+prim
12298   {0x3fff6054, cc_shade_sub_env_mul_t0_add_prim},
12299   // Text, Mia Soccer. Added by Gonetz
12300   // ((0-0)*0+t0, (0-0)*0+prim
12301   {0x3fff7fff, cc_t0},
12302   // paper mario. Added by Gonetz
12303   // ((0-0)*0+t0, (prim-env)*cmb+env
12304   {0x3fffa053, cc_prim_sub_env_mul_t0_add_env},
12305   // Objects in arena, pokemon stadium 2
12306   // (0-0)*0+t0, (cmb-prim)*shade+env
12307   {0x3fffa430, cc_t0_mul_prim},
12308   // intro, F1 Racing Championship. Added by Gonetz
12309   // (0-0)*0+t0, (shade-env)*cmb+0
12310   {0x3fffe054, cc_shade_sub_env_mul_t0},
12311   // stands, F1 Racing Championship. Added by Gonetz
12312   // (0-0)*0+t0, (1-env)*cmb+0
12313   {0x3fffe056, cc_one_sub_env_mul_t0},
12314   // ? (from log)
12315   // (0-0)*0+t0, (prim-0)*cmb+0
12316   {0x3fffe0f3, cc_t0_mul_prim},
12317   // background, GASP Fighters
12318   // (0-0)*0+t0, (shade-0)*cmb+0
12319   {0x3fffe0f4, cc_t0_mul_shade},
12320   // zelda 2 [Ogy]. Added by Gonetz
12321   // (0-0)*0+t0, (env-0)*cmb+0
12322   {0x3fffe0f5, cc_t0_mul_env},
12323   // logo, v-rally 99
12324   // (0-0)*0+t0, (prim-0)*t0+0
12325   {0x3fffe1f3, cc_t0_mul_prim},
12326   // target hit, zelda 2. Added by Gonetz
12327   // (0-0)*0+t0, (cmb-0)*prim+0
12328   {0x3fffe3f0, cc_t0_mul_prim},
12329   // Ms. Pac-Man intro background. Added by Gonetz
12330   // (0-0)*0+t0, (cmb-0)*shade+0
12331   {0x3fffe4f0, cc_t0_mul_shade},
12332   //  Wonder Project J2 logo. Added by Gonetz
12333   // (0-0)*0+t0, (t0-0)*shade+0
12334   {0x3fffe4f1, cc_t0_mul_shade},
12335   // tire trace, Monster truck madness. Added by Gonetz
12336   // (0-0)*0+t0, (cmb-0)*env+0
12337   {0x3fffe5f0, cc_t0_mul_env},
12338   // Gauntlet Legends intro. Added by Gonetz
12339   // (0-0)*0+t0, (cmb-0)*ecale+0
12340   {0x3fffe6f0, cc_t0},
12341   // tire trace, beetle adventure racing. Added by Gonetz
12342   // (t1-t0)*t0+t1, (cmb-t0)*shade+t1   **INC**
12343   {0x41124410, cc__t0_inter_t1_using_t0__mul_shade},
12344   // Paper Mario. Added by Gonetz
12345   // (t0-t1)*t0+t1   **INC**
12346   {0x41214121, cc_t1_inter_t0_using_t0},
12347   // Powered Star Beam, Paper Mario. Added by Gonetz
12348   // (t0-t1)*t0+t1, (env-prim)*cmb+prim   **INC**
12349   {0x41216035, cc_env_sub_prim_mul__t1_inter_t0_using_t0__add_prim},
12350   // wetrix raiseland [Raziel64]. Added by Gonetz
12351   // (prim-t1)*t0+t1, (env-t0)*cmb+cmb   **INC**
12352   {0x41230015, cc_env_sub_prim_mul__t0_mul_t1__add_prim},
12353   // SCARS. Added by Gonetz
12354   // (t1-t0)*t0+t1, (cmb-t0)*shade+t1   **INC**
12355   {0x41250b03, cc__t0_inter_t1_using_half__mul_shade},
12356   //beetle adventure racing. Added by Gonetz
12357   //(t0-t1)*t1+t1, (cmb-0)*shade+0  **INC**
12358   {0x4221e4f0, cc__t1_inter_t0_using_t1__mul_shade},
12359   // cianwood gym walls, pokemon stadium 2
12360   //(t0-prim)*t1+t1, (cmb-0)*env+shade
12361   {0x423185f0, cc__t0_sub_prim_mul_t1_add_t1__mul_env_add_shade},
12362   // cianwood gym walls, pokemon stadium 2
12363   //(t0-prim)*t1+t1, (cmb-0)*shade+0
12364   {0x4231e4f0, cc__t0_sub_prim_mul_t1_add_t1__mul_shade},
12365   // paper mario. Added by Gonetz
12366   // (t0-t0)*prim+t1, (t1-cmb)*cmb+env  **INC** weird
12367   {0x4311a002, cc_env},
12368   // background, Wetrix level 1, [Raziel64]. Added by Gonetz
12369   // (t0-t1)*prim+t1
12370   {0x43214321, cc_t1_inter_t0_using_prim},
12371   // Mario Party3 Tidal Toss
12372   // (t0-t1)*prim+t1, (cmb-0)*shade+0  **INC**
12373   {0x4321e4f0, cc__t1_inter_t0_using_prim__mul_shade},
12374   // grass, ISS 2k. Added by Gonetz
12375   // (t0-t1)*prim+t1, (cmb-0)*env+0  **INC**
12376   {0x4321e5f0, cc__t1_inter_t0_using_prim__mul_env},
12377   // intro, Paper Mario
12378   // (t0-0)*prim+t1
12379   {0x43f143f1, cc_t0_mul_prim_add_t1},
12380   // F1 World Grand Prix. Added by Gonetz
12381   // (t0-0)*prim+t1, (cmb-0)*shade+env  **INC**
12382   {0x43f1a4f0, cc__t0_add_t1__mul_shade_add_env},
12383   // field, ISS64. Added by Gonetz
12384   // (t0-t1)*shade+t1, (cmb-t1)*prim+t1  ** INC **
12385   {0x44214320, cc_t0_sub_t1_mul_prim_mul_shade_add_t1},
12386   //    {0x44214320, cc__t0_add_t1__mul_prim},
12387   // field, Top gear hyper-bike
12388   // (t0-t1)*shade+t1
12389   {0x44214421, cc_t1_inter_t0_using_shade},
12390   // water, goemon great adventure
12391   // (t0-t1)*env+t1 ** INC **
12392   {0x45214521, cc_t1_inter_t0_using_env},
12393   // characters, Ogre Battle. Added by Gonetz
12394   // (1-t1)*env+t1, (1-cmb)*prim+cmb  ** INC **
12395   {0x45260306, cc_one_sub_t1_mul_prim_add_t1},
12396   // characters, Ogre Battle. Added by Gonetz
12397   // (1-t1)*env+t1
12398   {0x45264526, cc_one_sub_t1_mul_env_add_t1},
12399   // characters, Ogre Battle. Added by Gonetz
12400   // (1-t1)*env+t1, (cmb-0)*prim+0  ** INC **
12401   {0x4526e3f0, cc__t1_inter_one_using_env__mul_prim},
12402   // explosion, body harvest. Added by Gonetz
12403   // (t0-t1)*scale+t1, (env-prim)*cmb+prim  ** INC **
12404   {0x46216035, cc_env_sub_prim_mul__t0_inter_t1_using_half__add_prim},
12405   // Water, AeroGauge. Added by Gonetz
12406   // (t0-t1)*prima+t1, (0-0)*0+cmb
12407   {0x4a214a21, cc_t1_inter_t0_using_prima},
12408   // flame, castlevania 2. Added by Gonetz
12409   // (t0-t1)*prima+t1, (prim-env)*cmb+env
12410   {0x4a21a053, cc_prim_sub_env_mul__t1_inter_t0_using_prima__add_env},
12411   // shadows, Mario Tennis. Added by Gonetz
12412   // (t0-t1)*prima+t1, (prim-0)*cmb+0
12413   {0x4a21e0f3, cc__t1_inter_t0_using_prima__mul_prim},
12414   // menu, Mario Golf. Added by Gonetz
12415   // (t0-t1)*prima+t1, (shade-0)*cmb+0
12416   {0x4a21e0f4, cc__t1_inter_t0_using_prima__mul_shade},
12417   // intro, castlevania 2. Added by Gonetz
12418   // (t0-t1)*prima+t1, (cmb-0)*prim+0
12419   {0x4a21e3f0, cc__t1_inter_t0_using_prima__mul_prim},
12420   // water on map, Ogre Battle64. Added by Gonetz
12421   // (t0-t1)*prima+t1, (cmb-0)*shade+0
12422   {0x4a21e4f0, cc__t1_inter_t0_using_prima__mul_shade},
12423   // Ice, Paper Mario
12424   // (t0-t1)*shade_a+t1
12425   {0x4b214b21, cc_t1_inter_t0_using_shadea},
12426   // Grass, Beetle Adventure Racing
12427   // (t0-t1)*shade_a+t1, (cmb-0)*shade+0
12428   {0x4b21e4f0, cc__t1_inter_t0_using_shadea__mul_shade},
12429   // Ground at kotake & koume, zelda
12430   // (t1-t0)*env_a+t0, (prim-env)*cmb+env
12431   {0x4c12a053, cc_prim_sub_env_mul__t0_inter_t1_using_enva__add_env},
12432   // Tony Hawk's Pro Skater. Added by Gonetz
12433   // (t0-t1)*env_a+t1, (cmb-0)*shade+cmb  ** INC **
12434   {0x4c2104f0, cc__t1_inter_t0_using_enva__mul_shade},
12435   // bikes, xg2. Added by Gonetz
12436   // (t0-t1)*env_a+t1, (cmb-prim)*prima+prim
12437   {0x4c216a30, cc__t1_inter_t0_using_enva__sub_prim_mul_prima_add_prim},
12438   // Yoshi Story
12439   // (t0-t1)*env_a+t1, (prim-env)*cmb+env
12440   {0x4c21a053, cc_prim_sub_env_mul__t1_inter_t0_using_enva__add_env},
12441   // arena, Pokemon Stadium 1. Added by Gonetz
12442   // (t0-t1)*env_a+t1, (cmb-0)*prim+0
12443   {0x4c21e3f0, cc__t1_inter_t0_using_enva__mul_prim},
12444   // "end of chapter" text, paper mario. Added by Gonetz
12445   // (1-t1)*env_a+t1, (cmb-0)*t1+0
12446   {0x4c26e2f0, cc__t1_inter_one_using_enva__mul_t0},
12447   // Zelda opening door, zelda
12448   // (t0-prim)*env_a+t1, (prim-env)*t0+env
12449   {0x4c31a053, cc_prim_sub_env_mul_t0_add_env},
12450   // arena, Pokemon Stadium 2
12451   // (t0-0)*env_a+t1, (cmb-0)*shade+prim
12452   {0x4cf164f0, cc__t0_mul_enva_add_t1__mul_shade_add_prim},
12453   // Kotake & koume magic poof, zelda
12454   // (t0-0)*env_a+t1, (prim-env)*cmb+env
12455   {0x4cf1a053, cc_prim_sub_env_mul__t0_mul_enva_add_t1__add_env},
12456   // ground in stone temple, zelda 2. Added by Gonetz
12457   // (t1-t0)*primlod+t1, (cmb-0)*prim+0
12458   {0x4e12e3f0, cc__t0_inter_t1_using_primlod__mul_prim},
12459   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
12460   // (noise-t0)*primlod+t1, (prim-env)*cmb+env  ** INC **
12461   {0x4e17a053, cc_prim_sub_env_mul__t0_inter_t1_using_primlod__add_env},
12462   // menu, pokemon stadium 1, [Raziel64]
12463   // (t0-t1)*lodf+t1, (prim-env)*cmb+env
12464   {0x4e214e21, cc_t1_inter_t0_using_primlod},
12465   // Pokemon backgrounds, pokemon stadium 2
12466   // (t0-t1)*primlod+t1, (cmb-0)*shade+prim
12467   {0x4e2164f0, cc__t1_inter_t0_using_primlod__mul_shade_add_prim},
12468   // Pokemon backgrounds, pokemon stadium 2
12469   // (t0-t1)*lodf+t1, (prim-env)*cmb+env
12470   {0x4e21a053, cc_prim_sub_env_mul__t1_inter_t0_using_primlod__add_env},
12471   // zelda 2 [Ogy]. Added by Gonetz
12472   // (t0-t1)*primlod+t1, (t1-cmb)*prim+env     ** INC **
12473   {0x4e21a302, cc_env_sub__t0_sub_t1_mul_primlod__mul_prim},
12474   // Magnitude, pokemon stadium 2
12475   // (t0-t1)*primlod+t1, (prim-env)*cmb_a+env
12476   {0x4e21a753, cc_prim_sub_env_mul__t1_inter_t0_using_primlod__add_env},
12477   // Arena, pokemon stadium 2
12478   // (t0-t1)*primlod+t1, (cmb-shade)*prim+0
12479   {0x4e21e340, cc__t1_inter_t0_using_primlod__sub_shade_mul_prim},
12480   // zelda 2 [Ogy]. Added by Gonetz
12481   // (t0-t1)*primlod+t1, (cmb-0)*shade+0
12482   {0x4e21e4f0, cc__t1_inter_t0_using_primlod__mul_shade},
12483   // lava in snowhead temple, zelda 2. Added by Gonetz
12484   // (t0-prim)*primlod+t1, (cmb-prim)*shade+cmb     ** INC **
12485   {0x4e310430, cc_lavatex_sub_prim_mul_shade_add_lavatex},
12486   // Skulltula coin, zelda
12487   // (t0-prim)*primlod+t1, (prim-env)*cmb+env
12488   {0x4e31a053, cc_prim_sub_env_mul__t0_sub_prim_mul_primlod_add_t1__add_env},
12489   // Pokemon background, pokemon stadium 2
12490   // (noise-shade)*primlod+t1, (prim-env)*cmb+env
12491   {0x4e47a053, cc_prim_sub_env_mul_t1_add_env},
12492   // Reflect, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
12493   // (t0-0)*primlod+t1, (prim-env)*cmb+env
12494   {0x4ef1a053, cc_prim_sub_env_mul__t0_add_t1__add_env},
12495   //beetle adventure racing. Added by Gonetz
12496   //(t0-t1)*k5+t1, (cmb-0)*shade+0
12497   {0x4f21e4f0, cc__t1_inter_t0_using_k5__mul_shade},
12498   // Spiderman. Added by Gonetz
12499   //(t0-t1)*k5+t1, (cmb-0)*env+0
12500   {0x4f21e5f0, cc_t1_mul_env},
12501   // N64 logo, Ogre Battle. Added by Gonetz
12502   //(0-0)*0+t1
12503   {0x5fff5fff, cc_t1},
12504   // reversing light, Monster truck madness. Added by Gonetz
12505   //(0-0)*0+t0, (0-0)*0+prim
12506   {0x5fff7fff, cc_prim},
12507   // battle tanks [Ogy]
12508   // (0-0)*0+t1, (env-shade)*cmb+shade
12509   {0x5fff8045, cc_env_sub_shade_mul_t1_add_shade},
12510   // minigame, pokemon stadium 1. Added by Gonetz
12511   // (0-0)*0+t1, (prim-env)*cmb+env
12512   {0x5fffa053, cc_prim_sub_env_mul_t1_add_env},
12513   // F1 World Grand Prix. Added by Gonetz
12514   // (t0-prim)*t0+prim, (cmb-0)*shade
12515   {0x6131e4f0, cc__prim_inter_t0_using_t0__mul_shade},
12516   // aerofighter's assault [Ogy]
12517   // (shade-prim)*t0+prim
12518   {0x61346134, cc_shade_sub_prim_mul_t0_add_prim},
12519   // pilot wings
12520   // (shade-prim)*t0+prim, (cmb-shade)*shadea+shade
12521   {0x61348b40, cc_shade_inter__prim_inter_shade_using_t0__using_shadea},
12522   // club blow, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
12523   // (shade-prim)*t0+prim, (cmb-env)*cmb_a+env ** INC **
12524   {0x6134a750, cc_shade_sub_prim_mul_t0_add_prim},
12525   // sky, Killer Instinct
12526   // (shade-prim)*t0+prim, (cmb-env)*shade_a+env ** INC **
12527   {0x6134ab50, cc_env_inter__prim_inter_shade_using_t0__using_shadea},
12528   // lava, beetle adventure racing
12529   // (shade-prim)*t0+prim, (cmb-0)*t1+0 ** INC **
12530   {0x6134e2f0, cc_shade_sub_prim_mul_t0_add_prim},
12531   // Monster truck madness intro. Added by Gonetz
12532   // (env-prim)*t0+prim, (cmb-0)*scale+cmb ** INC **
12533   {0x613506f0, cc_env_sub_prim_mul_t0_add_prim},
12534   // pokemon attack, Pokemon stadium 1
12535   // (env-prim)*t0+prim, (cmb-0)*0+cmb
12536   {0x61351ff0, cc_env_sub_prim_mul_t0_add_prim},
12537   // Paper Mario, fortune teller spheres
12538   // (env-prim)*t0+prim, (cmb-0)*t1+t0  ** INC **
12539   {0x613522f0, cc_t0_mul_t1_add_t0},
12540   // Later hearts, zelda
12541   // (env-prim)*t0+prim
12542   {0x61356135, cc_env_sub_prim_mul_t0_add_prim},
12543   // Mission Impossible. Added by Gonetz
12544   // (env-prim)*t0+prim, (shade-0)*cmb+0  ** INC **
12545   {0x6135e0f4, cc__prim_inter_env_using_t0__mul_shade},
12546   // crashing other vehicle, Monster truck madness [Raziel64]. Added by Gonetz
12547   // (env-prim)*t0+prim, (cmb-0)*t0+0  ** INC **
12548   {0x6135e1f0, cc_env_sub_prim_mul_t0_add_prim},
12549   // Tony Hawk's Pro Skater. Added by Gonetz
12550   // (env-prim)*t0+prim, (cmb-0)*t1+0  ** INC **
12551   {0x6135e2f0, cc_env_sub_prim_mul_t0_add_prim},
12552   // aerofighter's assault [Ogy]
12553   // (env-prim)*t0+prim, (cmb-0)*shade+0  ** INC **
12554   {0x6135e4f0, cc__prim_inter_env_using_t0__mul_shade},
12555   // "time out", paper mario. Added by Gonetz
12556   // (1-prim)*t0+prim, (1-cmb)*enva+cmb  ** INC **
12557   {0x61360c06, cc_one_sub_prim_mul_t0_add_prim},
12558   // intro, paper mario. Added by Gonetz
12559   // (1-prim)*t0+prim, (cmb-0)*prima+t0  ** INC **
12560   {0x61362af0, cc__one_sub_prim_mul_t0_add_prim__mul_prima_add__one_sub_prim_mul_t0_add_prim},
12561   // paper mario. Added by Gonetz
12562   // (1-prim)*t0+prim
12563   {0x61366136, cc_one_sub_prim_mul_t0_add_prim},
12564   // arena, Pokemon Stadium 2. Added by Gonetz
12565   // (1-prim)*t0+prim, (cmb-env)*shade+shade  ** INC **
12566   {0x61368450, cc_t0_mul_shade},
12567   // F1 World Grand Prix. Added by Gonetz
12568   // (1-prim)*t0+prim, (cmb-0)*shade+0 ** INC **
12569   {0x6136e4f0, cc_t0_mul_shade},
12570   // Xena. Added by Gonetz
12571   // (0-prim)*t0+prim
12572   {0x613f613f, cc_one_sub_t0_mul_prim},
12573   // Kirby64 end [Raziel64]. Added by Gonetz
12574   // (prim-env)*t0+prim
12575   {0x61536153, cc_prim_sub_env_mul_t0_add_prim},
12576   // Xena. Added by Gonetz
12577   // (shade-env)*t0+prim
12578   {0x61546154, cc_shade_sub_env_mul_t0_add_prim},
12579   // Karts, mario kart
12580   //z (one-env)*t0+prim
12581   {0x61566156, cc_t0_mul_1menv_add_prim},
12582   // Famista64. Added by Gonetz
12583   //(t0-0)*t0+prim
12584   {0x61f161f1, cc_t0_mul_prim},
12585   // Pokemon Stadium 2. Added by Gonetz
12586   //(shade-0)*t0+prim
12587   {0x61f461f4, cc_t0_mul_shade_add_prim},
12588   // Doom. Added by Gonetz
12589   //(1-0)*t0+prim
12590   {0x61f661f6, cc_t0_add_prim},
12591   // tire trace, beetle adventure racing. Added by Gonetz
12592   // (shade-prim)*t1+prim, (cmb-0)*t1+0  **INC**
12593   {0x6234e2f0, cc_shade_sub_prim_mul_t1_add_prim},
12594   // Text, turok
12595   // (env-prim)*t1+prim
12596   {0x62356235, cc_env_sub_prim_mul_t1_add_prim},
12597   // Pokemon Stadium 2, [gokuss4]. Added by Gonetz
12598   // (env-prim)*t1+prim, (cmb-0)*t1+0
12599   // Hack alert!
12600   {0x6235e2f0, cc_t1},
12601   // bike trace, xg2 intro. Added by Gonetz
12602   // (1-prim)*t1+prim
12603   {0x62366236, cc_one_sub_prim_mul_t1_add_prim},
12604   // aerofighter's assault [Ogy]
12605   // (1-prim)*t1+prim, (cmb-0)*0+env
12606   {0x6236bff0, cc_one_sub_prim_mul_t1_add_prim},
12607   // Tennis court, mario tennis
12608   // (t0-0)*t1+prim
12609   {0x62f162f1, cc__t0_mul_t1__add_prim},
12610   // Arena, Pokemon Stadium 2
12611   // (t0-0)*t1+prim, (cmb-0)*shade+0
12612   {0x62f1e4f0, cc__t0_mul_t1_add_prim__mul_shade},
12613   // Rush2. Added by Gonetz
12614   // (prim-prim)*prim+prim
12615   {0x63336333, cc_prim},
12616   //Bowser in final battle, Paper Mario. Added by Gonetz
12617   // (t1-0)*prim+prim
12618   {0x63f263f2, cc_t1_mul_prim_add_prim},
12619   // wetrix, icelayer, [Raziel64]. Added by Gonetz
12620   // (t0-prim)*shade+prim  ** INC **
12621   {0x64316431, cc_t0_mul_shade},
12622   // KI. Added by Gonetz
12623   // (env-prim)*shade+prim
12624   {0x64356435, cc_env_sub_prim_mul_shade_add_prim},
12625   // xg2. Added by Gonetz
12626   // (1-prim)*shade+prim, (t0-0)*cmb+0  ** INC **
12627   {0x6436e0f1, cc_t1_mul__one_sub_prim_mul_shade_add_prim},
12628   // Intro, CBFD. Added by Gonetz
12629   // (t0-env)*shade+prim
12630   {0x64516451, cc_t0_sub_env_mul_shade_add_prim},
12631   // sword in final battle, zelda 2. Added by Gonetz
12632   // (t0-env)*shade+prim, (cmb-0)*shade+0 ** INC **
12633   {0x6451e4f0, cc__t0_sub_env_mul_shade_add_prim__mul_shade},
12634   // attack, Pokemon Stadium 2.
12635   // (t0-env)*shade+prim, (cmb-0)*shade_a+0 ** INC **
12636   {0x6451ebf0, cc__t0_sub_env_mul_shade_add_prim__mul_shadea},
12637   // Road Rush. Added by Gonetz
12638   // (t0-0)*shade+prim
12639   {0x64f164f1, cc_t0_mul_shade_add_prim},
12640   // paper mario. Added by Gonetz
12641   // (1-0)*shade+prim
12642   {0x64f664f6, cc_prim_add_shade},
12643   // Character select, smash bros
12644   // (t0-prim)*env+prim
12645   {0x65316531, cc_t0_sub_prim_mul_env_add_prim},
12646   // Clear screen intro, banjo kazooie
12647   // (t0-prim)*env+prim, (cmb-0)*shade+0
12648   //    {0x6531e4f0, cc_t0_mul_env_mul_shade},
12649   {0x6531e4f0, cc__prim_inter_t0_using_env__mul_shade},
12650   // Dragonfly feet, banjo kazooie
12651   // (1-prim)*env+prim, (cmb-0)*shade+0
12652   {0x6536e4f0, cc__prim_inter_one_using_env__mul_shade},
12653   // Lava piranha atack, Paper Mario
12654   // (t1-k4)*env+prim       ** INC **
12655   {0x65726572, cc_t1_mul_env_add_prim},
12656   // zelda 2 [Ogy]. Added by Gonetz
12657   // (t0-0)*env+prim, (1-t1)*t0a+cmb  ** INC **
12658   {0x65f10826, cc_one_sub_t1_mul_t0a_add_t0_mul_env_add_prim},
12659   // clocks while warping through time, zelda 2
12660   // (t0-0)*env+prim, (cmb-0)*0+cmb
12661   {0x65f11ff0, cc_t0_mul_env_add_prim},
12662   // Helicopter, Nuclear Strike. Added by Gonetz
12663   // (t0-0)*env+prim
12664   {0x65f165f1, cc_t0_mul_env_add_prim},
12665   // Mystical Ninja
12666   // (1-0)*env+prim
12667   {0x65f665f6, cc_prim_add_env},
12668   // duke nukem: zero hour [Ogy]
12669   // (noise-0)*env+prim     ** INC **
12670   {0x65f765f7, cc_prim_add_env},
12671   // "terminator", CBFD
12672   // (0-0)*env+prim
12673   {0x65ff65ff, cc_prim},
12674   // Cliffs, Taz express. Added by Gonetz
12675   // (t0-0)*scale+prim
12676   {0x66f166f1, cc_t0_mul_scale_add_prim},
12677   // Taz express. Added by Gonetz
12678   // (t0-0)*scale+prim, (cmb-0)*shade+0
12679   {0x66f1e4f0, cc_t0_mul_scale_add_prim__mul_shade},
12680   // NFL Quarterback Club 98 Menu [CpUMasteR]
12681   // (prim-0)*scale+prim
12682   {0x66f366f3, cc_prim},
12683   // Pikachu
12684   // (t0-prim)*t0_a+prim, (env-cmb)*enva+cmb
12685   {0x68310c05, cc__prim_inter_t0_using_t0a__inter_env_using_enva},
12686   // Character, dual heroes
12687   // (t0-prim)*t0_a+prim
12688   {0x68316831, cc_t0_sub_prim_mul_t0a_add_prim},
12689   // Indy Racing 2000. Added by Gonetz
12690   // (t0-prim)*t0_a+prim, (cmb-0)*shade+0    ** INC **
12691   {0x6831e4f0, cc__prim_inter_t0_using_t0a__mul_shade},
12692   // text, Sin and Punishmen. Added by Gonetz
12693   // (env-prim)*t0_a+prim    ** INC **
12694   {0x68356835, cc_env_sub_prim_mul_t0a_add_prim},
12695   // arena, Pokemon Stadium 2
12696   // (1-prim)*t0_a+prim
12697   {0x68366836, cc_one_sub_prim_mul_t0a_add_prim},
12698   // menu, PD. Added by Gonetz
12699   // (env-prim)*t1_a+prim
12700   {0x69356935, cc_env_sub_prim_mul_t1a_add_prim},
12701   //    {0x69356935, cc_t1},
12702   //xg2. Added by Gonetz
12703   // (t0-prim)*prima+prim
12704   {0x6a316a31, cc_t0_sub_prim_mul_prima_add_prim},
12705   // menu, battle phoenix 64. Added by Gonetz
12706   // (env-prim)*prima+prim
12707   {0x6a356a35, cc_env_sub_prim_mul_prima_add_prim},
12708   // ground, KI. Added by Gonetz
12709   // (shade-env)*prima+prim
12710   {0x6a546a54, cc_shade_sub_env_mul_prima_add_prim},
12711   // F1 World Grand Prix. Added by Gonetz
12712   // (t0-0)*prima+prim, (shade-0)*cmb+env **INC**
12713   {0x6af1a0f4, cc__t0_mul_prima_add_prim_mul__shade_add_env},
12714   //broken wall, beetle adventure racing. Added by Gonetz
12715   // (t0-0)*prima+prim, (cmb-0)*shade+0 **INC**
12716   {0x6af1e4f0, cc__t0_mul_prima_add_prim_mul__shade},
12717   // Genie, diddy kong racing
12718   // (t0-prim)*shade_alpha+prim, (env-cmb)*shade+cmb
12719   //    {0x6b310405, cc_env_sub__prim_inter_t0_using_shadea__mul_shade_add_env},
12720   {0x6b310405, cc_t0_mul_shadea},
12721   // Extreme G. Added by Gonetz
12722   // (t0-prim)*shade_alpha+prim  ** INC **
12723   {0x6b316b31, cc_t0_sub_prim_mul_shadea_add_prim},
12724   // water block, Paper Mario. Added by Gonetz
12725   // (t0-prim)*shade_alpha+prim, (prim-env)*cmb+env  ** INC **
12726   {0x6b31a053, cc_prim_sub_env_mul__prim_inter_t0_using_shadea__add_env},
12727   // water, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
12728   // (t0-prim)*shade_alpha+prim, (cmb-0)*shade+0  ** INC **
12729   {0x6b31e4f0, cc__prim_inter_t0_using_shadea__mul_shade},
12730   // F1 World Grand Prix sky. Added by Gonetz
12731   // (env-prim)*shade_alpha+prim, (shade-cmb)*cmb_a+cmb ** INC **
12732   {0x6b350704, cc_f1_sky},
12733   // lullaby, Paper Mario. Added by Gonetz
12734   // (env-prim)*shade_alpha+prim
12735   {0x6b356b35, cc_env_sub_prim_mul_shadea_add_prim},
12736   // Some gannon spell, zelda
12737   // (noise-t0)*env_a+prim, (0-prim)*cmb+1  ** INC **
12738   {0x6c17c03f, cc_one_sub__one_sub_t0_mul_enva_add_prim__mul_prim},
12739   //Goldeneye, [Jeremy]. Added by Gonetz
12740   // (t0-prim)*env_a+prim
12741   {0x6c316c31, cc_t0_sub_prim_mul_enva_add_prim},
12742   // button, Sin and Punishmen. Added by Gonetz
12743   // (env-prim)*env_a+prim
12744   {0x6c356c35, cc_env_sub_prim_mul_enva_add_prim},
12745   // frame buffer effect, Glover2
12746   // (env-prim)*env_a+prim, (cmb-0)*shade+0
12747   {0x6c35e4f0, cc__prim_inter_env_using_enva__mul_shade},
12748   // fallen stars at star summit, Paper Mario. Added by Gonetz
12749   // (t0-env)*env_a+prim, (1-0)*primlod+cmb
12750   {0x6c510ef6, cc_t0_sub_env_mul_enva_add_prim},
12751   // focus, Paper Mario. Added by Gonetz
12752   // (t0-env)*env_a+prim, (cmb-shade)*shadea+shade  ** INC **
12753   {0x6c518b40, cc_t0_sub_shade_mul_shadea_add_shade},
12754   // Ring, pokemon stadium 2
12755   // (t0-0)*env_a+prim, (1-0)*cmb+0
12756   {0x6cf1e0f6, cc_t0_mul_enva_add_prim},
12757   // Jet Force
12758   // (noise-0)*env_a+prim
12759   {0x6cf76cf7, cc_prim},
12760   // snowhead temple, zelda 2. Added by Gonetz
12761   // (t1-t0)*primlod+prim, (cmb-0)*shade+shade
12762   {0x6e1284f0, cc__t1_sub_t0_mul_primlod_add_prim__mul_shade_add_shade},
12763   // zelda 2. Added by Gonetz
12764   // (t1-t0)*primlod+prim, (cmb-0)*shade+0  ** INC **
12765   {0x6e12e4f0, cc__t1_sub_t0_mul_primlod_add_prim__mul_shade},
12766   // mini games quiz monitor backround, Pokemon Stadium 2
12767   // (noise-t0)*primlod+prim, (prim-env)*cmb+env  ** INC **
12768   {0x6e17a053, cc_prim_sub_env_mul__one_sub_t0_mul_primlod_add_prim__add_env},
12769   // Morning Sun attack, pokemon stadium 2
12770   // (t0-prim)*primlod+prim, (prim-env)*0+cmb
12771   {0x6e311f53, cc_t0_sub_prim_mul_primlod_add_prim},
12772   // sky, daikatana. Added by Gonetz
12773   // (t0-prim)*primlod+prim, (cmb-0)*shade+0
12774   {0x6e31e4f0, cc_t0_mul_shade},
12775   // ball's track, NFL Blitz. Added by Gonetz
12776   // (t0-0)*primlod+prim
12777   {0x6ef16ef1, cc_t0_mul_primlod_add_prim},
12778   // Earthquake pokemon attack, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
12779   // (t0-0)*primlod+prim, (cmb-env)*cmb_a+env ** INC **
12780   {0x6ef1a750, cc_t0_mul_primlod_add_prim},
12781   // mini games quiz monitor backround, Pokemon Stadium 2
12782   // (noise-0)*primlod+prim, (env-cmb)*cmb_a+cmb ** INC **
12783   // use cmb_a which is ac_t0_mul_t1
12784   {0x6ef70705, cc_env_sub_prim_mul__t0a_mul_t1a__add_prim},
12785   // rope, CBFD
12786   // (t0-env)*k5+prim
12787   {0x6f516f51, cc_t0_sub_env_mul_k5_add_prim},
12788   // super bowling
12789   // (0-0)*k5+prim
12790   {0x6fff6fff, cc_prim},
12791   // intro, Aidyn Chronicles. Added by Gonetz
12792   // (0-0)*0+prim, (0-0)*0+prim
12793   {0x79fb7788, cc_prim},
12794   // Encore attack, Pokemon Stadium 2
12795   // (t0-0)*0+prim, (cmb-0)*shade+0
12796   {0x7ff1e4f0, cc_prim_mul_shade},
12797   // Menu, megaman
12798   // (1-0)*0+prim
12799   {0x7ff67ff6, cc_prim},
12800   // sky, PGA European Tour
12801   // (0-0)*0+prim, (env-0)*t0+cmb
12802   {0x7fff01f5, cc_t1_mul_env_add_prim},
12803   // WWF No Mercy?
12804   // ((0-0)*0+prim, (env-cmb)*shade+cmb
12805   {0x7fff0405, cc_env_sub_prim_mul_shade_add_prim},
12806   // sky, Spiderman. Added by Gonetz
12807   // (0-0)*0+prim, (t1-0)*shade+cmb
12808   {0x7fff04f2, cc_t1_mul_shade_add_prim},
12809   // ball's shadow, ISS 2k. Added by Gonetz
12810   // (0-0)*0+prim, (1-cmb)*env+cmb
12811   {0x7fff0506, cc_one_sub_prim_mul_env_add_prim},
12812   // Necklace, quest64
12813   // (0-0)*0+prim, (1-0)*env+cmb
12814   {0x7fff05f6, cc_prim_add_env},
12815   // Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
12816   // (0-0)*0+prim, (1-cmb)*cmba+cmb ** INC **
12817   {0x7fff0706, cc_prim},
12818   // Dobutsu no Mori. Added by Gonetz
12819   //(k5-k5)*0+prim, (cmb-0)*0+cmb
12820   {0x7fff1ff0, cc_prim},
12821   // Intro background, starfox
12822   //z (k5-k5)*0+prim
12823   {0x7fff7fff, cc_prim},
12824   // train smoke, Dobutsu No Mori. Added by Gonetz
12825   //(0-0)*0+prim, (shade-0)*cmb+0
12826   {0x7fffe0f4, cc_prim_mul_shade},
12827   // Donald Duck intro. Added by Gonetz
12828   //(0-0)*0+prim, (cmb-0)*prim+0
12829   {0x7fffe3f0, cc_prim_mul_prim},
12830   // Ms. Pac-Man intro. Added by Gonetz
12831   //(0-0)*0+prim, (cmb-0)*shade+0
12832   {0x7fffe4f0, cc_prim_mul_shade},
12833   // zelda 2.  Added by Gonetz
12834   //(t1-t0)*t0+shade, (cmb-0)*shade+0
12835   {0x8112e4f0, cc__t1_sub_t0_mul_t0_add_shade__mul_shade},
12836   // branches, Beetle Adventure Racing
12837   //(t0-shade)*t0+shade, (t0-cmb)*prim+cmb **INC**
12838   {0x81410301, cc_t0_mul_prim},
12839   // Namco logo, Famista 64
12840   //(prim-shade)*t0+shade, (env-cmb)*t0+cmb **INC**
12841   {0x81430105, cc_prim_sub_shade_mul_t0_add_shade},
12842   // pikachu, hey you pikachu
12843   //(prim-shade)*t0+shade, (env-cmb)*enva+cmb **INC**
12844   {0x81430c05, cc_prim_sub_shade_mul_t0_add_shade},
12845   // Mario's head, mario //Added by Gonetz
12846   //(prim-shade)*t0+shade
12847   {0x81438143, cc_prim_sub_shade_mul_t0_add_shade},
12848   // Iguana background, turok
12849   // (env-shade)*t0+shade
12850   {0x81458145, cc_env_sub_shade_mul_t0_add_shade},
12851   //attack, Pokemon Stadium 2
12852   // (env-shade)*t0+shade, (cmb-0)*prim+0
12853   {0x8145e3f0, cc__env_sub_shade_mul_t0_add_shade__mul_prim},
12854   // Bubbles in Jabu-Jabu's belly, zelda
12855   // (1-shade)*t0+shade
12856   {0x81468146, cc_one_sub_shade_mul_t0_add_shade},
12857   // saffron city, Pokemon Stadium 2
12858   // (1-shade)*t0+shade, (cmb-0)*prim+0
12859   {0x8146e3f0, cc__one_sub_shade_mul_t0_add_shade__mul_prim},
12860   // duck dodgers intro. Added by Gonetz
12861   // (1-shade)*t0+shade, (cmb-0)*shade+0
12862   {0x8146e4f0, cc__one_sub_shade_mul_t0_add_shade__mul_shade},
12863   // saffron city, Pokemon Stadium 2
12864   // (1-shade)*t0+shade, (cmb-0)*prima+0
12865   {0x8146eaf0, cc__one_sub_shade_mul_t0_add_shade__mul_env},
12866   // intro, Madden Footbal
12867   // (1-env)*t0+shade
12868   {0x81568156, cc_one_sub_env_mul_t0_add_shade},
12869   // sky in doom. Added by Gonetz
12870   // (prim-0)*t0+shade, (cmb-0)*primlod+env  **INC**
12871   {0x81f3aef0, cc_t0_mul_prim_add_shade},
12872   // commercial? in IIS98. Added by Gonetz
12873   // (1-0)*t0+shade
12874   {0x81f681f6, cc_t0_add_shade},
12875   //attack, Pokemon Stadium 2
12876   //(t0-prim)*t1+shade
12877   {0x82318231, cc_t0_sub_prim_mul_t1_add_shade},
12878   //beetle adventure racing. Added by Gonetz
12879   //(prim-shade)*t1+shade, (cmb-0)*t1+0  **INC**
12880   {0x8243e2f0, cc_prim_sub_shade_mul_t1_add_shade},
12881   //Arena, Pokemon Stadium 2
12882   //(t0-0)*t1+shade
12883   {0x82f182f1, cc__t0_mul_t1__add_shade},
12884   //Arena, Pokemon Stadium 2
12885   //(t0-0)*t1+shade, (cmb-0)*prim+0
12886   {0x82f1e3f0, cc__t0_mul_t1__mul_prim_add_prim_mul_shade},
12887   // Scorpion fire breath, MK4 [Jeremy]. Added by Gonetz
12888   // (t0-shade)*prim+shade
12889   {0x83418341, cc_t0_mul_prim_add_one_sub_prim_mul_shade},
12890   // Menu background, wwf no mercy
12891   // (env-shade)*prim+shade
12892   {0x83458345, cc_prim_mul_env_add_one_sub_prim_mul_shade},
12893   // Pokemon selection window background, pokemon stadium 2
12894   // (noise-shade)*prim+shade
12895   {0x83478347, cc_shade},
12896   // crown of king of ikana, zelda 2. Added by Gonetz
12897   // (t0-env)*prim+shade
12898   {0x83518351, cc_t0_sub_env_mul_prim_add_shade},
12899   // crown of king of ikana, zelda 2. Added by Gonetz
12900   // (t0-env)*prim+shade, (cmb-0)*cmb+0  ** INC **
12901   {0x8351e0f0, cc_t0_sub_env_mul_prim_add_shade},
12902   // salesman's shirt in the bomb shop in town, zelda 2 [Ogy]. Added by Gonetz
12903   // (t0-env)*prim+shade, (cmb-0)*shade+0  ** INC **
12904   {0x8351e4f0, cc_t0_mul_prim_mul_shade},
12905   // intro, Madden Footbal
12906   // (1-env)*prim+shade
12907   {0x83568356, cc_one_sub_env_mul_prim_add_shade},
12908   // Buss hunter 64. Added by Gonetz
12909   // (t0-0)*prim+shade
12910   {0x83f183f1, cc_t0_mul_prim_add_shade},
12911   // huge water lilies, zelda 2 [Ogy]. Added by Gonetz
12912   // (t0-0)*prim+shade, (cmb-env)*shade+0  ** INC **
12913   {0x83f1e450, cc__t0_mul_prim_add_shade__sub_env_mul_shade},
12914   // cynnabar gym fire shield, pokemon stadium 2
12915   // (t0-0)*prim+shade, (cmb-0)*env+0  ** INC **
12916   {0x83f1e5f0, cc__t0_mul_prim_add_shade__mul_env},
12917   // Objects in arena, pokemon stadium 2
12918   // (t1-0)*prim+shade, (cmb-0)*prim_a+0  - not going to bother with prim_a since it is FF
12919   {0x83f2eaf0, cc_t1_mul_prim_add_shade},
12920   // Pokemon Stadium 2. Added by Gonetz
12921   // (t0-prim)*shade+shade  ** INC **
12922   {0x84318431, cc_t0_mul_shade},
12923   // big N, Pokemon Stadium 2. Added by Gonetz
12924   // (1-prim)*shade+shade  ** INC **
12925   {0x84368436, cc_one_sub_prim_mul_shade_add_shade},
12926   //Arena, Pokemon Stadium 2
12927   //(t0-env)*shade+shade
12928   {0x84518451, cc_t0_sub_prim_mul_shade_add_shade},
12929   //Arena, Pokemon Stadium 2
12930   //(t0-env)*shade+shade, (cmb-0)*prim+0
12931   {0x8451e3f0, cc_t0_sub_env_mul_prim_mul_shade_add_prim_mul_shade},
12932   // arena, PokemonStadium2, [Raziel64]
12933   // (t0-0)*shade+shade, (cmb-0)*prim+0
12934   {0x84f1e3f0, cc_t0_mul_prim_mul_shade_add_prim_mul_shade},
12935   // Spiderman. Added by Gonetz
12936   // (1-0)*shade+shade
12937   {0x84f684f6, cc_shade_add_shade},
12938   // the "gekko" ( a monster in a room above the 3rd room of woodfall temple }, zelda 2 [Ogy]. Added by Gonetz
12939   // (t0-prim)*env+shade  ** INC **
12940   {0x85318531, cc_t0_sub_prim_mul_env_add_shade},
12941   // flower, zelda 2. Added by Gonetz
12942   // (t0-prim)*env+shade, (cmb-0)*shade+0  ** INC **
12943   {0x8531e4f0, cc_t0_sub_prim_mul_env_add_shade},
12944   // Robotron 64, [scorpiove]
12945   // (env-shade)*env+shade  ** INC **
12946   {0x85458545, cc_one_sub_env_mul_shade_add_env},
12947   // Enemy dying, quest64
12948   // (1-shade)*env+shade  **changed by Gonetz
12949   {0x85468546, cc_one_sub_shade_mul_env_add_shade},
12950   // Arena, Pokemon Stadium
12951   // (t0-0)*env+shade, (cmb-0)*prim+0
12952   {0x85f1e3f0, cc__t0_mul_prim_mul_env__add__prim_mul_shade},
12953   // Clouds, Pokemon Stadium
12954   // (t1-0)*env+shade, (cmb-0)*prim+0
12955   {0x85f2e3f0, cc__t1_mul_prim_mul_env__add__prim_mul_shade},
12956   // Sky, Beetle Adventure Racing ** INC **
12957   //(t0-shade)*t0_a+shade, (env-cmb)*enva+cmb
12958   {0x88410c05, cc_t0_sub_shade_mul_t0a_add_shade},
12959   // Mario's eyes, mario
12960   //z (t0-shade)*t0_a+shade
12961   {0x88418841, cc_t0_sub_shade_mul_t0a_add_shade},
12962   //beetle adventure racing. Added by Gonetz
12963   // (prim-shade)*t0_a+shade, (t1-0)*cmb+0  **INC**
12964   {0x8843e0f2, cc_prim_sub_shade_mul__t0a_mul_t1__add_shade},
12965   // blast corps [Ogy]
12966   // (prim-shade)*t1_a+shade
12967   {0x89438943, cc_prim_sub_shade_mul_t1a_add_shade},
12968   //broken wall, beetle adventure racing. Added by Gonetz
12969   // (t0-shade)*prima+shade, (1-0)*0+cmb
12970   {0x8a411ff6, cc_t0_sub_shade_mul_prima_add_shade},
12971   // menu, battle phoenix 64. Added by Gonetz
12972   // (t0-shade)*prima+shade
12973   {0x8a418a41, cc_t0_add_shade},
12974   // intro, castlevania 2. Added by Gonetz
12975   // (prim-shade)*prim_a+shade
12976   {0x8a438a43, cc_prim_sub_shade_mul_prima_add_shade},
12977   // Pilot wings
12978   // (t0-shade)*shade_a+shade, (cmb-0)*shade+0
12979   {0x8b41e4f0, cc__shade_inter_t0_using_shadea__mul_shade},
12980   // ?
12981   // (1-shade)*shade_a+shade
12982   {0x8b468b46, cc_one_sub_shade_mul_shadea_add_shade},
12983   // Pilot wings, sky in congratulations
12984   // (t0-0)*shade_a+shade,
12985   {0x8bf18bf1, cc_t0_mul_shadea_add_shade},
12986   // arena, Pokemon Stadium. Added by Gonetz
12987   // (t0-t1)*env_a+shade, (cmb-env)*prim+0  ** INC **
12988   {0x8c21e350, cc__t0_sub_t1_mul_enva_add_shade__sub_env_mul_prim},
12989   //diddy kong racing background fill. Added by Gonetz ** Modified by Dave2001
12990   // (env-shade)*env_a+shade, (cmb-0)*prim+0
12991   {0x8c458c45, cc_shade},  // note: previous combiner used other_alpha; doesn't work
12992   //diddy kong racing. Added by Gonetz
12993   // (env-shade)*env_a+shade, (cmb-0)*prim+0  ** INC **
12994   {0x8c45e3f0, cc_prim_mul_shade},
12995   // sky, Pokemon Stadium, [Raziel64]
12996   // (t0-0)*env_a+shade, (cmb-env)*prim+0  ** INC **
12997   {0x8cf1e350, cc_t0_mul_prim_add_shade_sub_env_mul_prim},
12998   // zelda 2 [Ogy]. Added by Gonetz
12999   // (t0-prim)*primlod+shade, (prim-env)*cmb+env  ** INC **
13000   {0x8e31a053, cc_prim_sub_env_mul__t0_sub_prim_mul_primlod_add_shade__add_env},
13001   // fallen leaves, Dobutsu no Mori. Added by Gonetz
13002   // (t0-shade)*primlod+shade, (prim-env)*cmb+env  ** INC **
13003   {0x8e41a053, cc_prim_sub_env_mul__t0_sub_shade_mul_primlod_add_shade__add_env},
13004   // the icicle above the part just before the entrance to the mountain village, zelda 2 [Ogy]. Added by Gonetz
13005   // (t0-prim)*0+shade, (prim-env)*cmb+env   ** INC ** ?
13006   {0x9f31a053, cc_prim_sub_env_mul_shade_add_env},
13007   // background on level 3-1, kirby 64 [Raziel64]. Added by Gonetz
13008   // (0-env)*0+shade
13009   {0x9f5f9f5f, cc_shade},
13010   // Spotlight, smash bros
13011   // (1-0)*0+shade
13012   {0x9ff69ff6, cc_shade},
13013   // water, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
13014   // (0-0)*0+shade, (cmb-cmb)*cmb+cmb
13015   {0x9fff0000, cc_shade},
13016   // menu, Dr.Mario. Added by Gonetz
13017   // (0-0)*0+shade, (prim-cmb)*env+cmb
13018   {0x9fff0503, cc_prim_sub_shade_mul_env_add_shade},
13019   // pikachu, hey you pikachu. Added by Gonetz
13020   // (0-0)*0+shade, (env-cmb)*enva+cmb
13021   {0x9fff0c05, cc_env_sub_shade_mul_enva_add_shade},
13022   // mega shock, paper mario
13023   //(0-0)*0+shade, (env-prim)*cmb+prim
13024   {0x9fff6035, cc_env_sub_prim_mul_shade_add_prim},
13025   // Super Mario 64 logo background
13026   //z (k5-k5)*0+shade
13027   {0x9fff9fff, cc_shade},
13028   // Zelda 2 final movie. Added by Gonetz
13029   // (0-0)*0+shade, (prim-0)*cmb+0
13030   {0x9fffe0f3, cc_prim_mul_shade},
13031   // tree shadow, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
13032   // (0-0)*0+shade, (env-0)*cmb+0
13033   {0x9fffe0f5, cc_env_mul_shade},
13034   // N64 logo, Aidyn Chronicles. Added by Gonetz
13035   // (0-0)*0+shade, (cmb-0)*prim+0
13036   {0x9fffe3f0, cc_prim_mul_shade},
13037   // Hand, smash bros
13038   // (0-0)*0+shade, (cmb-0)*env+0
13039   {0x9fffe5f0, cc_env_mul_shade},
13040   // Lave piranha atack, Paper Mario
13041   // (t1-t0)*t0+env, (cmb-t1)*t0+prim  ** INC **
13042   {0xa1126120, cc__t0_mul_t1__mul_env_add_prim},
13043   //Arena, Pokemon Stadium 2
13044   // (t1-prim)*t0+env, (cmb-0)*shade+0
13045   {0xa132e4f0, cc__t1_sub_prim_mul_t0_add_env__mul_shade},
13046   // Kirby64 end [Raziel64]. Added by Gonetz
13047   // (prim-shade)*t0+env
13048   {0xa143a143, cc_prim_sub_shade_mul_t0_add_env},
13049   // Superman [scorpiove]. Added by Gonetz
13050   // (t0-env)*t0+env
13051   {0xa151a151, cc_t0_sub_env_mul_t0_add_env},
13052   // powder keg, zelda 2. Added by Gonetz
13053   // (prim-env)*t0+env, (0-0)*shade_a+cmb
13054   {0xa1530bff, cc__prim_sub_env_mul_t0_add_env__add_shadea},
13055   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
13056   // (prim-env)*t0+env, (0-0)*prim_lod+cmb
13057   {0xa1530ef6, cc__prim_sub_env_mul_t0_add_env__add_primlod},
13058   //attack, Pokemon Stadium 2
13059   // (prim-env)*t0+env, (0-0)*prim_lod+cmb
13060   {0xa1530eff, cc_prim_sub_env_mul_t0_add_env},
13061   // Kotake & koume defeated, going into sky, zelda
13062   // (prim-env)*t0+env, (prim-env)*0+cmb
13063   {0xa1531f53, cc_prim_sub_env_mul_t0_add_env},
13064   // water, Dobutsu no Mori. Added by Gonetz
13065   // (prim-env)*t0+env, (cmb-0)*shade+t0
13066   {0xa15324f0, cc_t0_add_shade_mul_env},
13067   //sky, beetle adventure racing. Added by Gonetz
13068   // (prim-env)*t0+env, (cmb-shade)*t1+shade **INC** can't be done in one step
13069   {0xa1538240, cc__env_inter_prim_using_t0__sub_shade_mul_t0a_add_shade},
13070   //couple's mask, zelda2. Added by Gonetz
13071   // (prim-env)*t0+env, (prim-cmb)*shade+shade **INC** can't be done in one step
13072   {0xa1538403, cc_t0_mul_shade},
13073   // stadium, Pokemon Stadium 2. Added by Gonetz
13074   // (prim-env)*t0+env, (cmb-0)*shade+shade **INC** can't be done in one step
13075   {0xa15384f0, cc_t0_mul_shade},
13076   //clothes on girl in inn, zelda2. Added by Gonetz
13077   // (prim-env)*t0+env, (cmb-prim)*env+shade **INC** can't be done in one step
13078   {0xa1538530, cc_t0_mul_env_add_shade},
13079   // Getting light arrows for the first time, zelda
13080   // (prim-env)*t0+env, (prim-env)*cmb+env  ** INC **
13081   {0xa153a053, cc_prim_sub_env_mul_t0_add_env},
13082   // Fire, starfox
13083   // (prim-env)*t0+env
13084   {0xa153a153, cc_prim_sub_env_mul_t0_add_env},
13085   // a spell, Fushigi no Dungeon: Fuurai no Shiren 2
13086   // (prim-env)*t0+env, (cmb-env)*enva+env
13087   {0xa153ac50, cc_prim_sub_env_mul__t0_mul_enva__add_env},
13088   // wizrobe's attack, zelda 2. Added by Gonetz.
13089   // (prim-env)*t0+env, (cmb-0)*cmb+0
13090   {0xa153e0f0, cc_prim_sub_env_mul_t0_add_env},
13091   // dress, zelda 2. Added by Gonetz.
13092   // also for Great Farie's hair - changed to use texture mod by Dave2001.
13093   // (prim-env)*t0+env, (shade-0)*cmb+0
13094   {0xa153e0f4, cc__env_inter_prim_using_t0__mul_shade},
13095   // Start menu, paper mario
13096   // (prim-env)*t0+env, (cmb-0)*t0+0
13097   {0xa153e1f0, cc_prim_sub_env_mul_t0_add_env},
13098   //    {0xa153e0f4, cc_prim_sub_env_mul_t0_add_env},
13099   // Jellyfish tentacles in Jabu-Jabu's belly, zelda
13100   // (prim-env)*t0+env, (cmb-0)*prim+0
13101   {0xa153e3f0, cc__env_inter_prim_using_t0__mul_prim},
13102   // Dust, zelda
13103   //z (prim-env)*t0+env, (cmb-0)*shade+0   ** INC **
13104   {0xa153e4f0, cc__env_inter_prim_using_t0__mul_shade},
13105   //{0xa153e4f0, cc_prim_sub_env_mul_t0_add_env},
13106   // roof, Kirby 64. Added by Gonetz
13107   // (prim-env)*t0+env, (cmb-0)*env+0   ** INC **
13108   {0xa153e5f0, cc_prim_sub_env_mul_t0_add_env},
13109   // hall of fame, Pokemon Stadium
13110   // (prim-env)*t0+env, (cmb-0)*primlod+0
13111   {0xa153eef0, cc__prim_sub_env_mul_t0_add_env__mul_primlod},
13112   // Something weird in intro, monster truck madness
13113   // (prim-env)*t0+env, (cmb-0)*k5+0
13114   {0xa153eff0, cc__prim_sub_env_mul_t0_add_env__mul_k5},
13115   // clothes, kirby 64. Added by Gonetz
13116   // (shade-env)*t0+env
13117   {0xa154a154, cc_shade_sub_env_mul_t0_add_env},
13118   // field, Derby Stallion
13119   // (shade-env)*t0+env, (cmb-0)*prim+0 ** INC **
13120   {0xa154e3f0, cc_shade_sub_env_mul_t0_mul_prim_add_prim_mul_env},
13121   // background, level 3-5, kirby 64, [Raziel64]
13122   // (shade-env)*t0+env, (cmb-0)*shade+0 ** INC **
13123   {0xa154e4f0, cc_shade_sub_env_mul_t0_add_env},
13124   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
13125   // (one-env)*t0+env
13126   {0xa156a156, cc_one_sub_env_mul_t0_add_env},
13127   // Arena, Pokemon Stadium 2.
13128   // (one-env)*t0+env, (cmb-0)*shade+0
13129   {0xa156e4f0, cc__env_inter_one_using_t0__mul_shade},
13130   //Arena, Pokemon Stadium 2
13131   // (t1-0)*t0+env, (cmb-0)*cmb+0  ** INC **
13132   {0xa1f2e0f0, cc__t0_mul_t1__add_env_mul__t0_mul_t1__add_env},
13133   // quake 2 intro
13134   // (prim-0)*t0+env, (prim-0)*primlod+cmb  ** INC **
13135   {0xa1f30ef3, cc_t0_mul_prim_add_env},
13136   // Kotake or koume's hair, zelda
13137   // (prim-0)*t0+env
13138   {0xa1f3a1f3, cc_t0_mul_prim_add_env},
13139   // track, ridge racer. Added by Gonetz
13140   // (t0-env)*t1+env, (cmb-0)*shade+0   ** INC **
13141   {0xa251e4f0, cc__t0_mul_t1__mul_shade},
13142   // lava, beetle adventure racing
13143   // (t0-env)*t1+env, (cmb-0)*enva+0   ** INC **
13144   {0xa251ecf0, cc__t0_mul_t1__mul_enva},
13145   // Ded Moroz, Paper Mario
13146   // (prim-env)*t1+env, (1-cmb)*t1+cmb  ** INC **
13147   {0xa2530206, cc_prim_sub_env_mul_t1_add_env},
13148   // text, monster truck madness
13149   // (prim-env)*t1+env
13150   {0xa253a253, cc_prim_sub_env_mul_t1_add_env},
13151   // car position, Top Gear Rally. Added by Gonetz
13152   // (prim-env)*t1+env, (cmb-t0)*t1+0  ** INC **
13153   {0xa253e210, cc_prim_sub_env_mul_t1_add_env_mul_t0},
13154   // text, Top Gear Rally. Added by Gonetz
13155   // (prim-env)*t1+env, (cmb-0)*t1+0  ** INC **
13156   {0xa253e2f0, cc_prim_sub_env_mul_t1_add_env_mul_t0},
13157   // {0xa253e2f0, cc_prim_sub_env_mul_t1_add_env},
13158   // a pole in the cut-scene that appears after you receive odolwa's mask, zelda 2 [Ogy]. Added by Gonetz
13159   // (prim-env)*t1+env, (cmb-0)*shade+0  ** INC **
13160   {0xa253e4f0, cc_t1_mul_prim_mul_shade},
13161   // Quake 2 intro. Added by Gonetz
13162   // (t0-0)*t1+env, (t0-0)*primlod+cmb  ** INC **
13163   {0xa2f10ef1, cc__t0_mul_t1__add_env},
13164   // silver cave, pokemon stadium 2
13165   // (t0-0)*t1+env, (cmb-prim)*shadea+prim
13166   {0xa2f16b30, cc_prim_inter__t0_mul_t1_add_env__using_shadea},
13167   // silver cave, pokemon stadium 2
13168   // (t0-0)*t1+env, (cmb-0)*shadea+shade
13169   {0xa2f18bf0, cc__t0_mul_t1_add_env__mul_shadea_add_shade},
13170   // Quake64. Added by Gonetz
13171   // (t0-0)*t1+env
13172   {0xa2f1a2f1, cc__t0_mul_t1__add_env},
13173   // Quake II. Added by Gonetz   ** INC **
13174   // (t0-0)*t1+env, (cmb-0)*prim+env
13175   {0xa2f1a3f0, cc__t0_mul_t1__mul_prim_add_env},
13176   // Dr Mario [Ogy]. Added by Gonetz
13177   // (t0-env)*prim+env
13178   //    {0xa351a351, cc_t0_mul_prim_add_env},
13179   {0xa351a351, cc_t0_sub_env_mul_prim_add_env},
13180   // menu, Dr.Mario. Added by Gonetz
13181   // (prim-env)*prim+env
13182   {0xa353a353, cc_prim_sub_env_mul_prim_add_env},
13183   // Razor sword, zelda 2. Added by Gonetz
13184   // (shade-env)*prim+env, (cmb-0)*shade+0  ** INC **
13185   {0xa354e4f0, cc_shade_sub_env_mul_prim_add_env},
13186   // bomberman 64-2 intro. Added by Gonetz
13187   // (1-env)*prim+env
13188   {0xa356a356, cc_one_sub_env_mul_prim_add_env},
13189   // thing that escapes from the well, zelda
13190   // (noise-env)*prim+env
13191   {0xa357a357, cc_prim_add_env},
13192   // Bongo Bongo, zelda
13193   // (noise-env)*prim+env, (cmb-0)*shade+0
13194   {0xa357e4f0, cc_env_mul_shade},
13195   // paper mario. Added by Gonetz
13196   // (t0-0)*prim+env
13197   {0xa3f1a3f1, cc_t0_mul_prim_add_env},
13198   // paper mario. Added by Gonetz
13199   // (t0-0)*prim+env, (t0-env)*prim+0
13200   {0xa3f1e351, cc_t0_mul_prim_add_env},
13201   // paper mario. Added by Gonetz
13202   // (t0-0)*prim+env, (t0-0)*prim+0
13203   {0xa3f1e3f1, cc_t0_mul_prim},
13204   // mahogany town statue, Pokemon Stadium 2
13205   // (t0-0)*prim+env, (cmb-0)*shade+0
13206   {0xa3f1e4f0, cc__t0_mul_prim_add_env__mul_shade},
13207   // squirt, paper mario. Added by Gonetz
13208   // (t1-0)*prim+env, (1-cmb)*t1+cmb
13209   {0xa3f20206, cc_t1_mul_prim_add_env},
13210   // paper mario. Added by Gonetz
13211   // (shade-0)*prim+env
13212   {0xa3f4a3f4, cc_prim_mul_shade_add_env},
13213   // Sharpen attack, pokemon stadium 2
13214   // (shade-0)*prim+env, (cmb-0)*shade+0
13215   {0xa3f4e4f0, cc__prim_mul_shade_add_env__mul_shade},
13216   // Doraemon 2. Added by Gonetz
13217   // (1-0)*prim+env
13218   {0xa3f6a3f6, cc_prim_add_env},
13219   // Pokemon Stadium 2, [Jeremy]. Added by Gonetz
13220   // (noise-0)*prim+env  ** INC ** ?
13221   {0xa3f7a3f7, cc_prim_add_env},
13222   // monsters, Pokemon Stadium. Added by Gonetz
13223   // (t0-t1)*shade+env, (cmb-0)*prim+0 ** INC **
13224   {0xa421e3f0, cc__t0_sub_t1__mul_prim_mul_shade_add_prim_mul_env},
13225   // background, pokemon stadium 2
13226   // (t0-prim)*shade+env
13227   {0xa431a431, cc_t0_sub_prim_mul_shade_add_env},
13228   // Arena, pokemon stadium 2
13229   // (t0-prim)*shade+env, (cmb-0)*shade+0
13230   {0xa431e4f0, cc__t0_sub_prim_mul_shade_add_env__mul_shade},
13231   // Trophy, pokemon stadium 2
13232   // (t0-prim)*shade+env, (cmb-0)*shade_a+0
13233   {0xa431ebf0, cc__t0_sub_prim_mul_shade_add_env__mul_shadea},
13234   // Buildings, pokemon stadium 2
13235   // (t1-prim)*shade+env
13236   {0xa432a432, cc_t1_sub_prim_mul_shade_add_env},
13237   // bomberman 64 [Ogy]
13238   // (t0-env)*shade+env
13239   {0xa451a451, cc_t0_mul_shade_add_env},
13240   // kirby drill, kirby 64. Added by Gonetz
13241   // (prim-env)*shade+env
13242   {0xa453a453, cc_prim_sub_env_mul_shade_add_env},
13243   // ball, ISS98 intro. Added by Gonetz
13244   // (t0-0)*shade+env
13245   {0xa4f1a4f1, cc_t0_mul_shade_add_env},
13246   // waterfall,  Dobutsu_no_Mori
13247   // (prim-0)*shade+env, (t0-0)*primlod+cmb
13248   {0xa4f30ef1, cc_t0_mul_primlod_add_prim_mul_shade_add_env},
13249   // waterfall,  Dobutsu_no_Mori
13250   // (prim-0)*shade+env, (t1-0)*primlod+cmb
13251   {0xa4f30ef2, cc_t1_mul_primlod_add_prim_mul_shade_add_env},
13252   // score, ISS98 intro. Added by Gonetz
13253   // (prim-0)*shade+env
13254   {0xa4f3a4f3, cc_prim_mul_shade_add_env},
13255   // magic fist, Rayman2. Added by Gonetz
13256   // (env-0)*shade+env
13257   {0xa4f5a4f5, cc_env_mul_shade_add_env},
13258   // gunfire, Quake64. Added by Gonetz
13259   // (1-0)*shade+env
13260   {0xa4f6a4f6, cc_env_add_shade},
13261   // flame, Paper Mario. Added by Gonetz
13262   // (t0-center)*scale+env, (0-prim)*cmb+env
13263   {0xa661a03f, cc_env_sub__t0_mul_scale_add_env__mul_prim},
13264   // N64 BIOS
13265   // (t0-env)*t0_a+env, cmb*shade
13266   {0xa851e0f4, cc__env_inter_t0_using_t0a__mul_shade},
13267   // pink car, f-zero x
13268   // (t0-env)*t0_a+env, cmb*shade
13269   {0xa851e4f0, cc__env_inter_t0_using_t0a__mul_shade},
13270   // PokemonStadium1, [Raziel64]
13271   // (prim-env)*t0_a+env, (cmb-cmb)*cmb+cmb
13272   {0xa8530000, cc_prim_sub_env_mul_t0a_add_env},
13273   // N64 logo, Ogre Battle
13274   // (prim-env)*t0_a+env
13275   {0xa853a853, cc_prim_sub_env_mul_t0a_add_env},
13276   // Mud Slap, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
13277   // (prim-env)*t0_a+env, (cmb-0)*cmb+0
13278   {0xa853e0f0, cc_prim_sub_env_mul_t0a_add_env},
13279   // Tree background, mace
13280   // (prim-env)*t0_a+env, (cmb-0)*t0+0
13281   {0xa853e1f0, cc__env_inter_prim_using_t0a__mul_t0},
13282   //attack, Pokemon Stadium 2
13283   // (prim-env)*t0_a+env, (cmb-0)*prim+0
13284   {0xa853e3f0, cc__env_inter_prim_using_t0a__mul_prim},
13285   // logo, Deadly Arts. Added by Gonetz
13286   // (prim-env)*t1_a+env
13287   {0xa953a953, cc_prim_sub_env_mul_t1a_add_env},
13288   // MarioGolf  text "Birdie Put"
13289   // (t0-env)*prim_a+env
13290   {0xaa51aa51, cc_t0_sub_env_mul_prima_add_env},
13291   // N64 BIOS
13292   // (t0-env)*prim_a+env, (shade-0)*cmb+0
13293   {0xaa51e0f4, cc__env_inter_t0_using_prima__mul_shade},
13294   // N64 BIOS
13295   // (prim-env)*prima+env, (shade-0)*cmb+0
13296   {0xaa53e0f4, cc__env_inter_prim_using_prima__mul_shade},
13297   // Girl, PD intro. Added by Gonetz
13298   // (t0-env)*shade_alpha+env, (cmb-0)*shade+0 ** INC **
13299   {0xab51e4f0, cc__env_inter_t0_using_shadea__mul_shade},
13300   // Some gannon spell, zelda
13301   // (prim-env)*shade_alpha+env
13302   {0xab53ab53, cc_prim_sub_env_mul_shadea_add_env},
13303   //Arena, Pokemon Stadium 2
13304   // (t0-0)*shade_alpha+env, (cmb-0)*shade+prim
13305   {0xabf164f0, cc__t0_mul_shadea_add_env__mul_shade_add_prim},
13306   // Boxes, Taz express. Added by Gonetz
13307   // (t0-env)*env_a+env
13308   {0xac51ac51, cc_t0_sub_env_mul_enva_add_env},
13309   // paper mario. Added by Gonetz
13310   // (t0-env)*env_a+env, (cmb-0)*shade+0  **INC**
13311   {0xac51e4f0, cc_t0_mul_env_mul_shade},
13312   // goal, Monster Truck Madness 64
13313   // (noise-0)*env_a+env, (cmb-0)*t1+0  **INC**
13314   {0xacf7e2f0, cc_t1_mul_env},
13315   // sword on forge, zelda 2. Added by Gonetz
13316   // (t1-t1)*lodf+env, (t1-t0)*cmb+prim
13317   {0xae226012, cc__t1_sub_t0__mul_env_add_prim},
13318   // menu background, Pokemon Stadium 2, [Raziel64]
13319   // (t0-prim)*lodf+env
13320   {0xae31ae31, cc_t0_sub_prim_mul_primlod_add_env},
13321   // odd mushroom, zelda oot. Added by Gonetz
13322   // (t0-shade)*lodf+env, (prim-env)*cmb+env  ** INC **
13323   {0xae41a053, cc__env_inter_prim_using__t0_sub_shade_mul_primlod_add_env},
13324   //    {0xae41a053, cc_prim_sub_env_mul__t0_mul_shade__add_env},
13325   // Morning Sun, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
13326   // (t0-env)*lodf+env, (cmb-0)*prim+0
13327   {0xae51e3f0, cc__env_inter_t0_using_primlod__mul_prim},
13328   //Spacestation Silicon Valley intro. Added by Gonetz
13329   // (prim-env)*lodf+env
13330   {0xae53ae53, cc_env_inter_prim_using_primlod},
13331   // Doom, intro. Added by Gonetz
13332   // (t0-0)*lodf+env, (t0-0)*lodf+env
13333   {0xaef1aef1, cc_t0_add_env},
13334   // Dobutsu no Mori. Added by Gonetz
13335   // (prim-0)*lodf+env
13336   {0xaef3aef3, cc_prim_add_env},
13337   // forest behind window, Dobutsu no Mori. Added by Gonetz
13338   // (prim-0)*prim_lod+env, (t1-0)*cmb+0
13339   {0xaef3e0f2, cc_t0_mul__prim_mul_primlod_add_env },
13340   // tony hawks 2 menu
13341   // (t0-rnv)*k5+env, (cmb-t1)*t1_a+t1      ** INC ** (correct combiner does not work because of black t1)
13342   {0xaf514920, cc_t0_sub_env_mul_k5_add_env},
13343   // intro, Mission Impossible. Added by Gonetz
13344   // (k5-k5)*0+env, (0-0)*scale+env
13345   {0xbfffa6ff, cc_env},
13346   // Something blocking the screen, waverace
13347   //z (k5-k5)*0+env
13348   {0xbfffbfff, cc_env},
13349   // Derby Stallion . Added by Gonetz
13350   // (0-0)*0+env, (cmb-0)*prim+0
13351   {0xbfffe3f0, cc_prim_mul_env},
13352   // zelda 2 [Ogy]. Added by Gonetz
13353   // (k5-k5)*0+env, ((cmb-0)*shade+0
13354   {0xbfffe4f0, cc_env_mul_shade},
13355   // flame, paper mario. Added by Gonetz
13356   // (t0-t1)*t0+1, (0-prim)*cmb+env  **INC** weird
13357   {0xc121a03f, cc__t0_inter_t1_using_half__mul_prim_add_env},
13358   // tube near big monster on level 5, Kirby64 [Raziel64]
13359   // (prim-env)*t0+1, (cmb-0)*shade+0  ** INC **
13360   {0xc153e4f0, cc_prim_sub_env_mul_t0_mul_shade},
13361   // paper mario. Added by Gonetz
13362   // (0-env)*t0+1, (prim-cmb)*t0+prim  **INC**
13363   {0xc15f6103, cc_env_sub_prim_mul_t0_add_prim},
13364   // HAL, smash bros
13365   // (0-0)*0+1
13366   {0xdfffdfff, cc_one},
13367   // arena, Pokemon Stadium 1, [Raziel64]
13368   // (0-0)*0+1, (cmb-0)*prim+0
13369   {0xdfffe3f0, cc_prim},
13370   // skis, Spacestation Silicon Valley. Added by Gonetz
13371   // (shade-0)*cmb+0, (t1-t0)*primlod+t0
13372   {0xe0f42d12, cc_t0_inter_t1_using_primlod},
13373   // paper mario. Added by Gonetz
13374   // (1-t1)*t0+0, (env-prim)*cmb+prim  ** INC **
13375   {0xe1266035, cc_env_sub_prim_mul__t0_mul_t1__add_prim},
13376   // ground, zelda 2. Added by Gonetz.
13377   // (t1-prim)*t0+0, (cmb-0)*shade+0
13378   {0xe132e4f0, cc__t1_sub_prim_mul_t0__mul_shade},
13379   // carmagedon
13380   // (shade-prim)*t0+0
13381   {0xe134e134, cc_shade_sub_prim_mul_t0},
13382   // skeleton, castlevania 2. Added by Gonetz
13383   // (1-prim)*t0+0, (cmb-0)*shade+0
13384   {0xe136e4f0, cc_t0_mul_1mprim_mul_shade},
13385   // Starshot logo. Added by Gonetz
13386   // (shade-env)*t0+0, (1-0)*cmb+cmb
13387   {0xe15400f6, cc_shade_sub_env_mul_t0},
13388   // Kirby morfing, smash bros. Added by Gonetz
13389   // (shade-env)*t0+0
13390   {0xe154e154, cc_shade_sub_env_mul_t0},
13391   // menu, PGA euro tour. Added by Gonetz
13392   // (1-env)*t0+0
13393   {0xe156e156, cc_one_sub_env_mul_t0},
13394   // paper mario. Added by Gonetz
13395   // (t0-0)*t0+0, (1-cmb)*prim+cmb
13396   {0xe1f10306, cc_one_sub_t0_mul_prim_add_t0},
13397   // F1 World Grand Prix. Added by Gonetz
13398   // (t0-0)*t0+0, (shade-prim)*cmb+prim
13399   {0xe1f16034, cc_shade_sub_prim_mul_t0_add_prim},
13400   // paper mario. Added by Gonetz
13401   // (t0-0)*t0+0, (env-prim)*cmb+prim
13402   {0xe1f16035, cc_env_sub_prim_mul_t0_add_prim},
13403   // sparkles, F1 World Grand Prix. Added by Gonetz
13404   // (t0-0)*t0+0, (1-prim)*cmb+prim
13405   {0xe1f16036, cc_one_sub_prim_mul_t0_add_prim},
13406   // rocket team basket, Pokemon Stadium 2
13407   // (t0-0)*t0+0, (cmb-prim)*shade+shade
13408   {0xe1f18430, cc__t0_mul_t0__sub_prim_mul_shade_add_shade},
13409   // Tony Hawk's Pro Skater. Added by Gonetz
13410   // (t0-0)*t0+0, (cmb-0)*t0+0
13411   {0xe1f1e1f0, cc_t0},
13412   // something in upper left corner, mario tennis
13413   // (t0-0)*t0+0
13414   {0xe1f1e1f1, cc_t0},
13415   // zelda 2. Added by Gonetz
13416   // (t0-0)*t0+0, (cmb-0)*prim+0
13417   {0xe1f1e3f0, cc_t0_mul_prim},
13418   // zelda 2 final movie. Added by Gonetz
13419   // (t0-0)*t0+0, (cmb-0)*shade+0
13420   {0xe1f1e4f0, cc_t0_mul_shade},
13421   // paper mario. Added by Gonetz
13422   // (t0-t1)*t0+1, (env-cmb)*prima+cmb  ** INC **
13423   {0xe1f20a05, cc_t1_mul_prima},
13424   // terrain, SCARS. Added by Gonetz
13425   // (t1-0)*t0+0, (env-prim)*cmb+prim
13426   {0xe1f26035, cc_env_sub_prim_mul__t0_mul_t1__add_prim},
13427   // Trees, Zelda 2
13428   // (t1-0)*t0+0, (cmb-0)*shade+prim
13429   {0xe1f264f0, cc__t0_mul_t1__mul_shade_add_prim},
13430   // terrain, SCARS. Added by Gonetz
13431   // (t1-0)*t0+0, (env-shade)*cmb+shade
13432   {0xe1f28045, cc_env_sub_shade_mul__t0_mul_t1__add_shade},
13433   // arena, Pokemon Stadium 2. Added by Gonetz
13434   // (t1-0)*t0+0, (cmb-prim)*shade+shade  ** INC **
13435   {0xe1f28430, cc__t0_mul_t1__sub_prim_mul_shade_add_shade},
13436   // arena, Pokemon Stadium 2
13437   // (t1-0)*t0+0, (cmb-env)*shade+shade
13438   {0xe1f28450, cc__t0_mul_t1__sub_env_mul_shade_add_shade},
13439   // Zelda 2, [Ogy]. Added by Gonetz
13440   // (t1-0)*t0+0, (cmb-prim)*env+shade  ** INC **
13441   {0xe1f28530, cc__t0_mul_t1__sub_prim_mul_env_add_shade},
13442   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
13443   // (t1-0)*t0+0, (prim-env)*cmb+env
13444   {0xe1f2a053, cc_prim_sub_env_mul__t0_mul_t1__add_env},
13445   // paper mario. Added by Gonetz
13446   // (t1-0)*t0+0, (cmb-0)*prim+env
13447   {0xe1f2a3f0, cc__t0_mul_t1__mul_prim_add_env},
13448   // Sand, pokemon stadium 2
13449   // (t1-0)*t0+0, (cmb-prim)*shade+env  ** INC **
13450   {0xe1f2a430, cc__t0_mul_t1__mul_shade},
13451   // grass, Mission Impossible. Added by Gonetz
13452   // (t1-0)*t0+0, (shade-0)*cmb+0
13453   {0xe1f2e0f4, cc__t0_mul_t1__mul_shade},
13454   // flag, Monako Grand Prix
13455   // (t1-0)*t0+0
13456   {0xe1f2e1f2, cc_t0_mul_t1},
13457   // lighthouse's beam, zelda 2. Added by Gonetz
13458   // (t1-0)*t0+0, (cmb-0)*prim+0
13459   {0xe1f2e3f0, cc__t0_mul_t1__mul_prim},
13460   // Bottom of wings, pilotwings
13461   // (t1-0)*t0+0, (cmb-0)*shade+0
13462   {0xe1f2e4f0, cc__t0_mul_t1__mul_shade},
13463   // zelda 2. Added by Gonetz
13464   // (t1-0)*t0+0, (cmb-0)*prima+0
13465   {0xe1f2eaf0, cc__t0_mul_t1__mul_prima},
13466   // lava, Roadsters. Added by Gonetz
13467   // (prim-0)*t0+0, (1-prim)*t0+cmb
13468   {0xe1f30136, cc_t0},
13469   // sky, Pokemon Stadium 2. Added by Gonetz
13470   // (prim-0)*t0+0, (cmb-0)*shadea+env
13471   {0xe1f3abf0, cc_t0_mul_prim_mul_shadea_add_env},
13472   // cars, Indy Racing 2000. Added by Gonetz
13473   // (prim-0)*t0+0, (shade-0)*cmb+0
13474   {0xe1f3e0f4, cc_t0_mul_prim_mul_shade},
13475   // Sign shadows, zelda
13476   //z (prim-k5)*t0+cmb_a
13477   {0xe1f3e1f3, cc_t0_mul_prim},
13478   // Table, mace
13479   // (prim-0)*t0+0, (cmb-0)*shade+0
13480   {0xe1f3e4f0, cc_t0_mul_prim_mul_shade},
13481   // Gauntlet Legends intro
13482   // (prim-0)*t0+0, (cmb-0)*prima+0
13483   {0xe1f3eaf0, cc_t0_mul_prim_mul_prima},
13484   // walls, beetle adventure racing. Added by Gonetz
13485   // (shade-0)*t0+0, (prim-0)*t0+cmb
13486   {0xe1f401f3, cc_t0_mul_shade},
13487   // cars, ridge racer. Added by Gonetz
13488   // (shade-0)*t0+0, (prim-cmb)*cmb_a+cmb **INC**
13489   {0xe1f40703, cc_t0_mul_shade},
13490   // water block, Paper Mario. Added by Gonetz
13491   // (shade-0)*t0+0, (prim-env)*cmb+env
13492   {0xe1f4a053, cc_prim_sub_env_mul__t0_mul_shade__add_env},
13493   // a lot in TWINE. Added by Gonetz
13494   // (shade-0)*t0+0, (cmb-0)*prim+env
13495   {0xe1f4a3f0, cc_t0_mul_prim_mul_shade_add_env},
13496   // Xena. Added by Gonetz
13497   // (shade-0)*t0+0, (env-0)*cmb+0
13498   {0xe1f4e0f5, cc_t0_mul_env_mul_shade},
13499   // Starshot logo. Added by Gonetz
13500   // (shade-0)*t0+0, (1-0)*cmb+0
13501   {0xe1f4e0f6, cc_t0_mul_shade},
13502   // Duck Dodgers intro. Added by Gonetz
13503   // (shade-0)*t0+0
13504   {0xe1f4e1f4, cc_t0_mul_shade},
13505   // shadow, Mission Impossible. Added by Gonetz
13506   // (shade-0)*t0+0, (cmb-0)*prim+0
13507   {0xe1f4e3f0, cc_t0_mul_prim_mul_shade},
13508   // Tony Hawk's Pro Skater 3. Added by Gonetz
13509   // (env-0)*t0+0, (t1-0)*shade+cmb  ** INC **
13510   {0xe1f504f2, cc__t0_add_t1__mul_shade},
13511   // text, tonic trouble. Added by Gonetz
13512   // (env-0)*t0+0
13513   {0xe1f5e1f5, cc_t0_mul_env},
13514   // powder keg, zelda 2. Added by Gonetz
13515   // (env-0)*t0+0, (cmb-0)*shade+0
13516   {0xe1f5e4f0, cc_t0_mul_env_mul_shade},
13517   // Buss rush
13518   // (1-0)*t0+0, (0-cmb)*0+cmb
13519   {0xe1f61f0f, cc_t0},
13520   // water, Starshot. Added by Gonetz
13521   // (1-0)*t0+0, (1-0)*cmb+0
13522   {0xe1f6e0f6, cc_t0},
13523   // bomberman 64 [Ogy]
13524   // (1-0)*t0+0
13525   {0xe1f6e1f6, cc_t0},
13526   // Mermaid attack, Mystical Ninja
13527   // (noise-0)*t0+0
13528   {0xe1f7e1f7, cc_t0},
13529   // paper mario. Added by Gonetz * changed because of odd palette copy
13530   // (t0-0)*t1+0, (shade-env)*cmb+cmb  **INC** ?
13531   {0xe2f10054, cc_shade_sub_env_mul__t0_mul_t1__add__t0_mul_t1},
13532   // Duck Dodgers Starring Daffy Duck text background
13533   // (t0-0)*t1+0, (shade-cmb)*prim+cmb
13534   {0xe2f10304, cc_one_sub_prim_mul__t0_mul_t1__add__prim_mul_shade},
13535   // water, PGA European Tour
13536   // (t0-0)*t1+0, (env-cmb)*prim+cmb
13537   {0xe2f10305, cc_one_sub_prim_mul__t0_mul_t1__add__prim_mul_env},
13538   // Grass, mario golf
13539   // (t0-0)*t1+0, (cmb-t0)*cmb_a+t0
13540   {0xe2f12710, cc_t0_mul_t1},
13541   // xg2, Added by Gonetz
13542   // (t0-0)*t1+0, (env-prim)*cmb+prim
13543   {0xe2f16035, cc_env_sub_prim_mul__t0_mul_t1__add_prim},
13544   // poo, CBFD, Added by Gonetz
13545   // (t0-0)*t1+0, (cmb-env)*shade+prim ** INC **
13546   {0xe2f16450, cc__t0_mul_t1__mul_shade_add_prim},
13547   // the champion stage, Pokemon Stadium 2
13548   // (t0-0)*t1+0, (cmb-0)*shade+prim
13549   {0xe2f164f0, cc__t0_mul_t1__mul_shade_add_prim},
13550   // sky, xg2, Added by Gonetz
13551   // (t0-0)*t1+0, (cmb-prim)*cmb_a+prim
13552   {0xe2f16730, cc__t0_mul_t1__sub_prim_mul__t0t1a__add_prim },
13553   // Sin and Punishment, [scorpiove], Added by Gonetz
13554   // (t0-0)*t1+0, (env-prim)*cmb_a+prim
13555   {0xe2f16735, cc_env_sub_prim_mul__t0t1a__add_prim},
13556   // cianwood gym walls, pokemon stadium 2
13557   // (t0-0)*t1+0, (cmb-prim)*shade+shade
13558   {0xe2f18430, cc__t0_mul_t1__sub_prim_mul_shade_add_shade},
13559   // light, Ridge Racer. Added by Gonetz
13560   // (t0-0)*t1+0, (prim-env)*cmb+env
13561   {0xe2f1a053, cc_prim_sub_env_mul__t0_mul_t1__add_env},
13562   // Waterfall, duck dodgers. Added by Gonetz
13563   // (t0-0)*t1+0, (shade-env)*cmb+env
13564   {0xe2f1a054, cc_shade_sub_env_mul__t0_mul_t1__add_env},
13565   // Arena, Pokemon Stadium 2 ** INC **
13566   // (t0-0)*t1+0, (cmb-prim)*shade+env
13567   {0xe2f1a430, cc__t0_mul_t1__mul_shade_add_env},
13568   // bikes, xg2
13569   // (t0-0)*t1+0, (shade-0)*cmb+0
13570   {0xe2f1e0f4, cc__t0_mul_t1__mul_shade},
13571   // Sky background, xg2
13572   // (t0-0)*t1+0
13573   {0xe2f1e2f1, cc_t0_mul_t1},
13574   // statistics, Banjo 2. Added by Gonetz
13575   // (t0-0)*t1+0, (cmb-0)*prim+0
13576   {0xe2f1e3f0, cc__t0_mul_t1__mul_prim},
13577   // the champion stage, Pokemon Stadium 2
13578   // (t0-0)*t1+0, (cmb-prim)*shade+0
13579   {0xe2f1e430, cc__t0_mul_t1__sub_prim_mul_shade},
13580   // Water, pilotwings
13581   // (t0-0)*t1+0, (cmb-0)*shade+0
13582   {0xe2f1e4f0, cc__t0_mul_t1__mul_shade},
13583   //beetle adventure racing. A dded by Gonetz
13584   // (t0-0)*t1+0, (cmb-0)*env+0
13585   {0xe2f1e5f0, cc__t0_mul_t1__mul_env},
13586   //fall headwaters, zelda 2. Added by Gonetz
13587   // (t1-0)*t1+0, (cmb-0)*shade+0
13588   {0xe2f2e4f0, cc_t1_mul_shade},
13589   //text, Paper Mario
13590   // (prim-0)*t1+0
13591   {0xe2f3e2f3, cc_t1_mul_prim},
13592   //terrain, Beetle Adventure Racing. Added by Gonetz
13593   // (shade-0)*t1+0
13594   {0xe2f4e2f4, cc_t1_mul_shade},
13595   // Transfer pack, Pokemon Stadium 2
13596   // (noise-0)*t1+0, (prim-env)*cmb+env
13597   {0xe2f7a053, cc_prim_sub_env_mul_t1_add_env},
13598   // lens of truth, zelda 2 [Ogy]. Added by Gonetz
13599   // (1-t0)*prim+0
13600   {0xe316e316, cc_one_sub_t0_mul_prim},
13601   //C&C pointer
13602   //(shade-env)*prim+0
13603   {0xe354e354, cc_shade_sub_env_mul_prim},
13604   //C&C shadows
13605   //(1-env)*prim+0
13606   {0xe356e356, cc_one_sub_env_mul_prim},
13607   // Magnitude, pokemon stadium 2
13608   // (t0-0)*prim+0, (t0-0)*env+cmb
13609   {0xe3f105f1, cc_t0_mul__prim_add_env},
13610   // night vision, jet force gemini
13611   // (t0-0)*prim+0, (noise-0)*env+cmb
13612   {0xe3f105f7, cc_t0_mul_prim_add_env},
13613   // Smoke, diddy kong racing
13614   // (t0-0)*prim+0, (env-cmb)*env_alpha+cmb
13615   {0xe3f10c05, cc__t0_mul_prim__inter_env_using_enva},
13616   // battle menu, Paper Mario. Added by Gonetz
13617   // (t0-0)*prim+0, (t0-env)*env_alpha+cmb   ** INC **
13618   {0xe3f10c51, cc_t0_mul_prim},
13619   // stalactites, Beetle adventure Racing. Added by Gonetz
13620   // (t0-0)*prim+0, (cmb-shade)*t1_alpha+shade   ** INC **
13621   {0xe3f18940, cc_t0_mul_prim_add_shade },
13622   // ? in Jabu-Jabu's belly, submitted by gokuss4
13623   // {0xe4f1a053, (t0-0)*prim+0, (prim-env)*cmb+env
13624   {0xe3f1a053, cc_prim_sub_env_mul__t0_mul_prim__add_env},
13625   // kirby drill, kirby 64. Added by Gonetz
13626   // (t0-0)*prim+0, (cmb-env)*shade+env  **INC**
13627   {0xe3f1a450, cc_t0_mul_prim_mul_shade_add_env},
13628   // ? sign, zelda 2. Added by Gonetz
13629   // (t0-0)*prim+0, (cmb-0)*cmb+0 ** INC **
13630   {0xe3f1e0f0, cc_t0_mul_prim},
13631   // vehicle, Star Wars Ep.1 Racer, [Raziel64]. Added by Gonetz
13632   // (t0-0)*prim+0, (shade-0)*cmb+0
13633   {0xe3f1e0f4, cc_t0_mul_prim_mul_shade},
13634   // mini game, Pokemon Stadium 2
13635   // (t0-0)*prim+0, (1-0)*cmb+0
13636   {0xe3f1e0f6, cc_t0_mul_prim},
13637   // magic stuff, buck bumble. Added by Gonetz
13638   // (t0-0)*prim+0, (cmb-0)*prim+0
13639   {0xe3f1e3f0, cc_t0_mul_prim_mul_prim},
13640   // The mario face, mario
13641   //z (t0-k5)*prim+cmb_a
13642   {0xe3f1e3f1, cc_t0_mul_prim},
13643   // Butterflies at Jabu-Jabu's lake, zelda
13644   // (t0-0)*prim+0, (cmb-0)*shade+0
13645   {0xe3f1e4f0, cc_t0_mul_prim_mul_shade},
13646   // Sports shirt, Mia Soccer. Added by Gonetz
13647   // (t1-0)*prim+0, (1-t0)*t1+cmb **INC**
13648   //    {0xe3f20216, cc_t0_mul_prim_add_t1},
13649   {0xe3f20216, cc_shirt},
13650   // Sprites, Ogre Battle. Added by Gonetz
13651   // (t1-0)*prim+0
13652   {0xe3f2e3f2, cc_t1_mul_prim},
13653   // F1 World Grand Prix. Added by Gonetz
13654   // (t1-0)*prim+0, (cmb-0)*shade+0
13655   {0xe3f2e4f0, cc_t1_mul_prim_mul_shade},
13656   // intro background, bio freaks. Added by Gonetz
13657   // (prim-0)*prim+0
13658   {0xe3f3e3f3, cc_prim_mul_prim},
13659   // player, Ohzumou2
13660   // (shade-0)*prim+0, (env-cmb)*t0+cmb
13661   {0xe3f40105, cc_env_sub_primshade_mul_t0_add_primshade},
13662   // floor in pyramides, beetle adventure racing.
13663   // (shade-0)*prim+0, (t1-0)*cmb+0
13664   {0xe3f4e0f2, cc_t1_mul_prim_mul_shade},
13665   // Slingshot string, zelda
13666   // (shade-0)*prim+0
13667   {0xe3f4e3f4, cc_prim_mul_shade},
13668   // ?
13669   // (shade-0)*prim+0, (cmb-0)*shade+0 ** INC **
13670   {0xe3f4e4f0, cc_prim_mul_shade},
13671   // ???, zelda
13672   // (env-0)*prim+0, (0-0)*0+cmb
13673   {0xe3f5e3f5, cc_prim_mul_env},
13674   // Option selection, zelda
13675   //z (1-0)*prim+0
13676   {0xe3f6e3f6, cc_prim},
13677   // ranco monster, zelda 2. Added by Gonetz
13678   // (noise-0)*prim+0, (cmb-0)*prim_a+prim
13679   {0xe3f76af0, cc_prim_mul_prima_add_prim},
13680   // F-1_World_Grand_Prix_II, olivieryuyu
13681   // (noise-0)*prim+0, (0-cmb)*prim_a+shade
13682   {0xe3f78a0f, cc_shade_sub__prim_mul_prima},
13683   // zelda 2 [Ogy]. Added by Gonetz
13684   // (noise-0)*prim+0
13685   {0xe3f7e3f7, cc_prim},
13686   // Road rush. Added by Gonetz
13687   // (0-0)*prim+0  ** INC ** ?
13688   {0xe3ffe3ff, cc_prim},
13689   // Letter to Kafei's mom, zelda 2. Added by Gonetz
13690   // (0-0)*prim+0, (cmb-0)*shade+0
13691   {0xe3ffe4f0, cc_prim_mul_shade},
13692   // Jabu-Jabu's Belly, zelda. Added by Gonetz
13693   // (1-t0)*shade+0, (cmb-0)*prim+0
13694   {0xe416e3f0, cc_one_sub_t0_mul_prim_mul_shade},
13695   // Arena, Pokemon Stadium 2
13696   // (t0-prim)*shade+0
13697   {0xe431e431, cc_t0_sub_prim_mul_shade},
13698   // silver cave, pokemon stadium 2
13699   // (t0-env)*shade+0, (cmb-prim)*shade+prim
13700   {0xe4516430, cc__t0_sub_env_mul_shade__sub_prim_mul_shade_add_prim},
13701   // bomb mask, zelda 2. Added by Gonetz
13702   // (t0-env)*shade+0, (cmb-prim)*shade+shade ** INC **
13703   {0xe4518430, cc__t0_sub_env_mul_shade__sub_prim_mul_shade},
13704   // terrain, Top Gear Rally  2. Added by Gonetz
13705   // (t0-env)*shade+0
13706   {0xe451e451, cc_t0_sub_env_mul_shade},
13707   // closes, Nightmire Creatures
13708   // (1-env)*shade+0
13709   {0xe456e456, cc_one_sub_env_mul_shade},
13710   // water, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
13711   // (t0-0)*shade+0, (cmb-cmb)*cmb+cmb
13712   {0xe4f10000, cc_t0_mul_shade},
13713   // Monster truck madness intro. Added by Gonetz
13714   // (t0-0)*shade+0, (1-0)*cmb+cmb    ** INC **
13715   {0xe4f100f6, cc_t0_mul_shade},
13716   // terrain, SCARS. Added by Gonetz
13717   // (t0-0)*shade+0, (prim-cmb)*t0+cmb  ** INC **
13718   {0xe4f10103, cc_t0_mul_shade},
13719   // Boomerang circle, zelda
13720   // (t0-0)*shade+0, (1-cmb)*t0+cmb
13721   {0xe4f10106, cc_t0_mul_shade},
13722   // THPS3.
13723   // (t0-0)*shade+0, (1-0)*t0+cmb
13724   {0xe4f101f6, cc_t0_mul_shade},
13725   // ???, WWF No Mercy [CpuMaster]
13726   // (t0-0)*shade+0, (env-cmb)*prim+cmb
13727   {0xe4f10305, cc_t0_mul_one_sub_prim_mul_shade_add_prim_mul_env},
13728   // magic bubble, zelda2. Added by Gonetz
13729   // (t0-0)*shade+0, (t1-0)*shade+cmb
13730   {0xe4f104f2, cc__t0_mul_shade__add__t1_mul_shade},
13731   // bike select, xg2. Added by Gonetz
13732   // (t0-0)*shade+0, (1-cmb)*env+cmb  ** INC **
13733   {0xe4f10506, cc_t0_mul_shade},
13734   // a bugs life [Ogy]
13735   // (t0-0)*shade+0, (cmb-0)*env+cmb
13736   //    {0xe4f105f0, cc_t0_mul_env_mul_shade},
13737   {0xe4f105f0, cc_t0_mul_shade},
13738   // Wall, quest64
13739   // (t0-0)*shade+0, (1-0)*env+cmb
13740   {0xe4f105f6, cc_t0_mul_shade_add_env},
13741   //lava, beetle adventure racing. Added by Gonetz
13742   // (t0-0)*shade+0, (prim-cmb)*cmb_a+cmb **INC**
13743   {0xe4f10703, cc_t0_mul_shade},
13744   // course map, Ridge Racer. Added by Gonetz
13745   // (t0-0)*shade+0, (prim-cmb)*prima+cmb **INC**
13746   {0xe4f10a03, cc_t0_mul_shade},
13747   // arena, custom robo. Added by Gonetz
13748   // (t0-0)*shade+0, (noise-cmb)*prima+cmb **INC**
13749   {0xe4f10a07, cc_t0_mul_shade},
13750   // arena, custom robo 2. Added by Gonetz
13751   // (t0-0)*shade+0, (0-cmb)*prima+cmb **INC**
13752   {0xe4f10a0f, cc_t0_mul_shade},
13753   //floor in a cave, Paper mario. Added by Gonetz
13754   // (t0-0)*shade+0, (cmb-prim)*prima+cmb **INC**
13755   {0xe4f10a30, cc_t0_mul_shade},
13756   //beetle adventure racing. Added by Gonetz
13757   // (t0-0)*shade+0, (t1-prim)*prima+cmb **INC**
13758   {0xe4f10a32, cc_t0_mul_shade},
13759   // Monster truck madness intro. Added by Gonetz
13760   // (t0-0)*shade+0, (shade-cmb)*shade_a+cmb    ** INC **
13761   {0xe4f10b04, cc_t0_mul_shade},
13762   // xg2 intro. Added by Gonetz
13763   // (t0-0)*shade+0, (1-cmb)*shade_a+cmb    ** INC **
13764   {0xe4f10b06, cc__t0_mul_shade__inter_one_using_shadea},
13765   // Link's bomb, smash bros
13766   // (t0-0)*shade+0, (env-cmb)*env_a+cmb    ** INC **
13767   {0xe4f10c05, cc__t0_mul_shade__inter_env_using_enva},
13768   // language selection, Extreme-G XG2 (E)
13769   // (t0-0)*shade+0, (1-cmb)*env_a+cmb
13770   {0xe4f10c06, cc__t0_mul_shade__inter_one_using_enva},
13771   // A Bugs Life, [Raziel64]
13772   // (t0-0)*shade+0, (cmb-0)*k5+cmb
13773   {0xe4f10ff0, cc_t0_mul_shade},
13774   // Bass Rush
13775   // (t0-0)*shade+0, (cmb-0)*0+cmb
13776   {0xe4f11f0f, cc_t0_mul_shade},
13777   // car, Top Gear Rally. Added by Gonetz
13778   // (t0-0)*shade+0, (cmb-t0)*t0a+t0  **INC**
13779   {0xe4f12810, cc_t0_mul_shade},
13780   // logo, SCARS. Added by Gonetz
13781   // (t0-0)*shade+0, (cmb-t0)*shadea+t0  **INC**
13782   {0xe4f12b10, cc__t0_mul_shade_mul_shadea__add__t1_mul_one_sub_shadea},
13783   // ? sign, Spiderman. Added by Gonetz
13784   // (t0-0)*shade+0, (0-0)*0+t1
13785   {0xe4f15fff, cc_t0_mul_shade},
13786   // Major League Baseball Featuring Ken Griffey Jr.
13787   // (t0-0)*shade+0, (1-0)*cmb+prim  ** INC **
13788   {0xe4f160f6, cc_t0_mul_shade_add_prim},
13789   // plants, CBFD. Added by Gonetz
13790   // (t0-0)*shade+0, (cmb-env)*shade+prim  ** INC **
13791   {0xe4f16450, cc_t0_sub_env_mul_shade_add_prim},
13792   // Kirby64. Added by Gonetz
13793   // (t0-0)*shade+0, (cmb-prim)*prima+prim
13794   {0xe4f16a30, cc_t0_mul_prima_mul_shade_add_prim_mul_one_sub_prima},
13795   // building shadow, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
13796   // (t0-0)*shade+0, (0-0)*0+prim
13797   {0xe4f17fff, cc_prim},
13798   // tire trace, beetle adventure racing. Added by Gonetz
13799   // (t0-0)*shade+0, (env-cmb)*t1+shade  **INC**
13800   {0xe4f18205, cc_env_sub_shade_mul_t0_add_shade},
13801   // Gold Skulltula, zelda
13802   // (t0-0)*shade+0, (prim-env)*cmb+env
13803   {0xe4f1a053, cc_prim_sub_env_mul_t0_mul_shade_add_env},
13804   //    {0xe4f1a053, cc_t0_mul_prim_mul_shade},
13805   // fighters, GASP Fighters
13806   // (t0-0)*shade+0, (1-env)*cmb+env
13807   {0xe4f1a056, cc_t0_mul_one_sub_env_mul_shade_add_env},
13808   // Brian, quest64
13809   // (t0-0)*shade+0, (cmb-0)*prim+env
13810   {0xe4f1a3f0, cc_t0_mul_prim_mul_shade_add_env},
13811   // Objects in arena, pokemon stadium 2
13812   // (t0-0)*shade+0
13813   // (cmb-prim)*shade+env
13814   {0xe4f1a430, cc_t0_mul_shade},
13815   // Monster truck madness intro. Added by Gonetz
13816   // (t0-0)*shade+0, (cmb-env)*shadea+env  **INC**
13817   //    {0xe4f1ab50, cc_t0_mul_shade_add_env},
13818   {0xe4f1ab50, cc__t0_mul_shade__sub_env_mul_shadea_add_env},
13819   // Taz express. Added by Gonetz
13820   // (t0-0)*shade+0, (cmb-env)*enva+env  **INC**
13821   {0xe4f1ac50, cc_t0_mul_shade_add_env},
13822   // sky in doom. Added by Gonetz
13823   // (t0-0)*shade+0, (cmb-0)*primlod+env  **INC**
13824   {0xe4f1aef0, cc_t0_mul_shade_add_env},
13825   // fighters, GASP Fighters
13826   // (t0-0)*shade+0, (1-env)*cmb+0
13827   {0xe4f1e056, cc_t0_mul_one_sub_env_mul_shade},
13828   // walls, beetle adventure racing. Added by Gonetz
13829   // (t0-0)*shade+0, (t0-0)*cmb+0  **INC**
13830   {0xe4f1e0f1, cc_t0_mul_shade},
13831   // Link's face, zelda
13832   //z (t0-k5)*shade+cmb_a, (prim-k5)*cmb+cmb_a
13833   {0xe4f1e0f3, cc_t0_mul_prim_mul_shade},
13834   // Link's suit, zelda
13835   //z (t0-k5)*shade+cmb_a, (env-k5)*cmb+cmb_a
13836   {0xe4f1e0f5, cc_t0_mul_env_mul_shade},
13837   // Window, starfox
13838   //z (t0-k5)*shade+cmb_a, (cmb-k5)*prim+cmb_a
13839   {0xe4f1e3f0, cc_t0_mul_prim_mul_shade},
13840   // crystal, Doraemon 2
13841   //(t0-0)*shade+0, (t0-0)*prim+0
13842   {0xe4f1e3f1, cc_t0_mul_prim},
13843   // Characters, mace
13844   // (t0-0)*shade+0, (cmb-0)*shade+0
13845   {0xe4f1e4f0, cc_t0_mul_shade},
13846   // Super Mario 64 logo
13847   //z (t0-k5)*shade+cmb_a
13848   {0xe4f1e4f1, cc_t0_mul_shade},
13849   // Kokiri's hat, zelda
13850   // (t0-0)*shade+0, (cmb-0)*env+0
13851   {0xe4f1e5f0, cc_t0_mul_env_mul_shade},
13852   // Gauntlet Legends intro
13853   // (t0-0)*shade+0, (cmb-0)*scale+0
13854   {0xe4f1e6f0, cc_t0_mul_scale_mul_shade},
13855   // Something on a tree, Paper Mario. Added by Gonetz
13856   // (t0-0)*shade+0, (cmb-0)*prima+0
13857   {0xe4f1eaf0, cc_t0_mul_prima_mul_shade},
13858   // Course map, Ridge Racer. Added by Gonetz
13859   // (t0-0)*shade+0, (cmb-0)*shadea+0
13860   {0xe4f1ebf0, cc_t0_mul_shade_mul_shadea},
13861   // Dodongo skull's eyes, zelda
13862   // (t0-0)*shade+0, (cmb-0)*env_alpha+0
13863   {0xe4f1ecf0, cc_t0_mul_enva_mul_shade},
13864   // lava, beetle adventure racing. Added by Gonetz
13865   // (t1-0)*shade+0, (cmb-prim)*cmb_a+prim  **INC**
13866   {0xe4f26730, cc_prim_inter_t1_mul_shade_using_texa},
13867   // headlight, beetle adventure racing. Added by Gonetz
13868   // (t1-0)*shade+0, (env-cmb)*t0+shade  **INC**
13869   {0xe4f28105, cc_one_sub__t0_mul_t1__mul_shade},
13870   // bubble, Banjo-Kazooie. Added by Gonetz
13871   // (t1-0)*shade+0
13872   {0xe4f2e4f2, cc_t1_mul_shade},
13873   // water, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
13874   // (prim-0)*shade+0, (cmb-cmb)*cmb+cmb
13875   {0xe4f30000, cc_prim_mul_shade},
13876   // lamp shadow, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
13877   // (prim-0)*shade+0, (cmb-cmb)*t0+cmb
13878   {0xe4f30100, cc_prim_mul_shade},
13879   // Yoshi, mario golf
13880   // (prim-0)*shade+0, (env-cmb)*t0+cmb
13881   {0xe4f30105, cc_env_sub_primshade_mul_t0_add_primshade},
13882   //Spacestation Silicon Valley intro. Added by Gonetz
13883   // (prim-0)*shade+0, (env-cmb)*t1+cmb
13884   {0xe4f30205, cc_env_sub_primshade_mul_t1_add_primshade},
13885   // Tip of brian's hair, quest64
13886   // (prim-0)*shade+0, (1-0)*env+cmb
13887   {0xe4f305f6, cc_prim_mul_shade_add_env},
13888   // V8-2 menu
13889   // (prim-0)*shade+0, (env-cmb)*cmb_a+cmb
13890   {0xe4f30705, cc__prim_mul_shade__inter_env_using__prim_mul_shade_alpha},
13891   // Background circle, xg2
13892   // (prim-0)*shade+0, (1-cmb)*shade_a+cmb
13893   {0xe4f30b06, cc_prim_mul_shade},
13894   // circle, waverace. Added by Gonetz
13895   // (prim-0)*shade+0, (t0-cmb)*enva+cmb
13896   {0xe4f30c01, cc_t0_sub__prim_mul_shade__mul_enva_add__prim_mul_shade},
13897   // enemy hit, Glover2
13898   // (prim-0)*shade+0, (env-cmb)*enva+cmb
13899   {0xe4f30c05, cc__prim_mul_shade__inter_env_using_enva},
13900   // player, super bowling
13901   // (prim-0)*shade+0, (0-0)*k5+cmb
13902   {0xe4f30fff, cc_prim_mul_shade},
13903   //Lure, bass rush
13904   // (prim-0)*shade+0, (0-cmb)*0+cmb
13905   {0xe4f31f0f, cc_prim_mul_shade},
13906   // walls, beetle adventure racing. Added by Gonetz
13907   // (prim-0)*shade+0, (cmb-shade)*t1+shade   **INC**
13908   {0xe4f38240, cc__one_inter_prim_using_t1__mul_shade},
13909   // GASP fighters
13910   //(prim-0)*shade+0, (1-env)*cmb+0
13911   {0xe4f3e056, cc_prim_mul_one_sub_env_mul_shade},
13912   // Flag, mario kart
13913   //z (prim-k5)*shade+cmb_a
13914   {0xe4f3e4f3, cc_prim_mul_shade},
13915   // Characters, smash bros
13916   // (prim-0)*shade+0, (cmb-0)*env+0
13917   {0xe4f3e5f0, cc_prim_mul_env_mul_shade},
13918   // N64 logo, ridge race. Added by Gonetz
13919   // (shade-0)*shade+0, (prim-cmb)*prima+cmb **INC**
13920   {0xe4f40a03, cc_shade},
13921   // fighter, shield mode, bio freaks. Added by Gonetz
13922   // (shade-0)*shade+0
13923   {0xe4f4e4f4, cc_shade},
13924   // truck crush, Monster truck madness. Added by Gonetz
13925   // (env-0)*shade+0, (env-0)*shade+cmb
13926   {0xe4f504f5, cc_env_mul_shade},
13927   // Course map, Ridge Racer. Added by Gonetz
13928   // (env-0)*shade+0
13929   {0xe4f5e4f5, cc_env_mul_shade},
13930   // lava, beetle adventure racing
13931   // (1-0)*shade+0, (prim-cmb)*cmb_a+cmb
13932   {0xe4f60703, cc_prim_sub_shade_mul_shadea_add_shade},
13933   // the wings in the song of soaring cut-scene, zelda2 [Ogy]. Added by Gonetz
13934   // (1-0)*shade+0, (prim-0)*cmb+0
13935   {0xe4f6e0f3, cc_prim_mul_shade},
13936   // parts of vehicle, Star Wars Ep.I Racer. Added by Gonetz
13937   // (1-0)*shade+0, (cmb-0)*prim+0
13938   {0xe4f6e3f0, cc_prim_mul_shade},
13939   // Snowflakes???, mario kart. Boxer shadow (fb effect}, Knockout Kings 2000
13940   // (1-0)*shade+0, (1-0)*shade+0
13941   {0xe4f6e4f6, cc_one_mul_shade},
13942   // ???
13943   // (noise-0)*shade+0
13944   {0xe4f7e4f7, cc_shade},
13945   // quest64 [Ogy]
13946   // (prim-t0)*env+0, (0-0)*0+prim
13947   {0xe5137fff, cc_prim},
13948   // field, Mike Piazza's Strike Zone
13949   // (t0-prim)*env+0 ** INC **
13950   {0xe531e531, cc_t0_mul_env},
13951   // Mike Piazza's Strike Zone
13952   // (shade-prim)*env+0
13953   {0xe534e534, cc_shade_sub_prim_mul_env},
13954   // rope, CBFD. Added by Gonetz
13955   // (t0-0)*env+0, (1-env)*prim+cmb
13956   {0xe5f10356, cc_one_sub_env_mul_prim_add__t0_mul_env},
13957   // Bell, Pokemon Stadium 2. Added by Gonetz
13958   // (t0-0)*env+0, (shade-0)*prim+cmb
13959   {0xe5f103f4, cc_t0_mul_env_add_prim_mul_shade},
13960   // aerofighter's assault [Ogy]
13961   // (t0-0)*env+0, (1-t0)*shade+cmb
13962   {0xe5f10416, cc_t0_mul_env_add_1mt0_mul_shade},
13963   // foto, Armorines - Project S.W.A.R.M.  Added by Gonetz
13964   // (t0-0)*env+0, (noise-0)*scale+cmb
13965   {0xe5f106f7, cc_t0_mul_env},
13966   // Extreme G2, score.  Added by Gonetz
13967   // (t0-0)*env+0, (1-cmb)*enva+cmb  ** INC **
13968   {0xe5f10c06, cc_t0_mul_env},
13969   // many objects in Tonic Trouble
13970   // (t0-0)*env+0, (shade-0)*cmb+0
13971   {0xe5f1e0f4, cc_t0_mul_env_mul_shade},
13972   // Flying skull's eyes, zelda
13973   // (t0-0)*env+0, (cmb-0)*prim+0
13974   {0xe5f1e3f0, cc_t0_mul_prim_mul_env},
13975   // Rock spell, quest64
13976   // (t0-0)*env+0, (cmb-0)*shade+0
13977   {0xe5f1e4f0, cc_t0_mul_env_mul_shade},
13978   // Text, mario
13979   //z (t0-k5)*env+cmb_a
13980   {0xe5f1e5f1, cc_t0_mul_env},
13981   // kirby 64. Added by Gonetz
13982   // (prim-0)*env+0, (cmb-0)*shade+0
13983   {0xe5f3e4f0, cc_prim_mul_env_mul_shade},
13984   // wings, kirby 64. Added by Gonetz
13985   // (prim-0)*env+0
13986   {0xe5f3e5f3, cc_prim_mul_env},
13987   // Text, xg2
13988   // (shade-0)*env+0, (1-cmb)*env_a+cmb
13989   {0xe5f40c06, cc_env_mul_shade},
13990   // Text box, mario
13991   //z (shade-k5)*env+cmb_a
13992   {0xe5f4e5f4, cc_env_mul_shade},
13993   // bomberman 64 [Ogy]
13994   // (1-0)*env+0
13995   {0xe5f6e5f6, cc_env},
13996   // Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
13997   // (1-t0)*scale+0
13998   {0xe616e616, cc_zero},
13999   // Gauntlet Legends intro. Added by Gonetz
14000   // (t0-0)*scale+0, (cmb-0)*shade+0
14001   {0xe6f1e4f0, cc_t0_mul_scale_mul_shade},
14002   // shadows, Taz express. Added by Gonetz
14003   // (t0-0)*scale+0
14004   {0xe6f1e6f1, cc_t0_mul_scale},
14005   // shadows, Knockout Kings 2000. Added by Gonetz
14006   // (shade-0)*scale+0
14007   {0xe6f4e6f4, cc_scale_mul_shade},
14008   // bomberman 64 2 [Ogy]. Added by Gonetz
14009   // (1-0)*scale+0
14010   {0xe6f6e6f6, cc_scale},
14011   // walls, beetle adventure racing. Added by Gonetz
14012   // (t1-0)*t0_a+0, (1-t1)*cmb+t1  **INC**
14013   {0xe8f24026, cc_t1},
14014   // house on rancho, zelda2. Added by Gonetz
14015   // (t1-0)*t0_a+0, (cmb-0)*prim+0
14016   {0xe8f2e3f0, cc__t0a_mul_t1__mul_prim},
14017   // zelda2 [Ogy]. Added by Gonetz
14018   // (t1-0)*t0_a+0, (cmb-0)*shade+0
14019   {0xe8f2e4f0, cc__t0a_mul_t1__mul_shade},
14020   // mini quiz, Pokemon Stadium 2
14021   // (prim-0)*t0_a+0, (cmb-t1)*primlod+t1 ** INC **
14022   {0xe8f34e20, cc_t0},
14023   // Major League Baseball Featuring Ken Griffey Jr.
14024   // (prim-0)*t0_a+0
14025   {0xe8f3e8f3, cc_t0a_mul_prim},
14026   // Top Gear Hyper-Bike
14027   // (1-0)*t0_a+0
14028   {0xe8f6e8f6, cc_t0a},
14029   // waterfall,  Dobutsu_no_Mori
14030   // (t0-0)*t1_a+0, (prim-env)*cmb+env
14031   {0xe9f1a053, cc_prim_sub_env_mul__t0_mul_t1a__add_env},
14032   // logo, Deadly Arts. Added by Gonetz
14033   // (t0-0)*t1_a+0, (cmb-0)*shade+0
14034   {0xe9f1e4f0, cc__t0_mul_t1a__mul_shade},
14035   // car, Roadsters. Added by Gonetz
14036   // (prim-t0)*prim_a+0, (prim-cmb)*shade+0  ** INC **
14037   {0xea13e403, cc_prim_sub__prim_sub_t0_mul_prima__mul_shade},
14038   // arena, Pokemon Stadium 2. Added by Gonetz
14039   // (1-t0)*prim_a+0, (0-prim)*cmb+prim  ** INC **
14040   {0xea16603f, cc_t0_mul_prim},
14041   // V8-2
14042   // (1-prim)*prim_a+0
14043   {0xea36ea36, cc_one_sub_prim_mul_prima},
14044   // match start, Mario Tennis. Added by Gonetz
14045   // (t0-0)*prim_a+0, (1-t0)*cmb+t0  ** INC **
14046   {0xeaf12016, cc_one_sub_t0_mul_prima_add_t0},
14047   // blast corps [Ogy]
14048   // (t0-0)*prim_a+0
14049   {0xeaf1eaf1, cc_t0_mul_prima},
14050   // final battle, CBFD. Added by Gonetz
14051   // (prim-0)*prim_a+0
14052   {0xeaf3eaf3, cc_prim_mul_prima},
14053   // flower's stalk, Paper Mario. Added by Gonetz
14054   // (shade-0)*prim_a+0
14055   {0xeaf4eaf4, cc_shade_mul_prima},
14056   // blast corps [Ogy]
14057   // (noise-0)*prim_a+0, (t1-0)*shade+cmb   ** INC **
14058   {0xeaf704f2, cc_t0_mul_shade_add_prima},
14059   // F1 World Grand Prix. Added by Gonetz
14060   // (noise-0)*prim_a+0, (t1-0)*env_a+cmb   ** INC **
14061   {0xeaf70cf2, cc_t1_mul_enva},
14062   // shadows, killer instinct gold
14063   // (0-0)*prim_a+0
14064   {0xeaffeaff, cc_zero},
14065   // background, killer instinct gold
14066   // (t0-prim)*shade_a+0
14067   {0xeb31eb31, cc_t0_sub_prim_mul_shadea},
14068   // ground, C&C
14069   // (t0-shade)*shade_a+0
14070   {0xeb41eb41, cc_t0_sub_shade_mul_shadea},
14071   // Wreslters, WWF No Mercy, [CpUMasteR]
14072   // (t0-0)*shade_alpha+0, (env-cmb)*prim+cmb
14073   {0xebf10305, cc_t0_mul_one_sub_prim_mul_shadea_add_prim_mul_env},
14074   // map, Pilot wings. Added by Gonetz
14075   // (t0-0)*shade_alpha+0, (1-cmb)*shade+cmb
14076   {0xebf10406, cc_one_sub_shade_mul__t0_mul_shadea__add_shade},
14077   // Indy Racing 2000. Added by Gonetz
14078   // (t0-0)*shade_alpha+0, (1-0)*shade+cmb
14079   {0xebf104f6, cc_t0_mul_shadea_add_shade},
14080   // logo, WCW-nWo Revenge
14081   // (t0-0)*shade_alpha+0, (cmb-0)*prim+0
14082   {0xebf1e3f0, cc_t0_mul_prim_mul_shadea},
14083   // sky, pilot wings
14084   // (t0-0)*shade_alpha+0, (1-cmb)*shade+0
14085   {0xebf1e406, cc_one_sub__t0_mul_shadea__mul_shade},
14086   // Wrestlers in Game, WWF No mercy [CpUMasteR]
14087   // (t0-0)*shade_alpha+0
14088   {0xebf1ebf1, cc_t0_mul_shadea},
14089   // flag, top gear overdrive
14090   // (prim-0)*shade_alpha+0
14091   {0xebf3ebf3, cc_prim_mul_shadea},
14092   // Ropes, WWF games
14093   // (shade-0)*shade_alpha+0, (env-cmb)*prim+cmb
14094   {0xebf40305, cc_shade_mul_shadea},
14095   // Ropes, WWF games
14096   // (shade-0)*shade_alpha+0
14097   {0xebf4ebf4, cc_shade_mul_shadea},
14098   // arena, custom robo 2
14099   // (noise-0)*shade_alpha+0
14100   {0xebf7ebf7, cc_shadea},
14101   // Baton Pass attack, Pokemon Stadium 2
14102   // (t0-env)*enva+0, (shade-0)*prim+cmb
14103   {0xec5103f4, cc__t0_sub_env_mul_enva__add_prim_mul_shade},
14104   // Bell, Pokemon Stadium 2. Added by Gonetz
14105   // (t0-0)*enva+0, (shade-0)*prim+cmb
14106   {0xecf103f4, cc_t0_mul_enva_add_prim_mul_shade},
14107   // blastcorps, unimp log. Added by Gonetz
14108   // (t0-0)*enva+0
14109   {0xecf1ecf1, cc_t0_mul_enva},
14110   // car, Top Gear Rally. Added by Gonetz
14111   // (env-0)*enva+0
14112   {0xecf5ecf5, cc_env_mul_enva},
14113   // Sand attack, pokemon Stadium (J)
14114   // (noise-0)*enva+0, (prim-env)*cmb+env
14115   {0xecf7a053, cc_prim_sub_env_mul_enva_add_env},
14116   // Walls of well through lens of truth, zelda
14117   // (prim-t0)*primlod+0      ** INC **
14118   {0xee13ee13, cc_t0},   // JUST t0 b/c the other combiner handles the subtraction
14119   // Pokemon attack, Pokemon Stadium 2
14120   // (noise-t0)*primlod+0, (1-env)*cmb+env ** INC **
14121   {0xee17a056, cc_env_inter_one_using__one_sub_t0_mul_primlod},
14122   // barrage attack, Pokemon Stadium 2
14123   // (t0-0)*primlod+0, (prim-0)*shade+cmb
14124   {0xeef104f3, cc__t0_mul_primlod__add__prim_mul_shade},
14125   // something on a flor in stone temple, zelda 2. Added by Gonetz
14126   // (t0-0)*primlod+0, (cmb-0)*prim+0
14127   {0xeef1e3f0, cc_t0_mul_primlod_mul_prim},
14128   // entrance to oceanside spider house, zelda 2. Added by Gonetz
14129   // (t0-0)*primlod+0, (cmb-0)*shade+0
14130   {0xeef1e4f0, cc_t0_mul_primlod_mul_shade},
14131   // Haze/(all powder status changers}, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
14132   // (noise-0)*primlod+0, (prim-env)*cmb+env  ** INC **
14133   {0xeef7a053, cc_prim_sub_env_mul_primlod_add_env},
14134   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
14135   // (noise-0)*primlod+0, (prim-cmb)*cmb+0  ** INC **
14136   {0xeef7e003, cc_zero},
14137   // Night trees, Monster truck madness. Added by Gonetz
14138   // (t0-0)*k5+0
14139   {0xeff1eff1, cc_t0_mul_k5},
14140   // submitted by gokuss4
14141   // (0-0)*0+0, (0-0)*0+prim
14142   {0xfffd5fe6, cc_prim},
14143   // intro, Bettle Adventure Racing, [Raziel64]
14144   // (0-0)*0+0, (0-0)*0+t0
14145   {0xffff3fff, cc_t0},
14146   // Conker's face, CBFD
14147   // (0-0)*0+0, (shade-env)*k5+prim
14148   {0xffff6f54, cc_shade_sub_env_mul_k5_add_prim},
14149   // Boost, Beetle Adventure Racing. Added by Gonetz
14150   // (0-0)*0+0, (0-0)*0+prim
14151   {0xffff7fff, cc_prim},
14152   // headlight, beetle adventure racing. Added by Gonetz
14153   // (0-0)*0+0, (0-0)*0+shade
14154   {0xffff9fff, cc_shade},
14155   // intro, Bettle Adventure Racing, [Raziel64]
14156   // (0-0)*0+0, (shade-env)*t1+env
14157   {0xffffa254, cc_shade_sub_env_mul_t1_add_env},
14158   // Fly Swooping in, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
14159   // (0-0)*0+0, (1-env)*cmb_a+env
14160   {0xffffa756, cc_env},
14161   // Waterfall, Donkey Kong 64
14162   // (0-0)*0+0, (t0-0)*t1+0
14163   {0xffffe1f2, cc_t0_mul_t1},
14164   // Screen clear, banjo kazooie
14165   // (0-0)*0+0
14166   {0xffffffff, cc_zero},
14167   // { #CCEND }
14168 };
14169
14170 static COMBINER alpha_cmb_list[] = {
14171   // { #ACSTART }
14172   //Tony Hawk's Pro Skater. Added by Gonetz
14173   // (0-0)*0+0
14174   {0x01ff01ff, ac_zero},
14175   //terminal, Spacestation Silicon Valley. Added by Gonetz
14176   // (0-0)*0+0, (0-0)*0+prim
14177   {0x01ff07ff, ac_prim},
14178   // kirby drill, kirby 64. Added by Gonetz
14179   // (0-0)*0+cmb, (0-0)*0+1
14180   {0x01ff0dff, ac_one},
14181   //chip in Spacestation Silicon Valley intro. Added by Gonetz
14182   // (0-0)*0+cmb, (prim-0)*shade+0
14183   {0x01ff0f3b, ac_prim_mul_shade},
14184   //Goldeneye, [Jeremy]. Added by Gonetz
14185   // (t0-t0)*lodf+t0, (cmb-0)*prim+0
14186   {0x02090ef8, ac_t0_mul_prim},
14187   // Indy Racing 2000. Added by Gonetz
14188   // (t1-t0)*lodf+t0, (env-cmb)*prim+cmb  ** INC **
14189   {0x020a00c5, ac_t0_inter_t1_using_primlod},
14190   // water, Spacestation Silicon Valley. Added by Gonetz
14191   // (t1-t0)*lodf+t0, (0-shade)*0+cmb
14192   {0x020a01e7, ac_t0_inter_t1_using_primlod},
14193   // Bridge, sf rush
14194   //z (t1-t0)*lodf+t0
14195   {0x020a020a, ac_t0_inter_t1_using_primlod},
14196   // explosion, body harvest. Added by Gonetz
14197   //(t1-t0)*lodf+t0, (0-0)*0+t0
14198   {0x020a03ff, ac_t0},
14199   // cars, PD intro. Added by Gonetz
14200   // (t1-t0)*lodf+t0, (cmb-0)*shade+prim
14201   {0x020a0738, ac__t0_inter_t1_using_primlod__mul_shade_add_prim},
14202   // Rocket Robot in Wheels intro
14203   //(t1-t0)*lodf+t0, (0-0)*0+prim
14204   {0x020a07ff, ac_prim},
14205   // Iguana background ground, turok
14206   // (t1-t0)*lodf+t0, (0-0)*0+shade
14207   {0x020a09ff, ac_shade},
14208   // Ground, monster truck madness
14209   // (t1-t0)*lodf+t0, (0-0)*0+env
14210   {0x020a0bff, ac_env},
14211   // Taz express. Added by Gonetz
14212   // (t1-t0)*lodf+t0, (0-0)*0+1
14213   {0x020a0dff, ac_one},
14214   // Mike Piazza's Strike Zone
14215   // (t1-t0)*lodf+t0, (cmb-0)*t0+0
14216   {0x020a0e78, ac_t0_inter_t1_using_primlod},
14217   // N64 logo, tetrisphere. Added by Gonetz
14218   // (t1-t0)*lodf+t0, (cmb-0)*prim+0
14219   {0x020a0ef8, ac__t0_inter_t1_using_primlod__mul_prim},
14220   // Ground, mace
14221   // (t1-t0)*lodf+t0, (cmb-0)*shade+0
14222   //    {0x020a0f38, ac_t0_mul_shade},
14223   {0x020a0f38, ac__t0_inter_t1_using_primlod__mul_shade},
14224   // blast corps [Ogy]
14225   // (t1-t0)*lodf+t0, (cmb-0)*env+0
14226   {0x020a0f78, ac__t0_inter_t1_using_primlod__mul_env},
14227   // blast corps [Ogy]
14228   // (t1-t0)*lodf+t0, (t0-0)*env+0
14229   {0x020a0f79, ac_t0_mul_env},
14230   // blast corps. Added by Gonetz
14231   // (t1-t0)*lodf+t0, (shade-0)*env+0
14232   {0x020a0f7c, ac_env_mul_shade},
14233   // field, Mike Piazza's Strike Zone
14234   // (t1-t0)*lodf+t0, (0-0)*0+0
14235   {0x020a0fff, ac_t0_inter_t1_using_primlod},
14236   // blast corps, unimp log. Added by Gonetz
14237   // (t1-t0)*t0+t0
14238   {0x024a024a, ac_t0_inter_t1_using_t0a},
14239   // zelda 2 [Ogy]. Added by Gonetz
14240   // (t1-t0)*t0+t0, (cmb-0)*prim+0    **INC**
14241   {0x024a0ef8, ac__t0_inter_t1_using_t0a__mul_prim},
14242   // text in a menu, Twisted_Edge_Extreme_Snowboarding [Razeil64]. Added by Gonetz
14243   // (prim-t0)*t0+t0    **INC**
14244   {0x024b024b, ac_t0},
14245   // enemy's shot, battle tanks 2
14246   // (env-prim)*t0+t0  **INC**
14247   {0x025d025d, ac_t0},
14248   //Bowser in final battle, Paper Mario. Added by Gonetz
14249   // (t1-env)*t0+t0, (cmb-env)*prim+0  ** INC **
14250   {0x026a0ee8, ac__t0_mul_t1__mul_prim},
14251   // paper mario. Added by Gonetz
14252   // (t1-env)*t0+t0, (cmb-0)*prim+0  ** INC **
14253   {0x026a0ef8, ac__t0_mul_t1__mul_prim},
14254   // V8-2
14255   // (prim-0)*t0+t0
14256   {0x027b027b, ac_t0_mul_prim_add_t0},
14257   // THPS3. Added by Gonetz
14258   // (0-0)*t0+t0
14259   {0x027f027f, ac_t0},
14260   // zelda 2. Added by Gonetz
14261   // (0-0)*t0+t0, (cmb-0)*prim+0
14262   {0x027f0ef8, ac_t0_mul_prim},
14263   // Spider Web attack, Pokemon Stadium 2.
14264   // (t1-t0)*t1+t0, (cmb-0)*prim+cmb
14265   {0x028a00f8, ac__t0_inter_t1_using_t1a__mul_prim_add__t0_inter_t1_using_t1a},
14266   // teleportation, Spacestation Silicon Valley. Added by Gonetz
14267   // (t1-t0)*t1+t0
14268   {0x028a028a, ac_t0_inter_t1_using_t1a},
14269   // mega shock, paper mario. Added by Gonetz
14270   // (t1-t0)*t1+t0, (cmb-0)*prim+0
14271   {0x028a0ef8, ac__t0_inter_t1_using_t1a__mul_prim},
14272   // mini game, Pokemon Stadium 2
14273   // (t1-t0)*t1+t0, (cmb-0)*shade+0
14274   {0x028a0f38, ac__t0_inter_t1_using_t1a__mul_shade},
14275   // Magnitude, pokemon stadium 2
14276   // (shade-t0)*t1+t0, (cmb-0)*shade+env
14277   {0x028c0b38, ac__t0_mul_t1__mul_shade},
14278   // paper mario. Added by Gonetz
14279   // (1-t0)*t1+t0, (t1-0)*prim+0  ** INC **
14280   {0x028e0efa, ac__one_sub_t0_mul_t1_add_t0__mul_prim},
14281   //    {0x028e0efa, ac_t1_mul_prim},
14282   // Spider Web attack, Pokemon Stadium 2.
14283   // (1-t0)*t1+t0, (cmb-0)*shade+0  ** INC **
14284   {0x028e0f38, ac__one_sub_t0_mul_t1_add_t0__mul_prim},
14285   // paper mario. Added by Gonetz
14286   // (t1-env)*t1+t0, (cmb-0)*shade+0
14287   {0x02aa0f38, ac__t0_inter_t1_using_enva__mul_shade},
14288   // Scary dead boss thing, zelda
14289   // (env-1)*t1+t0, (cmb-0)*prim+0  * MAY need t1_inter_t0 instead...
14290   {0x02b50ef8, ac__env_sub_one_mul_t1_add_t0__mul_prim},
14291   // first screen, castlevania. Added by Gonetz
14292   // (env-0)*t1+t0    **INC**
14293   {0x02bd02bd, ac_t0},
14294   // enemy's shot, battle tanks 2 [Flash]
14295   // (1-0)*t1+t0, (0-0)*0+env
14296   {0x02be0bff, ac_env},
14297   // battle tanks 2 [Ogy]
14298   // (1-0)*t1+t0, (0-0)*0+1
14299   {0x02be0dff, ac_one},
14300   // menu screen, Rayman2. Added by Gonetz
14301   // (1-0)*t1+t0, (cmb-0)*shade+0
14302   {0x02be0f38, ac__t0_add_t1__mul_shade},
14303   // Sky, zelda
14304   //z (t1-t0)*prim+t0
14305   {0x02ca02ca, ac_t0_inter_t1_using_prima},
14306   // F1 World Grand Prix. Added by Gonetz
14307   // (t1-t0)*prim+t0, (0-0)*0+1
14308   {0x02ca0dff, ac_t0_inter_t1_using_prima},
14309   // logo, PD. Added by Gonetz
14310   // (t1-t0)*prim+t0, (cmb-0)*shade+0
14311   {0x02ca0f38, ac__t0_inter_t1_using_prima__mul_shade},
14312   // battle tanks [Ogy]
14313   // (t1-t0)*prim+t0, (cmb-0)*env+0
14314   {0x02ca0f78, ac__t0_inter_t1_using_prima__mul_env},
14315   // logo, Deadly Arts. Added by Gonetz
14316   // (env-t0)*prim+t0
14317   {0x02cd02cd, ac_one_sub_prim_mul_t0_add__prim_mul_env},
14318   // intro, castlevania 2. Added by Gonetz
14319   // (1-t0)*prim+t0
14320   {0x02ce02ce, ac_one_sub_t0_mul_prim_add_t0},
14321   // intro, diddy kong racing. Added by Gonetz
14322   // (1-t0)*prim+t0, (cmb-0)*shade+0   **INC**
14323   {0x02ce0f38, ac_t0_mul_shade},
14324   // submitted by Scorpiove, mario party 1
14325   // (0-t0)*prim+t0
14326   {0x02cf02cf, ac_one_sub_prim_mul_t0},
14327   // Pokemon attack, pokemon Stadium (J)
14328   // (t1-t1)*prim+t0, (prim-0)*lod_f+env **INC**
14329   {0x02d20a3b, ac_env},
14330   // Ground, pokemon stadium 2
14331   // (t0-0)*prim+t0
14332   {0x02f902f9, ac_t0_mul_prim},
14333   // GASP Fighters
14334   // (t1-0)*prim+t0,  ** INC **
14335   {0x02fa02fa, ac_t1_mul_prim_add_t0},
14336   // foresight attack, Pokemon Stadium 2
14337   // (t1-0)*prim+t0, (cmb-env)*shade+0
14338   {0x02fa0f28, ac__t1_mul_prima_add_t0__sub_env_mul_shade},
14339   // Earthquake pokemon attack, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
14340   // (t1-0)*prim+t0, (cmb-0)*shade+0
14341   {0x02fa0f38, ac__t1_mul_prima_add_t0__mul_shade},
14342   // Paper Mario, fortune teller
14343   // (t1-0)*prim+t0, (cmb-0)*env+0
14344   {0x02fa0f78, ac__t1_mul_prima_add_t0__mul_env},
14345   // Hydro Pump Attack, Pokemon Stadium.
14346   // (shade-0)*prim+t0, (cmb-0)*shade+0
14347   {0x02fc0f38, ac__t0_add_prim_mul_shade__mul_shade},
14348   // map, Ogre Battle 64. Added by Gonetz
14349   // (1-0)*prim+t0
14350   {0x02fe02fe, ac_t0_add_prim},
14351   // borders, Tony Hawk's Pro Skater 2. Added by Gonetz
14352   // (t1-t0)*shade+t0 ** INC **
14353   {0x030a030a, ac_t0_inter_t1_using_shadea},
14354   // Mickey USA
14355   // (t1-t0)*shade+t0, (cmb-0)*prim+0 ** INC **
14356   {0x030a0ef8, ac__t0_inter_t1_using_shadea__mul_prim},
14357   // Rocket Robot in Wheels intro
14358   // (t1-t0)*shade+t0, (cmb-0)*env+0 ** INC **
14359   {0x030a0f78, ac__t0_inter_t1_using_shadea__mul_env},
14360   // water, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
14361   // (1-t0)*shade+t0, (cmb-0)*shade+0 ** INC **
14362   {0x030e0f38, ac_t0_mul_shade},
14363   // sky, f-zero x
14364   // (0-t0)*shade+t0
14365   {0x030f030f, ac_one_sub_shade_mul_t0},
14366   // Deku tree from kokiri villiage, zelda
14367   //z (t1-t0)*env+t0, (t1-0)*primlod+cmb
14368   {0x034a01ba, ac_t0_inter_t1_using_enva},
14369   // Hearts, zelda
14370   //z (t1-t0)*env+t0
14371   {0x034a034a, ac_t0_inter_t1_using_enva},
14372   // Faries, zelda
14373   //z (t1-t0)*env+t0, (cmb-0)*prim+0
14374   {0x034a0ef8, ac__t0_inter_t1_using_enva__mul_prim},
14375   // zelda, waterfall. Added by Gonetz
14376   //z (t1-t0)*env+t0, (cmb-0)*shade+0
14377   {0x034a0f38, ac__t0_inter_t1_using_enva__mul_shade},
14378   // pokemon stadium 1. Added by Gonetz
14379   //(t1-t0)*env+t0, (cmb-0)*primlod+0
14380   {0x034a0fb8, ac__t0_inter_t1_using_enva__mul_primlod},
14381   // fruits, Yoshi Story. Added by Gonetz
14382   //(prim-t0)*env+t0
14383   {0x034b034b, ac_prim_sub_t0_mul_env_add_t0},
14384   // window, Rayman2. Added by Gonetz
14385   //(1-t0)*env+t0
14386   {0x034e034e, ac_one_sub_t0_mul_env_add_t0},
14387   // menu, PokemonStadium1, [Raziel64]
14388   //(1-t0)*env+t0, (cmb-0)*shade+0  ** INC **
14389   {0x034e0f38, ac_t0_mul_shade},
14390   // Ganon's sword swinging, zelda
14391   // (t0-t1)*env+t0, (cmb-0)*prim+0 ** INC **
14392   {0x03510ef8, ac__t0_sub_t1_mul_enva_add_t0__mul_prim},
14393   // Lave piranha atack, Paper Mario
14394   // (t1-prim)*env+t0, (0-cmb)*t1+0 ** INC **
14395   {0x035a0e87, ac_t0_mul_t1},
14396   // Reflected fire at kotake & koume's, zelda
14397   // (t0-1)*env+t0, (cmb-0)*prim+0  ** INC **
14398   {0x03710ef8, ac__t0_sub_one_mul_enva_add_t0__mul_prim},
14399   // thing that escapes from the well, zelda
14400   // (t1-1)*env+t0  ** INC **
14401   {0x03720372, ac_t1_sub_one_mul_enva_add_t0},
14402   // Sword charge, zelda
14403   // (t1-1)*env+t0, (cmb-0)*prim+0
14404   {0x03720ef8, ac__t1_sub_one_mul_enva_add_t0__mul_prim},
14405   // Gannon hitting the ground, zelda
14406   // (t1-1)*env+t0, (cmb-0)*shade+0 ** INC **
14407   {0x03720f38, ac__t1_sub_one_mul_enva_add_t0__mul_shade},
14408   // Tony Hawk's Pro Skater 3. Added by Gonetz
14409   // (t0-0)*env+t0
14410   {0x03790379, ac_t0_mul_env},
14411   // paper mario. Added by Gonetz
14412   // (t0-0)*env+t0, (cmb-0)*prim+0
14413   {0x03790ef8, ac_t0_mul_prim},
14414   // pads, Pokemon Stadium 2. Added by Gonetz
14415   // (t1-0)*env+t0, (cmb-0)*prim+env ** INC **
14416   {0x037a0af8, ac__t0_inter_t1_using_enva__mul_prim_add_env},
14417   // attack, Pokemon Stadium 2
14418   // (t1-0)*env+t0, (cmb-t0)*prim+0  ** INC **
14419   {0x037a0ec8, ac__t1_mul_enva_add_t0__mul_prim},
14420   // Ice arrow gfx, zelda
14421   // (t1-0)*env+t0, (cmb-0)*prim+0
14422   {0x037a0ef8, ac__t1_mul_enva_add_t0__mul_prim},
14423   // Scary face move, pokemon stadium 2
14424   // (t1-0)*env+t0, (cmb-prim)*shade+0
14425   {0x037a0f18, ac__t1_mul_enva_add_t0__sub_prim_mul_shade},
14426   // Saria's song, zelda
14427   // (t1-0)*env+t0, (cmb-0)*shade+0
14428   {0x037a0f38, ac__t1_mul_enva_add_t0__mul_shade},
14429   // eye drops bottle, zelda
14430   // (t0-t0)*prim_lodfrac+t0
14431   {0x03890389, ac_t0},
14432   // lighthouse's beam, zelda 2. Added by Gonetz
14433   // (t0-t0)*prim_lodfrac+t0, (cmb-0)*prim+0
14434   {0x03890ef8, ac_t0_mul_prim},
14435   // zelda 2. Added by Gonetz
14436   // (t1-t0)*primlod+t0, (cmb-0)*env+cmb  ** INC **
14437   {0x038a0178, ac__t0_inter_t1_using_primlod__mul_env_add__t0_inter_t1_using_primlod},
14438   // Enter name letter background, zelda
14439   //z (t1-t0)*primlod+t0
14440   {0x038a038a, ac_t0_inter_t1_using_primlod},
14441   // Sunny Day, Pokemon Stadium 2
14442   // (t1-t0)*primlod+t0, (cmb-0)*0+prim
14443   {0x038a07f8, ac_prim},
14444   //attack, Pokemon Stadium 2
14445   // (t1-t0)*primlod+t0, (cmb-env)*shade+shade ** INC **
14446   {0x038a0928, ac__t0_inter_t1_using_primlod__sub_env_mul_shade_add_shade},
14447   // blastcorps, unimp log. Added by Gonetz
14448   // (t1-t0)*primlod+t0, (0-0)*0+shade  **INC**?
14449   {0x038a09ff, ac_t0_inter_t1_using_primlod},
14450   // pokemon attack, pokemon monsters (J)
14451   // (t1-t0)*primlod+t0, (cmb-0)*prim+env
14452   {0x038a0af8, ac__t0_inter_t1_using_primlod__mul_prim_add_env},
14453   // sky, PGA European Tour
14454   // (t1-t0)*primlod+t0, (0-0)*0+1
14455   {0x038a0dff, ac_one},
14456   // Ice surrounding enemy, zelda
14457   // (t1-t0)*primlod+t0, (env-0)*lodf+0
14458   {0x038a0e3d, ac__t0_inter_t1_using_primlod__mul_env},
14459   // the bridge out side the mountain smithy shop, zelda 2 [Ogy]. Added by Gonetz
14460   // (t1-t0)*primlod+t0, (cmb-0)*t0+0
14461   {0x038a0e78, ac_t0_inter_t1_using_primlod},
14462   // zelda 2, [Ogy]. Added by Gonetz
14463   // (t1-t0)*primlod+t0, (cmb-0)*t1+0
14464   {0x038a0eb8, ac_t0_inter_t1_using_primlod},
14465   // Kirby's pool, smash bros
14466   // (t1-t0)*primlod+t0, (cmb-0)*prim+0
14467   {0x038a0ef8, ac__t0_inter_t1_using_primlod__mul_prim},
14468   // Samus stage fire, smash bros
14469   // (t1-t0)*primlod+t0, (cmb-0)*shade+0
14470   {0x038a0f38, ac__t0_inter_t1_using_primlod__mul_shade},
14471   // something about ice, zelda
14472   // (t1-t0)*primlod+t0, (cmb-0)*env+0
14473   {0x038a0f78, ac__t0_inter_t1_using_primlod__mul_env},
14474   // Blast Corps. Added by Gonetz
14475   // (t1-t0)*primlod+t0, (shade-0)*env+0
14476   {0x038a0f7c, ac_env_mul_shade},
14477   // goals, J. League Tactics Soccer. Added by Gonetz
14478   // (prim-t0)*primlod+t0  ** INC **
14479   {0x038b038b, ac_t0},
14480   // zelda 2, [Ogy]. Added by Gonetz
14481   // (t0-t1)*primlod+t0, (cmb-0)*prim+0
14482   {0x03910ef8, ac__t0_sub_t1_mul_primlod_add_t0__mul_prim},
14483   // a plane in the entrance to the mountain village zelda 2, [Ogy]. Added by Gonetz
14484   // (t1-t1)*primlod+t0, (cmb-0)*prim+0  ** INC **?
14485   {0x03920ef8, ac_t0_mul_prim},
14486   // zelda 2. Added by Gonetz
14487   // (t1-prim)*primlod+t0, (cmb-0)*prim+0  ** INC **
14488   {0x039a0ef8, ac__t1_sub_prim_mul_primlod_add_t0__mul_prim},
14489   // zelda 2. Added by Gonetz
14490   // (t1-shade)*primlod+t0, (cmb-0)*shade+0  ** INC **
14491   {0x03a20f38, ac__t1_sub_shade_mul_primlod_add_t0__mul_shade},
14492   // saffron city, Pokemon Stadium 2
14493   // (t1-1)*primlod+t0, (cmb-0)*0+cmb
14494   {0x03b201f8, ac_t1_sub_one_mul_primlod_add_t0},
14495   // Candle flame in ganon's castle, zelda
14496   // (t1-1)*primlod+t0
14497   {0x03b203b2, ac_t1_sub_one_mul_primlod_add_t0},
14498   // Fire, zelda
14499   //z (t1-1)*primlod+t0, (cmb-0)*prim+0   ** INC **
14500   {0x03b20ef8, ac__t1_sub_one_mul_primlod_add_t0__mul_prim},
14501   // explosion, zelda 2. Added by Gonetz
14502   // (t1-1)*primlod+t0, (t0-0)*prim+0   ** INC **
14503   {0x03b20ef9, ac_t0_mul_prim},
14504   // Din's fire, zelda
14505   // (t1-1)*prim_lodfrac+t0, (cmb-0)*shade+0  ** INC **
14506   {0x03b20f38, ac__t1_sub_one_mul_primlod_add_t0__mul_shade},
14507   // Fire cloud, zelda
14508   // (t1-1)*prim_lodfrac+t0, (cmb-0)*env+0  ** INC **
14509   {0x03b20f78, ac__t1_sub_one_mul_primlod_add_t0__mul_env},
14510   // zelda 2 [Ogy]. Added by Gonetz
14511   // (prim-1)*prim_lodfrac+t0, (cmb-0)*env+0  ** INC **
14512   {0x03b30f78, ac__prim_sub_one_mul_primlod_add_t0__mul_env},
14513   // fairy's spirit, zelda oot
14514   // (t0-0)*primlod+t0
14515   {0x03b903b9, ac_t0_mul_primlod_add_t0},
14516   // Scary face, pokemon stadium 2
14517   // (t0-0)*primlod+t0, (cmb-0)*prim+0
14518   {0x03b90ef8, ac_t0_mul_prim},
14519   // Magnitude attack, Pokemon Stadium 2
14520   // (t0-0)*primlod+t0, (cmb-0)*shade+0
14521   {0x03b90f38, ac__t0_mul_primlod_add_t0__mul_shade},
14522   // Leftovers Recovery, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
14523   // (t1-0)*prim_lodfrac+t0, (cmb-env)*prim+0  ** INC **
14524   {0x03ba0ee8, ac__t1_mul_primlod_add_t0__sub_env_mul_prim},
14525   // zelda 2 [Ogy]. Added by Gonetz
14526   // (t1-0)*prim_lodfrac+t0, (cmb-0)*prim+0
14527   {0x03ba0ef8, ac__t1_mul_primlod_add_t0__mul_prim},
14528   // Mega punch attack, Pokemon Stadium 2
14529   // (t1-0)*prim_lodfrac+t0, (cmb-prim)*shade+0
14530   {0x03ba0f18, ac__t1_mul_primlod_add_t0__sub_prim_mul_shade},
14531   // zelda 2 [Ogy]. Added by Gonetz
14532   // (t1-0)*prim_lodfrac+t0, (cmb-0)*shade+0
14533   {0x03ba0f38, ac__t1_mul_primlod_add_t0__mul_shade},
14534   // chuchu monsters, zelda 2 [Ogy]. Added by Gonetz
14535   // (t1-0)*prim_lodfrac+t0, (cmb-0)*env+0
14536   {0x03ba0f78, ac__t1_mul_primlod_add_t0__mul_env},
14537   // Scary face, pokemon stadium 2
14538   // (env-0)*primlod+t0, (cmb-0)*prim+0
14539   {0x03bd0ef8, ac_t0_mul_prim},
14540   // ground, zelda 2. Added by Gonetz
14541   // (t1-t0)*0+t0, (cmb-0)*0+cmb
14542   {0x03ca01f8, ac_t0},
14543   // zelda 2. Added by Gonetz
14544   // (t1-t0)*0+t0, (cmb-0)*prim+0
14545   {0x03ca0ef8, ac_t0_mul_prim},
14546   // smoke in a night, zelda 2. Added by Gonetz
14547   // (t1-t0)*0+t0, (cmb-0)*shade+0
14548   {0x03ca0f38, ac_t0_mul_shade},
14549   //the ice plane out side the mountain smithy shop, zelda 2 [Ogy]. Added by Gonetz
14550   //(t1-1)*0+t0, (cmb-0)*env+0
14551   {0x03f20f78, ac_t0_mul_env},
14552   //something on level 5, Kirby64 [Raziel64]
14553   //(t0-0)*0+t0
14554   {0x03f903f9, ac_t0},
14555   //spider house, zelda 2 [Ogy]. Added by Gonetz
14556   //(t0-0)*0+t0, (cmb-0)*prim+0
14557   {0x03f90ef8, ac_t0_mul_prim},
14558   //Darmani's fire spin, zelda 2 [Ogy]. Added by Gonetz
14559   //(t1-0)*0+t0, (cmb-0)*prim+0
14560   {0x03fa0ef8, ac_t0_mul_prim},
14561   // headlight, beetle adventure racing. Added by Gonetz
14562   //(1-0)*0+t0
14563   {0x03fe03fe, ac_t0},
14564   // player, super bowling
14565   // (0-0)*0+t0,
14566   {0x03ff0000, ac_t0},
14567   // Ghost's lantern, zelda
14568   // (0-0)*0+t0, (t1-0)*prim_lod+cmb
14569   {0x03ff01ba, ac_t1_mul_primlod_add_t0},
14570   // Hand cursor, mario
14571   //z (0-0)*0+t0
14572   {0x03ff03ff, ac_t0},
14573   // Taz express. Added by Gonetz
14574   // (0-0)*0+t0, (0-0)*0+t1
14575   {0x03ff05ff, ac_t0},
14576   // powder keg, zelda2. Added by Gonetz
14577   // (0-0)*0+t0, (0-0)*0+prim
14578   {0x03ff07ff, ac_t0},
14579   // water, Spacestation Silicon Valley. Added by Gonetz
14580   // (0-0)*0+t0, (0-0)*0+shade
14581   {0x03ff09ff, ac_t0},
14582   // Characters, Ogre Battle. Added by Gonetz.
14583   // (0-0)*0+t0, (cmb-0)*prim+env
14584   {0x03ff0af8, ac_t0_mul_prim_add_env},
14585   // Monster truck madness intro. Added by Gonetz
14586   // (0-0)*0+t0, (0-0)*0+env
14587   {0x03ff0bff, ac_t0},
14588   // Battlezone
14589   // (0-0)*0+t0, (0-0)*0+1
14590   {0x03ff0dff, ac_t0},
14591   // Zoras, zelda
14592   // (0-0)*0+t0, (env-0)*lodf+0
14593   {0x03ff0e3d, ac_env},
14594   // logo, v-rally 99
14595   // (0-0)*0+t0, (prim-0)*t0+0
14596   {0x03ff0e7b, ac_t0_mul_prim},
14597   // intro, WWF-War Zone
14598   // (0-0)*0+t0, (env-0)*t0+0
14599   {0x03ff0e7d, ac_t0_mul_env},
14600   // Window, starfox
14601   //z (0-0)*0+t0, (cmb-0)*prim+0
14602   {0x03ff0ef8, ac_t0_mul_prim},
14603   //beetle adventure racing. Added by Gonetz
14604   // (0-0)*0+t0, (cmb-0)*shade+0
14605   {0x03ff0f38, ac_t0_mul_shade},
14606   //  Wonder Project J2 logo. Added by Gonetz
14607   // (0-0)*0+t0, (t0-0)*shade+0
14608   {0x03ff0f39, ac_t0_mul_shade},
14609   // Saria's suit, zelda
14610   // (0-0)*0+t0, (cmb-0)*env+0
14611   {0x03ff0f78, ac_t0_mul_env},
14612   // Pokemon Stadium 2, [Jeremy]. Added by Gonetz
14613   // (0-0)*0+t0, (cmb-0)*primlod+0
14614   {0x03ff0fb8, ac_t0_mul_primlod},
14615   // Tony Hawk's Pro Skater. Added by Gonetz
14616   // (0-0)*0+t0, (0-0)*0+0
14617   {0x03ff0fff, ac_zero},
14618   // Spider Web attack, Pokemon Stadium 2.
14619   // (t0-t1)*t0+t1, (cmb-0)*prim+cmb   **INC**
14620   {0x045100f8, ac__t1_inter_t0_using_t0a__mul_prim_add__t1_inter_t0_using_t0a},
14621   // Powered Star Beam, Paper Mario. Added by Gonetz
14622   // (t0-t1)*t0+t1, (cmb-0)*prim+0   **INC**
14623   {0x04510ef8, ac__t1_inter_t0_using_t0a__mul_prim},
14624   // Deadly Arts logo. Added by Gonetz
14625   // (1-0)*t0+t1, (1-0)*prim+cmb
14626   {0x047e00fe, ac__t0_add_t1__add_prim},
14627   // Spiderman. Added by Gonetz
14628   // (1-0)*t0+t1
14629   {0x047e047e, ac_t0_add_t1},
14630   // water, Dobutsu no Mori. Added by Gonetz
14631   // (1-0)*t0+t1, (cmb-0)*primlod+prim
14632   {0x047e07b8, ac__t0_add_t1__mul_primlod_add_prim},
14633   // paper mario. Added by Gonetz
14634   // (1-t0)*t1+t1, (cmb-0)*t1+0  **INC**
14635   {0x048e0eb8, ac_t0_mul_t1},
14636   // Pokemon Stadium 2. Added by Gonetz
14637   // (t0-prim)*t1+t1, (cmb-0)*shade+0  **INC**
14638   {0x04990f38, ac_t1_mul_shade},
14639   // waterfall, Dobutsu no Mori. Added by Gonetz
14640   // (t0-0)*t1+t1
14641   {0x04b904b9, ac_t0_mul_t1_add_t1},
14642   // light, Dobutsu no Mori. Added by Gonetz
14643   // (t0-0)*t1+t1, (cmb-0)*primlod+0  ** INC **
14644   {0x04b90fb8, ac__t0_add_t1__mul_primlod},
14645   // lava, beetle adventure racing
14646   // (t1-0)*t1+t1, (cmb-0)*shade+0  ** INC **
14647   {0x04ba0f38, ac__t1_mul_t1_add_t1__mul_shade},
14648   // wheels, F1 World Grand Prix. Added by Gonetz
14649   // (t0-t1)*prim+t1
14650   {0x04d104d1, ac_t1_inter_t0_using_prima},
14651   // intro, castlevania 2. Added by Gonetz
14652   // (t0-t1)*prim+t1, (cmb-0)*shade+0
14653   {0x04d10f38, ac__t1_inter_t0_using_prima__mul_shade},
14654   // flame, castlevania 2. Added by Gonetz
14655   // (t0-t1)*prim+t1, (cmb-0)*env+0
14656   {0x04d10f78, ac__t1_inter_t0_using_prima__mul_env},
14657   // walls, beetle adventure racing. Added by Gonetz
14658   // (t0-0)*prim+t1  **INC**
14659   {0x04f904f9, ac_t0_mul_prim},
14660   // Reflect pokemon attack, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
14661   // (t0-0)*prim+t1, (cmb-0)*prim+env  **INC**
14662   {0x04f90af8, ac__t0_add_t1__mul_prim_add_env},
14663   // Psychic pokemon attack, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
14664   // (t0-0)*prim+t1, (cmb-0)*shade+0  **INC**
14665   {0x04f90f38, ac__t0_add_t1__mul_shade},
14666   // Rayman2. Added by Gonetz
14667   // (0-0)*shade+t1, (cmb-0)*env+0
14668   {0x053f0f78, ac_t1_mul_env},
14669   // Ground at kotake & koume, zelda
14670   // (t1-t0)*env+t1, (cmb-0)*prim+0 ** INC **
14671   {0x054a0ef8, ac__t1_sub_t0_mul_enva_add_t1__mul_prim},
14672   // Tony Hawk's Pro Skater. Added by Gonetz
14673   // (t0-t1)*env+t1
14674   {0x05510551, ac_t1_inter_t0_using_enva},
14675   // Shiek's disappearance, zelda
14676   // (t0-1)*env+t1
14677   {0x05710571, ac_t0_sub_one_mul_enva_add_t1},
14678   // Kotake or koume's magic poof, zelda
14679   // (t0-1)*env+t1, (cmb-0)*prim+0  ** INC **
14680   {0x05710ef8, ac__t0_sub_one_mul_enva_add_t1__mul_prim},
14681   // Gauntlet Legends intro
14682   // (t0-0)*env+t1, (cmb-0)*prim+0  ** INC **
14683   {0x05790ef8, ac__t0_add_t1__mul_prim},
14684   // Zelda opening door, zelda
14685   // (t0-0)*env+t1, (cmb-0)*shade+0
14686   {0x05790f38, ac_t1_mul_shade},
14687   // paper mario. Added by Gonetz
14688   // (t1-0)*env+t1, (cmb-0)*prim+0  ** INC **
14689   {0x057a0ef8, ac_t1_mul_prim},
14690   // pokemon attack, Pokemon Stadium 2. Added by Gonetz
14691   // (t0-t1)*prim_lod+t1, (cmb-0)*prim+0
14692   {0x05910ef8, ac__t1_inter_t0_using_primlod__mul_prim},
14693   // Skulltula coin, zelda
14694   // (t0-1)*primlod+t1              ** INC **
14695   {0x05b105b1, ac_t0_mul_t1},
14696   // Bell, Pokemon Stadium 2. Added by Gonetz
14697   // (t0-0)*primlod+t1, (cmb-env)*prim  ** INC **
14698   {0x05b90ee8, ac__t0_add_t1__mul_prim},
14699   // intro, Aidyn Chronicles. Added by Gonetz
14700   // (0-cmb)*0+t1, (t1-1)*0+cmb
14701   {0x05c701f2, ac_t1},
14702   // zelda 2 [Ogy]. Added by Gonetz
14703   // (t1-t0)*0+t1, (cmb-0)*prim+0
14704   {0x05ca0ef8, ac_t1_mul_prim},
14705   // beaver's river, zelda 2. Added by Gonetz
14706   // (t1-0)*0+t1, (cmb-0)*prim+0
14707   {0x05fa0ef8, ac_t1_mul_prim},
14708   // Arena, pokemon stadium 2
14709   // (0-0)*0+t1, (0-0)*t0+cmb
14710   {0x05ff007f, ac_t1},
14711   // Ogre Battle, unimp log. Added by Gonetz
14712   // (0-0)*0+t1, (0-0)*0+cmb
14713   {0x05ff05ff, ac_t1},
14714   // lullaby, Paper Mario. Added by Gonetz
14715   // (0-0)*0+t1, (cmb-0)*prim+0
14716   {0x05ff0ef8, ac_t1_mul_prim},
14717   // aerofighter's assault [Ogy]
14718   // (0-0)*0+t1, (cmb-0)*shade+0
14719   {0x05ff0f38, ac_t1_mul_shade},
14720   // magic fist, Rayman2. Added by Gonetz
14721   // (0-0)*0+t1, (cmb-0)*env+0
14722   {0x05ff0f78, ac_t1_mul_env},
14723   // Pokemon selection background, Pokemon stadium 2
14724   // (env-prim)*t0+prim
14725   {0x065d065d, ac_env_sub_prim_mul_t0_add_prim},
14726   // text background, Ganbare Goemon - Mononoke Sugoroku
14727   // (1-prim)*t0+prim
14728   {0x065e065e, ac_one_sub_prim_mul_t0_add_prim},
14729   // shadows, star wars: ep1 racer
14730   // (0-prim)*t0+prim
14731   {0x065f065f, ac_zero_sub_prim_mul_t0_add_prim},
14732   // lava, beetle adventure racing
14733   // (0-1)*t0+prim, (cmb-0)*prim+0  ** INC **
14734   {0x06770ef8, ac_t0_mul_prim},
14735   // menu, Ganbare Goemon - Mononoke Sugoroku
14736   // (t0-0)*t0+prim
14737   {0x06790679, ac_t0_add_prim},
14738   // Water, pokemon stadium 2
14739   // (t1-0)*t0+prim
14740   {0x067a067a, ac_t0_mul_t1_add_prim},
14741   // Smackdown Mall Menu, WWF No Mercy
14742   // (shade-0)*t0+prim
14743   {0x067c067c, ac_t0_mul_shade_add_prim},
14744   // flag, Top Gear Rally  2. Added by Gonetz
14745   // (env-0)*t0+prim
14746   {0x067d067d, ac_t0_mul_env_add_prim},
14747   // Mario Tennis. Added by Gonetz
14748   // (1-0)*t0+prim
14749   {0x067e067e, ac_t0_add_prim},
14750   // sky, PGA European Tour
14751   // (t0-0)*t1+prim
14752   {0x06b906b9, ac_t0_mul_t1_add_prim},
14753   // lava, beetle adventure racing
14754   // (t0-0)*t1+prim, (0-0)*0+1 **INC**?
14755   {0x06b90dff, ac_one},
14756   // Pokemon Stadium 2, [Jeremy]. Added by Gonetz
14757   // (prim-0)*t1+prim
14758   {0x06bb06bb, ac_t1_mul_prim_add_prim},
14759   // pokemon psyattack, Pokemon Stadium 2. Added by Gonetz
14760   // (1-0)*t1+prim, (cmb-0)*env+0
14761   {0x06be0f78, ac_t1_add_prim_mul_env},
14762   // Rush2 2. Added by Gonetz
14763   // (prim-prim)*prim+prim
14764   {0x06db06db, ac_prim},
14765   //Spacestation Silicon Valley intro. Added by Gonetz
14766   // (t1-prim)*shade+prim
14767   //    {0x071a071a, ac_t1_mul_shade},
14768   {0x071a071a, ac_t1_sub_prim_mul_shade_add_prim},
14769   //KI logos. Added by Gonetz
14770   // (env-prim)*shade+prim
14771   {0x071d071d, ac_env_sub_prim_mul_shade_add_prim},
14772   // Deadly Arts, arena. Added by Gonetz
14773   // (1-0)*shade+prim
14774   {0x073e073e, ac_prim_add_shade},
14775   // Phantom Gannon's portal, zelda
14776   // (t1-t0)*env+prim, (cmb-0)*shade+0  ** INC **
14777   {0x074a0f38, ac__t0_mul_t1__mul_prim_mul_shade},
14778   // Road rush. Added by Gonetz
14779   // (t0-0)*env+prim
14780   {0x07790779, ac_t0_mul_env_add_prim},
14781   // arena, Pokemon Stadium 2
14782   // (shade-t0)*primlod+prim, (cmb-t0)*shade ** INC **
14783   {0x078c0f08, ac_shade_sub_t0_mul_primlod_add_prim},
14784   // telescope, zelda 2. Added by Gonetz
14785   // (1-t0)*primlod+prim
14786   {0x078e078e, ac_one_sub_t0_mul_primlod_add_prim},
14787   // zelda 2 [Ogy]. Added by Gonetz
14788   // (t0-t1)*primlod+prim, (cmb-0)*t0+0
14789   {0x07910e78, ac_t0_inter_t1_using_primlod},
14790   // Dobutsu no Mori. Added by Gonetz
14791   // (t0-0)*primlod+prim
14792   {0x07b907b9, ac_t0_mul_primlod_add_prim},
14793   // Lock-On attack, Pokemon Stadium 2
14794   // (t1-t0)*0+prim, (cmb-0)*0+cmb
14795   {0x07ca01f8, ac_prim},
14796   // water, DK64
14797   // (0-0)*0+0, (0-t1)*0+prim
14798   {0x07d707d7, ac_prim},
14799   // Menu, megaman
14800   // (1-0)*0+prim
14801   {0x07fe07fe, ac_prim},
14802   // super bowling
14803   //(0-0)*0+prim,
14804   {0x07ff0000, ac_prim},
14805   // menu, Ganbare Goemon - Mononoke Sugoroku
14806   // (0-0)*0+prim, (0-0)*0+t0
14807   {0x07ff03ff, ac_t0},
14808   // Intro background, starfox
14809   //z (0-0)*0+prim
14810   {0x07ff07ff, ac_prim},
14811   // velva boss, JFG
14812   //(0-0)*0+prim, (0-0)*0+env
14813   {0x07ff0bff, ac_env},
14814   // gem, castlevania 2. Added by Gonetz
14815   // (0-0)*0+prim, (cmb-0)*t0+0
14816   {0x07ff0e78, ac_t0_mul_prim},
14817   // text, Tony Hawk's Pro Skater. Added by Gonetz
14818   // (0-0)*0+prim, (cmb-0)*t1+0
14819   {0x07ff0eb8, ac_t1_mul_prim}, //weird, but implementing this makes text unreadable
14820   // zelda 2. Added by Gonetz
14821   // (0-0)*0+prim, (cmb-0)*prim+0
14822   {0x07ff0ef8, ac_prim_mul_prim},
14823   // explosion, Blast Corps. Added by Gonetz
14824   // (0-0)*0+prim, (t0-0)*prim+0
14825   {0x07ff0ef9, ac_t0_mul_prim},
14826   // zelda 2, [Ogy]. Added by Gonetz
14827   // (0-0)*0+prim, (cmb-0)*shade+0
14828   {0x07ff0f38, ac_prim_mul_shade},
14829   // Fox's ears and arms, smash bros
14830   // (0-0)*0+prim, (cmb-0)*env+0
14831   {0x07ff0f78, ac_prim_mul_env},
14832   // monsters, Pokemon Stadium. Added by Gonetz
14833   // (0-0)*0+prim, (cmb-0)*primlod+0
14834   {0x07ff0fb8, ac_prim_mul_primlod},
14835   // Hydro Pump Attack, Pokemon Stadium.
14836   // (1-t1)*t0+shade, (cmb-prim)*shade+0
14837   {0x08560f18, ac__one_sub_t1_mul_t0_add_shade__sub_prim_mul_shade},
14838   // focus, Paper Mario. Added by Gonetz
14839   //(t0-shade)*t0+shade, (cmb-0)*prim+0  * INC **
14840   {0x08610ef8, ac_t0_mul_prim},
14841   // Mario's head, mario //Added by Gonetz
14842   //(prim-shade)*t0+shade
14843   {0x08630863, ac_prim_sub_shade_mul_t0_add_shade},
14844   // Fissure attack, pokemon stadium 2
14845   //(t1-t0)*prim+shade, (cmb-0)*shade+0
14846   {0x08ca0f38, ac__t1_sub_t0_mul_prim_add_shade__mul_shade},
14847   // Earthquake pokemon attack, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
14848   //(t0-t1)*prim+shade, (cmb-0)*shade+0 ** INC **
14849   {0x08d10f38, ac__t0_sub_t1_mul_prim_add_shade__mul_shade},
14850   // ?
14851   //(t0-shade)*prim+shade
14852   {0x08e108e1, ac_t0_mul_prim_add_shade_mul_one_minus_prim},
14853   // Paper Mario
14854   // (t0-prim)*shade+shade, (cmb-0)*env+0
14855   {0x09190f78, ac__t0_sub_prim_mul_shade_add_shade__mul_env},
14856   // pads, Pokemon Stadium 2. Added by Gonetz
14857   // (0-t0)*env+shade, (cmb-0)*prim+0  ** INC **
14858   {0x094f0ef8, ac_one_sub_t0_mul_prim_mul_shade},
14859   // sun rays, Pokemon Stadium 2.
14860   // (shade-0)*env+shade, (cmb-0)*prim+0
14861   {0x097c0ef8, ac_one_plus_env_mul_prim_mul_shade},
14862   // attack, Pokemon Stadium 2.
14863   // (t0-0)*primlod+shade, (cmb-0)*shade+0
14864   {0x09b90f38, ac__t0_mul_primlod_add_shade__mul_shade},
14865   // Huge turtle appearance, zelda 2. Added by Gonetz
14866   // (t1-0)*primlod+shade, (cmb-0)*shade+0  ** INC **
14867   {0x09ba0f38, ac__t1_mul_primlod_add_shade__mul_shade},
14868   // roof, Kirby 64. Added by Gonetz
14869   // (t0-0)*0+shade
14870   {0x09f909f9, ac_shade},
14871   // water, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
14872   // (0-0)*0+shade, (cmb-cmb)*lodf+cmb
14873   {0x09ff0000, ac_shade},
14874   // water temple, zelda 2. Added by Gonetz
14875   // (0-0)*0+shade, (cmb-0)*prim+cmb
14876   {0x09ff00f8, ac_prim_mul_shade_add_shade},
14877   // damaged car, SCARS. Added by Gonetz
14878   // (0-0)*0+shade, (t0-t1)*primlod+prim  ** INC **
14879   {0x09ff0791, ac_t0_mul_primlod_add_prim},
14880   // Hyrule castle gate, zelda
14881   //z (0-0)*0+shade, (0-0)*0+prim
14882   {0x09ff07ff, ac_prim},
14883   // Super Mario 64 logo
14884   //z (0-0)*0+shade
14885   {0x09ff09ff, ac_shade},
14886   // terrain, SCARS. Added by Gonetz
14887   // (0-0)*0+shade, (0-0)*0+1
14888   {0x09ff0dff, ac_one},
14889   // terrain, SCARS. Added by Gonetz
14890   // (0-0)*0+shade, (t0-0)*t1+0
14891   {0x09ff0eb9, ac_t0_mul_t1},
14892   // N64 logo, Aidyn Chronicles. Added by Gonetz
14893   // (0-0)*0+shade, (cmb-0)*prim+0
14894   {0x09ff0ef8, ac_prim_mul_shade},
14895   // birds?, custom robo. Added by Gonetz
14896   // (0-0)*0+shade, (cmb-0)*shade+0
14897   {0x09ff0f38, ac_shade},
14898   // sky, Glover, [Raziel64]. Added by Gonetz
14899   // (0-0)*0+shade, (t0-0)*shade+0
14900   {0x09ff0f39, ac_t0_mul_shade},
14901   // Hand, smash bros
14902   // (0-0)*0+shade, (cmb-0)*env+0
14903   {0x09ff0f78, ac_env_mul_shade},
14904   // Conker's helicopter tail, CBFD
14905   // (0-0)*0+shade, (shade-0)*env+0
14906   {0x09ff0f7c, ac_env_mul_shade},
14907   // menu, PokemonStadium1, [Raziel64]
14908   // (0-0)*0+shade, (cmb-0)*primlod+0
14909   {0x09ff0fb8, ac_primlod_mul_shade},
14910   // Link's sword slashing, smash bros
14911   // (prim-env)*t0+env
14912   {0x0a6b0a6b, ac_prim_sub_env_mul_t0_add_env},
14913   // Reflected beam at kotake & koume's, zelda
14914   // (prim-env)*t0+env, (cmb-0)*prim+0  ** INC **
14915   {0x0a6b0ef8, ac_t0_mul_prim},
14916   // teleporter, Spacestation Silicon Valley. Added by Gonetz
14917   // (prim-env)*t0+env, (cmb-0)*shade+0  ** INC **
14918   {0x0a6b0f38, ac_t0_mul_shade},
14919   // Ridge Racer, unimp log. Added by Gonetz
14920   // (prim-env)*t0+env, (cmb-0)*primlod+0
14921   {0x0a6b0fb8, ac_prim_sub_env_mul_t0_add_env},
14922   // Kotake or koume's hair, zelda
14923   // (prim-0)*t0+env
14924   {0x0a7b0a7b, ac_t0_mul_prim_add_env},
14925   // menu, doubut no mori
14926   // (1-0)*t0+env
14927   {0x0a7e0a7e, ac_t0_add_env},
14928   // Grass, mario golf
14929   // (env-shade)*t1+env, (0-0)*0+1
14930   {0x0aa50dff, ac_one},
14931   // Ridge Racer, cars select. Added by Gonetz
14932   // (prim-env)*t1+env
14933   {0x0aab0aab, ac_prim_sub_env_mul_t1_add_env},
14934   // text, monster truck madness
14935   // (prim-env)*t1+env, (cmb-0)*t1+0
14936   {0x0aab0eb8, ac_t1_mul_env},
14937   // zelda 2 [Ogy]. Added by Gonetz
14938   // (1-0)*t1+env, (0-0)*0+cmb
14939   //{0x0abe0abe, ac_one},
14940   {0x0abe0abe, ac_t1_add_env},
14941   // arena, Pokemon Stadium 2. Added by Gonetz
14942   // (1-t0)*prim+env, (cmb-0)*shade+0
14943   {0x0ace0f38, ac_one_sub_t0_mul_prim_mul_shade},
14944   // intro, Bomberman 64 - 2. Added by Gonetz
14945   // (t0-env)*prim+env
14946   {0x0ae90ae9, ac_t0_sub_env_mul_prim_add_env},
14947   // N64 logo, Ogre Battle. Added by Gonetz
14948   // (t0-0)*prim+env
14949   {0x0af90af9, ac_t0_mul_prim_add_env},
14950   // girls, PD intro. Added by Gonetz
14951   // (t0-env)*shade+env  ** INC **
14952   {0x0b290b29, ac_t0_sub_env_mul_shadea_add_env},
14953   // Text, Mia Soccer. Added by Gonetz
14954   // (t0-env)*shade+env, (cmb-0)*lod_fraction+0  ** INC **
14955   {0x0b290e38, ac_t0_sub_env_mul_shadea_add_env},
14956   // shadows, Mario Tennis. Added by Gonetz
14957   // (prim-env)*shade+env, (0-cmb)*t1+cmb ** INC **
14958   {0x0b2b0087, ac_prim_sub_env_mul_shade_add_env_mul_t1},
14959   // lamppost?, Ridge Racer. Added by Gonetz
14960   // (prim-env)*shade+env, (0-0)*0+cmb
14961   {0x0b2b0b2b, ac_prim_sub_env_mul_shade_add_env},
14962   // ground, zelda2. Added by Gonetz
14963   // (1-env)*shade+env, (t1-0)*prim+0
14964   {0x0b2e0efa, ac_t1_mul_prim},
14965   // GASP Fighters
14966   // (t0-0)*shade+env
14967   {0x0b390b39, ac_t0_mul_shade_add_env},
14968   // destroying stuff, golden eye
14969   // (1-0)*shade+env
14970   {0x0b3e0b3e, ac_env_add_shade},
14971   // Torches, Paper Mario. Added by Gonetz
14972   // (t0-t1)*env+env, (0-0)*0+1
14973   {0x0b510dff, ac_t0_sub_t1_mul_env_add_env},
14974   // Mini Racers
14975   // (t0-0)*primlod+env
14976   {0x0bb90bb9, ac_t0_mul_primlod_add_env},
14977   // International Track and Field 2000. Added by Gonetz
14978   // (t0-0)*0+env
14979   {0x0bf90bf9, ac_env},
14980   // TM, mario
14981   //z (0-0)*0+env
14982   {0x0bff0bff, ac_env},
14983   // rancho monster, zelda2. Added by Gonetz
14984   // (0-0)*0+env, (cmb-0)*t1+0
14985   {0x0bff0eb8, ac_t1_mul_env},
14986   // Rocket Robot in Wheels intro
14987   // (0-0)*0+env, (cmb-0)*prim+0
14988   {0x0bff0ef8, ac_prim_mul_env},
14989   // Background, Pokemon Snap   
14990   // (prim-env)*t0+1
14991   {0x0c6b0c6b, ac_prim_sub_env_mul_t0_add_one},
14992   // Mario Golf
14993   // (0-1)*t0+1
14994   {0x0c770c77, ac_one_sub_t0},
14995   // flame, paper mario. Added by Gonetz
14996   // (1-t0)*t1+1, (cmb-t1)*t1+t1
14997   {0x0c8e0490, ac_t0_mul_t1},
14998   // hall of fame, Pokemon Stadium
14999   // (t0-1)*prim+1, (cmb-0)*env+0
15000   {0x0cf10f78, ac__one_inter_t0_using_prim__mul_env},
15001   // Ring boundary, dual heroes
15002   // (0-1)*prim+1
15003   {0x0cf70cf7, ac_one_sub_prim},
15004   // Kirby64, level 6, [Raziel64]
15005   // (0-0)*prim+1
15006   {0x0cff0cff, ac_one},
15007   // Mystical Ninja
15008   // (0-1)*env+1
15009   {0x0d770d77, ac_one},
15010   // Deku shield in shop, zelda
15011   // (1-1)*primlod+1
15012   {0x0db60db6, ac_one},
15013   // water near gorons willage. Added by Gonetz
15014   // (t1-t0)*0+1, (cmb-0)*prim+0
15015   {0x0dca0ef8, ac_prim},
15016   // background, kirby 64. Added by Gonetz
15017   // (t0-0)*0+1
15018   {0x0df90df9, ac_one},
15019   // kirby 64. Added by Gonetz
15020   // (1-0)*0+1
15021   {0x0dfe0dfe, ac_one},
15022   // background on level 2-1, kirby 64 [Raziel64]. Added by Gonetz
15023   // (1-0)*0+1, (0-0)*0+1
15024   {0x0dfe0dff, ac_one},
15025   // duck dodgers intro. Added by Gonetz
15026   // (0-0)*0+1, (cmb-cmb)*primlod+cmb
15027   {0x0dff0000, ac_one},
15028   // duck dodgers intro. Added by Gonetz
15029   // (0-0)*0+1, (0-0)*0+t1 **INC**?
15030   {0x0dff05ff, ac_t1},
15031   // ?
15032   // (0-0)*0+1, (0-0)*0+prim
15033   {0x0dff07ff, ac_prim},
15034   // arena, custom robo. Added by Gonetz
15035   // (0-0)*0+1, (0-0)*0+shade
15036   {0x0dff09ff, ac_shade},
15037   // field, Mario Golf
15038   // (0-0)*0+1, (1-env)*shade+env
15039   {0x0dff0b2e, ac_one_sub_env_mul_shade_add_env},
15040   // battle tanks 2 [Ogy]
15041   // (0-0)*0+1, (0-0)*0+env
15042   {0x0dff0bff, ac_env},
15043   // helmet, F1 World Grand Prix. Added by Gonetz
15044   // (0-0)*0+1, (0-1)*0+1
15045   {0x0dff0df7, ac_one},
15046   // secret in level 3-4, Kirby64, [Raziel64]
15047   // (0-0)*0+1, (cmb-0)*0+1
15048   {0x0dff0df8, ac_one},
15049   // Menu options, starfox
15050   // (0-0)*0+1
15051   {0x0dff0dff, ac_one},
15052   // Water, zelda
15053   //z (0-0)*0+primlod, (cmb-0)*prim+0
15054   {0x0dff0ef8, ac_prim},
15055   // Desert ground, zelda
15056   // (0-0)*0+1, (cmb-0)*shade+0
15057   {0x0dff0f38, ac_shade},
15058   // Characters, smash bros
15059   // (0-0)*0+1, (cmb-0)*env+0
15060   {0x0dff0f78, ac_env},
15061   // end of level 3-4, Kirby64, [Raziel64]
15062   // (0-0)*0+1, (cmb-0)*0+0
15063   {0x0dff0ff8, ac_zero},
15064   // Kirby64
15065   // (0-0)*0+1, (0-0)*0+0
15066   {0x0dff0fff, ac_zero},
15067   // floor, Spiderman [Raziel64]. Added by Gonetz
15068   // (env-t1)*t0+0  ** INC **
15069   {0x0e550e55, ac_t0_mul_env},
15070   // skeleton, castlevania 2. Added by Gonetz
15071   // (1-prim)*t0+0
15072   {0x0e5e0e5e, ac_one_sub_prim_mul_t0},
15073   // player select, Forsaken [Raziel64]. Added by Gonetz
15074   // (prim-shade)*t0+0
15075   {0x0e630e63, ac_prim_sub_shade_mul_t0},
15076   // castlevania 2 [Ogy]. Added by Gonetz
15077   // (1-shade)*t0+0
15078   {0x0e660e66, ac_one_sub_shade_mul_t0},
15079   // GoldenEye: Helicopter rotors
15080   // (shade-env)*t0+0, (1-0)*prim+cmb
15081   {0x0e6c00fe, ac_shade_sub_env_mul_t0_add_prim},
15082   // background, level3-4, Kirby64, [Raziel64]
15083   // (shade-env)*t0+0
15084   {0x0e6c0e6c, ac_shade_sub_env_mul_t0},
15085   // Goemon, mystical ninja. Added by Gonetz
15086   // (1-env)*t0+0
15087   {0x0e6e0e6e, ac_one_sub_env_mul_t0},
15088   // fist attack, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
15089   // (t0-0)*t0+0, (t1-cmb)*prim+cmb
15090   {0x0e7900c2, ac_t0_inter_t1_using_prima},
15091   // Clay Fighter [Ogy]. Added by Gonetz
15092   // (t0-0)*t0+0
15093   {0x0e790e79, ac_t0_mul_t0},
15094   // Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
15095   // (t0-0)*t0+0, (prim-0)*t1+0
15096   {0x0e790ebb, ac_t1_mul_prim},
15097   // zelda 2 [Ogy]. Added by Gonetz
15098   // (t0-0)*t0+0, (cmb-0)*prim+0
15099   {0x0e790ef8, ac_t0_mul_prim},
15100   // zelda 2. Added by Gonetz
15101   // (t0-0)*t0+0, (cmb-0)*shade+0
15102   {0x0e790f38, ac_t0_mul_shade},
15103   // zelda 2. Added by Gonetz
15104   // (t0-0)*t0+0, (cmb-0)*env+0
15105   {0x0e790f78, ac_t0_mul_env},
15106   // the ice plane just before the entrance to gorons village (where tingle is}, zelda 2 [Ogy]. Added by Gonetz
15107   // (t1-0)*t0+0, (cmb-0)*0+cmb
15108   {0x0e7a01f8, ac_t0_mul_t1},
15109   // paper mario. Added by Gonetz
15110   // (t1-0)*t0+0, (cmb-env)*prim+env  ** INC **
15111   {0x0e7a0ae8, ac_t1_mul_prim},
15112   // mini games quiz monitor backround, Pokemon Stadium 2
15113   // (t1-0)*t0+0, (0-0)*0+1
15114   {0x0e7a0dff, ac_one},
15115   // Tony Hawk's Pro Skater. Added by Gonetz
15116   // (t1-0)*t0+0, (cmb-0)*t0+0
15117   {0x0e7a0e78, ac_t0_mul_t1},
15118   // bike trace, xg2. Added by Gonetz
15119   // (t1-0)*t0+0
15120   {0x0e7a0e7a, ac_t0_mul_t1},
15121   // Kotake & koume defeated, zelda
15122   // (t1-0)*t0+0, (cmb-0)*prim+0
15123   {0x0e7a0ef8, ac__t0_mul_t1__mul_prim},
15124   // Magnitude, pokemon stadium 2
15125   // (t1-0)*t0+0, (cmb-env)*shade+0
15126   {0x0e7a0f28, ac__t0_mul_t1__mul_env_mul_shade},
15127   // Bongo Bongo, zelda
15128   // (t1-0)*t0+0, (cmb-0)*shade+0
15129   {0x0e7a0f38, ac__t0_mul_t1__mul_shade},
15130   //  Dobutsu_no_Mori, waterfall
15131   // (t1-0)*t0+0, (cmb-0)*prim_lod+0
15132   {0x0e7a0fb8, ac__t0_mul_t1__mul_primlod},
15133   // Back of doors, megaman
15134   // (prim-0)*t0+0, (cmb-0)*lodfrac+0
15135   {0x0e7b0e38, ac_t0_mul_prim},
15136   // Karts, mario kart
15137   //z (prim-0)*t0+0
15138   {0x0e7b0e7b, ac_t0_mul_prim},
15139   // paper mario. Added by Gonetz
15140   // (prim-0)*t0+0, (t0-0)*prim+0
15141   {0x0e7b0ef9, ac_t0_mul_prim},
15142   // Table, mace
15143   // (prim-0)*t0+0, (cmb-0)*shade+0
15144   {0x0e7b0f38, ac_t0_mul_prim_mul_shade},
15145   // lamp shadow, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
15146   // (shade-0)*t0+0, (cmb-cmb)*lodf+cmb
15147   {0x0e7c0000, ac_t0_mul_shade},
15148   // Game logo, Aerofighters Assault [Raziel64]
15149   //(shade-0)*t0+0, (0-0)*0+1
15150   {0x0e7c0dff, ac_one},
15151   // Higher sky, waverace
15152   //z (shade-0)*t0+0
15153   {0x0e7c0e7c, ac_t0_mul_shade},
15154   // duck dodgers, intro. Added by Gonetz
15155   // (shade-0)*t0+0, (cmb-0)*prim+0
15156   {0x0e7c0ef8, ac_t0_mul_prim_mul_shade},
15157   // waterwheel in water temple, zelda 2. Added by Gonetz
15158   // (shade-0)*t0+0, (cmb-0)*env+0
15159   {0x0e7c0f78, ac_t0_mul_env_mul_shade},
15160   // Blowing up mine at bowser's, mario
15161   // (env-0)*t0+0
15162   {0x0e7d0e7d, ac_t0_mul_env},
15163   // castlevania 2, intro. Added by Gonetz
15164   // (1-0)*t0+0
15165   {0x0e7e0e7e, ac_t0},
15166   // moon, castlevania 2. Added by Gonetz
15167   // (1-0)*t0+0, (cmb-0)*prim+0
15168   {0x0e7e0ef8, ac_t0_mul_prim},
15169   //beetle adventure racing. Added by Gonetz
15170   // (1-0)*t0+0, (cmb-0)*shade+0
15171   {0x0e7e0f38, ac_t0_mul_shade},
15172   // lava, beetle adventure racing
15173   // (t0-prim)*t1+0, (0-0)*0+shade   ** INC **
15174   {0x0e9909ff, ac_shade},
15175   // Rain Dance, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
15176   // (t0-env)*t1+0, (cmb-0)*0+prim   ** INC **
15177   {0x0ea90ef8, ac__t0_mul_t1__mul_prim},
15178   // Duck Dodgers Starring Daffy Duck text background
15179   // (t0-0)*t1+0, (shade-cmb)*prim+cmb
15180   {0x0eb900c4, ac_one_sub_prim_mul__t0_mul_t1__add__prim_mul_shade},
15181   // torches, pokemon stadium 2
15182   // (t0-0)*t1+0, (cmb-env)*prim+cmb
15183   {0x0eb900e8, ac__t0_mul_t1__sub_env_mul_prim_add__t0_mul_t1},
15184   // airboarder 64 [Ogy]
15185   // (t0-0)*t1+0, (0-0)*0+prim
15186   {0x0eb907ff, ac_prim},
15187   // explosion, body harvest. Added by Gonetz
15188   // (t0-0)*t1+0, (0-0)*0+shade
15189   {0x0eb909ff, ac_shade},
15190   // Text off top, banjo kazooie
15191   // (t0-0)*t1+0
15192   {0x0eb90eb9, ac_t0_mul_t1},
15193   // smoke, daikatana. Added by Gonetz
15194   // (t0-0)*t1+0, (cmb-0)*prim+0
15195   {0x0eb90ef8, ac__t0_mul_t1__mul_prim},
15196   // Arena, Pokemon Stadium 2.
15197   // (t0-0)*t1+0, (cmb-prim)*shade+0
15198   {0x0eb90f18, ac__t0_mul_t1__sub_prim_mul_shade},
15199   // Water, pilotwings
15200   // (t0-0)*t1+0, (cmb-0)*shade+0
15201   {0x0eb90f38, ac__t0_mul_t1__mul_shade},
15202   // Tony Hawk's Pro Skater. Added by Gonetz
15203   // (t0-0)*t1+0, (cmb-0)*env+0
15204   {0x0eb90f78, ac__t0_mul_t1__mul_env},
15205   // light from window, Dobutsu no Mori. Added by Gonetz
15206   // (t0-0)*t1+0, (cmb-0)*primlod+0
15207   {0x0eb90fb8, ac__t0_mul_t1__mul_primlod},
15208   // chandelier in spider house, zelda 2. Added by Gonetz
15209   // (t1-0)*t1+0, (cmb-0)*prim+0
15210   {0x0eba0ef8, ac_t1_mul_prim},
15211   // cars, ridge racer. Added by Gonetz
15212   // (prim-0)*t1+0, (0-0)*0+1
15213   {0x0ebb0dff, ac_t1_mul_prim},
15214   // aerofighter's assault [Ogy]
15215   // (prim-0)*t1+0
15216   {0x0ebb0ebb, ac_t1_mul_prim},
15217   // tire trace, beetle adventure racing. Added by Gonetz
15218   // (shade-0)*t1+0
15219   {0x0ebc0ebc, ac_t1_mul_shade},
15220   // smoke, Starshot. Added by Gonetz
15221   // (env-0)*t1+0
15222   {0x0ebd0ebd, ac_t1_mul_env},
15223   // lots of things, goldeneye
15224   // (1-0)*t1+0, (0-0)*0+shade
15225   {0x0ebe09ff, ac_shade},
15226   // zelda 2 [Ogy]. Added by Gonetz
15227   // (1-0)*t1+0, (cmb-0)*prim+0
15228   {0x0ebe0ef8, ac_t1_mul_prim},
15229   // walls, perfect dark. Added by Gonetz
15230   // (1-0)*t1+0, (cmb-0)*shade+0
15231   {0x0ebe0f38, ac_t1_mul_shade},
15232   // sand, perfect dark. Added by Gonetz
15233   // (1-0)*t1+0, (cmb-0)*env+0
15234   {0x0ebe0f78, ac_t1_mul_env},
15235   // light, Ridge Racer. Added by Gonetz
15236   // (1-t0)*prim+0
15237   {0x0ece0ece, ac_one_sub_t0_mul_prim},
15238   // exaust, star wars ep1 racer
15239   // (1-t0)*prim+0, (cmb-0)*shade+0
15240   {0x0ece0f38, ac_one_sub_t0_mul_primshade},
15241   // iguana, Forsaken, [Raziel64]. Added by Gonetz
15242   // (t0-shade)*prim+0
15243   {0x0ee10ee1, ac_t0_sub_shade_mul_prim},
15244   // stands, NASCAR 2000
15245   // (prim-shade)*prim+0
15246   {0x0ee30ee3, ac_prim_sub_shade_mul_prim},
15247   // arena, Pokemon Stadium 2. Added by Gonetz
15248   // (t0-env)*prim+0    ** INC **
15249   {0x0ee90ee9, ac_t0_mul_prim},
15250   // lure, bass rush
15251   // (t0-0)*prim+0, (cmb-cmb)*lodf+cmb
15252   {0x0ef90000, ac_t0_mul_prim},
15253   // explosion, body harvest. Added by Gonetz
15254   // (t0-0)*prim+0, (t0-0)*env+cmb
15255   {0x0ef90179, ac_prim_add_env_mul_t0},
15256   // frog's eyes, zelda
15257   // (t0-0)*prim+0, (1-1)*prim_lod+cmb
15258   {0x0ef901b6, ac_t0_mul_prim},
15259   // Monster truck madness intro. Added by Gonetz
15260   // (t0-0)*prim+0, (cmb-0)*prim_lod+cmb  ** INC **
15261   {0x0ef901b8, ac_t0_mul_prim},
15262   // Road, zelda
15263   //z (t0-0)*prim+0, (t1-0)*primlod+cmb
15264   {0x0ef901ba, ac__t0_mul_prim__add__t1_mul_primlod},
15265   // Track, wipeout. Addded by Gonetz
15266   // (t0-0)*prim+0, (0-0)*0+prim
15267   {0x0ef907ff, ac_t0_mul_prim},
15268   // magic stuff, buck bumble. Added by Gonetz
15269   // (t0-0)*prim+0, (cmb-0)*prim+0
15270   {0x0ef90ef8, ac_t0_mul_prim_mul_prim},
15271   // The mario face, mario
15272   //z (t0-0)*prim+0
15273   {0x0ef90ef9, ac_t0_mul_prim},
15274   // paper mario. Added by Gonetz
15275   // (t0-0)*prim+0, (cmb-0)*shade+0
15276   {0x0ef90f38, ac_t0_mul_prim_mul_shade},
15277   // Pikachu's mouth, smash bros
15278   // (t0-0)*prim+0, (cmb-0)*env+0
15279   {0x0ef90f78, ac_t0_mul_prim_mul_env},
15280   // bomb mask, zelda 2. Added by Gonetz
15281   // (t0-0)*prim+0, (1-0)*env+0
15282   {0x0ef90f7e, ac_t0_mul_prim},
15283   // Charmander's tail, pokemon stadium 2
15284   // (t0-0)*prim+0, (cmb-0)*primlod+0
15285   {0x0ef90fb8, ac_t0_mul_prim_mul_primlod},
15286   // stalactites, Beetle adventure Racing. Added by Gonetz
15287   // (t1-0)*prim+0, (1-cmb)*shade+cmb
15288   {0x0efa0106, ac_one_sub_shade_mul_t1_add_shade},
15289   // Sprites, Ogre Battle. Added by Gonetz
15290   // (t1-0)*prim+0, (0-0)*0+cmb
15291   {0x0efa0efa, ac_t1_mul_prim},
15292   // Something about kotake & koume's combined attack, zelda
15293   // (t1-0)*prim+0, (cmb-0)*shade+0
15294   {0x0efa0f38, ac_t1_mul_prim_mul_shade},
15295   // intro background, bio freaks. Added by Gonetz
15296   // (prim-0)*prim+0
15297   {0x0efb0efb, ac_prim_mul_prim},
15298   // sky, xg2. Added by Gonetz
15299   // (shade-0)*prim+0, (0-0)*0+1
15300   {0x0efc0dff, ac_one},
15301   // Zelda, unimp log. Added by Gonetz
15302   // (shade-0)*prim+0
15303   {0x0efc0efc, ac_prim_mul_shade},
15304   // ?
15305   // (shade-0)*prim+0, (cmb-0)*shade+0 ** INC **
15306   {0x0efc0f38, ac_prim_mul_shade},
15307   // Baby mario's hat shadow, mario golf
15308   // (env-0)*prim+0
15309   {0x0efd0efd, ac_prim_mul_env},
15310   // Menu, doom
15311   // (1-0)*prim+0
15312   {0x0efe0efe, ac_prim},
15313   // Peris Song attack, Pokemin Stadium 2
15314   // (1-0)*prim+0, (cmb-0)*shade+0
15315   {0x0efe0f38, ac_prim_mul_shade},
15316   // Conker's shadow, CBFD. Added by Gonetz
15317   // (1-t0)*shade+0
15318   {0x0f0e0f0e, ac_one_sub_t0_mul_shade},
15319   // Rock smash, pokemon stadium 2
15320   // (1-t0)*shade+0
15321   {0x0f0f0ee8, ac_one_sub_t0_mul_shade},
15322   //waterfall, Paper Mario
15323   // (t0-t1)*shade+0
15324   {0x0f110f11, ac__t0_sub_t1__mul_shade},
15325   // mahogany town statue, Pokemon Stadium 2
15326   // (t0-prim)*shade+0
15327   {0x0f190f19, ac_t0_sub_prim_mul_shade},
15328   // silver cave, pokemon stadium 2
15329   // (t0-prim)*shade+0, (cmb-0)*env+0
15330   {0x0f190f78, ac_t0_sub_prim_mul_shade_mul_env},
15331   // Boomerang circle, zelda
15332   // (t0-0)*shade+0, (1-cmb)*t0+cmb
15333   {0x0f390046, ac_t0_mul_shade},
15334   // THPS3
15335   // (t0-0)*shade+0, (1-0)*t0+cmb
15336   {0x0f39007e, ac_t0_mul_shade},
15337   // ???
15338   // (t0-0)*shade+0, (env-0)*t1+cmb
15339   {0x0f3900bd, ac_t0_mul_shade},
15340   // Forest temple doorway, zelda
15341   // (t0-0)*shade+0, (t1-0)*primlod+cmb
15342   {0x0f3901ba, ac_t0_mul_shade},
15343   // skis, Spacestation Silicon Valley. Added by Gonetz
15344   // (t0-0)*shade+0, (0-0)*0+t0
15345   {0x0f3903ff, ac_t0},
15346   // paper mario. Added by Gonetz
15347   // (t0-0)*shade+0, (cmb-t0)*prim+0
15348   {0x0f390ec8, ac_t0_mul_prim_mul_shade},
15349   // House windows, zelda intro
15350   //z (t0-0)*shade+0, (cmb-0)*prim+0
15351   {0x0f390ef8, ac_t0_mul_prim_mul_shade},
15352   // Characters, mace
15353   // (t0-0)*shade+0, (cmb-0)*shade+0
15354   {0x0f390f38, ac_t0_mul_shade},
15355   // Shadows, mario
15356   //z (t0-0)*shade+0
15357   {0x0f390f39, ac_t0_mul_shade},
15358   // Clear screen intro, banjo kazooie
15359   // (t0-0)*shade+0, (cmb-0)*env+0
15360   {0x0f390f78, ac_t0_mul_env_mul_shade},
15361   // ridge racer, unimp log. Added by Gonetz
15362   // (t0-0)*shade+0, (cmb-0)*primlod+0  **INC**?
15363   {0x0f390fb8, ac_t0_mul_shade},
15364   // Reflecting combined attack at kotake & koume's, zelda
15365   // (t1-0)*shade+0, (cmb-0)*prim+0
15366   {0x0f3a0ef8, ac_t1_mul_prim_mul_shade},
15367   // aerofighter's assault [Ogy]
15368   // (t1-0)*shade+0
15369   {0x0f3a0f3a, ac_t1_mul_shade},
15370   //beetle adventure racing. Added by Gonetz
15371   //(t1-0)*shade+0, (cmb-0)*env+0
15372   {0x0f3a0f78, ac_t1_mul_env_mul_shade},
15373   // building shadow, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
15374   // (prim-0)*shade+0, (cmb-cmb)*lodf+cmb
15375   {0x0f3b0000, ac_prim_mul_shade},
15376   //chip in Spacestation Silicon Valley intro. Added by Gonetz
15377   // (prim-0)*shade+0, (env-cmb)*t1+cmb
15378   {0x0f3b0085, ac_env_sub_primshade_mul_t1_add_primshade},
15379   // N64 logo, tetrisphere. Added by Gonetz
15380   // (prim-0)*shade+0, (prim-0)*shade+0
15381   {0x0f3b0f3b, ac_prim_mul_shade},
15382   // rays, Fushigi no Dungeon - Furai no Shiren 2. Added by Gonetz
15383   // (shade-0)*shade+0, (cmb-0)*prim+0
15384   {0x0f3c0ef8, ac_prim_mul_shade},
15385   // light, dracula resurrection, castlevania 2. Added by Gonetz
15386   // (env-0)*shade+0
15387   {0x0f3d0f3d, ac_env_mul_shade},
15388   // zelda 2 [Ogy]. Added by Gonetz
15389   // (1-0)*shade+0
15390   {0x0f3e0f3e, ac_shade},
15391   // surf pokemon attack, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
15392   // (1-t0)*env+0, (1-cmb)*shade+0  ** INC **
15393   {0x0f4e0f06, ac_t0_mul_shade},
15394   // GE, boxes
15395   // (1-shade)*env+0, (cmb-0)*shade+0 ** INC **
15396   {0x0f660f38, ac_one_sub_shade_mul_env},
15397   //beetle adventure racing. Added by Gonetz
15398   //(t0-0)*env+0, (1-t0)*prim+cmb
15399   //{0x0f7900ce, ac_t0_mul_env}, //this one looks better
15400   //{0x0f7900ce, ac_env_sub_prim_mul_t0_add_prim},
15401   {0x0f7900ce, ac_one_sub_t1_add_t0_mul_env},
15402   //Zelda, logo ? Added by Gonetz
15403   //(t0-0)*env+0, (t1-0)*primlod+0    **INC** changed to mul_env for gannon's organ disappearing [Dave2001]
15404   {0x0f7901ba, ac__t0_inter_t1_using_primlod__mul_env},
15405   // V8-2 menu
15406   // (t0-0)*env+0, (0-0)*0+prim
15407   {0x0f7907ff, ac_prim},
15408   // Skeleton guy's eyes, zelda
15409   // (t0-0)*env+0, (cmb-0)*prim+0
15410   {0x0f790ef8, ac_t0_mul_prim_mul_env},
15411   // Dust from rock spell, quest64
15412   // (t0-0)*env+0, (cmb-0)*shade+0
15413   {0x0f790f38, ac_t0_mul_env_mul_shade},
15414   // eyes of poe, zelda
15415   // (t0-0)*env+0, (cmb-0)*env+0
15416   {0x0f790f78, ac_t0_mul_env},
15417   // Text, mario
15418   //z (t0-0)*env+0
15419   {0x0f790f79, ac_t0_mul_env},
15420   // Shadows, pokemon stadeom 2
15421   // (t0-0)*env+0, (cmb-0)*primlod+0
15422   {0x0f790fb8, ac_t0_mul_env_mul_primlod},
15423   //gauge, PGA
15424   // (t1-0)*env+0, (cmb-0)*t1+0 ** INC **
15425   {0x0f7a0eb8, ac_t1_mul_env},
15426   //text and shadows, Rayman2. Added by Gonetz
15427   // (t1-0)*env+0, (cmb-0)*shade+0
15428   {0x0f7a0f38, ac_t1_mul_env_mul_shade},
15429   // shadows, tom and jerry. Added by Gonetz
15430   // (t1-0)*env+0
15431   {0x0f7a0f7a, ac_t1_mul_env},
15432   // Bomberman64-2 intro. Added by Gonetz
15433   // (prim-0)*env+0
15434   {0x0f7b0f7b, ac_prim_mul_env},
15435   // Text box, mario
15436   //z (shade-0)*env+0
15437   {0x0f7c0f7c, ac_env_mul_shade},
15438   // Ogre battle 64
15439   // (env-0)*env+0
15440   {0x0f7d0f7d, ac_env},
15441   //Goldeneye, [Jeremy]. Added by Gonetz
15442   // (1-0)*env+0, (cmb-0)*shade+0
15443   {0x0f7e0f38, ac_env_mul_shade},
15444   // Status items, megaman
15445   // (1-0)*env+0
15446   {0x0f7e0f7e, ac_env},
15447   // gun fire, Beast_Wars_Transmetal [Raziel64]
15448   // (0-0)*env+0
15449   {0x0f7f0f7f, ac_zero},
15450   // Pokemon attack, Pokemon stadium (J). Added by Gonetz
15451   // (t1-t0)*primlod+0, (cmb-0)*env+prim  ** INC **
15452   {0x0f8a0778, ac__t1_sub_t0_mul_primlod__mul_env_add_prim},
15453   // Shadow Ball, Pokemon Stadium 2 [gokuss4]. Added by Gonetz
15454   // (t1-t0)*primlod+0, (t1-cmb)*prim+0  ** INC **
15455   {0x0f8a0ec2, ac_t0_mul_prim},
15456   // Walls of well through lens of truth, zelda
15457   // (prim-t0)*primlod+0
15458   {0x0f8b0f8b, ac_prim_sub_t0},
15459   // N64 logo, ridge racer. Added by Gonetz
15460   // (1-prim)*primlod+0  **INC**
15461   {0x0f9e0f9e, ac_zero},
15462   // Vines that covers a door in the third room of woodfall temple, zelda 2 [Ogy]. Added by Gonetz
15463   // (t0-0)*primlod+0, (cmb-0)*prim+0
15464   {0x0fb90ef8, ac_t0_mul_primlod_mul_prim},
15465   // zelda 2. Added by Gonetz
15466   // (t0-0)*primlod+0
15467   {0x0fb90fb9, ac_t0_mul_primlod},
15468   // NFL Blitz logo. Added by Gonetz
15469   // (t1-0)*primlod+0
15470   {0x0fba0fba, ac_t1_mul_primlod}, //causes issues
15471   // fallen stars at star summit, Paper Mario. Added by Gonetz
15472   // (shade-0)*primlod+0
15473   {0x0fbc0fbc, ac_primlod_mul_shade},
15474   // expansion pack, Jeremy McGrath Supercross 2000. Added by Gonetz
15475   // (1-0)*primlod+0
15476   {0x0fbe0fbe, ac_primlod},
15477   // intro, Aidyn Chronicles. Added by Gonetz
15478   // (0-0)*primlod+0, (prim-env)*t0+prim  **INC**
15479   {0x0fbf066b, ac_t0_mul_prim},
15480   // sky, Rayman2. Added by Gonetz
15481   // (0-shade)*0+0
15482   {0x0fe70fe7, ac_zero},
15483   // flame, PokemonStadium1 [Raziel64]
15484   // (t0-0)*0+0
15485   {0x0ff90ff9, ac_zero},
15486   //BAR
15487   // (0-0)*0+0, (0-0)*0+TEXEL1
15488   {0x0fff05ff, ac_t0},
15489   // Screen clear, banjo kazooie
15490   // (0-0)*0+0
15491   {0x0fff0fff, ac_zero},
15492   // { #ACEND }
15493 };
15494
15495 // CountCombine - count the # of entries in the combine lists
15496 void CountCombine ()
15497 {
15498   int size = sizeof(color_cmb_list) / sizeof(COMBINER);
15499   int i=0, index=0, a, b;
15500   do {
15501     a = color_cmb_list[index].key >> 24;
15502     for (; i<=a; i++)
15503       cc_lookup[i] = index;
15504
15505     while (index < size)
15506     {
15507       b = color_cmb_list[index].key >> 24;
15508       if (b != a) break;
15509       index ++;
15510     }
15511   } while (index < size);
15512   for (; i<257; i++) cc_lookup[i] = index;
15513
15514   size = sizeof(alpha_cmb_list) / sizeof(COMBINER);
15515   i=0, index=0;
15516   do {
15517     a = (alpha_cmb_list[index].key >> 20) & 0xFF;
15518     for (; i<=a; i++)
15519       ac_lookup[i] = index;
15520
15521     while (index < size)
15522     {
15523       b = (alpha_cmb_list[index].key >> 20) & 0xFF;
15524       if (b != a) break;
15525       index ++;
15526     }
15527   } while (index < size);
15528   for (; i<257; i++) ac_lookup[i] = index;
15529
15530   //color_cmb_list_count = sizeof(color_cmb_list) >> 3; // #bytes/4/2
15531   //alpha_cmb_list_count = sizeof(alpha_cmb_list) >> 3;
15532 }
15533
15534 //****************************************************************
15535 // Main Combine
15536 //****************************************************************
15537
15538 void Combine ()
15539 {
15540   FRDP (" | |- color combine: %08lx, #1: (%s-%s)*%s+%s, #2: (%s-%s)*%s+%s\n",
15541     ((rdp.cycle1 & 0xFFFF) << 16) | (rdp.cycle2 & 0xFFFF),
15542     Mode0[rdp.cycle1&0xF], Mode1[(rdp.cycle1>>4)&0xF], Mode2[(rdp.cycle1>>8)&0x1F], Mode3[(rdp.cycle1>>13)&7],
15543     Mode0[rdp.cycle2&0xF], Mode1[(rdp.cycle2>>4)&0xF], Mode2[(rdp.cycle2>>8)&0x1F], Mode3[(rdp.cycle2>>13)&7]);
15544   FRDP (" | |- alpha combine: %08lx, #1: (%s-%s)*%s+%s, #2: (%s-%s)*%s+%s\n",
15545     (rdp.cycle1 & 0x0FFF0000) | ((rdp.cycle2 & 0x0FFF0000) >> 16),
15546     Alpha0[(rdp.cycle1>>16)&7], Alpha1[(rdp.cycle1>>19)&7], Alpha2[(rdp.cycle1>>22)&7], Alpha3[(rdp.cycle1>>25)&7],
15547     Alpha0[(rdp.cycle2>>16)&7], Alpha1[(rdp.cycle2>>19)&7], Alpha2[(rdp.cycle2>>22)&7], Alpha3[(rdp.cycle2>>25)&7]);
15548   if (!rdp.LOD_en || rdp.cur_tile == rdp.mipmap_level)
15549     lod_frac = rdp.prim_lodfrac;
15550   else if (settings.lodmode == 0)
15551     lod_frac = 0;
15552   else
15553     lod_frac = 10;
15554
15555   rdp.noise = RDP::noise_none;
15556
15557   wxUint32 found = TRUE;
15558
15559   rdp.col[0] = rdp.col[1] = rdp.col[2] = rdp.col[3] =
15560     rdp.coladd[0] = rdp.coladd[1] = rdp.coladd[2] = rdp.coladd[3] = 1.0f;
15561   rdp.cmb_flags = rdp.cmb_flags_2 = 0;
15562
15563   rdp.uncombined = 0;
15564
15565   cmb.tex = 0;
15566   cmb.tmu0_func = cmb.tmu1_func = cmb.tmu0_a_func = cmb.tmu1_a_func = GR_COMBINE_FUNCTION_ZERO;
15567   cmb.tmu0_fac = cmb.tmu1_fac = cmb.tmu0_a_fac = cmb.tmu1_a_fac = GR_COMBINE_FACTOR_NONE;
15568   cmb.tmu0_invert = cmb.tmu0_a_invert = cmb.tmu1_invert = cmb.tmu1_a_invert = FXFALSE;
15569
15570   cmb.dc0_detailmax = cmb.dc1_detailmax = 0;
15571
15572   cmb.mod_0 = cmb.mod_1 = 0;    // remove all modifications
15573   cmb.modcolor_0 = cmb.modcolor1_0 = cmb.modcolor2_0 = cmb.modcolor_1 = cmb.modcolor1_1 = cmb.modcolor2_1
15574     = cmb.modfactor_0 = cmb.modfactor_1 = 0;
15575
15576   cmb.ccolor = cmb.tex_ccolor = 0;
15577   if (cmb.cmb_ext_use || cmb.tex_cmb_ext_use)
15578   {
15579     //have to draw something to allow use of standard combine functions
15580     if (fullscreen)
15581     {
15582       VERTEX v;
15583       memset(&v,0,sizeof(v));
15584       grDrawPoint(&v);
15585     }
15586     cmb.cmb_ext_use = 0;
15587     cmb.tex_cmb_ext_use = 0;
15588   }
15589
15590   wxUint32 cmb_mode_c = (rdp.cycle1 << 16) | (rdp.cycle2 & 0xFFFF);
15591   wxUint32 cmb_mode_a = (rdp.cycle1 & 0x0FFF0000) | ((rdp.cycle2 >> 16) & 0x00000FFF);
15592
15593   cmb.abf1 = GR_BLEND_SRC_ALPHA;
15594   cmb.abf2 = GR_BLEND_ONE_MINUS_SRC_ALPHA;
15595
15596 #ifdef FASTSEARCH
15597   // Fast, ordered search
15598   int current=0x7FFFFFFF, last;
15599   wxUint32 actual_combine, current_combine, color_combine, alpha_combine;
15600   int left, right;
15601
15602   actual_combine = current_combine = cmb_mode_c;
15603   color_combine = actual_combine;
15604   if ((rdp.cycle2 & 0xFFFF) == 0x1FFF)
15605     actual_combine = (rdp.cycle1 << 16) | (rdp.cycle1 & 0xFFFF);
15606
15607   left = cc_lookup[actual_combine>>24];
15608   right = cc_lookup[(actual_combine>>24)+1];
15609
15610   while (1)
15611   {
15612     last = current;
15613     current = left + ((right-left) >> 1);
15614     if (current == last)
15615       break;  // can't be found!
15616
15617     current_combine = color_cmb_list[current].key;
15618     if (current_combine < actual_combine)
15619       left = current;
15620     else if (current_combine > actual_combine)
15621       right = current;
15622     else
15623       break;  // found it!
15624   }
15625
15626   // Check if we didn't find it
15627   if (actual_combine != current_combine)
15628   {
15629     rdp.uncombined |= 1;
15630 #ifdef UNIMP_LOG
15631     if (settings.log_unk)
15632     {
15633       sprintf (out_buf, "COLOR combine not found: %08x, #1: (%s-%s)*%s+%s, #2: (%s-%s)*%s+%s\n",
15634         actual_combine,
15635         Mode0[rdp.cycle1&0xF], Mode1[(rdp.cycle1>>4)&0xF], Mode2[(rdp.cycle1>>8)&0x1F], Mode3[(rdp.cycle1>>13)&7],
15636         Mode0[rdp.cycle2&0xF], Mode1[(rdp.cycle2>>4)&0xF], Mode2[(rdp.cycle2>>8)&0x1F], Mode3[(rdp.cycle2>>13)&7]);
15637       UNIMPMODE();
15638     }
15639 #endif
15640     found = FALSE;
15641     //tex |= 3;
15642
15643     // use t0 as default
15644     cc_t0 ();
15645   }
15646   else
15647     color_cmb_list[current].func();
15648
15649   LRDP(" | |- Color done\n");
15650
15651   // Now again for alpha
15652   current = 0x7FFFFFFF;
15653   actual_combine = cmb_mode_a;
15654   alpha_combine = actual_combine;
15655   if ((rdp.cycle2 & 0x0FFF0000) == 0x01FF0000)
15656     actual_combine = (rdp.cycle1 & 0x0FFF0000) | ((rdp.cycle1 >> 16) & 0x00000FFF);
15657   if ((rdp.cycle1 & 0x0FFF0000) == 0x0FFF0000)
15658     actual_combine = (rdp.cycle2 & 0x0FFF0000) | ((rdp.cycle2 >> 16) & 0x00000FFF);
15659
15660   left = ac_lookup[(actual_combine>>20)&0xFF];
15661   right = ac_lookup[((actual_combine>>20)&0xFF)+1];
15662
15663   while (1)
15664   {
15665     last = current;
15666     current = left + ((right-left) >> 1);
15667     if (current == last)
15668       break;  // can't be found!
15669
15670     current_combine = alpha_cmb_list[current].key;
15671     if (current_combine < actual_combine)
15672       left = current;
15673     else if (current_combine > actual_combine)
15674       right = current;
15675     else
15676       break;  // found it!
15677   }
15678
15679   // Check if we didn't find it
15680   if (actual_combine != current_combine || !found)
15681   {
15682     if (actual_combine != current_combine)
15683     {
15684       rdp.uncombined |= 2;
15685 #ifdef UNIMP_LOG
15686       if (settings.log_unk)
15687       {
15688         sprintf (out_buf, "ALPHA combine not found: %08x, #1: (%s-%s)*%s+%s, #2: (%s-%s)*%s+%s\n",
15689           actual_combine,
15690           Alpha0[(rdp.cycle1>>16)&7], Alpha1[(rdp.cycle1>>19)&7], Alpha2[(rdp.cycle1>>22)&7], Alpha3[(rdp.cycle1>>25)&7],
15691           Alpha0[(rdp.cycle2>>16)&7], Alpha1[(rdp.cycle2>>19)&7], Alpha2[(rdp.cycle2>>22)&7], Alpha3[(rdp.cycle2>>25)&7]);
15692         UNIMPMODE();
15693       }
15694 #endif
15695     }
15696     if (settings.unk_as_red)
15697     {
15698       BrightRed ();
15699     }
15700     else
15701     {
15702       // use full alpha as default
15703       ac_t0 ();
15704     }
15705     //tex |= 3;
15706   }
15707   else
15708     alpha_cmb_list[current].func();
15709
15710
15711   if (color_combine == 0x69351fff) //text, PD, need to change texture alpha
15712   {
15713     A_USE_T1();
15714   }
15715   else if ((color_combine == 0x3fff1fff) && (alpha_combine == 0x03ff03ff) && (rdp.last_tile > rdp.cur_tile))//Dr. Mario
15716   {
15717     cc_t0();
15718     ac_t1();
15719   }
15720   else if (color_combine == 0x613522f0 && (settings.hacks&hack_PMario)) //Paper Mario fortune teller spheres
15721   {
15722     ac_t0();
15723   }
15724
15725   LRDP(" | |- Alpha done\n");
15726 #endif // FASTSEARCH
15727
15728   CombineBlender ();
15729   //*
15730   // Update textures?
15731   //    if (tex == 2 && rdp.texrecting && (cmb.tmu1_func != GR_COMBINE_FUNCTION_ZERO) && (rdp.last_tile_size == 0))
15732   if (cmb.tex == 2 && rdp.texrecting && (rdp.cur_tile == rdp.last_tile_size))
15733   {
15734     cmb.tex = 0;
15735     USE_T0();
15736     A_USE_T0();
15737   }
15738   //*/
15739   rdp.tex = cmb.tex;
15740
15741   if (fullscreen)
15742   {
15743     TBUFF_COLOR_IMAGE * aTBuff[2] = {0, 0};
15744     if (rdp.aTBuffTex[0])
15745       aTBuff[rdp.aTBuffTex[0]->tile] = rdp.aTBuffTex[0];
15746     if (rdp.aTBuffTex[1])
15747       aTBuff[rdp.aTBuffTex[1]->tile] = rdp.aTBuffTex[1];
15748     if (cmb.tex && (aTBuff[0] || aTBuff[1]))
15749     {
15750       if (aTBuff[0] && (settings.frame_buffer&fb_read_alpha))
15751       {
15752         if ((settings.hacks&hack_PMario) && aTBuff[0]->width == rdp.ci_width)
15753           ;
15754         else
15755         {
15756           grChromakeyValue(0);
15757           grChromakeyMode(GR_CHROMAKEY_ENABLE);
15758         }
15759       }
15760       else
15761         grChromakeyMode(GR_CHROMAKEY_DISABLE);
15762
15763       if (aTBuff[0] && aTBuff[0]->info.format == GR_TEXFMT_ALPHA_INTENSITY_88)
15764       {
15765         if (cmb.tex_cmb_ext_use & TEX_COMBINE_EXT_COLOR)
15766         {
15767           if (cmb.t0c_ext_a == GR_CMBX_LOCAL_TEXTURE_RGB)
15768             cmb.t0c_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA;
15769           if (cmb.t0c_ext_b == GR_CMBX_LOCAL_TEXTURE_RGB)
15770             cmb.t0c_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
15771           if (cmb.t0c_ext_c == GR_CMBX_LOCAL_TEXTURE_RGB)
15772             cmb.t0c_ext_c = GR_CMBX_LOCAL_TEXTURE_ALPHA;
15773         }
15774         else
15775           cmb.tmu0_func = GR_COMBINE_FUNCTION_LOCAL_ALPHA;
15776       }
15777
15778       if (aTBuff[1] && aTBuff[1]->info.format == GR_TEXFMT_ALPHA_INTENSITY_88)
15779       {
15780         if (cmb.tex_cmb_ext_use & TEX_COMBINE_EXT_COLOR)
15781         {
15782           if (cmb.t1c_ext_a == GR_CMBX_LOCAL_TEXTURE_RGB)
15783             cmb.t1c_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA;
15784           if (cmb.t1c_ext_b == GR_CMBX_LOCAL_TEXTURE_RGB)
15785             cmb.t1c_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
15786           if (cmb.t1c_ext_c == GR_CMBX_LOCAL_TEXTURE_RGB)
15787             cmb.t1c_ext_c = GR_CMBX_LOCAL_TEXTURE_ALPHA;
15788         }
15789         else
15790           cmb.tmu1_func = GR_COMBINE_FUNCTION_LOCAL_ALPHA;
15791       }
15792     }
15793     else
15794       grChromakeyMode(GR_CHROMAKEY_DISABLE);
15795   }
15796   cmb.shade_mod_hash = (rdp.cmb_flags + rdp.cmb_flags_2) * (rdp.prim_color + rdp.env_color + rdp.K5);
15797
15798   LRDP(" | + Combine end\n");
15799 }
15800
15801 void CombineBlender ()
15802 {
15803   wxUint32 blendmode = rdp.othermode_l >> 16;
15804   // Check force-blending
15805   if ((rdp.othermode_l & 0x4000) && (rdp.cycle_mode < 2))
15806   {
15807     switch (blendmode)
15808     {
15809       // Mace objects
15810     case 0x0382:
15811     case 0x0091:
15812       // 1080 sky
15813     case 0x0c08:
15814       // Mario kart player select
15815       // clr_in * 0 + clr_in * 1
15816       //  - or just clr_in, no matter what alpha
15817     case 0x0f0a:
15818       //DK64 blue prints
15819     case 0x0302:
15820       //Sin and Punishment
15821     case 0xcb02:
15822       // Battlezone
15823       // clr_in * a + clr_in * (1-a)
15824     case 0xc800:
15825     case 0x00c0:
15826       //ISS64
15827     case 0xc302:
15828       A_BLEND (GR_BLEND_ONE, GR_BLEND_ZERO);
15829       break;
15830
15831       //Space Invaders
15832     case 0x0448:
15833     case 0x055a:
15834       A_BLEND (GR_BLEND_ONE, GR_BLEND_ONE);
15835       break;
15836
15837       // LOT in Zelda: MM
15838     case 0xaf50:
15839     case 0x0f5a: //clr_in * 0 + clr_mem * 1
15840       A_BLEND (GR_BLEND_ZERO, GR_BLEND_ONE);
15841       break;
15842
15843     case 0x5f50: //clr_mem * 0 + clr_mem * (1-a)
15844       A_BLEND (GR_BLEND_ZERO, GR_BLEND_ONE_MINUS_SRC_ALPHA);
15845       break;
15846
15847       /*
15848       case 0xc410: // Perfect Dark Mauler
15849       {
15850       MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
15851       MOD_0_COL (rdp.fog_color & 0xFFFFFF00);
15852       MOD_0_FAC (rdp.fog_color & 0xFF);
15853       INTERSHADE_2 (rdp.fog_color & 0xFFFFFF00, rdp.fog_color & 0xFF);
15854
15855       float percent = (rdp.fog_color & 0xFF) / 255.0f;
15856       cmb.ccolor =
15857       ((wxUint32)(((cmb.ccolor >> 24) & 0xFF) * (1.0f-percent) + ((rdp.fog_color>>24) & 0xFF) * percent) << 24) |
15858       ((wxUint32)(((cmb.ccolor >> 16) & 0xFF) * (1.0f-percent) + ((rdp.fog_color>>16) & 0xFF) * percent) << 16) |
15859       ((wxUint32)(((cmb.ccolor >> 8) & 0xFF) * (1.0f-percent) + ((rdp.fog_color>>8) & 0xFF) * percent) << 8) |
15860       (cmb.ccolor & 0xFF);
15861
15862       rdp.col[0] = rdp.col[0] * (1.0f-percent) + ((rdp.fog_color>>24) & 0xFF) / 255.0f * percent;
15863       rdp.col[1] = rdp.col[1] * (1.0f-percent) + ((rdp.fog_color>>16) & 0xFF) / 255.0f * percent;
15864       rdp.col[2] = rdp.col[2] * (1.0f-percent) + ((rdp.fog_color>>8) & 0xFF) / 255.0f * percent;
15865       A_BLEND (GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA);
15866       }
15867       break;
15868       */
15869     case 0xf550: //clr_fog * a_fog + clr_mem * (1-a)
15870       A_BLEND (GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA);
15871       {
15872         wxUint32 prim = rdp.prim_color;
15873         rdp.prim_color = rdp.fog_color;
15874         cc_prim();
15875         ac_prim();
15876         rdp.prim_color = prim;
15877       }
15878       break;
15879
15880     case 0x0150: //spiderman
15881     case 0x0d18: //clr_in * a_fog + clr_mem * (1-a)
15882       A_BLEND (GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA);
15883       if (rdp.cycle_mode == 1 && rdp.cycle2 != 0x01ff1fff)
15884       {
15885         wxUint32 prim = rdp.prim_color;
15886         rdp.prim_color = rdp.fog_color;
15887         ac_prim();
15888         rdp.prim_color = prim;
15889       }
15890       break;
15891
15892     case 0xc912: //40 winks, clr_in * a_fog + clr_mem * 1
15893       {
15894         wxUint32 prim = rdp.prim_color;
15895         rdp.prim_color = rdp.fog_color;
15896         ac_prim();
15897         rdp.prim_color = prim;
15898       }
15899       A_BLEND (GR_BLEND_SRC_ALPHA, GR_BLEND_ONE);
15900       break;
15901
15902     default:
15903       A_BLEND (GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA);
15904     }
15905   }
15906   /*
15907   else if (blendmode == 0xc411) // Super Smash Bros, faked fog for flashing characters
15908   {
15909   MOD_0 (TMOD_TEX_INTER_COLOR_USING_FACTOR);
15910   MOD_0_COL (rdp.fog_color & 0xFFFFFF00);
15911   MOD_0_FAC (rdp.fog_color & 0xFF);
15912   INTERSHADE_2 (rdp.fog_color & 0xFFFFFF00, rdp.fog_color & 0xFF);
15913
15914   float percent = (rdp.fog_color & 0xFF) / 255.0f;
15915   cmb.ccolor =
15916   ((wxUint32)(((cmb.ccolor >> 24) & 0xFF) * (1.0f-percent) + ((rdp.fog_color>>24) & 0xFF) * percent) << 24) |
15917   ((wxUint32)(((cmb.ccolor >> 16) & 0xFF) * (1.0f-percent) + ((rdp.fog_color>>16) & 0xFF) * percent) << 16) |
15918   ((wxUint32)(((cmb.ccolor >> 8) & 0xFF) * (1.0f-percent) + ((rdp.fog_color>>8) & 0xFF) * percent) << 8) |
15919   (cmb.ccolor & 0xFF);
15920
15921   rdp.col[0] = rdp.col[0] * (1.0f-percent) + ((rdp.fog_color>>24) & 0xFF) / 255.0f * percent;
15922   rdp.col[1] = rdp.col[1] * (1.0f-percent) + ((rdp.fog_color>>16) & 0xFF) / 255.0f * percent;
15923   rdp.col[2] = rdp.col[2] * (1.0f-percent) + ((rdp.fog_color>>8) & 0xFF) / 255.0f * percent;
15924   A_BLEND (GR_BLEND_ONE, GR_BLEND_ZERO);
15925   }
15926   */
15927   else if (blendmode == 0x0040) // Mia Soccer Lights
15928     A_BLEND (GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA);
15929   else if ((settings.hacks&hack_Pilotwings) && (rdp.othermode_l & 0x80)) //CLR_ON_CVG without FORCE_BL
15930     A_BLEND (GR_BLEND_ZERO, GR_BLEND_ONE);
15931   else
15932     A_BLEND (GR_BLEND_ONE, GR_BLEND_ZERO);
15933
15934   // ALPHA_CVG_SEL means full alpha
15935   // The reason it wasn't working before was because I wasn't handling rdp:setothermode
15936   //  if (rdp.othermode_l & 0x2000)
15937   if ((rdp.othermode_l & 0x2000) && ((rdp.othermode_l & 0x7000) != 0x7000))
15938   {
15939     if ((settings.hacks&hack_PMario) && (blendmode == 0x5055))
15940     {
15941       A_BLEND (GR_BLEND_ZERO, GR_BLEND_ONE);
15942     }
15943     else if (blendmode == 0x4055) // Mario Golf
15944     {
15945       A_BLEND (GR_BLEND_ZERO, GR_BLEND_ONE);
15946     }
15947     else
15948     {
15949       A_BLEND (GR_BLEND_ONE, GR_BLEND_ZERO);
15950     }
15951   }
15952
15953   //hack
15954   //*
15955   if (settings.hacks&hack_ISS64)
15956   {
15957     if (rdp.othermode_l == 0xff5a6379)
15958     {
15959       A_BLEND (GR_BLEND_ZERO, GR_BLEND_SRC_ALPHA);
15960     }
15961     else if (rdp.othermode_l == 0x00504dd9) //players shadows. CVG_DST_WRAP
15962     {
15963       A_BLEND (GR_BLEND_ZERO, GR_BLEND_ONE);
15964     }
15965   }
15966   else if (settings.hacks&hack_TGR)
15967   {
15968     if (rdp.othermode_l == 0x0f0a0235)
15969     {
15970       A_BLEND (GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA);
15971     }
15972   }
15973   //*/
15974 }
15975
15976 void InitCombine ()
15977 {
15978   LOG ("InitCombine() ");
15979   memset(&cmb, 0, sizeof(cmb));
15980   const char *extensions = grGetString (GR_EXTENSION);
15981   if (const char * extstr = strstr(extensions, "COMBINE")) {
15982     if (!strncmp(extstr, "COMBINE", 7)) {
15983       LOG ("extensions ");
15984       char strColorCombineExt[] = "grColorCombineExt";
15985       cmb.grColorCombineExt = (GRCOLORCOMBINEEXT) grGetProcAddress(strColorCombineExt);
15986       char strAlphaCombineExt[] = "grAlphaCombineExt";
15987       cmb.grAlphaCombineExt = (GRCOLORCOMBINEEXT) grGetProcAddress(strAlphaCombineExt);
15988       char strTexColorCombineExt[] = "grTexColorCombineExt";
15989       cmb.grTexColorCombineExt = (GRTEXCOLORCOMBINEEXT) grGetProcAddress(strTexColorCombineExt);
15990       char strTexAlphaCombineExt[] = "grTexAlphaCombineExt";
15991       cmb.grTexAlphaCombineExt = (GRTEXCOLORCOMBINEEXT) grGetProcAddress(strTexAlphaCombineExt);
15992       char strConstantColorValueExt[] = "grConstantColorValueExt";
15993       cmb.grConstantColorValueExt = (GRCONSTANTCOLORVALUEEXT) grGetProcAddress(strConstantColorValueExt);
15994       if (cmb.grColorCombineExt && cmb.grAlphaCombineExt &&
15995         cmb.grTexColorCombineExt && cmb.grTexAlphaCombineExt)
15996       {
15997         cmb.combine_ext = TRUE;
15998         LOG ("initialized.");
15999       }
16000       else
16001       {
16002         cmb.combine_ext = FALSE;
16003       }
16004     }
16005   }
16006   cmb.dc0_lodbias = cmb.dc1_lodbias = 31;
16007   cmb.dc0_detailscale = cmb.dc1_detailscale = 7;
16008   cmb.lodbias0 = cmb.lodbias1 = 1.0f;
16009   LOG ("\n");
16010 }
16011
16012 void ColorCombinerToExtension ()
16013 {
16014   wxUint32 ext_local, ext_local_a, ext_other, ext_other_a;
16015   switch (cmb.c_loc)
16016   {
16017   case GR_COMBINE_LOCAL_ITERATED:
16018     ext_local = GR_CMBX_ITRGB;
16019     ext_local_a = GR_CMBX_ITALPHA;
16020     break;
16021   case GR_COMBINE_LOCAL_CONSTANT:
16022     ext_local = GR_CMBX_CONSTANT_COLOR;
16023     ext_local_a = GR_CMBX_CONSTANT_ALPHA;
16024     break;
16025   default:
16026     ext_local = GR_CMBX_ZERO;
16027     ext_local_a = GR_CMBX_ZERO;
16028   };
16029   switch (cmb.c_oth)
16030   {
16031   case GR_COMBINE_OTHER_ITERATED:
16032     ext_other = GR_CMBX_ITRGB;
16033     ext_other_a = GR_CMBX_ITALPHA;
16034     break;
16035   case GR_COMBINE_OTHER_TEXTURE:
16036     ext_other = GR_CMBX_TEXTURE_RGB;
16037     ext_other_a = GR_CMBX_TEXTURE_ALPHA;
16038     break;
16039   case GR_COMBINE_OTHER_CONSTANT:
16040     ext_other = GR_CMBX_CONSTANT_COLOR;
16041     ext_other_a = GR_CMBX_CONSTANT_ALPHA;
16042     break;
16043   default:
16044     ext_other = GR_CMBX_ZERO;
16045     ext_other_a = GR_CMBX_ZERO;
16046   };
16047   switch (cmb.c_fac)
16048   {
16049   case GR_COMBINE_FACTOR_ZERO:
16050     cmb.c_ext_c = GR_CMBX_ZERO;
16051     cmb.c_ext_c_invert = 0;
16052     break;
16053   case GR_COMBINE_FACTOR_ONE:
16054     cmb.c_ext_c = GR_CMBX_ZERO;
16055     cmb.c_ext_c_invert = 1;
16056     break;
16057   case GR_COMBINE_FACTOR_LOCAL:
16058     cmb.c_ext_c = ext_local;
16059     cmb.c_ext_c_invert = 0;
16060     break;
16061   case GR_COMBINE_FACTOR_LOCAL_ALPHA:
16062     cmb.c_ext_c = ext_local_a;
16063     cmb.c_ext_c_invert = 0;
16064     break;
16065   case GR_COMBINE_FACTOR_OTHER_ALPHA:
16066     cmb.c_ext_c = ext_other_a;
16067     cmb.c_ext_c_invert = 0;
16068     break;
16069   case GR_COMBINE_FACTOR_TEXTURE_RGB:
16070     cmb.c_ext_c = GR_CMBX_TEXTURE_RGB;
16071     cmb.c_ext_c_invert = 0;
16072     break;
16073   case GR_COMBINE_FACTOR_TEXTURE_ALPHA:
16074     cmb.c_ext_c = GR_CMBX_TEXTURE_ALPHA;
16075     cmb.c_ext_c_invert = 0;
16076     break;
16077   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
16078     cmb.c_ext_c = ext_local;
16079     cmb.c_ext_c_invert = 1;
16080     break;
16081   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
16082     cmb.c_ext_c = ext_local_a;
16083     cmb.c_ext_c_invert = 1;
16084     break;
16085   case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
16086     cmb.c_ext_c = ext_other_a;
16087     cmb.c_ext_c_invert = 1;
16088     break;
16089   case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:
16090     cmb.c_ext_c = GR_CMBX_TEXTURE_ALPHA;
16091     cmb.c_ext_c_invert = 1;
16092     break;
16093   default:
16094     cmb.c_ext_c = GR_CMBX_ZERO;
16095     cmb.c_ext_c_invert = 0;
16096   }
16097
16098   switch (cmb.c_fnc)
16099   {
16100   case GR_COMBINE_FUNCTION_ZERO:
16101     cmb.c_ext_a = GR_CMBX_ZERO;
16102     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16103     cmb.c_ext_b = GR_CMBX_ZERO;
16104     cmb.c_ext_b_mode = GR_FUNC_MODE_X;
16105     cmb.c_ext_c = GR_CMBX_ZERO;
16106     cmb.c_ext_c_invert = 0;
16107     cmb.c_ext_d = GR_CMBX_ZERO;
16108     cmb.c_ext_d_invert = 0;
16109     break;
16110   case GR_COMBINE_FUNCTION_LOCAL:
16111     cmb.c_ext_a = ext_local;
16112     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16113     cmb.c_ext_b = GR_CMBX_ZERO;
16114     cmb.c_ext_b_mode = GR_FUNC_MODE_X;
16115     cmb.c_ext_c = GR_CMBX_ZERO;
16116     cmb.c_ext_c_invert = 1;
16117     cmb.c_ext_d = GR_CMBX_ZERO;
16118     cmb.c_ext_d_invert = 0;
16119     break;
16120   case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
16121     cmb.c_ext_a = ext_local_a;
16122     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16123     cmb.c_ext_b = GR_CMBX_ZERO;
16124     cmb.c_ext_b_mode = GR_FUNC_MODE_X;
16125     cmb.c_ext_c = GR_CMBX_ZERO;
16126     cmb.c_ext_c_invert = 1;
16127     cmb.c_ext_d = GR_CMBX_ZERO;
16128     cmb.c_ext_d_invert = 0;
16129     break;
16130   case GR_COMBINE_FUNCTION_SCALE_OTHER:
16131     cmb.c_ext_a = ext_other;
16132     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16133     cmb.c_ext_b = GR_CMBX_ZERO;
16134     cmb.c_ext_b_mode = GR_FUNC_MODE_ZERO;
16135     cmb.c_ext_d = GR_CMBX_ZERO;
16136     cmb.c_ext_d_invert = 0;
16137     break;
16138   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
16139     cmb.c_ext_a = ext_other;
16140     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16141     cmb.c_ext_b = ext_local;
16142     cmb.c_ext_b_mode = GR_FUNC_MODE_ZERO;
16143     cmb.c_ext_d = GR_CMBX_B;
16144     cmb.c_ext_d_invert = 0;
16145     break;
16146   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
16147     cmb.c_ext_a = ext_other;
16148     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16149     cmb.c_ext_b = ext_local_a;
16150     cmb.c_ext_b_mode = GR_FUNC_MODE_ZERO;
16151     cmb.c_ext_d = GR_CMBX_B;
16152     cmb.c_ext_d_invert = 0;
16153     break;
16154   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
16155     cmb.c_ext_a = ext_other;
16156     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16157     cmb.c_ext_b = ext_local;
16158     cmb.c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16159     cmb.c_ext_d = GR_CMBX_ZERO;
16160     cmb.c_ext_d_invert = 0;
16161     break;
16162   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
16163     cmb.c_ext_a = ext_other;
16164     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16165     cmb.c_ext_b = ext_local;
16166     cmb.c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16167     cmb.c_ext_d = GR_CMBX_B;
16168     cmb.c_ext_d_invert = 0;
16169     break;
16170   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16171     cmb.c_ext_a = ext_other;
16172     cmb.c_ext_a_mode = GR_FUNC_MODE_X;
16173     cmb.c_ext_b = ext_local;
16174     cmb.c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16175     cmb.c_ext_d = GR_CMBX_ALOCAL;
16176     cmb.c_ext_d_invert = 0;
16177     break;
16178   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
16179     cmb.c_ext_a = GR_CMBX_ZERO;
16180     cmb.c_ext_a_mode = GR_FUNC_MODE_ZERO;
16181     cmb.c_ext_b = ext_local;
16182     cmb.c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16183     cmb.c_ext_d = GR_CMBX_B;
16184     cmb.c_ext_d_invert = 0;
16185     break;
16186   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16187   default:
16188     cmb.c_ext_a = GR_CMBX_ZERO;
16189     cmb.c_ext_a_mode = GR_FUNC_MODE_ZERO;
16190     cmb.c_ext_b = ext_local;
16191     cmb.c_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16192     cmb.c_ext_d = GR_CMBX_ALOCAL;
16193     cmb.c_ext_d_invert = 0;
16194     break;
16195   }
16196 }
16197
16198 void AlphaCombinerToExtension ()
16199 {
16200   wxUint32 ext_local, ext_other;
16201   switch (cmb.a_loc)
16202   {
16203   case GR_COMBINE_LOCAL_ITERATED:
16204     ext_local = GR_CMBX_ITALPHA;
16205     break;
16206   case GR_COMBINE_LOCAL_CONSTANT:
16207     ext_local = GR_CMBX_CONSTANT_ALPHA;
16208     break;
16209   default:
16210     ext_local = GR_CMBX_ZERO;
16211   };
16212   switch (cmb.a_oth)
16213   {
16214   case GR_COMBINE_OTHER_ITERATED:
16215     ext_other = GR_CMBX_ITALPHA;
16216     break;
16217   case GR_COMBINE_OTHER_TEXTURE:
16218     ext_other = GR_CMBX_TEXTURE_ALPHA;
16219     break;
16220   case GR_COMBINE_OTHER_CONSTANT:
16221     ext_other = GR_CMBX_CONSTANT_ALPHA;
16222     break;
16223   default:
16224     ext_other = GR_CMBX_ZERO;
16225   };
16226   switch (cmb.a_fac)
16227   {
16228   case GR_COMBINE_FACTOR_ZERO:
16229     cmb.a_ext_c = GR_CMBX_ZERO;
16230     cmb.a_ext_c_invert = 0;
16231     break;
16232   case GR_COMBINE_FACTOR_ONE:
16233     cmb.a_ext_c = GR_CMBX_ZERO;
16234     cmb.a_ext_c_invert = 1;
16235     break;
16236   case GR_COMBINE_FACTOR_LOCAL:
16237   case GR_COMBINE_FACTOR_LOCAL_ALPHA:
16238     cmb.a_ext_c = ext_local;
16239     cmb.a_ext_c_invert = 0;
16240     break;
16241   case GR_COMBINE_FACTOR_OTHER_ALPHA:
16242     cmb.a_ext_c = ext_other;
16243     cmb.a_ext_c_invert = 0;
16244     break;
16245   case GR_COMBINE_FACTOR_TEXTURE_ALPHA:
16246     cmb.a_ext_c = GR_CMBX_TEXTURE_ALPHA;
16247     cmb.a_ext_c_invert = 0;
16248     break;
16249   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
16250   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
16251     cmb.a_ext_c = ext_local;
16252     cmb.a_ext_c_invert = 1;
16253     break;
16254   case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
16255     cmb.a_ext_c = ext_other;
16256     cmb.a_ext_c_invert = 1;
16257     break;
16258   case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:
16259     cmb.a_ext_c = GR_CMBX_TEXTURE_ALPHA;
16260     cmb.a_ext_c_invert = 1;
16261     break;
16262   default:
16263     cmb.a_ext_c = GR_CMBX_ZERO;
16264     cmb.a_ext_c_invert = 0;
16265   }
16266
16267   switch (cmb.a_fnc)
16268   {
16269   case GR_COMBINE_FUNCTION_ZERO:
16270     cmb.a_ext_a = GR_CMBX_ZERO;
16271     cmb.a_ext_a_mode = GR_FUNC_MODE_X;
16272     cmb.a_ext_b = GR_CMBX_ZERO;
16273     cmb.a_ext_b_mode = GR_FUNC_MODE_X;
16274     cmb.a_ext_c = GR_CMBX_ZERO;
16275     cmb.a_ext_c_invert = 0;
16276     cmb.a_ext_d = GR_CMBX_ZERO;
16277     cmb.a_ext_d_invert = 0;
16278     break;
16279   case GR_COMBINE_FUNCTION_LOCAL:
16280   case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
16281     cmb.a_ext_a = GR_CMBX_ZERO;
16282     cmb.a_ext_a_mode = GR_FUNC_MODE_ZERO;
16283     cmb.a_ext_b = ext_local;
16284     cmb.a_ext_b_mode = GR_FUNC_MODE_X;
16285     cmb.a_ext_c = GR_CMBX_ZERO;
16286     cmb.a_ext_c_invert = 1;
16287     cmb.a_ext_d = GR_CMBX_ZERO;
16288     cmb.a_ext_d_invert = 0;
16289     break;
16290   case GR_COMBINE_FUNCTION_SCALE_OTHER:
16291     cmb.a_ext_a = ext_other;
16292     cmb.a_ext_a_mode = GR_FUNC_MODE_X;
16293     cmb.a_ext_b = GR_CMBX_ZERO;
16294     cmb.a_ext_b_mode = GR_FUNC_MODE_ZERO;
16295     cmb.a_ext_d = GR_CMBX_ZERO;
16296     cmb.a_ext_d_invert = 0;
16297     break;
16298   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
16299   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
16300     cmb.a_ext_a = ext_other;
16301     cmb.a_ext_a_mode = GR_FUNC_MODE_X;
16302     cmb.a_ext_b = ext_local;
16303     cmb.a_ext_b_mode = GR_FUNC_MODE_ZERO;
16304     cmb.a_ext_d = GR_CMBX_B;
16305     cmb.a_ext_d_invert = 0;
16306     break;
16307   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
16308     cmb.a_ext_a = ext_other;
16309     cmb.a_ext_a_mode = GR_FUNC_MODE_X;
16310     cmb.a_ext_b = ext_local;
16311     cmb.a_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16312     cmb.a_ext_d = GR_CMBX_ZERO;
16313     cmb.a_ext_d_invert = 0;
16314     break;
16315   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
16316   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16317     cmb.a_ext_a = ext_other;
16318     cmb.a_ext_a_mode = GR_FUNC_MODE_X;
16319     cmb.a_ext_b = ext_local;
16320     cmb.a_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16321     cmb.a_ext_d = GR_CMBX_B;
16322     cmb.a_ext_d_invert = 0;
16323     break;
16324   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
16325   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16326     cmb.a_ext_a = GR_CMBX_ZERO;
16327     cmb.a_ext_a_mode = GR_FUNC_MODE_ZERO;
16328     cmb.a_ext_b = ext_local;
16329     cmb.a_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16330     cmb.a_ext_d = GR_CMBX_B;
16331     cmb.a_ext_d_invert = 0;
16332     break;
16333   }
16334 }
16335
16336 void TexColorCombinerToExtension (GrChipID_t tmu)
16337 {
16338   wxUint32 tc_ext_a, tc_ext_a_mode, tc_ext_b, tc_ext_b_mode, tc_ext_c, tc_ext_d;
16339   int  tc_ext_c_invert, tc_ext_d_invert;
16340   wxUint32 tmu_func, tmu_fac;
16341
16342   if (tmu == GR_TMU0)
16343   {
16344     tmu_func = cmb.tmu0_func;
16345     tmu_fac = cmb.tmu0_fac;
16346   }
16347   else
16348   {
16349     tmu_func = cmb.tmu1_func;
16350     tmu_fac = cmb.tmu1_fac;
16351   }
16352
16353   switch (tmu_fac)
16354   {
16355   case GR_COMBINE_FACTOR_ZERO:
16356     tc_ext_c = GR_CMBX_ZERO;
16357     tc_ext_c_invert = 0;
16358     break;
16359   case GR_COMBINE_FACTOR_LOCAL:
16360     tc_ext_c = GR_CMBX_LOCAL_TEXTURE_RGB;
16361     tc_ext_c_invert = 0;
16362     break;
16363   case GR_COMBINE_FACTOR_LOCAL_ALPHA:
16364     tc_ext_c = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16365     tc_ext_c_invert = 0;
16366     break;
16367   case GR_COMBINE_FACTOR_OTHER_ALPHA:
16368     tc_ext_c = GR_CMBX_OTHER_TEXTURE_ALPHA;
16369     tc_ext_c_invert = 0;
16370     break;
16371   case GR_COMBINE_FACTOR_DETAIL_FACTOR:
16372     tc_ext_c = GR_CMBX_DETAIL_FACTOR;
16373     tc_ext_c_invert = 0;
16374     break;
16375   case GR_COMBINE_FACTOR_ONE:
16376     tc_ext_c = GR_CMBX_ZERO;
16377     tc_ext_c_invert = 1;
16378     break;
16379   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
16380     tc_ext_c = GR_CMBX_LOCAL_TEXTURE_RGB;
16381     tc_ext_c_invert = 1;
16382     break;
16383   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
16384     tc_ext_c = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16385     tc_ext_c_invert = 1;
16386     break;
16387   case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
16388     tc_ext_c = GR_CMBX_OTHER_TEXTURE_ALPHA;
16389     tc_ext_c_invert = 1;
16390     break;
16391   case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:
16392     tc_ext_c = GR_CMBX_DETAIL_FACTOR;
16393     tc_ext_c_invert = 1;
16394     break;
16395   default:
16396     tc_ext_c = GR_CMBX_ZERO;
16397     tc_ext_c_invert = 0;
16398     break;
16399   }
16400
16401   switch (tmu_func)
16402   {
16403   case GR_COMBINE_FUNCTION_ZERO:
16404     tc_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB;
16405     tc_ext_a_mode = GR_FUNC_MODE_ZERO;
16406     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16407     tc_ext_b_mode = GR_FUNC_MODE_ZERO;
16408     tc_ext_c = GR_CMBX_ZERO;
16409     tc_ext_c_invert = 0;
16410     tc_ext_d = GR_CMBX_ZERO;
16411     tc_ext_d_invert = 0;
16412     break;
16413   case GR_COMBINE_FUNCTION_LOCAL:
16414     tc_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB;
16415     tc_ext_a_mode = GR_FUNC_MODE_X;
16416     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16417     tc_ext_b_mode = GR_FUNC_MODE_ZERO;
16418     tc_ext_c = GR_CMBX_ZERO;
16419     tc_ext_c_invert = 1;
16420     tc_ext_d = GR_CMBX_ZERO;
16421     tc_ext_d_invert = 0;
16422     break;
16423   case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
16424     tc_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16425     tc_ext_a_mode = GR_FUNC_MODE_X;
16426     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16427     tc_ext_b_mode = GR_FUNC_MODE_ZERO;
16428     tc_ext_c = GR_CMBX_ZERO;
16429     tc_ext_c_invert = 1;
16430     tc_ext_d = GR_CMBX_ZERO;
16431     tc_ext_d_invert = 0;
16432     break;
16433   case GR_COMBINE_FUNCTION_SCALE_OTHER:
16434     tc_ext_a = GR_CMBX_OTHER_TEXTURE_RGB;
16435     tc_ext_a_mode = GR_FUNC_MODE_X;
16436     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16437     tc_ext_b_mode = GR_FUNC_MODE_ZERO;
16438     tc_ext_d = GR_CMBX_ZERO;
16439     tc_ext_d_invert = 0;
16440     break;
16441   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
16442     tc_ext_a = GR_CMBX_OTHER_TEXTURE_RGB;
16443     tc_ext_a_mode = GR_FUNC_MODE_X;
16444     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16445     tc_ext_b_mode = GR_FUNC_MODE_ZERO;
16446     tc_ext_d = GR_CMBX_B;
16447     tc_ext_d_invert = 0;
16448     break;
16449   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
16450     tc_ext_a = GR_CMBX_OTHER_TEXTURE_RGB;
16451     tc_ext_a_mode = GR_FUNC_MODE_X;
16452     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16453     tc_ext_b_mode = GR_FUNC_MODE_ZERO;
16454     tc_ext_d = GR_CMBX_B;
16455     tc_ext_d_invert = 0;
16456     break;
16457   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
16458     tc_ext_a = GR_CMBX_OTHER_TEXTURE_RGB;
16459     tc_ext_a_mode = GR_FUNC_MODE_X;
16460     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16461     tc_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16462     tc_ext_d = GR_CMBX_ZERO;
16463     tc_ext_d_invert = 0;
16464     break;
16465   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
16466     tc_ext_a = GR_CMBX_OTHER_TEXTURE_RGB;
16467     tc_ext_a_mode = GR_FUNC_MODE_X;
16468     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16469     tc_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16470     tc_ext_d = GR_CMBX_B;
16471     tc_ext_d_invert = 0;
16472     break;
16473   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16474     tc_ext_a = GR_CMBX_OTHER_TEXTURE_RGB;
16475     tc_ext_a_mode = GR_FUNC_MODE_X;
16476     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16477     tc_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16478     tc_ext_d = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16479     tc_ext_d_invert = 0;
16480     break;
16481   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
16482     tc_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB;
16483     tc_ext_a_mode = GR_FUNC_MODE_ZERO;
16484     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16485     tc_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16486     tc_ext_d = GR_CMBX_B;
16487     tc_ext_d_invert = 0;
16488     break;
16489   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16490     tc_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB;
16491     tc_ext_a_mode = GR_FUNC_MODE_ZERO;
16492     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16493     tc_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16494     tc_ext_d = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16495     tc_ext_d_invert = 0;
16496     break;
16497   default:
16498     tc_ext_a = GR_CMBX_LOCAL_TEXTURE_RGB;
16499     tc_ext_a_mode = GR_FUNC_MODE_ZERO;
16500     tc_ext_b = GR_CMBX_LOCAL_TEXTURE_RGB;
16501     tc_ext_b_mode = GR_FUNC_MODE_ZERO;
16502     tc_ext_c = GR_CMBX_ZERO;
16503     tc_ext_c_invert = 0;
16504     tc_ext_d = GR_CMBX_ZERO;
16505     tc_ext_d_invert = 0;
16506     break;
16507   }
16508
16509   if (tmu == GR_TMU0)
16510   {
16511     cmb.t0c_ext_a = tc_ext_a;
16512     cmb.t0c_ext_a_mode = tc_ext_a_mode;
16513     cmb.t0c_ext_b = tc_ext_b;
16514     cmb.t0c_ext_b_mode = tc_ext_b_mode;
16515     cmb.t0c_ext_c = tc_ext_c;
16516     cmb.t0c_ext_c_invert = tc_ext_c_invert;
16517     cmb.t0c_ext_d = tc_ext_d;
16518     cmb.t0c_ext_d_invert = tc_ext_d_invert;
16519   }
16520   else
16521   {
16522     cmb.t1c_ext_a = tc_ext_a;
16523     cmb.t1c_ext_a_mode = tc_ext_a_mode;
16524     cmb.t1c_ext_b = tc_ext_b;
16525     cmb.t1c_ext_b_mode = tc_ext_b_mode;
16526     cmb.t1c_ext_c = tc_ext_c;
16527     cmb.t1c_ext_c_invert = tc_ext_c_invert;
16528     cmb.t1c_ext_d = tc_ext_d;
16529     cmb.t1c_ext_d_invert = tc_ext_d_invert;
16530   }
16531 }
16532
16533 void TexAlphaCombinerToExtension (GrChipID_t tmu)
16534 {
16535   wxUint32 ta_ext_a, ta_ext_a_mode, ta_ext_b, ta_ext_b_mode, ta_ext_c, ta_ext_d;
16536   int  ta_ext_c_invert, ta_ext_d_invert;
16537   wxUint32 tmu_a_func, tmu_a_fac;
16538
16539   if (tmu == GR_TMU0)
16540   {
16541     tmu_a_func = cmb.tmu0_a_func;
16542     tmu_a_fac = cmb.tmu0_a_fac;
16543   }
16544   else
16545   {
16546     tmu_a_func = cmb.tmu1_a_func;
16547     tmu_a_fac = cmb.tmu1_a_fac;
16548   }
16549
16550   switch (tmu_a_fac)
16551   {
16552   case GR_COMBINE_FACTOR_ZERO:
16553     ta_ext_c = GR_CMBX_ZERO;
16554     ta_ext_c_invert = 0;
16555     break;
16556   case GR_COMBINE_FACTOR_LOCAL:
16557   case GR_COMBINE_FACTOR_LOCAL_ALPHA:
16558     ta_ext_c = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16559     ta_ext_c_invert = 0;
16560     break;
16561   case GR_COMBINE_FACTOR_OTHER_ALPHA:
16562     ta_ext_c = GR_CMBX_OTHER_TEXTURE_ALPHA;
16563     ta_ext_c_invert = 0;
16564     break;
16565   case GR_COMBINE_FACTOR_DETAIL_FACTOR:
16566     ta_ext_c = GR_CMBX_DETAIL_FACTOR;
16567     ta_ext_c_invert = 0;
16568     break;
16569   case GR_COMBINE_FACTOR_ONE:
16570     ta_ext_c = GR_CMBX_ZERO;
16571     ta_ext_c_invert = 1;
16572     break;
16573   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
16574   case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
16575     ta_ext_c = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16576     ta_ext_c_invert = 1;
16577     break;
16578   case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
16579     ta_ext_c = GR_CMBX_OTHER_TEXTURE_ALPHA;
16580     ta_ext_c_invert = 1;
16581     break;
16582   case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:
16583     ta_ext_c = GR_CMBX_DETAIL_FACTOR;
16584     ta_ext_c_invert = 1;
16585     break;
16586   default:
16587     ta_ext_c = GR_CMBX_ZERO;
16588     ta_ext_c_invert = 0;
16589     break;
16590   }
16591
16592   switch (tmu_a_func)
16593   {
16594   case GR_COMBINE_FUNCTION_ZERO:
16595     ta_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16596     ta_ext_a_mode = GR_FUNC_MODE_ZERO;
16597     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16598     ta_ext_b_mode = GR_FUNC_MODE_ZERO;
16599     ta_ext_c = GR_CMBX_ZERO;
16600     ta_ext_c_invert = 0;
16601     ta_ext_d = GR_CMBX_ZERO;
16602     ta_ext_d_invert = 0;
16603     break;
16604   case GR_COMBINE_FUNCTION_LOCAL:
16605   case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
16606     ta_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16607     ta_ext_a_mode = GR_FUNC_MODE_X;
16608     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16609     ta_ext_b_mode = GR_FUNC_MODE_ZERO;
16610     ta_ext_c = GR_CMBX_ZERO;
16611     ta_ext_c_invert = 1;
16612     ta_ext_d = GR_CMBX_ZERO;
16613     ta_ext_d_invert = 0;
16614     break;
16615   case GR_COMBINE_FUNCTION_SCALE_OTHER:
16616     ta_ext_a = GR_CMBX_OTHER_TEXTURE_ALPHA;
16617     ta_ext_a_mode = GR_FUNC_MODE_X;
16618     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16619     ta_ext_b_mode = GR_FUNC_MODE_ZERO;
16620     ta_ext_d = GR_CMBX_ZERO;
16621     ta_ext_d_invert = 0;
16622     break;
16623   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
16624   case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
16625     ta_ext_a = GR_CMBX_OTHER_TEXTURE_ALPHA;
16626     ta_ext_a_mode = GR_FUNC_MODE_X;
16627     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16628     ta_ext_b_mode = GR_FUNC_MODE_ZERO;
16629     ta_ext_d = GR_CMBX_B;
16630     ta_ext_d_invert = 0;
16631     break;
16632   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
16633     ta_ext_a = GR_CMBX_OTHER_TEXTURE_ALPHA;
16634     ta_ext_a_mode = GR_FUNC_MODE_X;
16635     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16636     ta_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16637     ta_ext_d = GR_CMBX_ZERO;
16638     ta_ext_d_invert = 0;
16639     break;
16640   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
16641   case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16642     ta_ext_a = GR_CMBX_OTHER_TEXTURE_ALPHA;
16643     ta_ext_a_mode = GR_FUNC_MODE_X;
16644     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16645     ta_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16646     ta_ext_d = GR_CMBX_B;
16647     ta_ext_d_invert = 0;
16648     break;
16649   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
16650   case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
16651     ta_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16652     ta_ext_a_mode = GR_FUNC_MODE_ZERO;
16653     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16654     ta_ext_b_mode = GR_FUNC_MODE_NEGATIVE_X;
16655     ta_ext_d = GR_CMBX_B;
16656     ta_ext_d_invert = 0;
16657     break;
16658   default:
16659     ta_ext_a = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16660     ta_ext_a_mode = GR_FUNC_MODE_ZERO;
16661     ta_ext_b = GR_CMBX_LOCAL_TEXTURE_ALPHA;
16662     ta_ext_b_mode = GR_FUNC_MODE_ZERO;
16663     ta_ext_c = GR_CMBX_ZERO;
16664     ta_ext_c_invert = 0;
16665     ta_ext_d = GR_CMBX_ZERO;
16666     ta_ext_d_invert = 0;
16667     break;
16668   }
16669
16670   if (tmu == GR_TMU0)
16671   {
16672     cmb.t0a_ext_a = ta_ext_a;
16673     cmb.t0a_ext_a_mode = ta_ext_a_mode;
16674     cmb.t0a_ext_b = ta_ext_b;
16675     cmb.t0a_ext_b_mode = ta_ext_b_mode;
16676     cmb.t0a_ext_c = ta_ext_c;
16677     cmb.t0a_ext_c_invert = ta_ext_c_invert;
16678     cmb.t0a_ext_d = ta_ext_d;
16679     cmb.t0a_ext_d_invert = ta_ext_d_invert;
16680   }
16681   else
16682   {
16683     cmb.t1a_ext_a = ta_ext_a;
16684     cmb.t1a_ext_a_mode = ta_ext_a_mode;
16685     cmb.t1a_ext_b = ta_ext_b;
16686     cmb.t1a_ext_b_mode = ta_ext_b_mode;
16687     cmb.t1a_ext_c = ta_ext_c;
16688     cmb.t1a_ext_c_invert = ta_ext_c_invert;
16689     cmb.t1a_ext_d = ta_ext_d;
16690     cmb.t1a_ext_d_invert = ta_ext_d_invert;
16691   }
16692 }