support mmc5 in newppu
This commit is contained in:
parent
1135f414f7
commit
ddd786eadf
|
@ -80,6 +80,18 @@ typedef struct __cartdata {
|
|||
uint8 size;
|
||||
} cartdata;
|
||||
|
||||
#define Sprite16 (PPU[0]&0x20) //Sprites 8x16/8x8
|
||||
//#define MMC5SPRVRAMADR(V) &MMC5SPRVPage[(V)>>10][(V)]
|
||||
static inline uint8 * MMC5BGVRAMADR(uint32 A)
|
||||
{
|
||||
if(!Sprite16) {
|
||||
if(mmc5ABMode==0)
|
||||
return &MMC5SPRVPage[(A)>>10][(A)];
|
||||
else
|
||||
return &MMC5BGVPage[(A)>>10][(A)];
|
||||
} else return &MMC5BGVPage[(A)>>10][(A)];
|
||||
}
|
||||
|
||||
static void mmc5_PPUWrite(uint32 A, uint8 V) {
|
||||
uint32 tmp = A;
|
||||
extern uint8 PALRAM[0x20];
|
||||
|
@ -104,15 +116,15 @@ static void mmc5_PPUWrite(uint32 A, uint8 V) {
|
|||
}
|
||||
|
||||
uint8 mmc5_PPURead(uint32 A) {
|
||||
uint32 tmp = A;
|
||||
|
||||
if(tmp<0x2000)
|
||||
if(A<0x2000)
|
||||
{
|
||||
return VPage[tmp>>10][tmp];
|
||||
if(ppuphase == PPUPHASE_BG)
|
||||
return *MMC5BGVRAMADR(A);
|
||||
else return MMC5SPRVPage[(A)>>10][(A)];
|
||||
}
|
||||
else
|
||||
{
|
||||
return vnapage[(tmp>>10)&0x3][tmp&0x3FF];
|
||||
return vnapage[(A>>10)&0x3][A&0x3FF];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -309,6 +309,8 @@ void ResetGameLoaded(void)
|
|||
GameStateRestore=0;
|
||||
PPU_hook=0;
|
||||
GameHBIRQHook=0;
|
||||
FFCEUX_PPURead = 0;
|
||||
FFCEUX_PPUWrite = 0;
|
||||
if(GameExpSound.Kill)
|
||||
GameExpSound.Kill();
|
||||
memset(&GameExpSound,0,sizeof(GameExpSound));
|
||||
|
|
14
src/ppu.cpp
14
src/ppu.cpp
|
@ -67,6 +67,8 @@ static uint32 ppulut1[256];
|
|||
static uint32 ppulut2[256];
|
||||
static uint32 ppulut3[128];
|
||||
|
||||
PPUPHASE ppuphase;
|
||||
|
||||
|
||||
template<typename T, int BITS>
|
||||
struct BITREVLUT {
|
||||
|
@ -1809,6 +1811,7 @@ int FCEUX_PPU_Loop(int skip) {
|
|||
|
||||
{
|
||||
PPU_status |= 0x80;
|
||||
ppuphase = PPUPHASE_VBL;
|
||||
|
||||
//Not sure if this is correct. According to Matt Conte and my own tests, it is.
|
||||
//Timing is probably off, though.
|
||||
|
@ -1847,11 +1850,16 @@ int FCEUX_PPU_Loop(int skip) {
|
|||
for(int sl=0;sl<241;sl++) {
|
||||
int yp = sl-1;
|
||||
|
||||
ppuphase = PPUPHASE_BG;
|
||||
|
||||
if(sl != 0) {
|
||||
DEBUG(FCEUD_UpdatePPUView(scanline=yp,1));
|
||||
DEBUG(FCEUD_UpdateNTView(scanline=yp,1));
|
||||
}
|
||||
|
||||
if(sl != 0) if(MMC5Hack && PPUON) MMC5_hb(yp);
|
||||
|
||||
|
||||
//twiddle the oam buffers
|
||||
int scanslot = oamslot^1;
|
||||
int renderslot = oamslot;
|
||||
|
@ -1986,6 +1994,8 @@ int FCEUX_PPU_Loop(int skip) {
|
|||
if(PPUON && sl != 0)
|
||||
ppur.install_h_latches();
|
||||
|
||||
ppuphase = PPUPHASE_OBJ;
|
||||
|
||||
//fetch sprite patterns
|
||||
for(int s=0;s<8;s++) {
|
||||
|
||||
|
@ -2044,6 +2054,8 @@ int FCEUX_PPU_Loop(int skip) {
|
|||
}
|
||||
}
|
||||
|
||||
ppuphase = PPUPHASE_BG;
|
||||
|
||||
//fetch BG: two tiles for next line
|
||||
for(int xt=0;xt<2;xt++)
|
||||
bgdata.main[xt].Read();
|
||||
|
@ -2071,6 +2083,8 @@ int FCEUX_PPU_Loop(int skip) {
|
|||
idleSynch ++;
|
||||
if(idleSynch==2) idleSynch = 0;
|
||||
|
||||
if(MMC5Hack && PPUON) MMC5_hb(240);
|
||||
|
||||
//idle for one line
|
||||
runppu(kLineTime);
|
||||
|
||||
|
|
Loading…
Reference in New Issue