merge mappers from FCEU-mm
[fceu.git] / pputile098.h
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