mirror of https://github.com/mgba-emu/mgba.git
DS Video: Fix VRAM mirroring in the renderer (fixes #561)
This commit is contained in:
parent
b65cc6d97d
commit
2930340178
2
CHANGES
2
CHANGES
|
@ -1,4 +1,6 @@
|
||||||
medusa alpha 2: (Future)
|
medusa alpha 2: (Future)
|
||||||
|
Bugfixes:
|
||||||
|
- DS Video: Fix VRAM mirroring in the renderer (fixes mgba.io/i/561)
|
||||||
Misc:
|
Misc:
|
||||||
- DS: Set boot complete bit in RAM on boot (fixes mgba.io/i/576, mgba.io/i/580, mgba.io/i/586)
|
- DS: Set boot complete bit in RAM on boot (fixes mgba.io/i/576, mgba.io/i/580, mgba.io/i/586)
|
||||||
|
|
||||||
|
|
|
@ -425,34 +425,42 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
|
||||||
uint32_t offset = oldInfo.base + oldInfo.offset[(oldValue >> 3) & 3];
|
uint32_t offset = oldInfo.base + oldInfo.offset[(oldValue >> 3) & 3];
|
||||||
switch (oldInfo.mode) {
|
switch (oldInfo.mode) {
|
||||||
case MODE_A_BG:
|
case MODE_A_BG:
|
||||||
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramABG[offset + i] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramABG[offset + i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramABG[offset + i] = NULL;
|
ds->video.vramABG[offset + i + j] = NULL;
|
||||||
ds->video.renderer->vramABG[offset + i] = NULL;
|
ds->video.renderer->vramABG[offset + i + j] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_B_BG:
|
case MODE_B_BG:
|
||||||
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramBBG[offset + i] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramBBG[offset + i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramBBG[offset + i] = NULL;
|
ds->video.vramBBG[offset + i + j] = NULL;
|
||||||
ds->video.renderer->vramBBG[offset + i] = NULL;
|
ds->video.renderer->vramBBG[offset + i + j] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_A_OBJ:
|
case MODE_A_OBJ:
|
||||||
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramAOBJ[offset + i] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramAOBJ[offset + i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramAOBJ[offset + i] = NULL;
|
ds->video.vramAOBJ[offset + i + j] = NULL;
|
||||||
ds->video.renderer->vramAOBJ[offset + i] = NULL;
|
ds->video.renderer->vramAOBJ[offset + i + j] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_B_OBJ:
|
case MODE_B_OBJ:
|
||||||
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramBOBJ[offset + i] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramBOBJ[offset + i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramBOBJ[offset + i] = NULL;
|
ds->video.vramBOBJ[offset + i + j] = NULL;
|
||||||
ds->video.renderer->vramBOBJ[offset + i] = NULL;
|
ds->video.renderer->vramBOBJ[offset + i + j] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -529,27 +537,35 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
|
||||||
}
|
}
|
||||||
switch (info.mode) {
|
switch (info.mode) {
|
||||||
case MODE_A_BG:
|
case MODE_A_BG:
|
||||||
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
ds->video.vramABG[offset + i] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
ds->video.vramABG[offset + i + j] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
||||||
ds->video.renderer->vramABG[offset + i] = ds->video.vramABG[offset + i];
|
ds->video.renderer->vramABG[offset + i + j] = ds->video.vramABG[offset + i + j];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_B_BG:
|
case MODE_B_BG:
|
||||||
|
for (j = offset; j < 0x20; j += info.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
ds->video.vramBBG[offset + i] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
ds->video.vramBBG[offset + i + j] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
||||||
ds->video.renderer->vramBBG[offset + i] = ds->video.vramBBG[offset + i];
|
ds->video.renderer->vramBBG[offset + i + j] = ds->video.vramBBG[offset + i + j];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_A_OBJ:
|
case MODE_A_OBJ:
|
||||||
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
ds->video.vramAOBJ[offset + i] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
ds->video.vramAOBJ[offset + i + j] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
||||||
ds->video.renderer->vramAOBJ[offset + i] = ds->video.vramAOBJ[offset + i];
|
ds->video.renderer->vramAOBJ[offset + i + j] = ds->video.vramAOBJ[offset + i + j];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_B_OBJ:
|
case MODE_B_OBJ:
|
||||||
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
ds->video.vramBOBJ[offset + i] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
ds->video.vramBOBJ[offset + i + j] = &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)];
|
||||||
ds->video.renderer->vramBOBJ[offset + i] = ds->video.vramBOBJ[offset + i];
|
ds->video.renderer->vramBOBJ[offset + i + j] = ds->video.vramBOBJ[offset + i + j];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_A_BG_EXT_PAL:
|
case MODE_A_BG_EXT_PAL:
|
||||||
|
|
Loading…
Reference in New Issue