Skip to content

Commit c159359

Browse files
committed
gba: improve handling of OBJ mosaic counters
1 parent 6e805e5 commit c159359

File tree

4 files changed

+29
-15
lines changed

4 files changed

+29
-15
lines changed

ares/gba/ppu/object.cpp

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@ auto PPU::Objects::setEnable(n1 status) -> void {
66
auto 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

111119
auto 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
}

ares/gba/ppu/ppu.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,16 @@ struct PPU : Thread, IO {
202202

203203
n1 hblank; //1 = allow access to OAM during Hblank
204204
n1 mapping; //0 = two-dimensional, 1 = one-dimensional
205-
n5 mosaicWidth;
206-
n5 mosaicHeight;
205+
n4 mosaicWidth;
206+
n4 mosaicHeight;
207207
} io;
208208

209209
Pixel lineBuffers[2][240];
210210
Pixel output;
211211
Pixel mosaic;
212-
u32 mosaicOffset;
212+
s32 mosaicY;
213+
n4 hmosaicOffset;
214+
n4 vmosaicOffset;
213215
} objects;
214216

215217
struct Window {

ares/gba/ppu/serialization.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ auto PPU::Objects::serialize(serializer& s) -> void {
6666
s(io.mosaicWidth);
6767
s(io.mosaicHeight);
6868

69-
s(mosaicOffset);
69+
s(mosaicY);
70+
s(hmosaicOffset);
71+
s(vmosaicOffset);
7072
}
7173

7274
auto PPU::Window::serialize(serializer& s) -> void {

ares/gba/system/serialization.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
static const string SerializerVersion = "v147";
1+
static const string SerializerVersion = "v148";
22

33
auto System::serialize(bool synchronize) -> serializer {
44
if(synchronize) scheduler.enter(Scheduler::Mode::Synchronize);

0 commit comments

Comments
 (0)