GBA: Update some register information with new stereoscopy discoveries

This commit is contained in:
Vicki Pfau 2025-02-07 03:03:09 -08:00
parent 92e10f31ea
commit 2e7918d8b2
7 changed files with 12 additions and 10 deletions

View File

@ -17,7 +17,7 @@ CXX_GUARD_START
enum GBAIORegisters { enum GBAIORegisters {
// Video // Video
GBA_REG_DISPCNT = 0x000, GBA_REG_DISPCNT = 0x000,
GBA_REG_GREENSWP = 0x002, GBA_REG_STEREOCNT = 0x002,
GBA_REG_DISPSTAT = 0x004, GBA_REG_DISPSTAT = 0x004,
GBA_REG_VCOUNT = 0x006, GBA_REG_VCOUNT = 0x006,
GBA_REG_BG0CNT = 0x008, GBA_REG_BG0CNT = 0x008,

View File

@ -110,7 +110,7 @@ struct GBAVideoSoftwareRenderer {
uint16_t bldy; uint16_t bldy;
GBAMosaicControl mosaic; GBAMosaicControl mosaic;
bool greenswap; bool stereo;
struct WindowN { struct WindowN {
struct GBAVideoWindowRegion h; struct GBAVideoWindowRegion h;

View File

@ -42,7 +42,8 @@ enum {
enum GBAVideoObjMode { enum GBAVideoObjMode {
OBJ_MODE_NORMAL = 0, OBJ_MODE_NORMAL = 0,
OBJ_MODE_SEMITRANSPARENT = 1, OBJ_MODE_SEMITRANSPARENT = 1,
OBJ_MODE_OBJWIN = 2 OBJ_MODE_OBJWIN = 2,
OBJ_MODE_STEREO = 3,
}; };
enum GBAVideoObjShape { enum GBAVideoObjShape {
@ -142,6 +143,7 @@ DECL_BITS(GBARegisterDISPSTAT, VcountSetting, 8, 8);
DECL_BITFIELD(GBARegisterBGCNT, uint16_t); DECL_BITFIELD(GBARegisterBGCNT, uint16_t);
DECL_BITS(GBARegisterBGCNT, Priority, 0, 2); DECL_BITS(GBARegisterBGCNT, Priority, 0, 2);
DECL_BITS(GBARegisterBGCNT, CharBase, 2, 2); DECL_BITS(GBARegisterBGCNT, CharBase, 2, 2);
DECL_BITS(GBARegisterBGCNT, StereoMode, 4, 2);
DECL_BIT(GBARegisterBGCNT, Mosaic, 6); DECL_BIT(GBARegisterBGCNT, Mosaic, 6);
DECL_BIT(GBARegisterBGCNT, 256Color, 7); DECL_BIT(GBARegisterBGCNT, 256Color, 7);
DECL_BITS(GBARegisterBGCNT, ScreenBase, 8, 5); DECL_BITS(GBARegisterBGCNT, ScreenBase, 8, 5);

View File

@ -934,7 +934,7 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) {
} }
// Fall through // Fall through
case GBA_REG_DISPCNT: case GBA_REG_DISPCNT:
case GBA_REG_GREENSWP: case GBA_REG_STEREOCNT:
case GBA_REG_DISPSTAT: case GBA_REG_DISPSTAT:
case GBA_REG_VCOUNT: case GBA_REG_VCOUNT:
case GBA_REG_BG0CNT: case GBA_REG_BG0CNT:

View File

@ -136,7 +136,7 @@ static void GBAVideoSoftwareRendererReset(struct GBAVideoRenderer* renderer) {
softwareRenderer->oamMax = 0; softwareRenderer->oamMax = 0;
softwareRenderer->mosaic = 0; softwareRenderer->mosaic = 0;
softwareRenderer->greenswap = false; softwareRenderer->stereo = false;
softwareRenderer->nextY = 0; softwareRenderer->nextY = 0;
softwareRenderer->objOffsetX = 0; softwareRenderer->objOffsetX = 0;
@ -195,8 +195,8 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender
softwareRenderer->dispcnt = value; softwareRenderer->dispcnt = value;
GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer); GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer);
break; break;
case GBA_REG_GREENSWP: case GBA_REG_STEREOCNT:
softwareRenderer->greenswap = value & 1; softwareRenderer->stereo = value & 1;
break; break;
case GBA_REG_BG0CNT: case GBA_REG_BG0CNT:
value &= 0xDFFF; value &= 0xDFFF;
@ -705,7 +705,7 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render
} }
int x; int x;
if (softwareRenderer->greenswap) { if (softwareRenderer->stereo) {
for (x = 0; x < GBA_VIDEO_HORIZONTAL_PIXELS; x += 4) { 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] & (M_COLOR_RED | M_COLOR_BLUE);
row[x] |= softwareRenderer->row[x + 1] & M_COLOR_GREEN; row[x] |= softwareRenderer->row[x + 1] & M_COLOR_GREEN;

View File

@ -128,7 +128,7 @@ void GBAVideoAssociateRenderer(struct GBAVideo* video, struct GBAVideoRenderer*
video->renderer->init(video->renderer); video->renderer->init(video->renderer);
video->renderer->reset(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_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; int address;
for (address = GBA_REG_BG0CNT; address < 0x56; address += 2) { for (address = GBA_REG_BG0CNT; address < 0x56; address += 2) {
if (address == 0x4E) { if (address == 0x4E) {

View File

@ -60,7 +60,7 @@ const QList<IOViewer::RegisterDescription>& IOViewer::registerDescriptions(mPlat
{ tr("Enable Window 1"), 14 }, { tr("Enable Window 1"), 14 },
{ tr("Enable OBJ Window"), 15 }, { tr("Enable OBJ Window"), 15 },
}); });
// 0x04000002: Green swap // 0x04000002: STEREOCNT
regGBA.append({ regGBA.append({
{ tr("Swap green components"), 0 }, { tr("Swap green components"), 0 },
}); });