Skip to content

Commit 3b8badd

Browse files
png183LukeUsher
authored andcommitted
fc: fix evaluation of sprites not aligned to 4-byte boundaries in OAM
1 parent 5319fe6 commit 3b8badd

File tree

1 file changed

+26
-40
lines changed

1 file changed

+26
-40
lines changed

ares/fc/ppu/sprite.cpp

Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ auto PPU::cycleSpriteEvaluation() -> void {
22
if (io.lx == 0) return;
33

44
if (io.lx <= 64) {
5-
if ((io.lx & 1) == 1)
5+
if ((io.lx & 1) == 1) {
66
sprite.oamData = 0xff;
7-
else
7+
} else {
88
soam[sprite.oamTempCounter++] = sprite.oamData;
9+
}
910
return;
1011
}
1112

@@ -17,60 +18,45 @@ auto PPU::cycleSpriteEvaluation() -> void {
1718

1819
if (sprite.oamMainCounterOverflow) {
1920
++sprite.oamMainCounterIndex;
20-
if (sprite.oamTempCounterOverflow)
21-
sprite.oamData = soam[sprite.oamTempCounter];
21+
if (sprite.oamTempCounterOverflow) sprite.oamData = soam[sprite.oamTempCounter];
2222
return;
2323
}
2424

25-
if (sprite.oamTempCounterTiming == 0) {
26-
s32 ly = io.ly == vlines() - 1 ? -1 : (s32)io.ly;
27-
u32 y = ly - sprite.oamData;
25+
s32 ly = io.ly == vlines() - 1 ? -1 : (s32)io.ly;
26+
u32 y = ly - sprite.oamData;
2827

29-
if (sprite.oamTempCounterOverflow) {
30-
sprite.oamData = soam[sprite.oamTempCounter];
28+
if (sprite.oamTempCounterOverflow) {
29+
sprite.oamData = soam[sprite.oamTempCounter];
30+
} else {
31+
soam[sprite.oamTempCounter] = sprite.oamData;
32+
}
3133

34+
if (sprite.oamTempCounterTiming == 0) {
35+
if (sprite.oamTempCounterOverflow) {
3236
if (y >= io.spriteHeight) {
33-
if (++sprite.oamMainCounterIndex == 0)
34-
sprite.oamMainCounterOverflow = true;
37+
if (++sprite.oamMainCounterIndex == 0) sprite.oamMainCounterOverflow = true;
3538
++sprite.oamMainCounterTiming;
3639
return;
3740
}
3841

3942
sprite.spriteOverflow = 1;
40-
++sprite.oamTempCounter;
41-
++sprite.oamMainCounterTiming;
42-
return;
43-
}
43+
} else {
44+
if (y >= io.spriteHeight) {
45+
sprite.oamMainCounterTiming = 0;
46+
if (++sprite.oamMainCounterIndex == 0) sprite.oamMainCounterOverflow = true;
47+
return;
48+
}
4449

45-
soam[sprite.oamTempCounter] = sprite.oamData;
46-
if (y >= io.spriteHeight) {
47-
if (++sprite.oamMainCounterIndex == 0)
48-
sprite.oamMainCounterOverflow = true;
49-
return;
50+
// first sprite evaluated should be treated as sprite zero
51+
latch.oamId[sprite.oamTempCounterIndex] = (io.lx == 66) ? 0 : 1;
5052
}
51-
52-
latch.oamId[sprite.oamTempCounterIndex] = sprite.oamMainCounterIndex;
5353
++sprite.oamTempCounter;
54-
++sprite.oamMainCounterTiming;
54+
if (++sprite.oamMainCounter == 0) sprite.oamMainCounterOverflow = true;
5555
} else {
56-
if (sprite.oamTempCounterOverflow) {
57-
sprite.oamData = soam[sprite.oamTempCounter];
58-
++sprite.oamTempCounter;
59-
++sprite.oamMainCounterTiming;
60-
return;
61-
}
62-
63-
soam[sprite.oamTempCounter] = sprite.oamData;
6456
++sprite.oamTempCounter;
65-
++sprite.oamMainCounterTiming;
66-
67-
if (sprite.oamTempCounterTiming == 0) {
68-
if (++sprite.oamMainCounterIndex == 0)
69-
sprite.oamMainCounterOverflow = true;
70-
71-
if (sprite.oamTempCounter == 0)
72-
sprite.oamTempCounterOverflow = true;
73-
}
57+
if (++sprite.oamMainCounter == 0) sprite.oamMainCounterOverflow = true;
58+
if (sprite.oamTempCounter == 0) sprite.oamTempCounterOverflow = true;
59+
if (sprite.oamTempCounterTiming == 0 && y >= io.spriteHeight) sprite.oamMainCounterTiming = 0;
7460
}
7561
return;
7662
}

0 commit comments

Comments
 (0)