use picofe menu, move generic code out of gp2x/
[fceu.git] / pputile098.h
CommitLineData
6244011f 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