uint8 *C;
uint8 cc;
uint32 vadr;
#ifdef PPU_VRC5FETCH
uint8 tmpd;
#endif

#ifndef PPUT_MMC5SP
	uint8 zz;
#else
	uint8 xs, ys;
	xs = X1;
	ys = ((scanline >> 3) + MMC5HackSPScroll) & 0x1F;
	if (ys >= 0x1E) ys -= 0x1E;
#endif

if (X1 >= 2) {
	uint8 *S = PALRAM;
	uint32 pixdata;

	pixdata = ppulut1[(pshift[0] >> (8 - XOffset)) & 0xFF] | ppulut2[(pshift[1] >> (8 - XOffset)) & 0xFF];

	pixdata |= ppulut3[XOffset | (atlatch << 3)];

	P[0] = S[pixdata & 0xF];
	pixdata >>= 4;
	P[1] = S[pixdata & 0xF];
	pixdata >>= 4;
	P[2] = S[pixdata & 0xF];
	pixdata >>= 4;
	P[3] = S[pixdata & 0xF];
	pixdata >>= 4;
	P[4] = S[pixdata & 0xF];
	pixdata >>= 4;
	P[5] = S[pixdata & 0xF];
	pixdata >>= 4;
	P[6] = S[pixdata & 0xF];
	pixdata >>= 4;
	P[7] = S[pixdata & 0xF];
	P += 8;
}

#ifdef PPUT_MMC5SP
	vadr = (MMC5HackExNTARAMPtr[xs | (ys << 5)] << 4) + (vofs & 7);
#else
	zz = RefreshAddr & 0x1F;
	C = vnapage[(RefreshAddr >> 10) & 3];
#ifdef PPU_VRC5FETCH
	tmpd = QTAINTRAM[((((RefreshAddr >> 10) & 3) >> ((qtaintramreg >> 1)) & 1) << 10) | (RefreshAddr & 0x3FF)];
	vofs = ((tmpd & 0x3F) << 12) | ((RefreshAddr >> 12) & 7);	// recalculate VROM offset 
#endif
	vadr = (C[RefreshAddr & 0x3ff] << 4) + vofs;				// Fetch name table byte.
#endif

#ifdef PPUT_HOOK
	PPU_hook(0x2000 | (RefreshAddr & 0xfff));
#endif

#ifdef PPUT_MMC5SP
	cc = MMC5HackExNTARAMPtr[0x3c0 + (xs >> 2) + ((ys & 0x1C) << 1)];
	cc = ((cc >> ((xs & 2) + ((ys & 0x2) << 1))) & 3);
#else
	#ifdef PPUT_MMC5CHR1
		cc = (MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff] & 0xC0) >> 6;
	#else
		cc = C[0x3c0 + (zz >> 2) + ((RefreshAddr & 0x380) >> 4)];	// Fetch attribute table byte.
		cc = ((cc >> ((zz & 2) + ((RefreshAddr & 0x40) >> 4))) & 3);
	#endif
#endif

atlatch >>= 2;
atlatch |= cc << 2;

pshift[0] <<= 8;
pshift[1] <<= 8;

#ifdef PPUT_MMC5SP
	C = MMC5HackVROMPTR + vadr;
	C += ((MMC5HackSPPage & 0x3f & MMC5HackVROMMask) << 12);
#else
	#ifdef PPUT_MMC5CHR1
		C = MMC5HackVROMPTR;
		C += (((MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff]) & 0x3f & MMC5HackVROMMask) << 12) + (vadr & 0xfff);
		C += (MMC50x5130 & 0x3) << 18; //11-jun-2009 for kuja_killer
	#elif defined(PPUT_MMC5)
		C = MMC5BGVRAMADR(vadr);
	#else

	#ifdef PPU_VRC5FETCH
	if(tmpd & 0x40)
		C = CHRptr[0] + vadr;
	else
		C = VRAMADR(vadr);
	#else
		C = VRAMADR(vadr);
#endif

	#endif
#endif

#ifdef PPUT_HOOK
	PPU_hook(vadr);
#endif

#ifdef PPU_BGFETCH
	if (RefreshAddr & 1) {
		if(ScreenON)
			RENDER_LOGP(C + 8);
		pshift[0] |= C[8];
		pshift[1] |= C[8];
	} else {
		if(ScreenON)
			RENDER_LOGP(C);
		pshift[0] |= C[0];
		pshift[1] |= C[0];
	}
#else
	#ifdef PPU_VRC5FETCH
	pshift[0] |= C[0];
	if(tmpd & 0x40)
		pshift[1] |= (tmpd & 0x80) ? 0xFF : 0x00;
	else
		pshift[1] |= C[8];
	#else
	if(ScreenON)
		RENDER_LOGP(C);
	pshift[0] |= C[0];
	if(ScreenON)
		RENDER_LOGP(C + 8);
	pshift[1] |= C[8];
	#endif
#endif

if ((RefreshAddr & 0x1f) == 0x1f)
	RefreshAddr ^= 0x41F;
else
	RefreshAddr++;

#ifdef PPUT_HOOK
	PPU_hook(0x2000 | (RefreshAddr & 0xfff));
#endif

