Proper write-twice behavior for $2122.

This commit is contained in:
Brandon Wright 2018-08-20 12:53:20 -05:00
parent aafb691fe7
commit 1ca15b4a4f
3 changed files with 7 additions and 14 deletions

18
ppu.h
View File

@ -294,6 +294,7 @@ struct SPPU
bool8 CGFLIP; bool8 CGFLIP;
uint8 CGFLIPRead; uint8 CGFLIPRead;
uint8 CGADD; uint8 CGADD;
uint8 CGSavedByte;
uint16 CGDATA[256]; uint16 CGDATA[256];
struct SOBJ OBJ[128]; struct SOBJ OBJ[128];
@ -719,12 +720,12 @@ static inline void REGISTER_2122 (uint8 Byte)
{ {
if (PPU.CGFLIP) if (PPU.CGFLIP)
{ {
if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8) || PPU.CGSavedByte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff))
{ {
FLUSH_REDRAW(); FLUSH_REDRAW();
PPU.CGDATA[PPU.CGADD] &= 0x00ff; PPU.CGDATA[PPU.CGADD] = (Byte & 0x7f) << 8 | PPU.CGSavedByte;
PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8;
IPPU.ColorsChanged = TRUE; IPPU.ColorsChanged = TRUE;
IPPU.Red[PPU.CGADD] = IPPU.XB[PPU.CGSavedByte & 0x1f];
IPPU.Blue[PPU.CGADD] = IPPU.XB[(Byte >> 2) & 0x1f]; IPPU.Blue[PPU.CGADD] = IPPU.XB[(Byte >> 2) & 0x1f];
IPPU.Green[PPU.CGADD] = IPPU.XB[(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; IPPU.Green[PPU.CGADD] = IPPU.XB[(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f];
IPPU.ScreenColors[PPU.CGADD] = (uint16) BUILD_PIXEL(IPPU.Red[PPU.CGADD], IPPU.Green[PPU.CGADD], IPPU.Blue[PPU.CGADD]); IPPU.ScreenColors[PPU.CGADD] = (uint16) BUILD_PIXEL(IPPU.Red[PPU.CGADD], IPPU.Green[PPU.CGADD], IPPU.Blue[PPU.CGADD]);
@ -734,16 +735,7 @@ static inline void REGISTER_2122 (uint8 Byte)
} }
else else
{ {
if (Byte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff)) PPU.CGSavedByte = Byte;
{
FLUSH_REDRAW();
PPU.CGDATA[PPU.CGADD] &= 0x7f00;
PPU.CGDATA[PPU.CGADD] |= Byte;
IPPU.ColorsChanged = TRUE;
IPPU.Red[PPU.CGADD] = IPPU.XB[Byte & 0x1f];
IPPU.Green[PPU.CGADD] = IPPU.XB[(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f];
IPPU.ScreenColors[PPU.CGADD] = (uint16) BUILD_PIXEL(IPPU.Red[PPU.CGADD], IPPU.Green[PPU.CGADD], IPPU.Blue[PPU.CGADD]);
}
} }
PPU.CGFLIP ^= 1; PPU.CGFLIP ^= 1;

View File

@ -433,6 +433,7 @@ static FreezeData SnapPPU[] =
INT_ENTRY(6, CGFLIP), INT_ENTRY(6, CGFLIP),
INT_ENTRY(6, CGFLIPRead), INT_ENTRY(6, CGFLIPRead),
INT_ENTRY(6, CGADD), INT_ENTRY(6, CGADD),
INT_ENTRY(11, CGSavedByte),
ARRAY_ENTRY(6, CGDATA, 256, uint16_ARRAY_V), ARRAY_ENTRY(6, CGDATA, 256, uint16_ARRAY_V),
#define O(N) \ #define O(N) \
INT_ENTRY(6, OBJ[N].HPos), \ INT_ENTRY(6, OBJ[N].HPos), \

View File

@ -198,7 +198,7 @@
#define SNAPSHOT_MAGIC "#!s9xsnp" #define SNAPSHOT_MAGIC "#!s9xsnp"
#define SNAPSHOT_VERSION_IRQ 7 #define SNAPSHOT_VERSION_IRQ 7
#define SNAPSHOT_VERSION_BAPU 8 #define SNAPSHOT_VERSION_BAPU 8
#define SNAPSHOT_VERSION 10 #define SNAPSHOT_VERSION 11
#define SUCCESS 1 #define SUCCESS 1
#define WRONG_FORMAT (-1) #define WRONG_FORMAT (-1)