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 | |