@@ -6,7 +6,14 @@ auto PPU::Objects::setEnable(n1 status) -> void {
66auto PPU::Objects::scanline (u32 y) -> void {
77 if (y >= 160 ) return ;
88
9- mosaicOffset = 0 ;
9+ hmosaicOffset = io.mosaicWidth ;
10+ if (y == 0 || vmosaicOffset == io.mosaicHeight ) {
11+ vmosaicOffset = 0 ;
12+ mosaicY = y;
13+ } else {
14+ vmosaicOffset++;
15+ }
16+
1017 auto & buffer = lineBuffers[y & 1 ];
1118 for (auto & pixel : buffer) pixel = {};
1219 if (ppu.io .forceBlank [1 ] || cpu.stopped () || !io.enable [1 ]) return ; // checks if display conditions will be met next scanline
@@ -16,8 +23,7 @@ auto PPU::Objects::scanline(u32 y) -> void {
1623 if (object.affine == 0 && object.affineSize == 1 ) continue ; // hidden
1724 if (py >= object.height << object.affineSize ) continue ; // offscreen
1825
19- if (object.mosaic && io.mosaicHeight ) {
20- s32 mosaicY = (y / (1 + io.mosaicHeight )) * (1 + io.mosaicHeight );
26+ if (object.mosaic ) {
2127 py = object.y >= 160 || mosaicY - object.y >= 0 ? u32 (mosaicY - object.y ) : 0 ;
2228 }
2329
@@ -97,15 +103,17 @@ auto PPU::Objects::outputPixel(u32 x, u32 y) -> void {
97103
98104 auto & buffer = lineBuffers[y & 1 ];
99105 output = buffer[x];
100-
101- // horizontal mosaic
102- if (!mosaicOffset) {
103- mosaicOffset = 1 + io.mosaicWidth ;
106+
107+ if (hmosaicOffset == io.mosaicWidth ) {
108+ hmosaicOffset = 0 ;
104109 mosaic = output;
105- } else if (!mosaic.mosaic || !output.mosaic || (output.priority < mosaic.priority )) {
110+ } else {
111+ hmosaicOffset++;
112+ }
113+
114+ if (!mosaic.mosaic || !output.mosaic || (output.priority < mosaic.priority )) {
106115 mosaic = output;
107116 }
108- mosaicOffset--;
109117}
110118
111119auto PPU::Objects::power () -> void {
@@ -115,5 +123,7 @@ auto PPU::Objects::power() -> void {
115123 }
116124 output = {};
117125 mosaic = {};
118- mosaicOffset = 0 ;
126+ mosaicY = 0 ;
127+ hmosaicOffset = 0 ;
128+ vmosaicOffset = 0 ;
119129}
0 commit comments