all repos — mgba @ 64034e387fb2696f05078dd00b9e9c70c27d5f66

mGBA Game Boy Advance Emulator

DS GX: Fix 6-bit PV stack pointer
Vicki Pfau vi@endrift.com
Mon, 27 Feb 2017 18:20:49 -0800
commit

64034e387fb2696f05078dd00b9e9c70c27d5f66

parent

2ab7289a059ab3055f00f0677f7c20bfed7591d5

2 files changed, 12 insertions(+), 11 deletions(-)

jump to
M include/mgba/internal/ds/gx.hinclude/mgba/internal/ds/gx.h

@@ -129,6 +129,7 @@ struct DSGXVertex* vertexBuffer[2];

struct DSGXPolygon* polygonBuffer[2]; int mtxMode; + int pvMatrixPointer; struct DSGXMatrix projMatrixStack; struct DSGXMatrix texMatrixStack; struct DSGXMatrix posMatrixStack[32];
M src/ds/gx.csrc/ds/gx.c

@@ -151,7 +151,6 @@ break;

} DSRegGXSTAT gxstat = gx->p->memory.io9[DS9_REG_GXSTAT_LO >> 1]; - int pvMatrixPointer = DSRegGXSTATGetPVMatrixStackLevel(gxstat); int projMatrixPointer = DSRegGXSTATGetProjMatrixStackLevel(gxstat); struct DSGXEntry entry = { 0 };

@@ -218,11 +217,11 @@ memcpy(&gx->projMatrixStack, &gx->projMatrix, sizeof(gx->projMatrix));

++projMatrixPointer; break; case 2: - memcpy(&gx->vecMatrixStack[pvMatrixPointer & 0x1F], &gx->vecMatrix, sizeof(gx->vecMatrix)); + memcpy(&gx->vecMatrixStack[gx->pvMatrixPointer & 0x1F], &gx->vecMatrix, sizeof(gx->vecMatrix)); // Fall through case 1: - memcpy(&gx->posMatrixStack[pvMatrixPointer & 0x1F], &gx->posMatrix, sizeof(gx->posMatrix)); - ++pvMatrixPointer; + memcpy(&gx->posMatrixStack[gx->pvMatrixPointer & 0x1F], &gx->posMatrix, sizeof(gx->posMatrix)); + ++gx->pvMatrixPointer; break; case 3: mLOG(DS_GX, STUB, "Unimplemented GX MTX_PUSH mode");

@@ -239,13 +238,13 @@ projMatrixPointer -= offset;

memcpy(&gx->projMatrix, &gx->projMatrixStack, sizeof(gx->projMatrix)); break; case 1: - pvMatrixPointer -= offset; - memcpy(&gx->posMatrix, &gx->posMatrixStack[pvMatrixPointer & 0x1F], sizeof(gx->posMatrix)); + gx->pvMatrixPointer -= offset; + memcpy(&gx->posMatrix, &gx->posMatrixStack[gx->pvMatrixPointer & 0x1F], sizeof(gx->posMatrix)); break; case 2: - pvMatrixPointer -= offset; - memcpy(&gx->vecMatrix, &gx->vecMatrixStack[pvMatrixPointer & 0x1F], sizeof(gx->vecMatrix)); - memcpy(&gx->posMatrix, &gx->posMatrixStack[pvMatrixPointer & 0x1F], sizeof(gx->posMatrix)); + gx->pvMatrixPointer -= offset; + memcpy(&gx->vecMatrix, &gx->vecMatrixStack[gx->pvMatrixPointer & 0x1F], sizeof(gx->vecMatrix)); + memcpy(&gx->posMatrix, &gx->posMatrixStack[gx->pvMatrixPointer & 0x1F], sizeof(gx->posMatrix)); break; case 3: mLOG(DS_GX, STUB, "Unimplemented GX MTX_POP mode");

@@ -261,9 +260,9 @@ mLOG(DS_GX, STUB, "Unimplemented GX command %02X:%02X %02X %02X %02X", entry.command, entry.params[0], entry.params[1], entry.params[2], entry.params[3]);

break; } - gxstat = DSRegGXSTATSetPVMatrixStackLevel(gxstat, pvMatrixPointer); + gxstat = DSRegGXSTATSetPVMatrixStackLevel(gxstat, gx->pvMatrixPointer); gxstat = DSRegGXSTATSetProjMatrixStackLevel(gxstat, projMatrixPointer); - gxstat = DSRegGXSTATTestFillMatrixStackError(gxstat, projMatrixPointer || pvMatrixPointer >= 0x1F); + gxstat = DSRegGXSTATTestFillMatrixStackError(gxstat, projMatrixPointer || gx->pvMatrixPointer >= 0x1F); gx->p->memory.io9[DS9_REG_GXSTAT_LO >> 1] = gxstat; if (cyclesLate >= cycles) {

@@ -312,6 +311,7 @@ }

gx->swapBuffers = false; gx->bufferIndex = 0; gx->mtxMode = 0; + gx->pvMatrixPointer = 0; memset(gx->outstandingParams, 0, sizeof(gx->outstandingParams)); memset(gx->outstandingCommand, 0, sizeof(gx->outstandingCommand));