mirror of https://github.com/mgba-emu/mgba.git
DS Video: Simplify VRAM mapping
This commit is contained in:
parent
f80bcfaf5d
commit
de55e44152
1
CHANGES
1
CHANGES
|
@ -7,6 +7,7 @@ Bugfixes:
|
||||||
Misc:
|
Misc:
|
||||||
- DS GX: Clean up and unify texture mapping
|
- DS GX: Clean up and unify texture mapping
|
||||||
- DS Core: Add symbol loading
|
- DS Core: Add symbol loading
|
||||||
|
- DS Video: Simplify VRAM mapping
|
||||||
|
|
||||||
0.7.0: (Future)
|
0.7.0: (Future)
|
||||||
Features:
|
Features:
|
||||||
|
|
|
@ -699,9 +699,6 @@ static void DSVideoSoftwareRendererPutPixels(struct DSVideoRenderer* renderer, s
|
||||||
} \
|
} \
|
||||||
uint32_t charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + ((localY & 0x700) >> 5) + ((localX & 0x700) >> 8); \
|
uint32_t charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + ((localY & 0x700) >> 5) + ((localX & 0x700) >> 8); \
|
||||||
uint16_t* vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
uint16_t* vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
|
||||||
continue; \
|
|
||||||
} \
|
|
||||||
pixelData = ((uint8_t*) vram)[charBase & VRAM_BLOCK_MASK];
|
pixelData = ((uint8_t*) vram)[charBase & VRAM_BLOCK_MASK];
|
||||||
|
|
||||||
#define EXT_0_MOSAIC(COORD, PAL) \
|
#define EXT_0_MOSAIC(COORD, PAL) \
|
||||||
|
@ -839,9 +836,6 @@ void DSVideoSoftwareRendererDrawBackgroundExt1(struct GBAVideoSoftwareRenderer*
|
||||||
if (!mosaicWait) {
|
if (!mosaicWait) {
|
||||||
uint32_t address = (localX >> 8) + (localY >> 8) * width + screenBase;
|
uint32_t address = (localX >> 8) + (localY >> 8) * width + screenBase;
|
||||||
uint8_t* vram = (uint8_t*) renderer->d.vramBG[address >> VRAM_BLOCK_OFFSET];
|
uint8_t* vram = (uint8_t*) renderer->d.vramBG[address >> VRAM_BLOCK_OFFSET];
|
||||||
if (UNLIKELY(!vram)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
color = vram[address & VRAM_BLOCK_MASK];
|
color = vram[address & VRAM_BLOCK_MASK];
|
||||||
mosaicWait = mosaicH;
|
mosaicWait = mosaicH;
|
||||||
} else {
|
} else {
|
||||||
|
@ -896,9 +890,6 @@ void DSVideoSoftwareRendererDrawBackgroundExt2(struct GBAVideoSoftwareRenderer*
|
||||||
if (!mosaicWait) {
|
if (!mosaicWait) {
|
||||||
uint32_t address = ((localX >> 8) + (localY >> 8) * width + screenBase) << 1;
|
uint32_t address = ((localX >> 8) + (localY >> 8) * width + screenBase) << 1;
|
||||||
uint16_t* vram = renderer->d.vramBG[address >> VRAM_BLOCK_OFFSET];
|
uint16_t* vram = renderer->d.vramBG[address >> VRAM_BLOCK_OFFSET];
|
||||||
if (UNLIKELY(!vram)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
LOAD_16(color, address & VRAM_BLOCK_MASK, vram);
|
LOAD_16(color, address & VRAM_BLOCK_MASK, vram);
|
||||||
#ifndef COLOR_16_BIT
|
#ifndef COLOR_16_BIT
|
||||||
unsigned color32;
|
unsigned color32;
|
||||||
|
|
|
@ -45,6 +45,8 @@ static const uint32_t _vramSize[9] = {
|
||||||
0x04000
|
0x04000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static uint16_t _zeroes[0x2000] = {};
|
||||||
|
|
||||||
enum DSVRAMBankMode {
|
enum DSVRAMBankMode {
|
||||||
MODE_A_BG = 0,
|
MODE_A_BG = 0,
|
||||||
MODE_B_BG = 1,
|
MODE_B_BG = 1,
|
||||||
|
@ -186,6 +188,20 @@ void DSVideoReset(struct DSVideo* video) {
|
||||||
video->p->memory.vramBank[7] = &video->vram[0x4C000];
|
video->p->memory.vramBank[7] = &video->vram[0x4C000];
|
||||||
video->p->memory.vramBank[8] = &video->vram[0x50000];
|
video->p->memory.vramBank[8] = &video->vram[0x50000];
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 32; ++i) {
|
||||||
|
video->renderer->vramABG[i] = _zeroes;
|
||||||
|
video->renderer->vramBBG[i] = _zeroes;
|
||||||
|
video->renderer->vramAOBJ[i] = _zeroes;
|
||||||
|
video->renderer->vramBOBJ[i] = _zeroes;
|
||||||
|
}
|
||||||
|
for (i = 0; i < 4; ++i) {
|
||||||
|
video->renderer->vramABGExtPal[i] = NULL;
|
||||||
|
video->renderer->vramBBGExtPal[i] = NULL;
|
||||||
|
}
|
||||||
|
video->renderer->vramAOBJExtPal = NULL;
|
||||||
|
video->renderer->vramBOBJExtPal = NULL;
|
||||||
|
|
||||||
video->renderer->deinit(video->renderer);
|
video->renderer->deinit(video->renderer);
|
||||||
video->renderer->init(video->renderer);
|
video->renderer->init(video->renderer);
|
||||||
}
|
}
|
||||||
|
@ -499,8 +515,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
|
||||||
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramABG[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramABG[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramABG[i + j] = NULL;
|
ds->video.vramABG[i + j] = _zeroes;
|
||||||
ds->video.renderer->vramABG[i + j] = NULL;
|
ds->video.renderer->vramABG[i + j] = _zeroes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -509,8 +525,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
|
||||||
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramBBG[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramBBG[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramBBG[i + j] = NULL;
|
ds->video.vramBBG[i + j] = _zeroes;
|
||||||
ds->video.renderer->vramBBG[i + j] = NULL;
|
ds->video.renderer->vramBBG[i + j] = _zeroes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -519,8 +535,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
|
||||||
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramAOBJ[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramAOBJ[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramAOBJ[i + j] = NULL;
|
ds->video.vramAOBJ[i + j] = _zeroes;
|
||||||
ds->video.renderer->vramAOBJ[i + j] = NULL;
|
ds->video.renderer->vramAOBJ[i + j] = _zeroes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -529,8 +545,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
|
||||||
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
|
||||||
for (i = 0; i < size; ++i) {
|
for (i = 0; i < size; ++i) {
|
||||||
if (ds->video.vramBOBJ[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
if (ds->video.vramBOBJ[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
|
||||||
ds->video.vramBOBJ[i + j] = NULL;
|
ds->video.vramBOBJ[i + j] = _zeroes;
|
||||||
ds->video.renderer->vramBOBJ[i + j] = NULL;
|
ds->video.renderer->vramBOBJ[i + j] = _zeroes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -569,16 +585,16 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
|
||||||
break;
|
break;
|
||||||
case MODE_3D_TEX:
|
case MODE_3D_TEX:
|
||||||
if (ds->gx.tex[offset] == memory->vramBank[index]) {
|
if (ds->gx.tex[offset] == memory->vramBank[index]) {
|
||||||
ds->gx.tex[offset] = NULL;
|
ds->gx.tex[offset] = _zeroes;
|
||||||
ds->gx.renderer->tex[offset] = NULL;
|
ds->gx.renderer->tex[offset] = _zeroes;
|
||||||
ds->gx.renderer->invalidateTex(ds->gx.renderer, offset);
|
ds->gx.renderer->invalidateTex(ds->gx.renderer, offset);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MODE_3D_TEX_PAL:
|
case MODE_3D_TEX_PAL:
|
||||||
for (i = 0; i < oldInfo.mirrorSize; ++i) {
|
for (i = 0; i < oldInfo.mirrorSize; ++i) {
|
||||||
if (ds->gx.texPal[offset + i] == &memory->vramBank[index][i << 13]) {
|
if (ds->gx.texPal[offset + i] == &memory->vramBank[index][i << 13]) {
|
||||||
ds->gx.texPal[offset + i] = NULL;
|
ds->gx.texPal[offset + i] = _zeroes;
|
||||||
ds->gx.renderer->texPal[offset + i] = NULL;
|
ds->gx.renderer->texPal[offset + i] = _zeroes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -15,9 +15,6 @@
|
||||||
} \
|
} \
|
||||||
screenBase = background->screenBase + yBase + (xBase >> 2); \
|
screenBase = background->screenBase + yBase + (xBase >> 2); \
|
||||||
uint16_t* screenBlock = renderer->d.vramBG[screenBase >> VRAM_BLOCK_OFFSET]; \
|
uint16_t* screenBlock = renderer->d.vramBG[screenBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!screenBlock)) { \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
LOAD_16(mapData, screenBase & VRAM_BLOCK_MASK, screenBlock); \
|
LOAD_16(mapData, screenBase & VRAM_BLOCK_MASK, screenBlock); \
|
||||||
localY = inY & 0x7; \
|
localY = inY & 0x7; \
|
||||||
if (GBA_TEXT_MAP_VFLIP(mapData)) { \
|
if (GBA_TEXT_MAP_VFLIP(mapData)) { \
|
||||||
|
@ -29,26 +26,21 @@
|
||||||
palette = &mainPalette[paletteData]; \
|
palette = &mainPalette[paletteData]; \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (LIKELY(vram)) { \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
tileData >>= 4 * mod8; \
|
||||||
tileData >>= 4 * mod8; \
|
for (; outX < end; ++outX) { \
|
||||||
for (; outX < end; ++outX) { \
|
BACKGROUND_DRAW_PIXEL_16(BLEND, OBJWIN, 0); \
|
||||||
BACKGROUND_DRAW_PIXEL_16(BLEND, OBJWIN, 0); \
|
} \
|
||||||
} \
|
} else { \
|
||||||
} else { \
|
for (outX = end - 1; outX >= renderer->start; --outX) { \
|
||||||
for (outX = end - 1; outX >= renderer->start; --outX) { \
|
BACKGROUND_DRAW_PIXEL_16(BLEND, OBJWIN, 0); \
|
||||||
BACKGROUND_DRAW_PIXEL_16(BLEND, OBJWIN, 0); \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DRAW_BACKGROUND_MODE_0_TILE_PREFIX_16(BLEND, OBJWIN) \
|
#define DRAW_BACKGROUND_MODE_0_TILE_PREFIX_16(BLEND, OBJWIN) \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 4; \
|
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 4; \
|
||||||
palette = &mainPalette[paletteData]; \
|
palette = &mainPalette[paletteData]; \
|
||||||
|
@ -91,23 +83,19 @@
|
||||||
} \
|
} \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 4; \
|
||||||
carryData = 0; \
|
palette = &mainPalette[paletteData]; \
|
||||||
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
|
tileData >>= 4 * baseX; \
|
||||||
} else { \
|
} else { \
|
||||||
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 4; \
|
tileData >>= 4 * (7 - baseX); \
|
||||||
palette = &mainPalette[paletteData]; \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
|
||||||
tileData >>= 4 * baseX; \
|
|
||||||
} else { \
|
|
||||||
tileData >>= 4 * (7 - baseX); \
|
|
||||||
} \
|
|
||||||
tileData &= 0xF; \
|
|
||||||
tileData |= tileData << 4; \
|
|
||||||
tileData |= tileData << 8; \
|
|
||||||
tileData |= tileData << 16; \
|
|
||||||
carryData = tileData; \
|
|
||||||
} \
|
} \
|
||||||
|
tileData &= 0xF; \
|
||||||
|
tileData |= tileData << 4; \
|
||||||
|
tileData |= tileData << 8; \
|
||||||
|
tileData |= tileData << 16; \
|
||||||
|
carryData = tileData; \
|
||||||
} \
|
} \
|
||||||
for (; length; ++tileX) { \
|
for (; length; ++tileX) { \
|
||||||
BACKGROUND_TEXT_SELECT_CHARACTER; \
|
BACKGROUND_TEXT_SELECT_CHARACTER; \
|
||||||
|
@ -116,23 +104,19 @@
|
||||||
tileData = carryData; \
|
tileData = carryData; \
|
||||||
for (; x < 8 && length; ++x, --length) { \
|
for (; x < 8 && length; ++x, --length) { \
|
||||||
if (!mosaicWait) { \
|
if (!mosaicWait) { \
|
||||||
if (UNLIKELY(!vram)) { \
|
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 4; \
|
||||||
carryData = 0; \
|
palette = &mainPalette[paletteData]; \
|
||||||
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
|
tileData >>= x * 4; \
|
||||||
} else { \
|
} else { \
|
||||||
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 4; \
|
tileData >>= (7 - x) * 4; \
|
||||||
palette = &mainPalette[paletteData]; \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
|
||||||
tileData >>= x * 4; \
|
|
||||||
} else { \
|
|
||||||
tileData >>= (7 - x) * 4; \
|
|
||||||
} \
|
|
||||||
tileData &= 0xF; \
|
|
||||||
tileData |= tileData << 4; \
|
|
||||||
tileData |= tileData << 8; \
|
|
||||||
tileData |= tileData << 16; \
|
|
||||||
carryData = tileData; \
|
|
||||||
} \
|
} \
|
||||||
|
tileData &= 0xF; \
|
||||||
|
tileData |= tileData << 4; \
|
||||||
|
tileData |= tileData << 8; \
|
||||||
|
tileData |= tileData << 16; \
|
||||||
|
carryData = tileData; \
|
||||||
mosaicWait = mosaicH; \
|
mosaicWait = mosaicH; \
|
||||||
} \
|
} \
|
||||||
--mosaicWait; \
|
--mosaicWait; \
|
||||||
|
@ -149,10 +133,6 @@
|
||||||
palette = &mainPalette[paletteData]; \
|
palette = &mainPalette[paletteData]; \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 5)) + (localY << 2); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
|
||||||
outX += 8; \
|
|
||||||
continue; \
|
|
||||||
} \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
if (tileData) { \
|
if (tileData) { \
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
|
@ -182,47 +162,42 @@
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
int end2 = end - 4; \
|
int end2 = end - 4; \
|
||||||
if (LIKELY(vram)) { \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
int shift = inX & 0x3; \
|
||||||
int shift = inX & 0x3; \
|
if (end2 > outX) { \
|
||||||
if (end2 > outX) { \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= 8 * shift; \
|
|
||||||
shift = 0; \
|
|
||||||
for (; outX < end2; ++outX) { \
|
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= 8 * shift; \
|
|
||||||
for (; outX < end; ++outX) { \
|
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
int start = outX; \
|
|
||||||
outX = end - 1; \
|
|
||||||
if (end2 > start) { \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
for (; outX >= end2; --outX) { \
|
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
|
||||||
} \
|
|
||||||
charBase += 4; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
for (; outX >= renderer->start; --outX) { \
|
tileData >>= 8 * shift; \
|
||||||
|
shift = 0; \
|
||||||
|
for (; outX < end2; ++outX) { \
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
\
|
||||||
|
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
||||||
|
tileData >>= 8 * shift; \
|
||||||
|
for (; outX < end; ++outX) { \
|
||||||
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
int start = outX; \
|
||||||
|
outX = end - 1; \
|
||||||
|
if (end2 > start) { \
|
||||||
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
|
for (; outX >= end2; --outX) { \
|
||||||
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
|
} \
|
||||||
|
charBase += 4; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
|
for (; outX >= renderer->start; --outX) { \
|
||||||
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DRAW_BACKGROUND_MODE_0_TILE_PREFIX_256(BLEND, OBJWIN) \
|
#define DRAW_BACKGROUND_MODE_0_TILE_PREFIX_256(BLEND, OBJWIN) \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
int end = mod8 - 4; \
|
int end = mod8 - 4; \
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
if (end > 0) { \
|
if (end > 0) { \
|
||||||
|
@ -266,10 +241,6 @@
|
||||||
BACKGROUND_TEXT_SELECT_CHARACTER; \
|
BACKGROUND_TEXT_SELECT_CHARACTER; \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
|
||||||
outX += 8; \
|
|
||||||
continue; \
|
|
||||||
} \
|
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
if (tileData) { \
|
if (tileData) { \
|
||||||
|
@ -315,29 +286,25 @@
|
||||||
tileData = carryData; \
|
tileData = carryData; \
|
||||||
for (x = 0; x < 8; ++x) { \
|
for (x = 0; x < 8; ++x) { \
|
||||||
if (!mosaicWait) { \
|
if (!mosaicWait) { \
|
||||||
if (UNLIKELY(!vram)) { \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
carryData = 0; \
|
if (x >= 4) { \
|
||||||
} else { \
|
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
tileData >>= (x - 4) * 8; \
|
||||||
if (x >= 4) { \
|
|
||||||
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= (x - 4) * 8; \
|
|
||||||
} else { \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= x * 8; \
|
|
||||||
} \
|
|
||||||
} else { \
|
} else { \
|
||||||
if (x >= 4) { \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
tileData >>= x * 8; \
|
||||||
tileData >>= (7 - x) * 8; \
|
} \
|
||||||
} else { \
|
} else { \
|
||||||
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
if (x >= 4) { \
|
||||||
tileData >>= (3 - x) * 8; \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
} \
|
tileData >>= (7 - x) * 8; \
|
||||||
|
} else { \
|
||||||
|
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
||||||
|
tileData >>= (3 - x) * 8; \
|
||||||
} \
|
} \
|
||||||
tileData &= 0xFF; \
|
|
||||||
carryData = tileData; \
|
|
||||||
} \
|
} \
|
||||||
|
tileData &= 0xFF; \
|
||||||
|
carryData = tileData; \
|
||||||
mosaicWait = mosaicH; \
|
mosaicWait = mosaicH; \
|
||||||
} \
|
} \
|
||||||
tileData |= tileData << 8; \
|
tileData |= tileData << 8; \
|
||||||
|
@ -351,49 +318,44 @@
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
int end2 = end - 4; \
|
int end2 = end - 4; \
|
||||||
if (LIKELY(vram)) { \
|
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 8; \
|
||||||
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 8; \
|
palette = &mainPalette[paletteData]; \
|
||||||
palette = &mainPalette[paletteData]; \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
int shift = inX & 0x3; \
|
||||||
int shift = inX & 0x3; \
|
if (end2 > outX) { \
|
||||||
if (end2 > outX) { \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= 8 * shift; \
|
|
||||||
shift = 0; \
|
|
||||||
for (; outX < end2; ++outX) { \
|
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= 8 * shift; \
|
|
||||||
for (; outX < end; ++outX) { \
|
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
int start = outX; \
|
|
||||||
outX = end - 1; \
|
|
||||||
if (end2 > start) { \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
for (; outX >= end2; --outX) { \
|
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
|
||||||
} \
|
|
||||||
charBase += 4; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
for (; outX >= renderer->start; --outX) { \
|
tileData >>= 8 * shift; \
|
||||||
|
shift = 0; \
|
||||||
|
for (; outX < end2; ++outX) { \
|
||||||
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
\
|
||||||
|
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
||||||
|
tileData >>= 8 * shift; \
|
||||||
|
for (; outX < end; ++outX) { \
|
||||||
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
int start = outX; \
|
||||||
|
outX = end - 1; \
|
||||||
|
if (end2 > start) { \
|
||||||
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
|
for (; outX >= end2; --outX) { \
|
||||||
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
|
} \
|
||||||
|
charBase += 4; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
|
for (; outX >= renderer->start; --outX) { \
|
||||||
|
BACKGROUND_DRAW_PIXEL_256(BLEND, OBJWIN, 0); \
|
||||||
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DRAW_BACKGROUND_MODE_0_TILE_PREFIX_256EXT(BLEND, OBJWIN) \
|
#define DRAW_BACKGROUND_MODE_0_TILE_PREFIX_256EXT(BLEND, OBJWIN) \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 8; \
|
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 8; \
|
||||||
palette = &mainPalette[paletteData]; \
|
palette = &mainPalette[paletteData]; \
|
||||||
int end = mod8 - 4; \
|
int end = mod8 - 4; \
|
||||||
|
@ -441,10 +403,6 @@
|
||||||
palette = &mainPalette[paletteData]; \
|
palette = &mainPalette[paletteData]; \
|
||||||
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + (localY << 3); \
|
||||||
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
|
||||||
if (UNLIKELY(!vram)) { \
|
|
||||||
outX += 8; \
|
|
||||||
continue; \
|
|
||||||
} \
|
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
if (tileData) { \
|
if (tileData) { \
|
||||||
|
@ -490,31 +448,27 @@
|
||||||
tileData = carryData; \
|
tileData = carryData; \
|
||||||
for (x = 0; x < 8; ++x) { \
|
for (x = 0; x < 8; ++x) { \
|
||||||
if (!mosaicWait) { \
|
if (!mosaicWait) { \
|
||||||
if (UNLIKELY(!vram)) { \
|
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 8; \
|
||||||
carryData = 0; \
|
palette = &mainPalette[paletteData]; \
|
||||||
} else { \
|
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
||||||
paletteData = GBA_TEXT_MAP_PALETTE(mapData) << 8; \
|
if (x >= 4) { \
|
||||||
palette = &mainPalette[paletteData]; \
|
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
||||||
if (!GBA_TEXT_MAP_HFLIP(mapData)) { \
|
tileData >>= (x - 4) * 8; \
|
||||||
if (x >= 4) { \
|
|
||||||
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= (x - 4) * 8; \
|
|
||||||
} else { \
|
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
|
||||||
tileData >>= x * 8; \
|
|
||||||
} \
|
|
||||||
} else { \
|
} else { \
|
||||||
if (x >= 4) { \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
tileData >>= x * 8; \
|
||||||
tileData >>= (7 - x) * 8; \
|
} \
|
||||||
} else { \
|
} else { \
|
||||||
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
if (x >= 4) { \
|
||||||
tileData >>= (3 - x) * 8; \
|
LOAD_32(tileData, charBase & VRAM_BLOCK_MASK, vram); \
|
||||||
} \
|
tileData >>= (7 - x) * 8; \
|
||||||
|
} else { \
|
||||||
|
LOAD_32(tileData, (charBase + 4) & VRAM_BLOCK_MASK, vram); \
|
||||||
|
tileData >>= (3 - x) * 8; \
|
||||||
} \
|
} \
|
||||||
tileData &= 0xFF; \
|
|
||||||
carryData = tileData; \
|
|
||||||
} \
|
} \
|
||||||
|
tileData &= 0xFF; \
|
||||||
|
carryData = tileData; \
|
||||||
mosaicWait = mosaicH; \
|
mosaicWait = mosaicH; \
|
||||||
} \
|
} \
|
||||||
tileData |= tileData << 8; \
|
tileData |= tileData << 8; \
|
||||||
|
|
|
@ -32,6 +32,8 @@ static void GBAVideoDummyRendererPutPixels(struct GBAVideoRenderer* renderer, si
|
||||||
static void _startHblank(struct mTiming*, void* context, uint32_t cyclesLate);
|
static void _startHblank(struct mTiming*, void* context, uint32_t cyclesLate);
|
||||||
static void _startHdraw(struct mTiming*, void* context, uint32_t cyclesLate);
|
static void _startHdraw(struct mTiming*, void* context, uint32_t cyclesLate);
|
||||||
|
|
||||||
|
static uint16_t _zeroes[0x2000] = {};
|
||||||
|
|
||||||
const int GBAVideoObjSizes[16][2] = {
|
const int GBAVideoObjSizes[16][2] = {
|
||||||
{ 8, 8 },
|
{ 8, 8 },
|
||||||
{ 16, 16 },
|
{ 16, 16 },
|
||||||
|
@ -103,6 +105,8 @@ void GBAVideoReset(struct GBAVideo* video) {
|
||||||
memset(video->renderer->vramOBJ, 0, sizeof(video->renderer->vramOBJ));
|
memset(video->renderer->vramOBJ, 0, sizeof(video->renderer->vramOBJ));
|
||||||
video->renderer->vramOBJ[0] = &video->vram[0x8000];
|
video->renderer->vramOBJ[0] = &video->vram[0x8000];
|
||||||
video->renderer->vramOBJ[1] = &video->vram[0xA000];
|
video->renderer->vramOBJ[1] = &video->vram[0xA000];
|
||||||
|
video->renderer->vramOBJ[2] = _zeroes;
|
||||||
|
video->renderer->vramOBJ[3] = _zeroes;
|
||||||
|
|
||||||
memset(video->palette, 0, sizeof(video->palette));
|
memset(video->palette, 0, sizeof(video->palette));
|
||||||
memset(video->oam.raw, 0, sizeof(video->oam.raw));
|
memset(video->oam.raw, 0, sizeof(video->oam.raw));
|
||||||
|
@ -129,6 +133,8 @@ void GBAVideoAssociateRenderer(struct GBAVideo* video, struct GBAVideoRenderer*
|
||||||
memset(renderer->vramOBJ, 0, sizeof(renderer->vramOBJ));
|
memset(renderer->vramOBJ, 0, sizeof(renderer->vramOBJ));
|
||||||
renderer->vramOBJ[0] = &video->vram[0x8000];
|
renderer->vramOBJ[0] = &video->vram[0x8000];
|
||||||
renderer->vramOBJ[1] = &video->vram[0xA000];
|
renderer->vramOBJ[1] = &video->vram[0xA000];
|
||||||
|
renderer->vramOBJ[2] = _zeroes;
|
||||||
|
renderer->vramOBJ[3] = _zeroes;
|
||||||
renderer->oam = &video->oam;
|
renderer->oam = &video->oam;
|
||||||
video->renderer->init(video->renderer);
|
video->renderer->init(video->renderer);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue