From 2e7918d8b2ccc0c92d212a14884df655fbb3abeb Mon Sep 17 00:00:00 2001
From: Vicki Pfau <vi@endrift.com>
Date: Fri, 7 Feb 2025 03:03:09 -0800
Subject: [PATCH] GBA: Update some register information with new stereoscopy
 discoveries

---
 include/mgba/internal/gba/io.h                       | 2 +-
 include/mgba/internal/gba/renderers/video-software.h | 2 +-
 include/mgba/internal/gba/video.h                    | 4 +++-
 src/gba/io.c                                         | 2 +-
 src/gba/renderers/video-software.c                   | 8 ++++----
 src/gba/video.c                                      | 2 +-
 src/platform/qt/IOViewer.cpp                         | 2 +-
 7 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/include/mgba/internal/gba/io.h b/include/mgba/internal/gba/io.h
index 197e19d62..2891c650c 100644
--- a/include/mgba/internal/gba/io.h
+++ b/include/mgba/internal/gba/io.h
@@ -17,7 +17,7 @@ CXX_GUARD_START
 enum GBAIORegisters {
 	// Video
 	GBA_REG_DISPCNT = 0x000,
-	GBA_REG_GREENSWP = 0x002,
+	GBA_REG_STEREOCNT = 0x002,
 	GBA_REG_DISPSTAT = 0x004,
 	GBA_REG_VCOUNT = 0x006,
 	GBA_REG_BG0CNT = 0x008,
diff --git a/include/mgba/internal/gba/renderers/video-software.h b/include/mgba/internal/gba/renderers/video-software.h
index d9a012fa8..ce918775a 100644
--- a/include/mgba/internal/gba/renderers/video-software.h
+++ b/include/mgba/internal/gba/renderers/video-software.h
@@ -110,7 +110,7 @@ struct GBAVideoSoftwareRenderer {
 	uint16_t bldy;
 
 	GBAMosaicControl mosaic;
-	bool greenswap;
+	bool stereo;
 
 	struct WindowN {
 		struct GBAVideoWindowRegion h;
diff --git a/include/mgba/internal/gba/video.h b/include/mgba/internal/gba/video.h
index 5fc68eb59..5ee2bc36f 100644
--- a/include/mgba/internal/gba/video.h
+++ b/include/mgba/internal/gba/video.h
@@ -42,7 +42,8 @@ enum {
 enum GBAVideoObjMode {
 	OBJ_MODE_NORMAL = 0,
 	OBJ_MODE_SEMITRANSPARENT = 1,
-	OBJ_MODE_OBJWIN = 2
+	OBJ_MODE_OBJWIN = 2,
+	OBJ_MODE_STEREO = 3,
 };
 
 enum GBAVideoObjShape {
@@ -142,6 +143,7 @@ DECL_BITS(GBARegisterDISPSTAT, VcountSetting, 8, 8);
 DECL_BITFIELD(GBARegisterBGCNT, uint16_t);
 DECL_BITS(GBARegisterBGCNT, Priority, 0, 2);
 DECL_BITS(GBARegisterBGCNT, CharBase, 2, 2);
+DECL_BITS(GBARegisterBGCNT, StereoMode, 4, 2);
 DECL_BIT(GBARegisterBGCNT, Mosaic, 6);
 DECL_BIT(GBARegisterBGCNT, 256Color, 7);
 DECL_BITS(GBARegisterBGCNT, ScreenBase, 8, 5);
diff --git a/src/gba/io.c b/src/gba/io.c
index cb6058f7f..0747986f0 100644
--- a/src/gba/io.c
+++ b/src/gba/io.c
@@ -934,7 +934,7 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) {
 		}
 		// Fall through
 	case GBA_REG_DISPCNT:
-	case GBA_REG_GREENSWP:
+	case GBA_REG_STEREOCNT:
 	case GBA_REG_DISPSTAT:
 	case GBA_REG_VCOUNT:
 	case GBA_REG_BG0CNT:
diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c
index 83550bcfa..e2dab9033 100644
--- a/src/gba/renderers/video-software.c
+++ b/src/gba/renderers/video-software.c
@@ -136,7 +136,7 @@ static void GBAVideoSoftwareRendererReset(struct GBAVideoRenderer* renderer) {
 	softwareRenderer->oamMax = 0;
 
 	softwareRenderer->mosaic = 0;
-	softwareRenderer->greenswap = false;
+	softwareRenderer->stereo = false;
 	softwareRenderer->nextY = 0;
 
 	softwareRenderer->objOffsetX = 0;
@@ -195,8 +195,8 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender
 		softwareRenderer->dispcnt = value;
 		GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer);
 		break;
-	case GBA_REG_GREENSWP:
-		softwareRenderer->greenswap = value & 1;
+	case GBA_REG_STEREOCNT:
+		softwareRenderer->stereo = value & 1;
 		break;
 	case GBA_REG_BG0CNT:
 		value &= 0xDFFF;
@@ -705,7 +705,7 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render
 	}
 
 	int x;
-	if (softwareRenderer->greenswap) {
+	if (softwareRenderer->stereo) {
 		for (x = 0; x < GBA_VIDEO_HORIZONTAL_PIXELS; x += 4) {
 			row[x] = softwareRenderer->row[x] & (M_COLOR_RED | M_COLOR_BLUE);
 			row[x] |= softwareRenderer->row[x + 1] & M_COLOR_GREEN;
diff --git a/src/gba/video.c b/src/gba/video.c
index 749a29be0..a86413251 100644
--- a/src/gba/video.c
+++ b/src/gba/video.c
@@ -128,7 +128,7 @@ void GBAVideoAssociateRenderer(struct GBAVideo* video, struct GBAVideoRenderer*
 	video->renderer->init(video->renderer);
 	video->renderer->reset(video->renderer);
 	renderer->writeVideoRegister(renderer, GBA_REG_DISPCNT, video->p->memory.io[GBA_REG(DISPCNT)]);
-	renderer->writeVideoRegister(renderer, GBA_REG_GREENSWP, video->p->memory.io[GBA_REG(GREENSWP)]);
+	renderer->writeVideoRegister(renderer, GBA_REG_STEREOCNT, video->p->memory.io[GBA_REG(STEREOCNT)]);
 	int address;
 	for (address = GBA_REG_BG0CNT; address < 0x56; address += 2) {
 		if (address == 0x4E) {
diff --git a/src/platform/qt/IOViewer.cpp b/src/platform/qt/IOViewer.cpp
index 9b44af04f..8ef921b7c 100644
--- a/src/platform/qt/IOViewer.cpp
+++ b/src/platform/qt/IOViewer.cpp
@@ -60,7 +60,7 @@ const QList<IOViewer::RegisterDescription>& IOViewer::registerDescriptions(mPlat
 		{ tr("Enable Window 1"), 14 },
 		{ tr("Enable OBJ Window"), 15 },
 	});
-	// 0x04000002: Green swap
+	// 0x04000002: STEREOCNT
 	regGBA.append({
 		{ tr("Swap green components"), 0 },
 	});