fceugx/source/fceultra/pputile.inc

119 lines
2.5 KiB
PHP
Raw Normal View History

2016-09-18 05:43:24 +02:00
uint8 *C;
2009-07-17 19:27:04 +02:00
register uint8 cc;
uint32 vadr;
2016-09-18 05:43:24 +02:00
2009-07-17 19:27:04 +02:00
#ifndef PPUT_MMC5SP
2016-09-18 05:43:24 +02:00
register uint8 zz;
2009-07-17 19:27:04 +02:00
#else
2016-09-18 05:43:24 +02:00
uint8 xs, ys;
xs = X1;
ys = ((scanline >> 3) + MMC5HackSPScroll) & 0x1F;
if (ys >= 0x1E) ys -= 0x1E;
2009-07-17 19:27:04 +02:00
#endif
2016-09-18 05:43:24 +02:00
if (X1 >= 2) {
uint8 *S = PALRAM;
2009-07-17 19:27:04 +02:00
uint32 pixdata;
2016-09-18 05:43:24 +02:00
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;
2009-07-17 19:27:04 +02:00
}
#ifdef PPUT_MMC5SP
2016-09-18 05:43:24 +02:00
vadr = (MMC5HackExNTARAMPtr[xs | (ys << 5)] << 4) + (vofs & 7);
2009-07-17 19:27:04 +02:00
#else
2016-09-18 05:43:24 +02:00
zz = RefreshAddr & 0x1F;
C = vnapage[(RefreshAddr >> 10) & 3];
vadr = (C[RefreshAddr & 0x3ff] << 4) + vofs; // Fetch name table byte.
2009-07-17 19:27:04 +02:00
#endif
#ifdef PPUT_HOOK
2016-09-18 05:43:24 +02:00
PPU_hook(0x2000 | (RefreshAddr & 0xfff));
2009-07-17 19:27:04 +02:00
#endif
#ifdef PPUT_MMC5SP
2016-09-18 05:43:24 +02:00
cc = MMC5HackExNTARAMPtr[0x3c0 + (xs >> 2) + ((ys & 0x1C) << 1)];
cc = ((cc >> ((xs & 2) + ((ys & 0x2) << 1))) & 3);
2009-07-17 19:27:04 +02:00
#else
#ifdef PPUT_MMC5CHR1
2016-09-18 05:43:24 +02:00
cc = (MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff] & 0xC0) >> 6;
2009-07-17 19:27:04 +02:00
#else
2016-09-18 05:43:24 +02:00
cc = C[0x3c0 + (zz >> 2) + ((RefreshAddr & 0x380) >> 4)]; // Fetch attribute table byte.
cc = ((cc >> ((zz & 2) + ((RefreshAddr & 0x40) >> 4))) & 3);
2009-07-17 19:27:04 +02:00
#endif
#endif
2016-09-18 05:43:24 +02:00
atlatch >>= 2;
atlatch |= cc << 2;
pshift[0] <<= 8;
pshift[1] <<= 8;
2009-07-17 19:27:04 +02:00
#ifdef PPUT_MMC5SP
2016-09-18 05:43:24 +02:00
C = MMC5HackVROMPTR + vadr;
2009-07-17 19:27:04 +02:00
C += ((MMC5HackSPPage & 0x3f & MMC5HackVROMMask) << 12);
#else
#ifdef PPUT_MMC5CHR1
C = MMC5HackVROMPTR;
2016-09-18 05:43:24 +02:00
C += (((MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff]) & 0x3f & MMC5HackVROMMask) << 12) + (vadr & 0xfff);
C += (MMC50x5130 & 0x3) << 18; //11-jun-2009 for kuja_killer
2009-07-17 19:27:04 +02:00
#elif defined(PPUT_MMC5)
2016-09-18 05:43:24 +02:00
C = MMC5BGVRAMADR(vadr);
2009-07-17 19:27:04 +02:00
#else
C = VRAMADR(vadr);
#endif
#endif
#ifdef PPUT_HOOK
PPU_hook(vadr);
#endif
2016-09-18 05:43:24 +02:00
#ifdef PPU_BGFETCH
if (RefreshAddr & 1) {
if(ScreenON)
RENDER_LOG(vadr + 8);
pshift[0] |= C[8];
pshift[1] |= C[8];
} else {
if(ScreenON)
RENDER_LOG(vadr);
pshift[0] |= C[0];
pshift[1] |= C[0];
}
#else
if(ScreenON)
RENDER_LOG(vadr);
pshift[0] |= C[0];
if(ScreenON)
RENDER_LOG(vadr + 8);
pshift[1] |= C[8];
#endif
2009-07-17 19:27:04 +02:00
2016-09-18 05:43:24 +02:00
if ((RefreshAddr & 0x1f) == 0x1f)
RefreshAddr ^= 0x41F;
2009-07-17 19:27:04 +02:00
else
RefreshAddr++;
#ifdef PPUT_HOOK
2016-09-18 05:43:24 +02:00
PPU_hook(0x2000 | (RefreshAddr & 0xfff));
2009-07-17 19:27:04 +02:00
#endif