aboutsummaryrefslogtreecommitdiff
path: root/GPU2D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'GPU2D.cpp')
-rw-r--r--GPU2D.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/GPU2D.cpp b/GPU2D.cpp
index 819d4ea..663a97d 100644
--- a/GPU2D.cpp
+++ b/GPU2D.cpp
@@ -35,6 +35,8 @@ void GPU2D::Reset()
{
DispCnt = 0;
memset(BGCnt, 0, 4*2);
+ memset(BGXPos, 0, 4*2);
+ memset(BGYPos, 0, 4*2);
}
void GPU2D::SetFramebuffer(u16* buf)
@@ -100,6 +102,15 @@ void GPU2D::Write16(u32 addr, u16 val)
case 0x00A: BGCnt[1] = val; return;
case 0x00C: BGCnt[2] = val; return;
case 0x00E: BGCnt[3] = val; return;
+
+ case 0x010: BGXPos[0] = val; return;
+ case 0x012: BGYPos[0] = val; return;
+ case 0x014: BGXPos[1] = val; return;
+ case 0x016: BGYPos[1] = val; return;
+ case 0x018: BGXPos[2] = val; return;
+ case 0x01A: BGYPos[2] = val; return;
+ case 0x01C: BGXPos[3] = val; return;
+ case 0x01E: BGYPos[3] = val; return;
}
printf("unknown GPU write16 %08X %04X\n", addr, val);
@@ -213,9 +224,8 @@ void GPU2D::DrawBG_Text_4bpp(u32 line, u16* dst, u32 bgnum)
u16* tilemap;
u16* pal;
- // TODO scroll
- u16 xoff = 0;
- u16 yoff = line;
+ u16 xoff = BGXPos[bgnum];
+ u16 yoff = BGYPos[bgnum] + line;
u32 widexmask = (bgcnt & 0x4000) ? 0x100 : 0;
//u32 ymask = (bgcnt & 0x8000) ? 0x1FF : 0xFF;
@@ -257,7 +267,7 @@ void GPU2D::DrawBG_Text_4bpp(u32 line, u16* dst, u32 bgnum)
// load a new tile
curtile = tilemap[((xoff & 0xFF) >> 3) + ((xoff & widexmask) << 2)];
curpal = pal + ((curtile & 0xF000) >> 8);
- pixels = tileset + ((curtile & 0x01FF) << 5) + ((yoff & 0x7) << 2);
+ pixels = tileset + ((curtile & 0x03FF) << 5) + ((yoff & 0x7) << 2);
pixels += ((xoff & 0x7) >> 1);
}
@@ -268,7 +278,7 @@ void GPU2D::DrawBG_Text_4bpp(u32 line, u16* dst, u32 bgnum)
// load a new tile
curtile = tilemap[((xoff & 0xFF) >> 3) + ((xoff & widexmask) << 2)];
curpal = pal + ((curtile & 0xF000) >> 8);
- pixels = tileset + ((curtile & 0x01FF) << 5) + ((yoff & 0x7) << 2);
+ pixels = tileset + ((curtile & 0x03FF) << 5) + ((yoff & 0x7) << 2);
}
// draw pixel