crudely fix mmc5 split screen for SDF
This commit is contained in:
parent
984d9b0035
commit
1c39740f3d
|
@ -137,11 +137,35 @@ static void mmc5_PPUWrite(uint32 A, uint8 V) {
|
||||||
}
|
}
|
||||||
|
|
||||||
extern uint32 NTRefreshAddr;
|
extern uint32 NTRefreshAddr;
|
||||||
uint8 FASTCALL mmc5_PPURead(uint32 A) {
|
uint8 FASTCALL mmc5_PPURead(uint32 A)
|
||||||
|
{
|
||||||
|
bool split = false;
|
||||||
|
if(newppu)
|
||||||
|
{
|
||||||
|
if((MMC5HackSPMode&0x80) && !(MMC5HackCHRMode&2))
|
||||||
|
{
|
||||||
|
int target = MMC5HackSPMode&0x1f;
|
||||||
|
int side = MMC5HackSPMode&0x40;
|
||||||
|
int ht = NTRefreshAddr&31;
|
||||||
|
|
||||||
|
if(side==0)
|
||||||
|
{
|
||||||
|
if(ht<target) split = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(ht>=target) split = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (A < 0x2000)
|
if (A < 0x2000)
|
||||||
{
|
{
|
||||||
if (ppuphase == PPUPHASE_BG )
|
if (ppuphase == PPUPHASE_BG )
|
||||||
{
|
{
|
||||||
|
if(split)
|
||||||
|
return MMC5HackVROMPTR[MMC5HackSPPage*0x1000 + (A&0xFFF)];
|
||||||
|
|
||||||
//uhhh call through to this more sophisticated function, only if it's really needed?
|
//uhhh call through to this more sophisticated function, only if it's really needed?
|
||||||
//we should probably reuse it completely, if we can
|
//we should probably reuse it completely, if we can
|
||||||
if (MMC5HackCHRMode == 1) {
|
if (MMC5HackCHRMode == 1) {
|
||||||
|
@ -153,10 +177,32 @@ uint8 FASTCALL mmc5_PPURead(uint32 A) {
|
||||||
if(PPU[1] & 0x10)
|
if(PPU[1] & 0x10)
|
||||||
return *MMC5BGVRAMADR(A);
|
return *MMC5BGVRAMADR(A);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MMC5SPRVPage[(A) >> 10][(A)];
|
return MMC5SPRVPage[(A) >> 10][(A)];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if(split)
|
||||||
|
{
|
||||||
|
static const int kHack = -1; //dunno if theres science to this or if it just fixes SDF (cant be bothered to think about it)
|
||||||
|
int linetile = (newppu_get_scanline()+kHack)/8 + MMC5HackSPScroll;
|
||||||
|
|
||||||
|
//REF NT: return 0x2000 | (v << 0xB) | (h << 0xA) | (vt << 5) | ht;
|
||||||
|
//REF AT: return 0x2000 | (v << 0xB) | (h << 0xA) | 0x3C0 | ((vt & 0x1C) << 1) | ((ht & 0x1C) >> 2);
|
||||||
|
|
||||||
|
if((A&0x3FF)>=0x3C0)
|
||||||
|
{
|
||||||
|
A &= ~(0x1C<<1); //mask off VT
|
||||||
|
A |= (linetile&0x1C)<<1; //mask on adjusted VT
|
||||||
|
return ExRAM[A & 0x3FF];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
A &= ~((0x1F<<5) | (1<<0xB)); //mask off VT and V
|
||||||
|
A |= (linetile&31)<<5; //mask on adjusted VT (V doesnt make any sense, I think)
|
||||||
|
return ExRAM[A & 0x3FF];
|
||||||
|
}
|
||||||
|
}
|
||||||
return vnapage[(A >> 10) & 0x3][A & 0x3FF];
|
return vnapage[(A >> 10) & 0x3][A & 0x3FF];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue