098 renderer added
[fceu.git] / pputile098.h
diff --git a/pputile098.h b/pputile098.h
new file mode 100644 (file)
index 0000000..6da930c
--- /dev/null
@@ -0,0 +1,157 @@
+        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
+