thug/Code/Gfx/NGPS/NX/gif.cpp
2016-02-14 08:39:12 +11:00

203 lines
6.2 KiB
C++

#include <core/defines.h>
#include <math.h>
#include "dma.h"
#include "gif.h"
#include "vif.h"
#include "vu1.h"
namespace NxPs2
{
/* ノヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘサ
コ GIFtag format コ
ネヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘシ
31 16 15 14 0
レトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトツトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ ウEOP NLOOP ウ
タトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトチトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
63 60 59 58 57 47 46 45 32
レトトトトトトトトトトトツトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトツトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ NREG ウ FLG ウ PRIM ウPRE ウ
タトトトトトトトトトトトチトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトチトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
95 76 75 72 71 68 67 64
レトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトツトトトトトトトトトトトツトトトトトトトトトトトツトトトトトトトトトトトソ
ウ ... ウ [REG2] ウ [REG1] ウ REG0 ウ
タトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトチトトトトトトトトトトトチトトトトトトトトトトトチトトトトトトトトトトトル
127 96
レトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ ウ
タトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
ノヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘサ
コ PATH1 GIFtag format コ
ネヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘシ
31 30 23 22 16 15 14 0
レトトツトトトトトトトトトトトトトトトトトトトトトトトツトトトトトトトトトトトトトトトトトトトトツトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ0 ウ NREG exponent ウ << NREG ウEOP NLOOP ウ
タトトチトトトトトトトトトトトトトトトトトトトトトトトチトトトトトトトトトトトトトトトトトトトトチトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
63 60 59 58 57 47 46 45 43 42 32
レトトトトトトトトトトトツトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトツトトツトトトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ NREG ウ FLG ウ PRIM ウPRE ウ ADDR ウ
タトトトトトトトトトトトチトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトチトトチトトトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
95 76 75 72 71 68 67 64
レトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトツトトトトトトトトトトトツトトトトトトトトトトトツトトトトトトトトトトトソ
ウ ... ウ [REG2] ウ [REG1] ウ REG0 ウ
タトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトチトトトトトトトトトトトチトトトトトトトトトトトチトトトトトトトトトトトル
127 112 111 106 105 96
レトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトツトトトトトトトトトトトトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ ウ flags ウ SIZE ウ
タトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトチトトトトトトトトトトトトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
flags:
106 -
107 -
108 -
109 -
110 - no ITOP }
111 - no ITOP } uses 2 flags because the parsing loop is quicker
*/
//-------------------------------------------------
// G I F T A G C O N S T R U C T I O N
//-------------------------------------------------
// PATH1
void gif::Tag1(uint32 Regs, uint NReg, uint Flg, uint Prim, uint Pre, uint Eop, uint NLoop, uint Addr)
{
uint32 size = NReg * NLoop;
float NRegFloat = (float)NReg * 1.1920928955e-07f; // 2^-23
dma::Store32(*(uint32 *)&NRegFloat | Eop<<15 | NLoop,
NReg<<28 | Flg<<26 | Prim<<15 | Pre<<14 | Addr,
Regs,
size);
}
void gif::BeginTag1(uint32 Regs, uint NReg, uint Flg, uint Prim, uint Pre, uint Addr)
{
float NRegFloat = (float)NReg * 1.1920928955e-07f; // 2^-23
pTag = dma::pLoc;
dma::Store32(*(uint32 *)&NRegFloat,
NReg<<28 | Flg<<26 | Prim<<15 | Pre<<14 | Addr,
Regs,
0);
}
void gif::BeginTag1_extended(uint32 Regs, uint NReg, uint Flg, uint Prim, uint Pre, uint Addr, uint Step)
{
float StepFloat = (float)Step * 1.1920928955e-07f; // 2^-23
pTag = dma::pLoc;
dma::Store32(*(uint32 *)&StepFloat,
NReg<<28 | Flg<<26 | Prim<<15 | Pre<<14 | Addr,
Regs,
0);
}
void gif::EndTag1(uint Eop)
{
uint32 size = vif::UnpackSize * vif::CycleLength;
((uint32 *)pTag)[0] |= Eop<<15 | vif::UnpackSize;
((uint32 *)pTag)[3] = size;
vu1::Loc += vif::UnpackSize * vif::CycleLength + 1;
}
void gif::BeginTagImmediate(uint32 Regs, uint NReg, uint Flg, uint Prim, uint Pre, uint Addr)
{
float NRegFloat = (float)NReg * 1.1920928955e-07f; // 2^-23
pTag = dma::pLoc;
dma::Store32(*(uint32 *)&NRegFloat,
NReg<<28 | Flg<<26 | Prim<<15 | Pre<<14 | Addr,
Regs,
0);
}
void gif::EndTagImmediate(uint Eop)
{
uint32 size = vif::UnpackSize;
uint NREG = pTag[7]>>4;
((uint32 *)pTag)[0] |= Eop<<15 | (vif::UnpackSize/NREG);
((uint32 *)pTag)[3] = size;
vu1::Loc += vif::UnpackSize+1;
}
// PATH2 or 3
void gif::Tag2(uint32 Regs, uint NReg, uint Flg, uint Prim, uint Pre, uint Eop, uint NLoop)
{
dma::Store32( Eop<<15 | NLoop,
NReg<<28 | Flg<<26 | Prim<<15 | Pre<<14,
Regs,
0);
}
void gif::BeginTag2(uint32 Regs, uint NReg, uint Flg, uint Prim, uint Pre)
{
pTag = dma::pLoc;
dma::Store32( 0,
NReg<<28 | Flg<<26 | Prim<<15 | Pre<<14,
Regs,
0);
}
void gif::EndTag2(uint Eop)
{
uint FLG = pTag[7]>>2 & 3;
uint NREG = pTag[7]>>4;
uint NLOOP;
if (FLG==IMAGE)
NLOOP = (dma::pLoc - pTag - 16) / 16;
else
NLOOP = (dma::pLoc - pTag - 16) / (16*NREG);
*(uint32 *)pTag |= Eop<<15 | NLOOP;
}
//--------------------------------
// S T A T I C D A T A
//--------------------------------
uint8 *gif::pTag;
} // namespace NxPs2