all repos — mgba @ fe2f67e2aa2246e8ec2c2599a480d6ff7557f3f7

mGBA Game Boy Advance Emulator

DS Video: Fix 128 pixel-wide bitmap OBJs
Vicki Pfau vi@endrift.com
Wed, 26 Apr 2017 10:01:59 -0700
commit

fe2f67e2aa2246e8ec2c2599a480d6ff7557f3f7

parent

cbc805b1943edef579f4a938edbdc90d72aac391

M include/mgba/internal/gba/renderers/video-software.hinclude/mgba/internal/gba/renderers/video-software.h

@@ -164,6 +164,7 @@ int oamDirty;

int oamMax; struct GBAVideoSoftwareSprite sprites[128]; int tileStride; + int bitmapStride; bool combinedObjSort; int start;
M src/ds/renderers/software.csrc/ds/renderers/software.c

@@ -217,6 +217,7 @@ } else {

eng->tileStride = 0x20 << DSRegisterDISPCNTGetTileBoundary(dispcnt); fakeDispcnt = GBARegisterDISPCNTFillObjCharacterMapping(fakeDispcnt); } + eng->bitmapStride = 0x10 << DSRegisterDISPCNTGetBitmapObj2D(dispcnt); eng->d.writeVideoRegister(&eng->d, DS9_REG_A_DISPCNT_LO, fakeDispcnt); eng->dispcnt |= dispcnt & 0xFFFF0000; if (DSRegisterDISPCNTIsBgExtPalette(dispcnt)) {
M src/gba/renderers/software-obj.csrc/gba/renderers/software-obj.c

@@ -233,8 +233,8 @@ }

int32_t x = (uint32_t) GBAObjAttributesBGetX(sprite->b) << 23; x >>= 23; unsigned charBase = GBAObjAttributesCGetTile(sprite->c); - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { - charBase = (charBase & 0x1F) * 0x10 + (charBase & ~0x1F) * 0x80; + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { + charBase = (charBase & (renderer->bitmapStride - 1)) * 0x10 + (charBase & ~(renderer->bitmapStride - 1)) * 0x80; } else { charBase *= renderer->tileStride; }

@@ -281,8 +281,8 @@ }

int inY = y - (int) GBAObjAttributesAGetY(sprite->a); int stride = GBARegisterDISPCNTIsObjCharacterMapping(renderer->dispcnt) ? (width >> !GBAObjAttributesAIs256Color(sprite->a)) : 0x80; - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { - stride = 0x100; // TODO: Param + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { + stride = renderer->bitmapStride << 3; } uint32_t current;

@@ -350,7 +350,7 @@ if (outX < start || outX >= condition) {

return 0; } - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { int alpha = GBAObjAttributesCGetPalette(sprite->c); if (flags & FLAG_OBJWIN) { SPRITE_TRANSFORMED_LOOP(BITMAP, OBJWIN);

@@ -416,7 +416,7 @@ if (GBAObjAttributesBIsHFlip(sprite->b)) {

inX = width - inX - 1; xOffset = -1; } - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { int alpha = GBAObjAttributesCGetPalette(sprite->c); if (flags & FLAG_OBJWIN) { SPRITE_NORMAL_LOOP(BITMAP, OBJWIN);
M src/gba/renderers/video-software.csrc/gba/renderers/video-software.c

@@ -62,6 +62,7 @@ renderer->d.disableBG[2] = false;

renderer->d.disableBG[3] = false; renderer->d.disableOBJ = false; renderer->tileStride = 0x20; + renderer->bitmapStride = 0; renderer->combinedObjSort = false; renderer->masterEnd = VIDEO_HORIZONTAL_PIXELS; renderer->masterHeight = VIDEO_VERTICAL_PIXELS;