GSRegs.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:23k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "stdafx.h"
  22. #include "GSState.h"
  23. // GIFPackedRegHandler*
  24. void __fastcall GSState::GIFPackedRegHandlerNull(GIFPackedReg* r)
  25. {
  26. LOG(_T("GIFPackedRegHandlerNull(%016I64x%016I64x)n"), r->ai64[0], r->ai64[1]);
  27. }
  28. void __fastcall GSState::GIFPackedRegHandlerPRIM(GIFPackedReg* r)
  29. {
  30. LOG(_T("Packed "));
  31. GIFReg r2;
  32. r2.PRIM.i64 = r->PRIM.PRIM;
  33. GIFRegHandlerPRIM(&r2);
  34. }
  35. void __fastcall GSState::GIFPackedRegHandlerRGBA(GIFPackedReg* r)
  36. {
  37. LOG(_T("Packed RGBA(R=%x G=%x B=%x A=%x)n"),
  38. r->RGBA.R,
  39. r->RGBA.G,
  40. r->RGBA.B,
  41. r->RGBA.A);
  42. m_v.RGBAQ.R = r->RGBA.R;
  43. m_v.RGBAQ.G = r->RGBA.G;
  44. m_v.RGBAQ.B = r->RGBA.B;
  45. m_v.RGBAQ.A = r->RGBA.A;
  46. m_v.RGBAQ.Q = m_q;
  47. }
  48. void __fastcall GSState::GIFPackedRegHandlerSTQ(GIFPackedReg* r)
  49. {
  50. LOG(_T("Packed STQ(S=%.4f T=%.4f, Q=%.4f)n"), 
  51. r->STQ.S,
  52. r->STQ.T,
  53. r->STQ.Q);
  54. m_v.ST.S = r->STQ.S;
  55. m_v.ST.T = r->STQ.T;
  56. m_q = r->STQ.Q;
  57. }
  58. void __fastcall GSState::GIFPackedRegHandlerUV(GIFPackedReg* r)
  59. {
  60. LOG(_T("Packed UV(U=%.4f V=%.4f)n"), 
  61. (float)r->UV.U/16,
  62. (float)r->UV.V/16);
  63. m_v.UV.U = r->UV.U;
  64. m_v.UV.V = r->UV.V;
  65. }
  66. void __fastcall GSState::GIFPackedRegHandlerXYZF2(GIFPackedReg* r)
  67. {
  68. LOG(_T("Packed "));
  69. LOG(_T("XYZF%d(X=%.2f Y=%.2f Z=%d F=%d)n"), 
  70. 2 + r->XYZF2.ADC,
  71. (float)r->XYZF2.X/16,
  72. (float)r->XYZF2.Y/16,
  73. r->XYZF2.Z,
  74. r->XYZF2.F);
  75. m_v.XYZ.X = r->XYZF2.X;
  76. m_v.XYZ.Y = r->XYZF2.Y;
  77. m_v.XYZ.Z = r->XYZF2.Z;
  78. m_v.FOG.F = r->XYZF2.F;
  79. VertexKick(r->XYZF2.ADC);
  80. }
  81. void __fastcall GSState::GIFPackedRegHandlerXYZ2(GIFPackedReg* r)
  82. {
  83. LOG(_T("Packed "));
  84. LOG(_T("XYZ%d(X=%.2f Y=%.2f Z=%d)n"), 
  85. 2 + r->XYZ2.ADC,
  86. (float)r->XYZ2.X/16,
  87. (float)r->XYZ2.Y/16,
  88. r->XYZ2.Z);
  89. m_v.XYZ.X = r->XYZ2.X;
  90. m_v.XYZ.Y = r->XYZ2.Y;
  91. m_v.XYZ.Z = r->XYZ2.Z;
  92. VertexKick(r->XYZ2.ADC);
  93. }
  94. void __fastcall GSState::GIFPackedRegHandlerTEX0_1(GIFPackedReg* r)
  95. {
  96. LOG(_T("Packed "));
  97. GIFRegHandlerTEX0_1((GIFReg*)&r->ai64[0]);
  98. }
  99. void __fastcall GSState::GIFPackedRegHandlerTEX0_2(GIFPackedReg* r)
  100. {
  101. LOG(_T("Packed "));
  102. GIFRegHandlerTEX0_2((GIFReg*)&r->ai64[0]);
  103. }
  104. void __fastcall GSState::GIFPackedRegHandlerCLAMP_1(GIFPackedReg* r)
  105. {
  106. LOG(_T("Packed "));
  107. GIFRegHandlerCLAMP_1((GIFReg*)&r->ai64[0]);
  108. }
  109. void __fastcall GSState::GIFPackedRegHandlerCLAMP_2(GIFPackedReg* r)
  110. {
  111. LOG(_T("Packed "));
  112. GIFRegHandlerCLAMP_2((GIFReg*)&r->ai64[0]);
  113. }
  114. void __fastcall GSState::GIFPackedRegHandlerFOG(GIFPackedReg* r)
  115. {
  116. LOG(_T("Packed FOG(F=%x)n"),
  117. r->FOG.F);
  118. m_v.FOG.F = r->FOG.F;
  119. }
  120. void __fastcall GSState::GIFPackedRegHandlerXYZF3(GIFPackedReg* r)
  121. {
  122. LOG(_T("Packed "));
  123. GIFRegHandlerXYZF3((GIFReg*)&r->ai64[0]);
  124. }
  125. void __fastcall GSState::GIFPackedRegHandlerXYZ3(GIFPackedReg* r)
  126. {
  127. LOG(_T("Packed "));
  128. GIFRegHandlerXYZ3((GIFReg*)&r->ai64[0]);
  129. }
  130. void __fastcall GSState::GIFPackedRegHandlerA_D(GIFPackedReg* r)
  131. {
  132. LOG(_T("Packed "));
  133. (this->*m_fpGIFRegHandlers[(BYTE)r->A_D.ADDR])(&r->r);
  134. }
  135. void __fastcall GSState::GIFPackedRegHandlerNOP(GIFPackedReg* r)
  136. {
  137. LOG(_T("Packed NOP(%016I64x%016I64x)n"), r->ai64[0], r->ai64[1]);
  138. }
  139. // GIFRegHandler*
  140. void __fastcall GSState::GIFRegHandlerNull(GIFReg* r)
  141. {
  142. LOG(_T("*** WARNING *** GIFRegHandlerNull(%016I64x)n"), r->i64);
  143. }
  144. void __fastcall GSState::GIFRegHandlerPRIM(GIFReg* r)
  145. {
  146. LOG(_T("PRIM(PRIM=%x IIP=%x TME=%x FGE=%x ABE=%x AA1=%x FST=%x CTXT=%x FIX=%x)n"), 
  147. r->PRIM.PRIM,
  148. r->PRIM.IIP,
  149. r->PRIM.TME,
  150. r->PRIM.FGE,
  151. r->PRIM.ABE,
  152. r->PRIM.AA1,
  153. r->PRIM.FST,
  154. r->PRIM.CTXT,
  155. r->PRIM.FIX);
  156. if(m_de.PRIM.i64 != r->PRIM.i64)
  157. FlushPrimInternal();
  158. m_de.PRIM = r->PRIM;
  159. m_de.PRMODE._PRIM = r->PRIM.PRIM;
  160. if(m_de.PRMODECONT.AC)
  161. {
  162. m_ctxt = &m_de.CTXT[m_de.PRIM.CTXT];
  163. }
  164. NewPrim();
  165. }
  166. void __fastcall GSState::GIFRegHandlerRGBAQ(GIFReg* r)
  167. {
  168. LOG(_T("RGBAQ(R=%x G=%x B=%x A=%x Q=%.4f)n"),
  169. r->RGBAQ.R,
  170. r->RGBAQ.G,
  171. r->RGBAQ.B,
  172. r->RGBAQ.A,
  173. r->RGBAQ.Q);
  174. m_v.RGBAQ = r->RGBAQ;
  175. }
  176. void __fastcall GSState::GIFRegHandlerST(GIFReg* r)
  177. {
  178. LOG(_T("ST(S=%.4f T=%.4f)n"), 
  179. r->ST.S,
  180. r->ST.T);
  181. m_v.ST = r->ST;
  182. }
  183. void __fastcall GSState::GIFRegHandlerUV(GIFReg* r)
  184. {
  185. LOG(_T("UV(U=%.4f V=%.4f)n"), 
  186. (float)r->UV.U/16,
  187. (float)r->UV.V/16);
  188. m_v.UV = r->UV;
  189. }
  190. void __fastcall GSState::GIFRegHandlerXYZF2(GIFReg* r)
  191. {
  192. LOG(_T("XYZF2(X=%.2f Y=%.2f Z=%08x F=%d)n"), 
  193. (float)r->XYZF.X/16,
  194. (float)r->XYZF.Y/16,
  195. r->XYZF.Z,
  196. r->XYZF.F);
  197. /*
  198. m_v.XYZ.X = r->XYZF.X;
  199. m_v.XYZ.Y = r->XYZF.Y;
  200. m_v.XYZ.Z = r->XYZF.Z;
  201. m_v.FOG.F = r->XYZF.F;
  202. */
  203. m_v.XYZ.ai32[0] = r->XYZF.ai32[0];
  204. m_v.XYZ.ai32[1] = r->XYZF.ai32[1] & 0x00ffffff;
  205. m_v.FOG.ai32[1] = r->XYZF.ai32[1] & 0xff000000;
  206. VertexKick(false);
  207. }
  208. void __fastcall GSState::GIFRegHandlerXYZ2(GIFReg* r)
  209. {
  210. LOG(_T("XYZ2(X=%.2f Y=%.2f Z=%08x)n"), 
  211. (float)r->XYZ.X/16,
  212. (float)r->XYZ.Y/16,
  213. r->XYZ.Z);
  214. m_v.XYZ = r->XYZ;
  215. VertexKick(false);
  216. }
  217. void __fastcall GSState::GIFRegHandlerTEX0_1(GIFReg* r)
  218. {
  219. LOG(_T("TEX0_1(TBP0=%I64x TBW=%I64d PSM=%I64x TW=%I64d TH=%I64d TCC=%I64x TFX=%I64x CBP=%I64x CPSM=%I64x CSM=%I64x CSA=%I64x CLD=%I64x)n"),
  220. r->TEX0.TBP0,
  221. r->TEX0.TBW*64,
  222. r->TEX0.PSM,
  223. 1i64<<r->TEX0.TW,
  224. 1i64<<r->TEX0.TH,
  225. r->TEX0.TCC,
  226. r->TEX0.TFX,
  227. r->TEX0.CBP,
  228. r->TEX0.CPSM,
  229. r->TEX0.CSM,
  230. r->TEX0.CSA,
  231. r->TEX0.CLD);
  232. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEX0.i64 != r->TEX0.i64)
  233. FlushPrimInternal();
  234. m_de.CTXT[0].TEX0 = r->TEX0;
  235. //ASSERT(m_de.CTXT[0].TEX0.TW <= 10 && m_de.CTXT[0].TEX0.TH <= 10);
  236. if(m_de.CTXT[0].TEX0.TW > 10) m_de.CTXT[0].TEX0.TW = 10;
  237. if(m_de.CTXT[0].TEX0.TH > 10) m_de.CTXT[0].TEX0.TH = 10;
  238. m_de.CTXT[0].TEX0.CPSM &= 0xa; // 1010b
  239. m_de.CTXT[0].ttbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[0].TEX0.PSM];
  240. FlushWriteTransfer();
  241. m_lm.WriteCLUT(r->TEX0, m_de.TEXCLUT);
  242. }
  243. void __fastcall GSState::GIFRegHandlerTEX0_2(GIFReg* r)
  244. {
  245. LOG(_T("TEX0_2(TBP0=%I64x TBW=%I64d PSM=%I64x TW=%I64d TH=%I64d TCC=%I64x TFX=%I64x CBP=%I64x CPSM=%I64x CSM=%I64x CSA=%I64x CLD=%I64x)n"),
  246. r->TEX0.TBP0,
  247. r->TEX0.TBW*64,
  248. r->TEX0.PSM,
  249. 1i64<<r->TEX0.TW,
  250. 1i64<<r->TEX0.TH,
  251. r->TEX0.TCC,
  252. r->TEX0.TFX,
  253. r->TEX0.CBP,
  254. r->TEX0.CPSM,
  255. r->TEX0.CSM,
  256. r->TEX0.CSA,
  257. r->TEX0.CLD);
  258. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEX0.i64 != r->TEX0.i64)
  259. FlushPrimInternal();
  260. m_de.CTXT[1].TEX0 = r->TEX0;
  261. //ASSERT(m_de.CTXT[1].TEX0.TW <= 10 && m_de.CTXT[1].TEX0.TH <= 10);
  262. if(m_de.CTXT[1].TEX0.TW > 10) m_de.CTXT[1].TEX0.TW = 10;
  263. if(m_de.CTXT[1].TEX0.TH > 10) m_de.CTXT[1].TEX0.TH = 10;
  264. m_de.CTXT[1].TEX0.CPSM &= 0xa; // 1010b
  265. m_de.CTXT[1].ttbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[1].TEX0.PSM];
  266. FlushWriteTransfer();
  267. m_lm.WriteCLUT(r->TEX0, m_de.TEXCLUT);
  268. }
  269. void __fastcall GSState::GIFRegHandlerCLAMP_1(GIFReg* r)
  270. {
  271. LOG(_T("CLAMP_1(WMS=%x WMT=%x MINU=%x MAXU=%x MINV=%x MAXV=%x)n"),
  272. r->CLAMP.WMS,
  273. r->CLAMP.WMT,
  274. r->CLAMP.MINU,
  275. r->CLAMP.MAXU,
  276. r->CLAMP.MINV,
  277. r->CLAMP.MAXV);
  278. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].CLAMP.i64 != r->CLAMP.i64)
  279. FlushPrimInternal();
  280. m_de.CTXT[0].CLAMP = r->CLAMP;
  281. }
  282. void __fastcall GSState::GIFRegHandlerCLAMP_2(GIFReg* r)
  283. {
  284. LOG(_T("CLAMP_2(WMS=%x WMT=%x MINU=%x MAXU=%x MINV=%x MAXV=%x)n"),
  285. r->CLAMP.WMS,
  286. r->CLAMP.WMT,
  287. r->CLAMP.MINU,
  288. r->CLAMP.MAXU,
  289. r->CLAMP.MINV,
  290. r->CLAMP.MAXV);
  291. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].CLAMP.i64 != r->CLAMP.i64)
  292. FlushPrimInternal();
  293. m_de.CTXT[1].CLAMP = r->CLAMP;
  294. }
  295. void __fastcall GSState::GIFRegHandlerFOG(GIFReg* r)
  296. {
  297. LOG(_T("FOG(F=%x)n"),
  298. r->FOG.F);
  299. m_v.FOG = r->FOG;
  300. }
  301. void __fastcall GSState::GIFRegHandlerXYZF3(GIFReg* r)
  302. {
  303. LOG(_T("XYZF3(X=%.2f Y=%.2f Z=%08x F=%d)n"), 
  304. (float)r->XYZF.X/16,
  305. (float)r->XYZF.Y/16,
  306. r->XYZF.Z,
  307. r->XYZF.F);
  308. /*
  309. m_v.XYZ.X = r->XYZF.X;
  310. m_v.XYZ.Y = r->XYZF.Y;
  311. m_v.XYZ.Z = r->XYZF.Z;
  312. m_v.FOG.F = r->XYZF.F;
  313. */
  314. m_v.XYZ.ai32[0] = r->XYZF.ai32[0];
  315. m_v.XYZ.ai32[1] = r->XYZF.ai32[1] & 0x00ffffff;
  316. m_v.FOG.ai32[1] = r->XYZF.ai32[1] & 0xff000000;
  317. VertexKick(true);
  318. }
  319. void __fastcall GSState::GIFRegHandlerXYZ3(GIFReg* r)
  320. {
  321. LOG(_T("XYZ3(X=%.2f Y=%.2f Z=%08x)n"), 
  322. (float)r->XYZ.X/16,
  323. (float)r->XYZ.Y/16,
  324. r->XYZ.Z);
  325. m_v.XYZ = r->XYZ;
  326. VertexKick(true);
  327. }
  328. void __fastcall GSState::GIFRegHandlerNOP(GIFReg* r)
  329. {
  330. LOG(_T("NOP()n"));
  331. }
  332. void __fastcall GSState::GIFRegHandlerTEX1_1(GIFReg* r)
  333. {
  334. LOG(_T("TEX1_1(LCM=%x MXL=%x MMAG=%x MMIN=%x MTBA=%x L=%x K=%x)n"),
  335. r->TEX1.LCM,
  336. r->TEX1.MXL,
  337. r->TEX1.MMAG,
  338. r->TEX1.MMIN,
  339. r->TEX1.MTBA,
  340. r->TEX1.L,
  341. r->TEX1.K);
  342. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEX1.i64 != r->TEX1.i64)
  343. FlushPrimInternal();
  344. m_de.CTXT[0].TEX1 = r->TEX1;
  345. }
  346. void __fastcall GSState::GIFRegHandlerTEX1_2(GIFReg* r)
  347. {
  348. LOG(_T("TEX1_2(LCM=%x MXL=%x MMAG=%x MMIN=%x MTBA=%x L=%x K=%x)n"),
  349. r->TEX1.LCM,
  350. r->TEX1.MXL,
  351. r->TEX1.MMAG,
  352. r->TEX1.MMIN,
  353. r->TEX1.MTBA,
  354. r->TEX1.L,
  355. r->TEX1.K);
  356. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEX1.i64 != r->TEX1.i64)
  357. FlushPrimInternal();
  358. m_de.CTXT[1].TEX1 = r->TEX1;
  359. }
  360. void __fastcall GSState::GIFRegHandlerTEX2_1(GIFReg* r)
  361. {
  362. LOG(_T("TEX2_1(PSM=%x CBP=%x CPSM=%x CSM=%x CSA=%x CLD=%x)n"),
  363. r->TEX2.PSM,
  364. r->TEX2.CBP,
  365. r->TEX2.CPSM,
  366. r->TEX2.CSM,
  367. r->TEX2.CSA,
  368. r->TEX2.CLD);
  369. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEX2.i64 != r->TEX2.i64)
  370. FlushPrimInternal();
  371. m_de.CTXT[0].TEX2 = r->TEX2;
  372. FlushWriteTransfer();
  373. m_lm.WriteCLUT(*(GIFRegTEX0*)&r->TEX2, m_de.TEXCLUT);
  374. }
  375. void __fastcall GSState::GIFRegHandlerTEX2_2(GIFReg* r)
  376. {
  377. LOG(_T("TEX2_2(PSM=%x CBP=%x CPSM=%x CSM=%x CSA=%x CLD=%x)n"),
  378. r->TEX2.PSM,
  379. r->TEX2.CBP,
  380. r->TEX2.CPSM,
  381. r->TEX2.CSM,
  382. r->TEX2.CSA,
  383. r->TEX2.CLD);
  384. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEX2.i64 != r->TEX2.i64)
  385. FlushPrimInternal();
  386. m_de.CTXT[1].TEX2 = r->TEX2;
  387. FlushWriteTransfer();
  388. m_lm.WriteCLUT(*(GIFRegTEX0*)&r->TEX2, m_de.TEXCLUT);
  389. }
  390. void __fastcall GSState::GIFRegHandlerXYOFFSET_1(GIFReg* r)
  391. {
  392. LOG(_T("XYOFFSET_1(OFX=%.2f OFY=%.2f)n"), 
  393. (float)r->XYOFFSET.OFX/16,
  394. (float)r->XYOFFSET.OFY/16);
  395. m_de.CTXT[0].XYOFFSET = r->XYOFFSET;
  396. }
  397. void __fastcall GSState::GIFRegHandlerXYOFFSET_2(GIFReg* r)
  398. {
  399. LOG(_T("XYOFFSET_2(OFX=%.2f OFY=%.2f)n"), 
  400. (float)r->XYOFFSET.OFX/16,
  401. (float)r->XYOFFSET.OFY/16);
  402. m_de.CTXT[1].XYOFFSET = r->XYOFFSET;
  403. }
  404. void __fastcall GSState::GIFRegHandlerPRMODECONT(GIFReg* r)
  405. {
  406. LOG(_T("PRMODECONT(AC=%x)n"),
  407. r->PRMODECONT.AC);
  408. if(m_de.PRMODECONT.i64 != r->PRMODECONT.i64)
  409. {
  410. FlushPrimInternal();
  411. }
  412. m_de.PRMODECONT = r->PRMODECONT;
  413. m_pPRIM = !m_de.PRMODECONT.AC ? (GIFRegPRIM*)&m_de.PRMODE : &m_de.PRIM;
  414. m_ctxt = &m_de.CTXT[m_pPRIM->CTXT];
  415. }
  416. void __fastcall GSState::GIFRegHandlerPRMODE(GIFReg* r)
  417. {
  418. LOG(_T("PRMODE(IIP=%x TME=%x FGE=%x ABE=%x AA1=%x FST=%x CTXT=%x FIX=%x)n"),
  419. r->PRMODE.IIP,
  420. r->PRMODE.TME,
  421. r->PRMODE.FGE,
  422. r->PRMODE.ABE,
  423. r->PRMODE.AA1,
  424. r->PRMODE.FST,
  425. r->PRMODE.CTXT,
  426. r->PRMODE.FIX);
  427. if(!m_de.PRMODECONT.AC)
  428. FlushPrimInternal();
  429. UINT32 _PRIM = m_de.PRMODE._PRIM;
  430. m_de.PRMODE = r->PRMODE;
  431. m_de.PRMODE._PRIM = _PRIM;
  432. m_ctxt = &m_de.CTXT[m_pPRIM->CTXT];
  433. }
  434. void __fastcall GSState::GIFRegHandlerTEXCLUT(GIFReg* r)
  435. {
  436. LOG(_T("TEXCLUT(CBW=%x COU=%x COV=%x)n"),
  437. r->TEXCLUT.CBW,
  438. r->TEXCLUT.COU,
  439. r->TEXCLUT.COV);
  440. if(m_de.TEXCLUT.i64 != r->TEXCLUT.i64)
  441. FlushPrimInternal();
  442. m_de.TEXCLUT = r->TEXCLUT;
  443. }
  444. void __fastcall GSState::GIFRegHandlerSCANMSK(GIFReg* r)
  445. {
  446. LOG(_T("SCANMSK(MSK=%x)n"),
  447. r->SCANMSK.MSK);
  448. if(m_de.SCANMSK.i64 != r->SCANMSK.i64)
  449. FlushPrimInternal();
  450. m_de.SCANMSK = r->SCANMSK;
  451. }
  452. void __fastcall GSState::GIFRegHandlerMIPTBP1_1(GIFReg* r)
  453. {
  454. LOG(_T("MIPTBP1_1(TBP1=%x TBW1=%x TBP2=%x TBW2=%x TBP3=%x TBW3=%x)n"),
  455. r->MIPTBP1.TBP1,
  456. r->MIPTBP1.TBW1,
  457. r->MIPTBP1.TBP2,
  458. r->MIPTBP1.TBW2,
  459. r->MIPTBP1.TBP3,
  460. r->MIPTBP1.TBW3);
  461. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].MIPTBP1.i64 != r->MIPTBP1.i64)
  462. FlushPrimInternal();
  463. m_de.CTXT[0].MIPTBP1 = r->MIPTBP1;
  464. }
  465. void __fastcall GSState::GIFRegHandlerMIPTBP1_2(GIFReg* r)
  466. {
  467. LOG(_T("MIPTBP1_2(TBP1=%x TBW1=%x TBP2=%x TBW2=%x TBP3=%x TBW3=%x)n"),
  468. r->MIPTBP1.TBP1,
  469. r->MIPTBP1.TBW1,
  470. r->MIPTBP1.TBP2,
  471. r->MIPTBP1.TBW2,
  472. r->MIPTBP1.TBP3,
  473. r->MIPTBP1.TBW3);
  474. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].MIPTBP1.i64 != r->MIPTBP1.i64)
  475. FlushPrimInternal();
  476. m_de.CTXT[1].MIPTBP1 = r->MIPTBP1;
  477. }
  478. void __fastcall GSState::GIFRegHandlerMIPTBP2_1(GIFReg* r)
  479. {
  480. LOG(_T("MIPTBP2_1(TBP4=%x TBW4=%x TBP5=%x TBW5=%x TBP6=%x TBW6=%x)n"),
  481. r->MIPTBP2.TBP4,
  482. r->MIPTBP2.TBW4,
  483. r->MIPTBP2.TBP5,
  484. r->MIPTBP2.TBW5,
  485. r->MIPTBP2.TBP6,
  486. r->MIPTBP2.TBW6);
  487. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].MIPTBP2.i64 != r->MIPTBP2.i64)
  488. FlushPrimInternal();
  489. m_de.CTXT[0].MIPTBP2 = r->MIPTBP2;
  490. }
  491. void __fastcall GSState::GIFRegHandlerMIPTBP2_2(GIFReg* r)
  492. {
  493. LOG(_T("MIPTBP2_2(TBP4=%x TBW4=%x TBP5=%x TBW5=%x TBP6=%x TBW6=%x)n"),
  494. r->MIPTBP2.TBP4,
  495. r->MIPTBP2.TBW4,
  496. r->MIPTBP2.TBP5,
  497. r->MIPTBP2.TBW5,
  498. r->MIPTBP2.TBP6,
  499. r->MIPTBP2.TBW6);
  500. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].MIPTBP2.i64 != r->MIPTBP2.i64)
  501. FlushPrimInternal();
  502. m_de.CTXT[1].MIPTBP2 = r->MIPTBP2;
  503. }
  504. void __fastcall GSState::GIFRegHandlerTEXA(GIFReg* r)
  505. {
  506. LOG(_T("TEXA(TA0=%x AEM=%x TA1=%x)n"),
  507. r->TEXA.TA0,
  508. r->TEXA.AEM,
  509. r->TEXA.TA1);
  510. if(m_de.TEXA.i64 != r->TEXA.i64)
  511. FlushPrimInternal();
  512. m_de.TEXA = r->TEXA;
  513. }
  514. void __fastcall GSState::GIFRegHandlerFOGCOL(GIFReg* r)
  515. {
  516. LOG(_T("FOGCOL(FCR=%x FCG=%x FCB=%x)n"),
  517. r->FOGCOL.FCR,
  518. r->FOGCOL.FCG,
  519. r->FOGCOL.FCB);
  520. if(m_de.FOGCOL.i64 != r->FOGCOL.i64)
  521. FlushPrimInternal();
  522. m_de.FOGCOL = r->FOGCOL;
  523. }
  524. void __fastcall GSState::GIFRegHandlerTEXFLUSH(GIFReg* r)
  525. {
  526. LOG(_T("TEXFLUSH()n"));
  527. // what should we do here?
  528. }
  529. void __fastcall GSState::GIFRegHandlerSCISSOR_1(GIFReg* r)
  530. {
  531. LOG(_T("SCISSOR_1(SCAX0=%d SCAX1=%d SCAY0=%d SCAY1=%d)n"),
  532. r->SCISSOR.SCAX0,
  533. r->SCISSOR.SCAX1,
  534. r->SCISSOR.SCAY0,
  535. r->SCISSOR.SCAY1);
  536. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].SCISSOR.i64 != r->SCISSOR.i64)
  537. FlushPrimInternal();
  538. m_de.CTXT[0].SCISSOR = r->SCISSOR;
  539. }
  540. void __fastcall GSState::GIFRegHandlerSCISSOR_2(GIFReg* r)
  541. {
  542. LOG(_T("SCISSOR_2(SCAX0=%d SCAX1=%d SCAY0=%d SCAY1=%d)n"),
  543. r->SCISSOR.SCAX0,
  544. r->SCISSOR.SCAX1,
  545. r->SCISSOR.SCAY0,
  546. r->SCISSOR.SCAY1);
  547. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].SCISSOR.i64 != r->SCISSOR.i64)
  548. FlushPrimInternal();
  549. m_de.CTXT[1].SCISSOR = r->SCISSOR;
  550. }
  551. void __fastcall GSState::GIFRegHandlerALPHA_1(GIFReg* r)
  552. {
  553. LOG(_T("ALPHA_1(A=%x B=%x C=%x D=%x FIX=%x)n"),
  554. r->ALPHA.A,
  555. r->ALPHA.B,
  556. r->ALPHA.C,
  557. r->ALPHA.D,
  558. r->ALPHA.FIX);
  559. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].ALPHA.i64 != r->ALPHA.i64)
  560. FlushPrimInternal();
  561. m_de.CTXT[0].ALPHA = r->ALPHA;
  562. }
  563. void __fastcall GSState::GIFRegHandlerALPHA_2(GIFReg* r)
  564. {
  565. LOG(_T("ALPHA_2(A=%x B=%x C=%x D=%x FIX=%x)n"),
  566. r->ALPHA.A,
  567. r->ALPHA.B,
  568. r->ALPHA.C,
  569. r->ALPHA.D,
  570. r->ALPHA.FIX);
  571. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].ALPHA.i64 != r->ALPHA.i64)
  572. FlushPrimInternal();
  573. m_de.CTXT[1].ALPHA = r->ALPHA;
  574. }
  575. void __fastcall GSState::GIFRegHandlerDIMX(GIFReg* r)
  576. {
  577. LOG(_T("DIMX([%d,%d,%d,%d][%d,%d,%d,%d][%d,%d,%d,%d][%d,%d,%d,%d])n"),
  578. r->DIMX.DM00,
  579. r->DIMX.DM01,
  580. r->DIMX.DM02,
  581. r->DIMX.DM03,
  582. r->DIMX.DM10,
  583. r->DIMX.DM11,
  584. r->DIMX.DM12,
  585. r->DIMX.DM13,
  586. r->DIMX.DM20,
  587. r->DIMX.DM21,
  588. r->DIMX.DM22,
  589. r->DIMX.DM23,
  590. r->DIMX.DM30,
  591. r->DIMX.DM31,
  592. r->DIMX.DM32,
  593. r->DIMX.DM33);
  594. if(m_de.DIMX.i64 != r->DIMX.i64)
  595. FlushPrimInternal();
  596. m_de.DIMX = r->DIMX;
  597. }
  598. void __fastcall GSState::GIFRegHandlerDTHE(GIFReg* r)
  599. {
  600. LOG(_T("DTHE(DTHE=%x)n"),
  601. r->DTHE.DTHE);
  602. if(m_de.DTHE.i64 != r->DTHE.i64)
  603. FlushPrimInternal();
  604. m_de.DTHE = r->DTHE;
  605. }
  606. void __fastcall GSState::GIFRegHandlerCOLCLAMP(GIFReg* r)
  607. {
  608. LOG(_T("COLCLAMP(CLAMP=%x)n"),
  609. r->COLCLAMP.CLAMP);
  610. if(m_de.COLCLAMP.i64 != r->COLCLAMP.i64)
  611. FlushPrimInternal();
  612. m_de.COLCLAMP = r->COLCLAMP;
  613. }
  614. void __fastcall GSState::GIFRegHandlerTEST_1(GIFReg* r)
  615. {
  616. LOG(_T("TEST_1(ATE=%x ATST=%x AREF=%x AFAIL=%x DATE=%x DATM=%x ZTE=%x ZTST=%x)n"),
  617. r->TEST.ATE,
  618. r->TEST.ATST,
  619. r->TEST.AREF,
  620. r->TEST.AFAIL,
  621. r->TEST.DATE,
  622. r->TEST.DATM,
  623. r->TEST.ZTE,
  624. r->TEST.ZTST);
  625. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEST.i64 != r->TEST.i64)
  626. FlushPrimInternal();
  627. m_de.CTXT[0].TEST = r->TEST;
  628. }
  629. void __fastcall GSState::GIFRegHandlerTEST_2(GIFReg* r)
  630. {
  631. LOG(_T("TEST_2(ATE=%x ATST=%x AREF=%x AFAIL=%x DATE=%x DATM=%x ZTE=%x ZTST=%x)n"),
  632. r->TEST.ATE,
  633. r->TEST.ATST,
  634. r->TEST.AREF,
  635. r->TEST.AFAIL,
  636. r->TEST.DATE,
  637. r->TEST.DATM,
  638. r->TEST.ZTE,
  639. r->TEST.ZTST);
  640. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEST.i64 != r->TEST.i64)
  641. FlushPrimInternal();
  642. m_de.CTXT[1].TEST = r->TEST;
  643. }
  644. void __fastcall GSState::GIFRegHandlerPABE(GIFReg* r)
  645. {
  646. LOG(_T("PABE(PABE=%x)n"), 
  647. r->PABE.PABE);
  648. if(m_de.PABE.i64 != r->PABE.i64)
  649. FlushPrimInternal();
  650. m_de.PABE = r->PABE;
  651. }
  652. void __fastcall GSState::GIFRegHandlerFBA_1(GIFReg* r)
  653. {
  654. LOG(_T("FBA_1(FBA=%x)n"), 
  655. r->FBA.FBA);
  656. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].FBA.i64 != r->FBA.i64)
  657. FlushPrimInternal();
  658. m_de.CTXT[0].FBA = r->FBA;
  659. }
  660. void __fastcall GSState::GIFRegHandlerFBA_2(GIFReg* r)
  661. {
  662. LOG(_T("FBA_2(FBA=%x)n"), 
  663. r->FBA.FBA);
  664. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].FBA.i64 != r->FBA.i64)
  665. FlushPrimInternal();
  666. m_de.CTXT[1].FBA = r->FBA;
  667. }
  668. void __fastcall GSState::GIFRegHandlerFRAME_1(GIFReg* r)
  669. {
  670. LOG(_T("FRAME_1(FBP=%x FBW=%d PSM=%x FBMSK=%x)n"),
  671. r->FRAME.Block(),
  672. r->FRAME.FBW*64,
  673. r->FRAME.PSM,
  674. r->FRAME.FBMSK);
  675. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].FRAME.i64 != r->FRAME.i64)
  676. FlushPrimInternal();
  677. m_de.CTXT[0].FRAME = r->FRAME;
  678. m_de.CTXT[0].ftbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[0].FRAME.PSM];
  679. }
  680. void __fastcall GSState::GIFRegHandlerFRAME_2(GIFReg* r)
  681. {
  682. LOG(_T("FRAME_2(FBP=%x FBW=%d PSM=%x FBMSK=%x)n"),
  683. r->FRAME.Block(),
  684. r->FRAME.FBW*64,
  685. r->FRAME.PSM,
  686. r->FRAME.FBMSK);
  687. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].FRAME.i64 != r->FRAME.i64)
  688. FlushPrimInternal();
  689. m_de.CTXT[1].FRAME = r->FRAME;
  690. m_de.CTXT[1].ftbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[1].FRAME.PSM];
  691. }
  692. void __fastcall GSState::GIFRegHandlerZBUF_1(GIFReg* r)
  693. {
  694. LOG(_T("ZBUF_1(ZBP=%x PSM=%x ZMSK=%x)n"),
  695. r->ZBUF.ZBP<<5,
  696. r->ZBUF.PSM,
  697. r->ZBUF.ZMSK);
  698. r->ZBUF.PSM |= 0x30;
  699. if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].ZBUF.i64 != r->ZBUF.i64)
  700. FlushPrimInternal();
  701. m_de.CTXT[0].ZBUF = r->ZBUF;
  702. if(m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ32
  703. && m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ24
  704. && m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ16
  705. && m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ16S)
  706. m_de.CTXT[0].ZBUF.PSM = PSM_PSMZ32;
  707. m_de.CTXT[0].ztbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[0].ZBUF.PSM];
  708. }
  709. void __fastcall GSState::GIFRegHandlerZBUF_2(GIFReg* r)
  710. {
  711. LOG(_T("ZBUF_2(ZBP=%x PSM=%x ZMSK=%x)n"),
  712. r->ZBUF.ZBP<<5,
  713. r->ZBUF.PSM,
  714. r->ZBUF.ZMSK);
  715. r->ZBUF.PSM |= 0x30;
  716. if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].ZBUF.i64 != r->ZBUF.i64)
  717. FlushPrimInternal();
  718. m_de.CTXT[1].ZBUF = r->ZBUF;
  719. if(m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ32
  720. && m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ24
  721. && m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ16
  722. && m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ16S)
  723. m_de.CTXT[1].ZBUF.PSM = PSM_PSMZ32;
  724. m_de.CTXT[1].ztbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[1].ZBUF.PSM];
  725. }
  726. void __fastcall GSState::GIFRegHandlerBITBLTBUF(GIFReg* r)
  727. {
  728. LOG(_T("BITBLTBUF(SBP=%x SBW=%d SPSM=%x DBP=%x DBW=%d DPSM=%x)n"),
  729. r->BITBLTBUF.SBP,
  730. r->BITBLTBUF.SBW*64,
  731. r->BITBLTBUF.SPSM,
  732. r->BITBLTBUF.DBP,
  733. r->BITBLTBUF.DBW*64,
  734. r->BITBLTBUF.DPSM);
  735. if(m_rs.BITBLTBUF.i64 != r->BITBLTBUF.i64)
  736. FlushWriteTransfer();
  737. m_rs.BITBLTBUF = r->BITBLTBUF;
  738. }
  739. void __fastcall GSState::GIFRegHandlerTRXPOS(GIFReg* r)
  740. {
  741. LOG(_T("TRXPOS(SSAX=%d SSAY=%d DSAX=%d DSAY=%d DIR=%d)n"),
  742. r->TRXPOS.SSAX,
  743. r->TRXPOS.SSAY,
  744. r->TRXPOS.DSAX,
  745. r->TRXPOS.DSAY,
  746. r->TRXPOS.DIR);
  747. if(m_rs.TRXPOS.i64 != r->TRXPOS.i64)
  748. FlushWriteTransfer();
  749. m_rs.TRXPOS = r->TRXPOS;
  750. }
  751. void __fastcall GSState::GIFRegHandlerTRXREG(GIFReg* r)
  752. {
  753. LOG(_T("TRXREG(RRW=%d RRH=%d)n"),
  754. r->TRXREG.RRW,
  755. r->TRXREG.RRH);
  756. if(m_rs.TRXREG.i64 != r->TRXREG.i64 || m_rs.TRXREG2.i64 != r->TRXREG.i64)
  757. FlushWriteTransfer();
  758. m_rs.TRXREG = m_rs.TRXREG2 = r->TRXREG;
  759. }
  760. void __fastcall GSState::GIFRegHandlerTRXDIR(GIFReg* r)
  761. {
  762. LOG(_T("TRXDIR(XDIR=%d)n"), 
  763. r->TRXDIR.XDIR);
  764. FlushWriteTransfer();
  765. FlushPrimInternal();
  766. m_rs.TRXDIR = r->TRXDIR;
  767. switch(m_rs.TRXDIR.XDIR)
  768. {
  769. case 0: // host -> local
  770. m_x = m_rs.TRXPOS.DSAX;
  771. m_y = m_rs.TRXPOS.DSAY;
  772. m_rs.TRXREG.RRW = m_x + m_rs.TRXREG2.RRW;
  773. m_rs.TRXREG.RRH = m_y + m_rs.TRXREG2.RRH;
  774. break;
  775. case 1: // local -> host
  776. m_x = m_rs.TRXPOS.SSAX;
  777. m_y = m_rs.TRXPOS.SSAY;
  778. m_rs.TRXREG.RRW = m_x + m_rs.TRXREG2.RRW;
  779. m_rs.TRXREG.RRH = m_y + m_rs.TRXREG2.RRH;
  780. break;
  781. case 2: // local -> local
  782. MoveTransfer();
  783. break;
  784. case 3: 
  785. ASSERT(0);
  786. break;
  787. }
  788. }
  789. void __fastcall GSState::GIFRegHandlerHWREG(GIFReg* r)
  790. {
  791. LOG(_T("HWREG(DATA_LOWER=%08x DATA_UPPER=%08x)n"),
  792. r->HWREG.DATA_LOWER,
  793. r->HWREG.DATA_UPPER);
  794. // TODO
  795. ASSERT(0);
  796. }
  797. void __fastcall GSState::GIFRegHandlerSIGNAL(GIFReg* r)
  798. {
  799. LOG(_T("SIGNAL(ID=%08x IDMSK=%08x)n"), 
  800. r->SIGNAL.ID, 
  801. r->SIGNAL.IDMSK);
  802. m_rs.SIGLBLID.SIGID = (m_rs.SIGLBLID.SIGID&~r->SIGNAL.IDMSK)|(r->SIGNAL.ID&r->SIGNAL.IDMSK);
  803. if(m_rs.CSRw.SIGNAL) m_pCSRr->SIGNAL = 1;
  804. if(!m_rs.IMR.SIGMSK && m_fpGSirq) m_fpGSirq();
  805. }
  806. void __fastcall GSState::GIFRegHandlerFINISH(GIFReg* r)
  807. {
  808. LOG(_T("FINISH()n"));
  809. if(m_rs.CSRw.FINISH) m_pCSRr->FINISH = 1;
  810. if(!m_rs.IMR.FINISHMSK && m_fpGSirq) m_fpGSirq();
  811. }
  812. void __fastcall GSState::GIFRegHandlerLABEL(GIFReg* r)
  813. {
  814. LOG(_T("LABEL(ID=%08x IDMSK=%08x)n"), 
  815. r->LABEL.ID, 
  816. r->LABEL.IDMSK);
  817. m_rs.SIGLBLID.LBLID = (m_rs.SIGLBLID.LBLID&~r->LABEL.IDMSK)|(r->LABEL.ID&r->LABEL.IDMSK);
  818. }