| 1 | uint8 *C; |
| 2 | register uint8 cc; |
| 3 | uint32 vadr; |
| 4 | |
| 5 | #ifndef PPUT_MMC5SP |
| 6 | register uint8 zz; |
| 7 | #else |
| 8 | uint8 xs,ys; |
| 9 | xs=X1; |
| 10 | ys=((scanline>>3)+MMC5HackSPScroll)&0x1F; |
| 11 | if(ys>=0x1E) ys-=0x1E; |
| 12 | #endif |
| 13 | |
| 14 | if(X1>=2) |
| 15 | { |
| 16 | uint8 *S=PALRAM; |
| 17 | uint32 pixdata; |
| 18 | |
| 19 | pixdata=ppulut1[(pshift[0]>>(8-XOffset))&0xFF]|ppulut2[(pshift[1]>>(8-XOffset))&0xFF]; |
| 20 | |
| 21 | pixdata|=ppulut3[XOffset|(atlatch<<3)]; |
| 22 | //printf("%02x ",ppulut3[XOffset|(atlatch<<3)]); |
| 23 | |
| 24 | #ifdef C80x86 |
| 25 | asm volatile( |
| 26 | "movl %%ebx,%%eax\n\t" |
| 27 | "andl $15,%%eax\n\t" |
| 28 | "movb (%%esi,%%eax),%%cl\n\t" |
| 29 | "shrl $4, %%ebx\n\t" |
| 30 | "movb %%cl, (%%edi)\n\t" |
| 31 | |
| 32 | "movl %%ebx,%%eax\n\t" |
| 33 | "andl $15,%%eax\n\t" |
| 34 | "movb (%%esi,%%eax),%%cl\n\t" |
| 35 | "shrl $4, %%ebx\n\t" |
| 36 | "movb %%cl, 1(%%edi)\n\t" |
| 37 | |
| 38 | "movl %%ebx,%%eax\n\t" |
| 39 | "andl $15,%%eax\n\t" |
| 40 | "movb (%%esi,%%eax),%%cl\n\t" |
| 41 | "shrl $4, %%ebx\n\t" |
| 42 | "movb %%cl, 2(%%edi)\n\t" |
| 43 | |
| 44 | "movl %%ebx,%%eax\n\t" |
| 45 | "andl $15,%%eax\n\t" |
| 46 | "movb (%%esi,%%eax),%%cl\n\t" |
| 47 | "shrl $4, %%ebx\n\t" |
| 48 | "movb %%cl, 3(%%edi)\n\t" |
| 49 | |
| 50 | "movl %%ebx,%%eax\n\t" |
| 51 | "andl $15,%%eax\n\t" |
| 52 | "movb (%%esi,%%eax),%%cl\n\t" |
| 53 | "shrl $4, %%ebx\n\t" |
| 54 | "movb %%cl, 4(%%edi)\n\t" |
| 55 | |
| 56 | "movl %%ebx,%%eax\n\t" |
| 57 | "andl $15,%%eax\n\t" |
| 58 | "movb (%%esi,%%eax),%%cl\n\t" |
| 59 | "shrl $4, %%ebx\n\t" |
| 60 | "movb %%cl, 5(%%edi)\n\t" |
| 61 | |
| 62 | "movl %%ebx,%%eax\n\t" |
| 63 | "andl $15,%%eax\n\t" |
| 64 | "movb (%%esi,%%eax),%%cl\n\t" |
| 65 | "shrl $4, %%ebx\n\t" |
| 66 | "movb %%cl, 6(%%edi)\n\t" |
| 67 | |
| 68 | //"movl %%ebx,%%eax\n\t" |
| 69 | //"andl $15,%%eax\n\t" |
| 70 | //"movb (%%esi,%%eax),%%cl\n\t" |
| 71 | //"movb %%cl, 7(%%edi)\n\t" |
| 72 | "movb (%%esi, %%ebx),%%cl\n\t" |
| 73 | "movb %%cl, 7(%%edi)\n\t" |
| 74 | : |
| 75 | : "S" (S), "D" (P), "b" (pixdata) |
| 76 | : "eax", "cl" ); |
| 77 | #else |
| 78 | P[0]=S[pixdata&0xF]; |
| 79 | pixdata>>=4; |
| 80 | P[1]=S[pixdata&0xF]; |
| 81 | pixdata>>=4; |
| 82 | P[2]=S[pixdata&0xF]; |
| 83 | pixdata>>=4; |
| 84 | P[3]=S[pixdata&0xF]; |
| 85 | pixdata>>=4; |
| 86 | P[4]=S[pixdata&0xF]; |
| 87 | pixdata>>=4; |
| 88 | P[5]=S[pixdata&0xF]; |
| 89 | pixdata>>=4; |
| 90 | P[6]=S[pixdata&0xF]; |
| 91 | pixdata>>=4; |
| 92 | P[7]=S[pixdata&0xF]; |
| 93 | #endif |
| 94 | P+=8; |
| 95 | } |
| 96 | |
| 97 | #ifdef PPUT_MMC5SP |
| 98 | vadr=(MMC5HackExNTARAMPtr[xs|(ys<<5)]<<4)+(vofs&7); |
| 99 | #else |
| 100 | zz=RefreshAddr&0x1F; |
| 101 | C=vnapage[(RefreshAddr>>10)&3]; |
| 102 | vadr=(C[RefreshAddr&0x3ff]<<4)+vofs; /* Fetch name table byte. */ |
| 103 | #endif |
| 104 | |
| 105 | #ifdef PPUT_HOOK |
| 106 | PPU_hook(0x2000|(RefreshAddr&0xfff)); |
| 107 | #endif |
| 108 | |
| 109 | #ifdef PPUT_MMC5SP |
| 110 | cc=MMC5HackExNTARAMPtr[0x3c0+(xs>>2)+((ys&0x1C)<<1)]; |
| 111 | cc=((cc >> ((xs&2) + ((ys&0x2)<<1))) &3); |
| 112 | #else |
| 113 | #ifdef PPUT_MMC5CHR1 |
| 114 | cc=(MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff] & 0xC0)>>6; |
| 115 | #else |
| 116 | cc=C[0x3c0+(zz>>2)+((RefreshAddr&0x380)>>4)]; /* Fetch attribute table byte. */ |
| 117 | cc=((cc >> ((zz&2) + ((RefreshAddr&0x40)>>4))) &3); |
| 118 | #endif |
| 119 | #endif |
| 120 | |
| 121 | atlatch>>=2; |
| 122 | atlatch|=cc<<2; |
| 123 | |
| 124 | pshift[0]<<=8; |
| 125 | pshift[1]<<=8; |
| 126 | |
| 127 | #ifdef PPUT_MMC5SP |
| 128 | C = MMC5HackVROMPTR+vadr; |
| 129 | C += ((MMC5HackSPPage & 0x3f & MMC5HackVROMMask) << 12); |
| 130 | #else |
| 131 | #ifdef PPUT_MMC5CHR1 |
| 132 | C = MMC5HackVROMPTR; |
| 133 | C += (((MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff]) & 0x3f & |
| 134 | MMC5HackVROMMask) << 12) + (vadr & 0xfff); |
| 135 | #elif defined(PPUT_MMC5) |
| 136 | C=MMC5BGVRAMADR(vadr); |
| 137 | #else |
| 138 | C = VRAMADR(vadr); |
| 139 | #endif |
| 140 | #endif |
| 141 | |
| 142 | #ifdef PPUT_HOOK |
| 143 | PPU_hook(vadr); |
| 144 | #endif |
| 145 | |
| 146 | pshift[0]|=C[0]; |
| 147 | pshift[1]|=C[8]; |
| 148 | |
| 149 | if((RefreshAddr&0x1f)==0x1f) |
| 150 | RefreshAddr^=0x41F; |
| 151 | else |
| 152 | RefreshAddr++; |
| 153 | |
| 154 | #ifdef PPUT_HOOK |
| 155 | PPU_hook(0x2000|(RefreshAddr&0xfff)); |
| 156 | #endif |
| 157 | |