158 lines
3.9 KiB
C
158 lines
3.9 KiB
C
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
|
|
|