        uint8 *C; 
        register uint8 cc;
        uint32 vadr;
       
	#ifndef PPUT_MMC5SP
	register 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)];
	 //printf("%02x ",ppulut3[XOffset|(atlatch<<3)]);

	 #ifdef C80x86
	 asm volatile(
	 "movl %%ebx,%%eax\n\t"
	 "andl $15,%%eax\n\t"
	 "movb (%%esi,%%eax),%%cl\n\t"
	 "shrl $4, %%ebx\n\t"
	 "movb %%cl, (%%edi)\n\t"

         "movl %%ebx,%%eax\n\t"
         "andl $15,%%eax\n\t"
         "movb (%%esi,%%eax),%%cl\n\t"
         "shrl $4, %%ebx\n\t"
         "movb %%cl, 1(%%edi)\n\t"

         "movl %%ebx,%%eax\n\t"
         "andl $15,%%eax\n\t"
         "movb (%%esi,%%eax),%%cl\n\t"
         "shrl $4, %%ebx\n\t"
         "movb %%cl, 2(%%edi)\n\t"

         "movl %%ebx,%%eax\n\t"
         "andl $15,%%eax\n\t"
         "movb (%%esi,%%eax),%%cl\n\t"
         "shrl $4, %%ebx\n\t"
         "movb %%cl, 3(%%edi)\n\t"

         "movl %%ebx,%%eax\n\t"
         "andl $15,%%eax\n\t"
         "movb (%%esi,%%eax),%%cl\n\t"
         "shrl $4, %%ebx\n\t"
         "movb %%cl, 4(%%edi)\n\t"

         "movl %%ebx,%%eax\n\t"
         "andl $15,%%eax\n\t"
         "movb (%%esi,%%eax),%%cl\n\t"
         "shrl $4, %%ebx\n\t"
         "movb %%cl, 5(%%edi)\n\t"

         "movl %%ebx,%%eax\n\t"
         "andl $15,%%eax\n\t"
         "movb (%%esi,%%eax),%%cl\n\t"
         "shrl $4, %%ebx\n\t"
         "movb %%cl, 6(%%edi)\n\t"

         //"movl %%ebx,%%eax\n\t"
         //"andl $15,%%eax\n\t"
         //"movb (%%esi,%%eax),%%cl\n\t"
         //"movb %%cl, 7(%%edi)\n\t"
	 "movb (%%esi, %%ebx),%%cl\n\t"
	 "movb %%cl, 7(%%edi)\n\t"
	 :
	 : "S" (S), "D" (P), "b" (pixdata)
	 : "eax", "cl" );
	 #else
	 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];
	 #endif
	 P+=8;
        }

        #ifdef PPUT_MMC5SP
        vadr=(MMC5HackExNTARAMPtr[xs|(ys<<5)]<<4)+(vofs&7);
	#else
        zz=RefreshAddr&0x1F;
        C=vnapage[(RefreshAddr>>10)&3];
        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);
	 #elif defined(PPUT_MMC5)
	 C=MMC5BGVRAMADR(vadr);
	 #else
         C = VRAMADR(vadr);
	 #endif
	#endif

	#ifdef PPUT_HOOK
	PPU_hook(vadr);	
	#endif

        pshift[0]|=C[0];
        pshift[1]|=C[8];

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

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

