-
Notifications
You must be signed in to change notification settings - Fork 10
/
pputile.inc
142 lines (124 loc) · 3.05 KB
/
pputile.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
uint8 *C;
uint8 cc;
uint32 vadr;
#ifdef PPU_VRC5FETCH
uint8 tmpd;
#endif
#ifndef PPUT_MMC5SP
FCEU_MAYBE_UNUSED 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)];
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];
P += 8;
}
#ifdef PPUT_MMC5SP
vadr = (MMC5HackExNTARAMPtr[xs | (ys << 5)] << 4) + (vofs & 7);
#else
zz = RefreshAddr & 0x1F;
C = vnapage[(RefreshAddr >> 10) & 3];
#ifdef PPU_VRC5FETCH
tmpd = QTAINTRAM[((((RefreshAddr >> 10) & 3) >> ((qtaintramreg >> 1)) & 1) << 10) | (RefreshAddr & 0x3FF)];
vofs = ((tmpd & 0x3F) << 12) | ((RefreshAddr >> 12) & 7); // recalculate VROM offset
#endif
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);
C += (MMC50x5130 & 0x3) << 18; //11-jun-2009 for kuja_killer
#elif defined(PPUT_MMC5)
C = MMC5BGVRAMADR(vadr);
#else
#ifdef PPU_VRC5FETCH
if(tmpd & 0x40)
C = CHRptr[0] + vadr;
else
C = VRAMADR(vadr);
#else
C = VRAMADR(vadr);
#endif
#endif
#endif
#ifdef PPUT_HOOK
PPU_hook(vadr);
#endif
#ifdef PPU_BGFETCH
if (RefreshAddr & 1) {
if(ScreenON)
RENDER_LOGP(C + 8);
pshift[0] |= C[8];
pshift[1] |= C[8];
} else {
if(ScreenON)
RENDER_LOGP(C);
pshift[0] |= C[0];
pshift[1] |= C[0];
}
#else
#ifdef PPU_VRC5FETCH
pshift[0] |= C[0];
if(tmpd & 0x40)
pshift[1] |= (tmpd & 0x80) ? 0xFF : 0x00;
else
pshift[1] |= C[8];
#else
if(ScreenON)
RENDER_LOGP(C);
pshift[0] |= C[0];
if(ScreenON)
RENDER_LOGP(C + 8);
pshift[1] |= C[8];
#endif
#endif
if ((RefreshAddr & 0x1f) == 0x1f)
RefreshAddr ^= 0x41F;
else
RefreshAddr++;
#ifdef PPUT_HOOK
PPU_hook(0x2000 | (RefreshAddr & 0xfff));
#endif