aboutsummaryrefslogtreecommitdiff
path: root/GPU2D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'GPU2D.cpp')
-rw-r--r--GPU2D.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/GPU2D.cpp b/GPU2D.cpp
index de3636e..90064d1 100644
--- a/GPU2D.cpp
+++ b/GPU2D.cpp
@@ -83,6 +83,8 @@ void GPU2D::Reset()
memset(BGRotC, 0, 2*2);
memset(BGRotD, 0, 2*2);
+ MasterBrightness = 0;
+
BGExtPalStatus[0] = 0;
BGExtPalStatus[1] = 0;
BGExtPalStatus[2] = 0;
@@ -170,6 +172,8 @@ void GPU2D::Write16(u32 addr, u16 val)
case 0x032: BGRotB[1] = val; return;
case 0x034: BGRotC[1] = val; return;
case 0x036: BGRotD[1] = val; return;
+
+ case 0x06C: MasterBrightness = val; return;
}
//printf("unknown GPU write16 %08X %04X\n", addr, val);
@@ -265,6 +269,50 @@ void GPU2D::DrawScanline(u32 line)
break;
}
+ // master brightness
+ if ((MasterBrightness >> 14) == 1)
+ {
+ // up
+ u32 factor = MasterBrightness & 0x1F;
+ if (factor > 16) factor = 16;
+
+ for (int i = 0; i < 256; i++)
+ {
+ u32 val = dst[i];
+
+ u32 r = val & 0x00003F;
+ u32 g = val & 0x003F00;
+ u32 b = val & 0x3F0000;
+
+ r += (((0x00003F - r) * factor) >> 4);
+ g += ((((0x003F00 - g) * factor) >> 4) & 0x003F00);
+ b += ((((0x3F0000 - b) * factor) >> 4) & 0x3F0000);
+
+ dst[i] = r | g | b;
+ }
+ }
+ else if ((MasterBrightness >> 14) == 2)
+ {
+ // down
+ u32 factor = MasterBrightness & 0x1F;
+ if (factor > 16) factor = 16;
+
+ for (int i = 0; i < 256; i++)
+ {
+ u32 val = dst[i];
+
+ u32 r = val & 0x00003F;
+ u32 g = val & 0x003F00;
+ u32 b = val & 0x3F0000;
+
+ r -= ((r * factor) >> 4);
+ g -= (((g * factor) >> 4) & 0x003F00);
+ b -= (((b * factor) >> 4) & 0x3F0000);
+
+ dst[i] = r | g | b;
+ }
+ }
+
// convert to 32-bit RGBA
for (int i = 0; i < 256; i++)
dst[i] = ((dst[i] & 0x003F3F3F) << 2) |