/* 
 *	Copyright (C) 2007-2009 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, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA USA. 
 *  http://www.gnu.org/copyleft/gpl.html
 *
 */

#pragma once

#pragma pack(push, 1)

#include "GS.h"

enum
{
	GPU_POLYGON = 1,
	GPU_LINE = 2,
	GPU_SPRITE = 3,
};

REG32_(GPUReg, STATUS)
	uint32 TX:4;
	uint32 TY:1;
	uint32 ABR:2;
	uint32 TP:2;
	uint32 DTD:1;
	uint32 DFE:1;
	uint32 MD:1;
	uint32 ME:1;
	uint32 _PAD0:3;
	uint32 WIDTH1:1;
	uint32 WIDTH0:2;
	uint32 HEIGHT:1;
	uint32 ISPAL:1;
	uint32 ISRGB24:1;
	uint32 ISINTER:1;
	uint32 DEN:1;
	uint32 _PAD1:2;
	uint32 IDLE:1;
	uint32 IMG:1;
	uint32 COM:1;
	uint32 DMA:2;
	uint32 LCF:1;
	/*
	uint32 TX:4;
	uint32 TY:1;
	uint32 ABR:2;
	uint32 TP:2;
	uint32 DTD:1;
	uint32 DFE:1;
	uint32 PBW:1;
	uint32 PBC:1;
	uint32 _PAD0:3;
	uint32 HRES2:1;
	uint32 HRES1:2;
	uint32 VRES:1;
	uint32 ISPAL:1;
	uint32 ISRGB24:1;
	uint32 ISINTER:1;
	uint32 ISSTOP:1;
	uint32 _PAD1:1;
	uint32 DMARDY:1;
	uint32 IDIDLE:1;
	uint32 DATARDY:1;
	uint32 ISEMPTY:1;
	uint32 TMODE:2;
	uint32 ODE:1;
	*/
REG_END

REG32_(GPUReg, PACKET)
	uint32 _PAD:24;
	uint32 OPTION:5;
	uint32 TYPE:3;
REG_END

REG32_(GPUReg, PRIM)
	uint32 VTX:24;
	uint32 TGE:1;
	uint32 ABE:1;
	uint32 TME:1;
	uint32 _PAD2:1;
	uint32 IIP:1;
	uint32 TYPE:3;
REG_END

REG32_(GPUReg, POLYGON)
	uint32 _PAD:24;
	uint32 TGE:1;
	uint32 ABE:1;
	uint32 TME:1;
	uint32 VTX:1;
	uint32 IIP:1;
	uint32 TYPE:3;
REG_END

REG32_(GPUReg, LINE)
	uint32 _PAD:24;
	uint32 ZERO1:1;
	uint32 ABE:1;
	uint32 ZERO2:1;
	uint32 PLL:1;
	uint32 IIP:1;
	uint32 TYPE:3;
REG_END

REG32_(GPUReg, SPRITE)
	uint32 _PAD:24;
	uint32 ZERO:1;
	uint32 ABE:1;
	uint32 TME:1;
	uint32 SIZE:2;
	uint32 TYPE:3;
REG_END

REG32_(GPUReg, RESET)
	uint32 _PAD:32;
REG_END

REG32_(GPUReg, DEN)
	uint32 DEN:1;
	uint32 _PAD:31;
REG_END

REG32_(GPUReg, DMA)
	uint32 DMA:2;
	uint32 _PAD:30;
REG_END

REG32_(GPUReg, DAREA)
	uint32 X:10;
	uint32 Y:9;
	uint32 _PAD:13;
REG_END

REG32_(GPUReg, DHRANGE)
	uint32 X1:12;
	uint32 X2:12;
	uint32 _PAD:8;
REG_END

REG32_(GPUReg, DVRANGE)
	uint32 Y1:10;
	uint32 Y2:11;
	uint32 _PAD:11;
REG_END

REG32_(GPUReg, DMODE)
	uint32 WIDTH0:2;
	uint32 HEIGHT:1;
	uint32 ISPAL:1;
	uint32 ISRGB24:1;
	uint32 ISINTER:1;
	uint32 WIDTH1:1;
	uint32 REVERSE:1;
	uint32 _PAD:24;
REG_END

REG32_(GPUReg, GPUINFO)
	uint32 PARAM:24;
	uint32 _PAD:8;
REG_END

REG32_(GPUReg, MODE)
	uint32 TX:4;
	uint32 TY:1;
	uint32 ABR:2;
	uint32 TP:2;
	uint32 DTD:1;
	uint32 DFE:1;
	uint32 _PAD:21;
REG_END

REG32_(GPUReg, MASK)
	uint32 MD:1;
	uint32 ME:1;
	uint32 _PAD:30;
REG_END

REG32_(GPUReg, DRAREA)
	uint32 X:10;
	uint32 Y:10;
	uint32 _PAD:12;
REG_END

REG32_(GPUReg, DROFF)
	int32 X:11;
	int32 Y:11;
	int32 _PAD:10;
REG_END

REG32_(GPUReg, RGB)
	uint32 R:8;
	uint32 G:8;
	uint32 B:8;
	uint32 _PAD:8;
REG_END

REG32_(GPUReg, XY)
	int32 X:11;
	int32 _PAD1:5;
	int32 Y:11;
	int32 _PAD2:5;
REG_END

REG32_(GPUReg, UV)
	uint32 U:8;
	uint32 V:8;
	uint32 _PAD:16;
REG_END

REG32_(GPUReg, TWIN)
	uint32 TWW:5;
	uint32 TWH:5;
	uint32 TWX:5;
	uint32 TWY:5;
	uint32 _PAD:12;
REG_END

REG32_(GPUReg, CLUT)
	uint32 _PAD1:16;
	uint32 X:6;
	uint32 Y:9;
	uint32 _PAD2:1;
REG_END

REG32_SET(GPUReg)
	GPURegSTATUS STATUS;
	GPURegPACKET PACKET;
	GPURegPRIM PRIM;
	GPURegPOLYGON POLYGON;
	GPURegLINE LINE;
	GPURegSPRITE SPRITE;
	GPURegRESET RESET;
	GPURegDEN DEN;
	GPURegDMA DMA;
	GPURegDAREA DAREA;
	GPURegDHRANGE DHRANGE;
	GPURegDVRANGE DVRANGE;
	GPURegDMODE DMODE;
	GPURegGPUINFO GPUINFO;
	GPURegMODE MODE;
	GPURegMASK MASK;
	GPURegDRAREA DRAREA;
	GPURegDROFF DROFF;
	GPURegRGB RGB;
	GPURegXY XY;
	GPURegUV UV;
	GPURegTWIN TWIN;
	GPURegCLUT CLUT;
REG_SET_END

struct GPUFreezeData
{
	uint32 version; // == 1
	uint32 status;
	uint32 control[256];
	uint16 vram[1024 * 1024];
};

#pragma pack(pop)