Code Search for Developers
 
 
  

GSRegs.cpp from guliverkli at Krugle


Show GSRegs.cpp syntax highlighted

/* 
 *	Copyright (C) 2003-2005 Gabest
 *	http://www.gabest.org
 *
 *  This Program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *   
 *  This Program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *   
 *  You should have received a copy of the GNU General Public License
 *  along with GNU Make; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 *  http://www.gnu.org/copyleft/gpl.html
 *
 */

#include "stdafx.h"
#include "GSState.h"

// GIFPackedRegHandler*

void __fastcall GSState::GIFPackedRegHandlerNull(GIFPackedReg* r)
{
	LOG(_T("GIFPackedRegHandlerNull(%016I64x%016I64x)\n"), r->ai64[0], r->ai64[1]);
}

void __fastcall GSState::GIFPackedRegHandlerPRIM(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	GIFReg r2;
	r2.PRIM.i64 = r->PRIM.PRIM;
	GIFRegHandlerPRIM(&r2);
}

void __fastcall GSState::GIFPackedRegHandlerRGBA(GIFPackedReg* r)
{
	LOG(_T("Packed RGBA(R=%x G=%x B=%x A=%x)\n"),
		r->RGBA.R,
		r->RGBA.G,
		r->RGBA.B,
		r->RGBA.A);

	m_v.RGBAQ.R = r->RGBA.R;
	m_v.RGBAQ.G = r->RGBA.G;
	m_v.RGBAQ.B = r->RGBA.B;
	m_v.RGBAQ.A = r->RGBA.A;
	m_v.RGBAQ.Q = m_q;
}

void __fastcall GSState::GIFPackedRegHandlerSTQ(GIFPackedReg* r)
{
	LOG(_T("Packed STQ(S=%.4f T=%.4f, Q=%.4f)\n"), 
		r->STQ.S,
		r->STQ.T,
		r->STQ.Q);

	m_v.ST.S = r->STQ.S;
	m_v.ST.T = r->STQ.T;
	m_q = r->STQ.Q;
}

void __fastcall GSState::GIFPackedRegHandlerUV(GIFPackedReg* r)
{
	LOG(_T("Packed UV(U=%.4f V=%.4f)\n"), 
		(float)r->UV.U/16,
		(float)r->UV.V/16);

	m_v.UV.U = r->UV.U;
	m_v.UV.V = r->UV.V;
}

void __fastcall GSState::GIFPackedRegHandlerXYZF2(GIFPackedReg* r)
{
	LOG(_T("Packed "));

	LOG(_T("XYZF%d(X=%.2f Y=%.2f Z=%d F=%d)\n"), 
		2 + r->XYZF2.ADC,
		(float)r->XYZF2.X/16,
		(float)r->XYZF2.Y/16,
		r->XYZF2.Z,
		r->XYZF2.F);

	m_v.XYZ.X = r->XYZF2.X;
	m_v.XYZ.Y = r->XYZF2.Y;
	m_v.XYZ.Z = r->XYZF2.Z;
	m_v.FOG.F = r->XYZF2.F;

	VertexKick(r->XYZF2.ADC);
}

void __fastcall GSState::GIFPackedRegHandlerXYZ2(GIFPackedReg* r)
{
	LOG(_T("Packed "));

	LOG(_T("XYZ%d(X=%.2f Y=%.2f Z=%d)\n"), 
		2 + r->XYZ2.ADC,
		(float)r->XYZ2.X/16,
		(float)r->XYZ2.Y/16,
		r->XYZ2.Z);

	m_v.XYZ.X = r->XYZ2.X;
	m_v.XYZ.Y = r->XYZ2.Y;
	m_v.XYZ.Z = r->XYZ2.Z;

	VertexKick(r->XYZ2.ADC);
}

void __fastcall GSState::GIFPackedRegHandlerTEX0_1(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	GIFRegHandlerTEX0_1((GIFReg*)&r->ai64[0]);
}

void __fastcall GSState::GIFPackedRegHandlerTEX0_2(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	GIFRegHandlerTEX0_2((GIFReg*)&r->ai64[0]);
}

void __fastcall GSState::GIFPackedRegHandlerCLAMP_1(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	GIFRegHandlerCLAMP_1((GIFReg*)&r->ai64[0]);
}

void __fastcall GSState::GIFPackedRegHandlerCLAMP_2(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	GIFRegHandlerCLAMP_2((GIFReg*)&r->ai64[0]);
}

void __fastcall GSState::GIFPackedRegHandlerFOG(GIFPackedReg* r)
{
	LOG(_T("Packed FOG(F=%x)\n"),
		r->FOG.F);

	m_v.FOG.F = r->FOG.F;
}

void __fastcall GSState::GIFPackedRegHandlerXYZF3(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	GIFRegHandlerXYZF3((GIFReg*)&r->ai64[0]);
}

void __fastcall GSState::GIFPackedRegHandlerXYZ3(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	GIFRegHandlerXYZ3((GIFReg*)&r->ai64[0]);
}

void __fastcall GSState::GIFPackedRegHandlerA_D(GIFPackedReg* r)
{
	LOG(_T("Packed "));
	(this->*m_fpGIFRegHandlers[(BYTE)r->A_D.ADDR])(&r->r);
}

void __fastcall GSState::GIFPackedRegHandlerNOP(GIFPackedReg* r)
{
	LOG(_T("Packed NOP(%016I64x%016I64x)\n"), r->ai64[0], r->ai64[1]);
}

// GIFRegHandler*

void __fastcall GSState::GIFRegHandlerNull(GIFReg* r)
{
	LOG(_T("*** WARNING *** GIFRegHandlerNull(%016I64x)\n"), r->i64);
}

void __fastcall GSState::GIFRegHandlerPRIM(GIFReg* r)
{
	LOG(_T("PRIM(PRIM=%x IIP=%x TME=%x FGE=%x ABE=%x AA1=%x FST=%x CTXT=%x FIX=%x)\n"), 
		r->PRIM.PRIM,
		r->PRIM.IIP,
		r->PRIM.TME,
		r->PRIM.FGE,
		r->PRIM.ABE,
		r->PRIM.AA1,
		r->PRIM.FST,
		r->PRIM.CTXT,
		r->PRIM.FIX);

	if(m_de.PRIM.i64 != r->PRIM.i64)
		FlushPrimInternal();

	m_de.PRIM = r->PRIM;
	m_de.PRMODE._PRIM = r->PRIM.PRIM;

	if(m_de.PRMODECONT.AC)
	{
		m_ctxt = &m_de.CTXT[m_de.PRIM.CTXT];
	}

	NewPrim();
}

void __fastcall GSState::GIFRegHandlerRGBAQ(GIFReg* r)
{
	LOG(_T("RGBAQ(R=%x G=%x B=%x A=%x Q=%.4f)\n"),
		r->RGBAQ.R,
		r->RGBAQ.G,
		r->RGBAQ.B,
		r->RGBAQ.A,
		r->RGBAQ.Q);

	m_v.RGBAQ = r->RGBAQ;
}

void __fastcall GSState::GIFRegHandlerST(GIFReg* r)
{
	LOG(_T("ST(S=%.4f T=%.4f)\n"), 
		r->ST.S,
		r->ST.T);

	m_v.ST = r->ST;
}

void __fastcall GSState::GIFRegHandlerUV(GIFReg* r)
{
	LOG(_T("UV(U=%.4f V=%.4f)\n"), 
		(float)r->UV.U/16,
		(float)r->UV.V/16);

	m_v.UV = r->UV;
}

void __fastcall GSState::GIFRegHandlerXYZF2(GIFReg* r)
{
	LOG(_T("XYZF2(X=%.2f Y=%.2f Z=%08x F=%d)\n"), 
		(float)r->XYZF.X/16,
		(float)r->XYZF.Y/16,
		r->XYZF.Z,
		r->XYZF.F);
/*
	m_v.XYZ.X = r->XYZF.X;
	m_v.XYZ.Y = r->XYZF.Y;
	m_v.XYZ.Z = r->XYZF.Z;
	m_v.FOG.F = r->XYZF.F;
*/
	m_v.XYZ.ai32[0] = r->XYZF.ai32[0];
	m_v.XYZ.ai32[1] = r->XYZF.ai32[1] & 0x00ffffff;
	m_v.FOG.ai32[1] = r->XYZF.ai32[1] & 0xff000000;

	VertexKick(false);
}

void __fastcall GSState::GIFRegHandlerXYZ2(GIFReg* r)
{
	LOG(_T("XYZ2(X=%.2f Y=%.2f Z=%08x)\n"), 
		(float)r->XYZ.X/16,
		(float)r->XYZ.Y/16,
		r->XYZ.Z);

	m_v.XYZ = r->XYZ;

	VertexKick(false);
}

void __fastcall GSState::GIFRegHandlerTEX0_1(GIFReg* r)
{
	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"),
		r->TEX0.TBP0,
		r->TEX0.TBW*64,
		r->TEX0.PSM,
		1i64<<r->TEX0.TW,
		1i64<<r->TEX0.TH,
		r->TEX0.TCC,
		r->TEX0.TFX,
		r->TEX0.CBP,
		r->TEX0.CPSM,
		r->TEX0.CSM,
		r->TEX0.CSA,
		r->TEX0.CLD);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEX0.i64 != r->TEX0.i64)
		FlushPrimInternal();

	m_de.CTXT[0].TEX0 = r->TEX0;

	//ASSERT(m_de.CTXT[0].TEX0.TW <= 10 && m_de.CTXT[0].TEX0.TH <= 10);
	if(m_de.CTXT[0].TEX0.TW > 10) m_de.CTXT[0].TEX0.TW = 10;
	if(m_de.CTXT[0].TEX0.TH > 10) m_de.CTXT[0].TEX0.TH = 10;
	m_de.CTXT[0].TEX0.CPSM &= 0xa; // 1010b

	m_de.CTXT[0].ttbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[0].TEX0.PSM];

	FlushWriteTransfer();

	m_lm.WriteCLUT(r->TEX0, m_de.TEXCLUT);
}

void __fastcall GSState::GIFRegHandlerTEX0_2(GIFReg* r)
{
	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"),
		r->TEX0.TBP0,
		r->TEX0.TBW*64,
		r->TEX0.PSM,
		1i64<<r->TEX0.TW,
		1i64<<r->TEX0.TH,
		r->TEX0.TCC,
		r->TEX0.TFX,
		r->TEX0.CBP,
		r->TEX0.CPSM,
		r->TEX0.CSM,
		r->TEX0.CSA,
		r->TEX0.CLD);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEX0.i64 != r->TEX0.i64)
		FlushPrimInternal();

	m_de.CTXT[1].TEX0 = r->TEX0;

	//ASSERT(m_de.CTXT[1].TEX0.TW <= 10 && m_de.CTXT[1].TEX0.TH <= 10);
	if(m_de.CTXT[1].TEX0.TW > 10) m_de.CTXT[1].TEX0.TW = 10;
	if(m_de.CTXT[1].TEX0.TH > 10) m_de.CTXT[1].TEX0.TH = 10;
	m_de.CTXT[1].TEX0.CPSM &= 0xa; // 1010b

	m_de.CTXT[1].ttbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[1].TEX0.PSM];

	FlushWriteTransfer();

	m_lm.WriteCLUT(r->TEX0, m_de.TEXCLUT);
}

void __fastcall GSState::GIFRegHandlerCLAMP_1(GIFReg* r)
{
	LOG(_T("CLAMP_1(WMS=%x WMT=%x MINU=%x MAXU=%x MINV=%x MAXV=%x)\n"),
		r->CLAMP.WMS,
		r->CLAMP.WMT,
		r->CLAMP.MINU,
		r->CLAMP.MAXU,
		r->CLAMP.MINV,
		r->CLAMP.MAXV);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].CLAMP.i64 != r->CLAMP.i64)
		FlushPrimInternal();

	m_de.CTXT[0].CLAMP = r->CLAMP;
}

void __fastcall GSState::GIFRegHandlerCLAMP_2(GIFReg* r)
{
	LOG(_T("CLAMP_2(WMS=%x WMT=%x MINU=%x MAXU=%x MINV=%x MAXV=%x)\n"),
		r->CLAMP.WMS,
		r->CLAMP.WMT,
		r->CLAMP.MINU,
		r->CLAMP.MAXU,
		r->CLAMP.MINV,
		r->CLAMP.MAXV);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].CLAMP.i64 != r->CLAMP.i64)
		FlushPrimInternal();

	m_de.CTXT[1].CLAMP = r->CLAMP;
}

void __fastcall GSState::GIFRegHandlerFOG(GIFReg* r)
{
	LOG(_T("FOG(F=%x)\n"),
		r->FOG.F);

	m_v.FOG = r->FOG;
}

void __fastcall GSState::GIFRegHandlerXYZF3(GIFReg* r)
{
	LOG(_T("XYZF3(X=%.2f Y=%.2f Z=%08x F=%d)\n"), 
		(float)r->XYZF.X/16,
		(float)r->XYZF.Y/16,
		r->XYZF.Z,
		r->XYZF.F);
/*
	m_v.XYZ.X = r->XYZF.X;
	m_v.XYZ.Y = r->XYZF.Y;
	m_v.XYZ.Z = r->XYZF.Z;
	m_v.FOG.F = r->XYZF.F;
*/
	m_v.XYZ.ai32[0] = r->XYZF.ai32[0];
	m_v.XYZ.ai32[1] = r->XYZF.ai32[1] & 0x00ffffff;
	m_v.FOG.ai32[1] = r->XYZF.ai32[1] & 0xff000000;

	VertexKick(true);
}

void __fastcall GSState::GIFRegHandlerXYZ3(GIFReg* r)
{
	LOG(_T("XYZ3(X=%.2f Y=%.2f Z=%08x)\n"), 
		(float)r->XYZ.X/16,
		(float)r->XYZ.Y/16,
		r->XYZ.Z);

	m_v.XYZ = r->XYZ;

	VertexKick(true);
}

void __fastcall GSState::GIFRegHandlerNOP(GIFReg* r)
{
	LOG(_T("NOP()\n"));
}

void __fastcall GSState::GIFRegHandlerTEX1_1(GIFReg* r)
{
	LOG(_T("TEX1_1(LCM=%x MXL=%x MMAG=%x MMIN=%x MTBA=%x L=%x K=%x)\n"),
		r->TEX1.LCM,
		r->TEX1.MXL,
		r->TEX1.MMAG,
		r->TEX1.MMIN,
		r->TEX1.MTBA,
		r->TEX1.L,
		r->TEX1.K);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEX1.i64 != r->TEX1.i64)
		FlushPrimInternal();

	m_de.CTXT[0].TEX1 = r->TEX1;
}

void __fastcall GSState::GIFRegHandlerTEX1_2(GIFReg* r)
{
	LOG(_T("TEX1_2(LCM=%x MXL=%x MMAG=%x MMIN=%x MTBA=%x L=%x K=%x)\n"),
		r->TEX1.LCM,
		r->TEX1.MXL,
		r->TEX1.MMAG,
		r->TEX1.MMIN,
		r->TEX1.MTBA,
		r->TEX1.L,
		r->TEX1.K);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEX1.i64 != r->TEX1.i64)
		FlushPrimInternal();

	m_de.CTXT[1].TEX1 = r->TEX1;
}

void __fastcall GSState::GIFRegHandlerTEX2_1(GIFReg* r)
{
	LOG(_T("TEX2_1(PSM=%x CBP=%x CPSM=%x CSM=%x CSA=%x CLD=%x)\n"),
		r->TEX2.PSM,
		r->TEX2.CBP,
		r->TEX2.CPSM,
		r->TEX2.CSM,
		r->TEX2.CSA,
		r->TEX2.CLD);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEX2.i64 != r->TEX2.i64)
		FlushPrimInternal();

	m_de.CTXT[0].TEX2 = r->TEX2;

	FlushWriteTransfer();

	m_lm.WriteCLUT(*(GIFRegTEX0*)&r->TEX2, m_de.TEXCLUT);
}

void __fastcall GSState::GIFRegHandlerTEX2_2(GIFReg* r)
{
	LOG(_T("TEX2_2(PSM=%x CBP=%x CPSM=%x CSM=%x CSA=%x CLD=%x)\n"),
		r->TEX2.PSM,
		r->TEX2.CBP,
		r->TEX2.CPSM,
		r->TEX2.CSM,
		r->TEX2.CSA,
		r->TEX2.CLD);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEX2.i64 != r->TEX2.i64)
		FlushPrimInternal();

	m_de.CTXT[1].TEX2 = r->TEX2;

	FlushWriteTransfer();

	m_lm.WriteCLUT(*(GIFRegTEX0*)&r->TEX2, m_de.TEXCLUT);
}

void __fastcall GSState::GIFRegHandlerXYOFFSET_1(GIFReg* r)
{
	LOG(_T("XYOFFSET_1(OFX=%.2f OFY=%.2f)\n"), 
		(float)r->XYOFFSET.OFX/16,
		(float)r->XYOFFSET.OFY/16);

	m_de.CTXT[0].XYOFFSET = r->XYOFFSET;
}

void __fastcall GSState::GIFRegHandlerXYOFFSET_2(GIFReg* r)
{
	LOG(_T("XYOFFSET_2(OFX=%.2f OFY=%.2f)\n"), 
		(float)r->XYOFFSET.OFX/16,
		(float)r->XYOFFSET.OFY/16);

	m_de.CTXT[1].XYOFFSET = r->XYOFFSET;
}

void __fastcall GSState::GIFRegHandlerPRMODECONT(GIFReg* r)
{
	LOG(_T("PRMODECONT(AC=%x)\n"),
		r->PRMODECONT.AC);

	if(m_de.PRMODECONT.i64 != r->PRMODECONT.i64)
	{
		FlushPrimInternal();
	}

	m_de.PRMODECONT = r->PRMODECONT;

	m_pPRIM = !m_de.PRMODECONT.AC ? (GIFRegPRIM*)&m_de.PRMODE : &m_de.PRIM;
	m_ctxt = &m_de.CTXT[m_pPRIM->CTXT];
}

void __fastcall GSState::GIFRegHandlerPRMODE(GIFReg* r)
{
	LOG(_T("PRMODE(IIP=%x TME=%x FGE=%x ABE=%x AA1=%x FST=%x CTXT=%x FIX=%x)\n"),
		r->PRMODE.IIP,
		r->PRMODE.TME,
		r->PRMODE.FGE,
		r->PRMODE.ABE,
		r->PRMODE.AA1,
		r->PRMODE.FST,
		r->PRMODE.CTXT,
		r->PRMODE.FIX);

	if(!m_de.PRMODECONT.AC)
		FlushPrimInternal();

	UINT32 _PRIM = m_de.PRMODE._PRIM;
	m_de.PRMODE = r->PRMODE;
	m_de.PRMODE._PRIM = _PRIM;

	m_ctxt = &m_de.CTXT[m_pPRIM->CTXT];
}

void __fastcall GSState::GIFRegHandlerTEXCLUT(GIFReg* r)
{
	LOG(_T("TEXCLUT(CBW=%x COU=%x COV=%x)\n"),
		r->TEXCLUT.CBW,
		r->TEXCLUT.COU,
		r->TEXCLUT.COV);

	if(m_de.TEXCLUT.i64 != r->TEXCLUT.i64)
		FlushPrimInternal();

	m_de.TEXCLUT = r->TEXCLUT;
}

void __fastcall GSState::GIFRegHandlerSCANMSK(GIFReg* r)
{
	LOG(_T("SCANMSK(MSK=%x)\n"),
		r->SCANMSK.MSK);

	if(m_de.SCANMSK.i64 != r->SCANMSK.i64)
		FlushPrimInternal();

	m_de.SCANMSK = r->SCANMSK;
}

void __fastcall GSState::GIFRegHandlerMIPTBP1_1(GIFReg* r)
{
	LOG(_T("MIPTBP1_1(TBP1=%x TBW1=%x TBP2=%x TBW2=%x TBP3=%x TBW3=%x)\n"),
		r->MIPTBP1.TBP1,
		r->MIPTBP1.TBW1,
		r->MIPTBP1.TBP2,
		r->MIPTBP1.TBW2,
		r->MIPTBP1.TBP3,
		r->MIPTBP1.TBW3);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].MIPTBP1.i64 != r->MIPTBP1.i64)
		FlushPrimInternal();

	m_de.CTXT[0].MIPTBP1 = r->MIPTBP1;
}

void __fastcall GSState::GIFRegHandlerMIPTBP1_2(GIFReg* r)
{
	LOG(_T("MIPTBP1_2(TBP1=%x TBW1=%x TBP2=%x TBW2=%x TBP3=%x TBW3=%x)\n"),
		r->MIPTBP1.TBP1,
		r->MIPTBP1.TBW1,
		r->MIPTBP1.TBP2,
		r->MIPTBP1.TBW2,
		r->MIPTBP1.TBP3,
		r->MIPTBP1.TBW3);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].MIPTBP1.i64 != r->MIPTBP1.i64)
		FlushPrimInternal();

	m_de.CTXT[1].MIPTBP1 = r->MIPTBP1;
}

void __fastcall GSState::GIFRegHandlerMIPTBP2_1(GIFReg* r)
{
	LOG(_T("MIPTBP2_1(TBP4=%x TBW4=%x TBP5=%x TBW5=%x TBP6=%x TBW6=%x)\n"),
		r->MIPTBP2.TBP4,
		r->MIPTBP2.TBW4,
		r->MIPTBP2.TBP5,
		r->MIPTBP2.TBW5,
		r->MIPTBP2.TBP6,
		r->MIPTBP2.TBW6);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].MIPTBP2.i64 != r->MIPTBP2.i64)
		FlushPrimInternal();

	m_de.CTXT[0].MIPTBP2 = r->MIPTBP2;
}

void __fastcall GSState::GIFRegHandlerMIPTBP2_2(GIFReg* r)
{
	LOG(_T("MIPTBP2_2(TBP4=%x TBW4=%x TBP5=%x TBW5=%x TBP6=%x TBW6=%x)\n"),
		r->MIPTBP2.TBP4,
		r->MIPTBP2.TBW4,
		r->MIPTBP2.TBP5,
		r->MIPTBP2.TBW5,
		r->MIPTBP2.TBP6,
		r->MIPTBP2.TBW6);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].MIPTBP2.i64 != r->MIPTBP2.i64)
		FlushPrimInternal();

	m_de.CTXT[1].MIPTBP2 = r->MIPTBP2;
}

void __fastcall GSState::GIFRegHandlerTEXA(GIFReg* r)
{
	LOG(_T("TEXA(TA0=%x AEM=%x TA1=%x)\n"),
		r->TEXA.TA0,
		r->TEXA.AEM,
		r->TEXA.TA1);

	if(m_de.TEXA.i64 != r->TEXA.i64)
		FlushPrimInternal();

	m_de.TEXA = r->TEXA;
}

void __fastcall GSState::GIFRegHandlerFOGCOL(GIFReg* r)
{
	LOG(_T("FOGCOL(FCR=%x FCG=%x FCB=%x)\n"),
		r->FOGCOL.FCR,
		r->FOGCOL.FCG,
		r->FOGCOL.FCB);

	if(m_de.FOGCOL.i64 != r->FOGCOL.i64)
		FlushPrimInternal();

	m_de.FOGCOL = r->FOGCOL;
}

void __fastcall GSState::GIFRegHandlerTEXFLUSH(GIFReg* r)
{
	LOG(_T("TEXFLUSH()\n"));

	// what should we do here?
}

void __fastcall GSState::GIFRegHandlerSCISSOR_1(GIFReg* r)
{
	LOG(_T("SCISSOR_1(SCAX0=%d SCAX1=%d SCAY0=%d SCAY1=%d)\n"),
		r->SCISSOR.SCAX0,
		r->SCISSOR.SCAX1,
		r->SCISSOR.SCAY0,
		r->SCISSOR.SCAY1);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].SCISSOR.i64 != r->SCISSOR.i64)
		FlushPrimInternal();

	m_de.CTXT[0].SCISSOR = r->SCISSOR;
}

void __fastcall GSState::GIFRegHandlerSCISSOR_2(GIFReg* r)
{
	LOG(_T("SCISSOR_2(SCAX0=%d SCAX1=%d SCAY0=%d SCAY1=%d)\n"),
		r->SCISSOR.SCAX0,
		r->SCISSOR.SCAX1,
		r->SCISSOR.SCAY0,
		r->SCISSOR.SCAY1);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].SCISSOR.i64 != r->SCISSOR.i64)
		FlushPrimInternal();

	m_de.CTXT[1].SCISSOR = r->SCISSOR;
}

void __fastcall GSState::GIFRegHandlerALPHA_1(GIFReg* r)
{
	LOG(_T("ALPHA_1(A=%x B=%x C=%x D=%x FIX=%x)\n"),
		r->ALPHA.A,
		r->ALPHA.B,
		r->ALPHA.C,
		r->ALPHA.D,
		r->ALPHA.FIX);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].ALPHA.i64 != r->ALPHA.i64)
		FlushPrimInternal();

	m_de.CTXT[0].ALPHA = r->ALPHA;
}

void __fastcall GSState::GIFRegHandlerALPHA_2(GIFReg* r)
{
	LOG(_T("ALPHA_2(A=%x B=%x C=%x D=%x FIX=%x)\n"),
		r->ALPHA.A,
		r->ALPHA.B,
		r->ALPHA.C,
		r->ALPHA.D,
		r->ALPHA.FIX);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].ALPHA.i64 != r->ALPHA.i64)
		FlushPrimInternal();

	m_de.CTXT[1].ALPHA = r->ALPHA;
}

void __fastcall GSState::GIFRegHandlerDIMX(GIFReg* r)
{
	LOG(_T("DIMX([%d,%d,%d,%d][%d,%d,%d,%d][%d,%d,%d,%d][%d,%d,%d,%d])\n"),
		r->DIMX.DM00,
		r->DIMX.DM01,
		r->DIMX.DM02,
		r->DIMX.DM03,
		r->DIMX.DM10,
		r->DIMX.DM11,
		r->DIMX.DM12,
		r->DIMX.DM13,
		r->DIMX.DM20,
		r->DIMX.DM21,
		r->DIMX.DM22,
		r->DIMX.DM23,
		r->DIMX.DM30,
		r->DIMX.DM31,
		r->DIMX.DM32,
		r->DIMX.DM33);

	if(m_de.DIMX.i64 != r->DIMX.i64)
		FlushPrimInternal();

	m_de.DIMX = r->DIMX;
}

void __fastcall GSState::GIFRegHandlerDTHE(GIFReg* r)
{
	LOG(_T("DTHE(DTHE=%x)\n"),
		r->DTHE.DTHE);

	if(m_de.DTHE.i64 != r->DTHE.i64)
		FlushPrimInternal();

	m_de.DTHE = r->DTHE;
}

void __fastcall GSState::GIFRegHandlerCOLCLAMP(GIFReg* r)
{
	LOG(_T("COLCLAMP(CLAMP=%x)\n"),
		r->COLCLAMP.CLAMP);

	if(m_de.COLCLAMP.i64 != r->COLCLAMP.i64)
		FlushPrimInternal();

	m_de.COLCLAMP = r->COLCLAMP;
}

void __fastcall GSState::GIFRegHandlerTEST_1(GIFReg* r)
{
	LOG(_T("TEST_1(ATE=%x ATST=%x AREF=%x AFAIL=%x DATE=%x DATM=%x ZTE=%x ZTST=%x)\n"),
		r->TEST.ATE,
		r->TEST.ATST,
		r->TEST.AREF,
		r->TEST.AFAIL,
		r->TEST.DATE,
		r->TEST.DATM,
		r->TEST.ZTE,
		r->TEST.ZTST);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].TEST.i64 != r->TEST.i64)
		FlushPrimInternal();

	m_de.CTXT[0].TEST = r->TEST;
}

void __fastcall GSState::GIFRegHandlerTEST_2(GIFReg* r)
{
	LOG(_T("TEST_2(ATE=%x ATST=%x AREF=%x AFAIL=%x DATE=%x DATM=%x ZTE=%x ZTST=%x)\n"),
		r->TEST.ATE,
		r->TEST.ATST,
		r->TEST.AREF,
		r->TEST.AFAIL,
		r->TEST.DATE,
		r->TEST.DATM,
		r->TEST.ZTE,
		r->TEST.ZTST);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].TEST.i64 != r->TEST.i64)
		FlushPrimInternal();

	m_de.CTXT[1].TEST = r->TEST;
}

void __fastcall GSState::GIFRegHandlerPABE(GIFReg* r)
{
	LOG(_T("PABE(PABE=%x)\n"), 
		r->PABE.PABE);

	if(m_de.PABE.i64 != r->PABE.i64)
		FlushPrimInternal();

	m_de.PABE = r->PABE;
}

void __fastcall GSState::GIFRegHandlerFBA_1(GIFReg* r)
{
	LOG(_T("FBA_1(FBA=%x)\n"), 
		r->FBA.FBA);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].FBA.i64 != r->FBA.i64)
		FlushPrimInternal();

	m_de.CTXT[0].FBA = r->FBA;
}

void __fastcall GSState::GIFRegHandlerFBA_2(GIFReg* r)
{
	LOG(_T("FBA_2(FBA=%x)\n"), 
		r->FBA.FBA);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].FBA.i64 != r->FBA.i64)
		FlushPrimInternal();

	m_de.CTXT[1].FBA = r->FBA;
}

void __fastcall GSState::GIFRegHandlerFRAME_1(GIFReg* r)
{
	LOG(_T("FRAME_1(FBP=%x FBW=%d PSM=%x FBMSK=%x)\n"),
		r->FRAME.Block(),
		r->FRAME.FBW*64,
		r->FRAME.PSM,
		r->FRAME.FBMSK);

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].FRAME.i64 != r->FRAME.i64)
		FlushPrimInternal();

	m_de.CTXT[0].FRAME = r->FRAME;

	m_de.CTXT[0].ftbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[0].FRAME.PSM];
}

void __fastcall GSState::GIFRegHandlerFRAME_2(GIFReg* r)
{
	LOG(_T("FRAME_2(FBP=%x FBW=%d PSM=%x FBMSK=%x)\n"),
		r->FRAME.Block(),
		r->FRAME.FBW*64,
		r->FRAME.PSM,
		r->FRAME.FBMSK);

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].FRAME.i64 != r->FRAME.i64)
		FlushPrimInternal();

	m_de.CTXT[1].FRAME = r->FRAME;

	m_de.CTXT[1].ftbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[1].FRAME.PSM];
}

void __fastcall GSState::GIFRegHandlerZBUF_1(GIFReg* r)
{
	LOG(_T("ZBUF_1(ZBP=%x PSM=%x ZMSK=%x)\n"),
		r->ZBUF.ZBP<<5,
		r->ZBUF.PSM,
		r->ZBUF.ZMSK);

	r->ZBUF.PSM |= 0x30;

	if(m_pPRIM->CTXT == 0 && m_de.CTXT[0].ZBUF.i64 != r->ZBUF.i64)
		FlushPrimInternal();

	m_de.CTXT[0].ZBUF = r->ZBUF;

	if(m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ32
	&& m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ24
	&& m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ16
	&& m_de.CTXT[0].ZBUF.PSM != PSM_PSMZ16S)
		m_de.CTXT[0].ZBUF.PSM = PSM_PSMZ32;

	m_de.CTXT[0].ztbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[0].ZBUF.PSM];
}

void __fastcall GSState::GIFRegHandlerZBUF_2(GIFReg* r)
{
	LOG(_T("ZBUF_2(ZBP=%x PSM=%x ZMSK=%x)\n"),
		r->ZBUF.ZBP<<5,
		r->ZBUF.PSM,
		r->ZBUF.ZMSK);

	r->ZBUF.PSM |= 0x30;

	if(m_pPRIM->CTXT == 1 && m_de.CTXT[1].ZBUF.i64 != r->ZBUF.i64)
		FlushPrimInternal();

	m_de.CTXT[1].ZBUF = r->ZBUF;

	if(m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ32
	&& m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ24
	&& m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ16
	&& m_de.CTXT[1].ZBUF.PSM != PSM_PSMZ16S)
		m_de.CTXT[1].ZBUF.PSM = PSM_PSMZ32;

	m_de.CTXT[1].ztbl = &GSLocalMemory::m_psmtbl[m_de.CTXT[1].ZBUF.PSM];
}

void __fastcall GSState::GIFRegHandlerBITBLTBUF(GIFReg* r)
{
	LOG(_T("BITBLTBUF(SBP=%x SBW=%d SPSM=%x DBP=%x DBW=%d DPSM=%x)\n"),
		r->BITBLTBUF.SBP,
		r->BITBLTBUF.SBW*64,
		r->BITBLTBUF.SPSM,
		r->BITBLTBUF.DBP,
		r->BITBLTBUF.DBW*64,
		r->BITBLTBUF.DPSM);

	if(m_de.BITBLTBUF.i64 != r->BITBLTBUF.i64)
		FlushWriteTransfer();

	m_de.BITBLTBUF = r->BITBLTBUF;
}

void __fastcall GSState::GIFRegHandlerTRXPOS(GIFReg* r)
{
	LOG(_T("TRXPOS(SSAX=%d SSAY=%d DSAX=%d DSAY=%d DIR=%d)\n"),
		r->TRXPOS.SSAX,
		r->TRXPOS.SSAY,
		r->TRXPOS.DSAX,
		r->TRXPOS.DSAY,
		r->TRXPOS.DIR);

	if(m_de.TRXPOS.i64 != r->TRXPOS.i64)
		FlushWriteTransfer();

	m_de.TRXPOS = r->TRXPOS;
}

void __fastcall GSState::GIFRegHandlerTRXREG(GIFReg* r)
{
	LOG(_T("TRXREG(RRW=%d RRH=%d)\n"),
		r->TRXREG.RRW,
		r->TRXREG.RRH);

	if(m_de.TRXREG.i64 != r->TRXREG.i64 || m_de.TRXREG2.i64 != r->TRXREG.i64)
		FlushWriteTransfer();

	m_de.TRXREG = m_de.TRXREG2 = r->TRXREG;
}

void __fastcall GSState::GIFRegHandlerTRXDIR(GIFReg* r)
{
	LOG(_T("TRXDIR(XDIR=%d)\n"), 
		r->TRXDIR.XDIR);

	FlushWriteTransfer();

	FlushPrimInternal();

	m_de.TRXDIR = r->TRXDIR;

	switch(m_de.TRXDIR.XDIR)
	{
	case 0: // host -> local
		m_x = m_de.TRXPOS.DSAX;
		m_y = m_de.TRXPOS.DSAY;
		m_de.TRXREG.RRW = m_x + m_de.TRXREG2.RRW;
		m_de.TRXREG.RRH = m_y + m_de.TRXREG2.RRH;
		break;
	case 1: // local -> host
		m_x = m_de.TRXPOS.SSAX;
		m_y = m_de.TRXPOS.SSAY;
		m_de.TRXREG.RRW = m_x + m_de.TRXREG2.RRW;
		m_de.TRXREG.RRH = m_y + m_de.TRXREG2.RRH;
		break;
	case 2: // local -> local
		MoveTransfer();
		break;
	case 3: 
		ASSERT(0);
		break;
	}
}

void __fastcall GSState::GIFRegHandlerHWREG(GIFReg* r)
{
	LOG(_T("HWREG(DATA_LOWER=%08x DATA_UPPER=%08x)\n"),
		r->HWREG.DATA_LOWER,
		r->HWREG.DATA_UPPER);

	// TODO

	ASSERT(0);
}

void __fastcall GSState::GIFRegHandlerSIGNAL(GIFReg* r)
{
	LOG(_T("SIGNAL(ID=%08x IDMSK=%08x)\n"), 
		r->SIGNAL.ID, 
		r->SIGNAL.IDMSK);

	if(m_fMultiThreaded) return;

	m_rs.pSIGLBLID->SIGID = (m_rs.pSIGLBLID->SIGID & ~r->SIGNAL.IDMSK) | (r->SIGNAL.ID & r->SIGNAL.IDMSK);

	if(m_rs.pCSR->wSIGNAL) m_rs.pCSR->rSIGNAL = 1;
	if(!m_rs.pIMR->SIGMSK && m_fpGSirq) m_fpGSirq();
}

void __fastcall GSState::GIFRegHandlerFINISH(GIFReg* r)
{
	LOG(_T("FINISH()\n"));

	if(m_fMultiThreaded) return;

	if(m_rs.pCSR->wFINISH) m_rs.pCSR->rFINISH = 1;
	if(!m_rs.pIMR->FINISHMSK && m_fpGSirq) m_fpGSirq();
}

void __fastcall GSState::GIFRegHandlerLABEL(GIFReg* r)
{
	LOG(_T("LABEL(ID=%08x IDMSK=%08x)\n"), 
		r->LABEL.ID, 
		r->LABEL.IDMSK);

	if(m_fMultiThreaded) return;

	m_rs.pSIGLBLID->LBLID = (m_rs.pSIGLBLID->LBLID & ~r->LABEL.IDMSK) | (r->LABEL.ID & r->LABEL.IDMSK);
}





See more files for this project here

guliverkli

Home of VobSub, Media Player Classic (MPC) and other misc utils.

Project homepage: http://sourceforge.net/projects/guliverkli
Programming language(s): C,C++,PHP
License: other

  res/
    GSdx9.rc2
    hlsl_merge.fx
    hlsl_rb.fx
    hlsl_tfx.fx
    logo1.bmp
    ps11_en00.psh
    ps11_en01.psh
    ps11_en10.psh
    ps11_en11.psh
    ps11_tfx000.psh
    ps11_tfx010.psh
    ps11_tfx011.psh
    ps11_tfx1x0.psh
    ps11_tfx1x1.psh
    ps11_tfx200.psh
    ps11_tfx210.psh
    ps11_tfx211.psh
    ps11_tfx300.psh
    ps11_tfx310.psh
    ps11_tfx311.psh
    ps11_tfx4xx.psh
    ps14_en00.psh
    ps14_en01.psh
    ps14_en10.psh
    ps14_en11.psh
  GS.cpp
  GS.h
  GSCapture.cpp
  GSCapture.h
  GSCaptureDlg.cpp
  GSCaptureDlg.h
  GSHash.cpp
  GSHash.h
  GSLocalMemory.cpp
  GSLocalMemory.h
  GSPerfMon.cpp
  GSPerfMon.h
  GSRegs.cpp
  GSRenderer.cpp
  GSRenderer.h
  GSRendererHW.cpp
  GSRendererHW.h
  GSRendererNull.cpp
  GSRendererNull.h
  GSRendererSoft.cpp
  GSRendererSoft.h
  GSSettingsDlg.cpp
  GSSettingsDlg.h
  GSSoftVertex.cpp
  GSSoftVertex.h
  GSState.cpp
  GSState.h
  GSTables.cpp
  GSTables.h
  GSTextureCache.cpp
  GSTextureCache.h
  GSTransfer.cpp
  GSUtil.cpp
  GSUtil.h
  GSVertexList.cpp
  GSVertexList.h
  GSWnd.cpp
  GSWnd.h
  GSdx9.cpp
  GSdx9.def
  GSdx9.h
  GSdx9.icproj
  GSdx9.rc
  GSdx9.sln
  GSdx9.vcproj
  GSdx9_ic.sln
  GSdx9_vs2005.sln
  GSdx9_vs2005.vcproj
  resource.h
  stdafx.cpp
  stdafx.h
  x86-32.asm
  x86-64.asm
  x86.cpp
  x86.h