#define Pal (PALRAM)
-static void FASTAPASS(1) RefreshLine(uint8 *target);
+static void (*RefreshLine)(uint8 *P, uint32 vofs) = NULL;
static void PRefreshLine(void);
static void ResetPPU(void);
int scanline;
static uint32 scanlines_per_frame;
+uint8 GameMemBlock[131072] __attribute__ ((aligned (4)));
+uint8 NTARAM[0x800] __attribute__ ((aligned (4)));
+uint8 PALRAM[0x20] __attribute__ ((aligned (4)));
+uint8 RAM[0x800] __attribute__ ((aligned (4)));
+
uint8 PPU[4];
uint8 PPUSPL;
-uint8 GameMemBlock[131072];
-uint8 NTARAM[0x800],PALRAM[0x20];
-uint8 RAM[0x800];
-
uint8 PAL=0;
void BGRender(uint8 *target)
{
- uint32 tem;
- RefreshLine(target);
+ uint32 tem, vofs;
+ vofs=((PPU[0]&0x10)<<8) | ((RefreshAddr>>12)&7);
+
+ Pal[0]|=64;
+ Pal[4]|=64;
+ Pal[8]|=64;
+ Pal[0xC]|=64;
+ RefreshLine(target-XOffset, vofs);
+ Pal[0]&=63;
+ Pal[4]&=63;
+ Pal[8]&=63;
+ Pal[0xC]&=63;
+
if(!(PPU[1]&2))
{
- tem=Pal[0]|(Pal[0]<<8)|(Pal[0]<<16)|(Pal[0]<<24);
- tem|=0x40404040;
+ tem=Pal[0]|0x40;
+ tem|=tem<<8;
+ tem|=tem<<16;
*(uint32 *)target=*(uint32 *)(target+4)=tem;
}
}
{
uint32 tem;
int x;
- uint8 *target=XBuf+(scanline<<8)+(scanline<<4)+8;
+ uint8 *target=XBuf+scanline*320+32;
if(ScreenON || SpriteON)
{
if(PPU[1]&0x01)
{
for(x=63;x>=0;x--)
- *(uint32 *)&target[x<<2]=(*(uint32*)&target[x<<2])&0xF0F0F0F0;
+ ((uint32 *)target)[x]=((uint32*)target)[x]&0xF0F0F0F0;
}
if((PPU[1]>>5)==0x7)
for(x=63;x>=0;x--)
- *(uint32 *)&target[x<<2]=((*(uint32*)&target[x<<2])&0x3f3f3f3f)|0x40404040;
+ ((uint32 *)target)[x]=(((uint32*)target)[x]&0x3f3f3f3f)|0x40404040;
else if(PPU[1]&0xE0)
for(x=63;x>=0;x--)
- *(uint32 *)&target[x<<2]=(*(uint32*)&target[x<<2])|0xC0C0C0C0;
+ ((uint32 *)target)[x]=((uint32*)target)[x]|0xC0C0C0C0;
else
for(x=63;x>=0;x--)
- *(uint32 *)&target[x<<2]=(*(uint32*)&target[x<<2])&0x3f3f3f3f;
-
+ ((uint32 *)target)[x]=((uint32*)target)[x]&0x3f3f3f3f;
+ FCEU_dwmemset(target- 8,0x3f3f3f3f,8);
+ FCEU_dwmemset(target+256,0x3f3f3f3f,8);
#ifdef FRAMESKIP
}
#endif
}
}
-/* Total of 33 tiles(32 + 1 extra) */
-static void FASTAPASS(1) RefreshLine(uint8 *target)
+/* This high-level graphics MMC5 emulation code was written
+ for MMC5 carts in "CL" mode. It's probably not totally
+ correct for carts in "SL" mode.
+ */
+static void RefreshLine_MMC5Hack1(uint8 *P, uint32 vofs)
{
- uint32 vofs;
- int X1;
- uint8 *P=target;
-
- vofs=0;
-
- Pal[0]|=64;
- Pal[4]|=64;
- Pal[8]|=64;
- Pal[0xC]|=64;
-
- vofs=((PPU[0]&0x10)<<8) | ((RefreshAddr>>12)&7);
- P-=XOffset;
-
- /* This high-level graphics MMC5 emulation code was written
- for MMC5 carts in "CL" mode. It's probably not totally
- correct for carts in "SL" mode.
- */
- if(MMC5Hack && geniestage!=1)
- {
- if(MMC5HackCHRMode==0 && (MMC5HackSPMode&0x80))
- {
- int8 tochange;
+ int8 tochange, X1;
tochange=MMC5HackSPMode&0x1F;
RefreshAddr++;
tochange--;
}
- }
- else if(MMC5HackCHRMode==1 && (MMC5HackSPMode&0x80))
- {
- int8 tochange;
+}
+
+static void RefreshLine_MMC5Hack2(uint8 *P, uint32 vofs)
+{
+ int8 tochange, X1;
tochange=MMC5HackSPMode&0x1F;
RefreshAddr++;
tochange--;
}
- }
+}
+
+static void RefreshLine_MMC5Hack3(uint8 *P, uint32 vofs)
+{
+ int8 X1;
- else if(MMC5HackCHRMode==1)
- {
for(X1=33;X1;X1--,P+=8)
{
uint8 *C;
else
RefreshAddr++;
}
- }
- else
- {
+}
+
+static void RefreshLine_MMC5Hack4(uint8 *P, uint32 vofs)
+{
+ int8 X1;
+
for(X1=33;X1;X1--,P+=8)
{
uint8 *C;
else
RefreshAddr++;
}
- }
- } // End if(MMC5Hack)
+}
+
+static void RefreshLine_PPU_hook(uint8 *P, uint32 vofs)
+{
+ int8 X1;
- else if(PPU_hook)
- {
for(X1=33;X1;X1--,P+=8)
{
uint8 *C;
else
RefreshAddr++;
}
- }
- else
- {
- for(X1=33;X1;X1--,P+=8)
+}
+
+static void RefreshLine_normal(uint8 *P, uint32 vofs) // vofs is 0x107 max
+{
+ int8 X1;
+ uint32 rfraddr = RefreshAddr;
+ uint8 *page = vnapage[(rfraddr>>10)&3];
+ uint32 cc2=0;
+
+ if ((rfraddr&0xc)!=0)
+ cc2=*(uint32 *) (page + ((rfraddr&0x380)>>4) + ((rfraddr&0x10)>>2) + 0x3c0);
+
+ for (X1=33;X1;X1--,P+=8)
{
- uint8 *C;
- uint8 cc,zz,zz2;
+ uint8 cc,*C;
uint32 vadr;
- zz=RefreshAddr&0x1F;
- zz2=(RefreshAddr>>10)&3;
- vadr=(vnapage[zz2][RefreshAddr&0x3ff]<<4)+vofs;
+ vadr=(page[rfraddr&0x3ff]<<4)+vofs;
C = VRAMADR(vadr);
- cc=vnapage[zz2][0x3c0+(zz>>2)+((RefreshAddr&0x380)>>4)];
- cc=((cc >> ((zz&2) + ((RefreshAddr&0x40)>>4))) &3) <<2;
- #include "fceline.h"
+ if ((rfraddr&0xc)==0)
+ cc2=*(uint32 *) (page + ((rfraddr&0x380)>>4) + ((rfraddr&0x10)>>2) + 0x3c0);
+ cc=((cc2 >> ((rfraddr&2) + ((rfraddr&0x40)>>4) + ((rfraddr&0xc)<<1))) & 3) << 2;
- if((RefreshAddr&0x1f)==0x1f)
- RefreshAddr^=0x41F;
- else
- RefreshAddr++;
- }
- }
+ #include "fceline.h"
- #undef vofs
+ if((rfraddr&0x1f)==0x1f) {
+ rfraddr^=0x41F;
+ page = vnapage[(rfraddr>>10)&3];
+ } else
+ rfraddr++;
+ }
+ RefreshAddr = rfraddr;
+}
- Pal[0]&=63;
- Pal[4]&=63;
- Pal[8]&=63;
- Pal[0xC]&=63;
+static void SetRefreshLine(void)
+{
+ if(MMC5Hack && geniestage!=1)
+ {
+ if(MMC5HackCHRMode==0 && (MMC5HackSPMode&0x80))
+ {
+ if (RefreshLine != RefreshLine_MMC5Hack1) printf("set refr RefreshLine_MMC5Hack1\n");
+ RefreshLine = RefreshLine_MMC5Hack1;
+ }
+ else if(MMC5HackCHRMode==1 && (MMC5HackSPMode&0x80))
+ {
+ if (RefreshLine != RefreshLine_MMC5Hack2) printf("set refr RefreshLine_MMC5Hack2\n");
+ RefreshLine = RefreshLine_MMC5Hack2;
+ }
+ else if(MMC5HackCHRMode==1)
+ {
+ if (RefreshLine != RefreshLine_MMC5Hack3) printf("set refr RefreshLine_MMC5Hack3\n");
+ RefreshLine = RefreshLine_MMC5Hack3;
+ }
+ else
+ {
+ if (RefreshLine != RefreshLine_MMC5Hack4) printf("set refr RefreshLine_MMC5Hack4\n");
+ RefreshLine = RefreshLine_MMC5Hack4;
+ }
+ } // End if(MMC5Hack)
+ else if(PPU_hook)
+ {
+ if (RefreshLine != RefreshLine_PPU_hook) printf("set refr RefreshLine_PPU_hook\n");
+ RefreshLine = RefreshLine_PPU_hook;
+ }
+ else
+ {
+ if (RefreshLine != RefreshLine_normal) printf("set refr RefreshLine_normal\n");
+ RefreshLine = RefreshLine_normal;
+ }
}
-static INLINE void Fixit2(void)
+//static INLINE
+void Fixit2(void)
{
if(ScreenON || SpriteON)
{
}
}
-static INLINE void Fixit1(void)
+//static INLINE
+void Fixit1(void)
{
if(ScreenON || SpriteON)
{
}
}
+//#define NEW_TRY
+
/* This is called at the beginning of all h-blanks on visible lines. */
+#ifndef NEW_TRY
static void DoHBlank(void)
{
if(ScreenON || SpriteON)
//PPU_hook(0,-1);
//fprintf(stderr,"%3d: $%04x\n",scanline,RefreshAddr);
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+#endif
// ============================//
static INLINE void Thingo(void)
{
Loop6502();
+#ifndef NEW_TRY
if(tosprite>=256)
{
tosprite=256;
}
DoHBlank();
+#else
+ X6502_Run_scanline();
+#endif
}
#undef harko
{
for(;;)
{
+ //extern int asdc;
+ //printf("asdc: %i\n", asdc);
+ //asdc=0;
ApplyPeriodicCheats();
X6502_Run(256+85);
if(PPU_hook) PPU_hook(RefreshAddr&0x3fff);
}
if(FCEUGameInfo.type==GIT_NSF)
+ {
X6502_Run((256+85)*240);
+ }
else
{
int x,max,maxref;
deemp=PPU[1]>>5;
+ SetRefreshLine();
for(scanline=0;scanline<240;scanline++)
{
deempcnt[deemp]++;