@@ -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