Implement the Super MegaZeux text mode.
This commit is contained in:
@@ -243,6 +243,8 @@ svga_render_text_80(svga_t *svga)
|
|||||||
p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
|
p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
|
||||||
xinc = (svga->seqregs[1] & 1) ? 8 : 9;
|
xinc = (svga->seqregs[1] & 1) ? 8 : 9;
|
||||||
|
|
||||||
|
uint32_t col = 0x00000000;
|
||||||
|
|
||||||
for (int x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) {
|
for (int x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) {
|
||||||
if (!svga->force_old_addr)
|
if (!svga->force_old_addr)
|
||||||
addr = svga->remap_func(svga, svga->memaddr) & svga->vram_display_mask;
|
addr = svga->remap_func(svga, svga->memaddr) & svga->vram_display_mask;
|
||||||
@@ -263,19 +265,57 @@ svga_render_text_80(svga_t *svga)
|
|||||||
charaddr = svga->charseta + (chr * 128);
|
charaddr = svga->charseta + (chr * 128);
|
||||||
|
|
||||||
if (drawcursor) {
|
if (drawcursor) {
|
||||||
bg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask];
|
bg = attr & 15;
|
||||||
fg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask];
|
fg = attr >> 4;
|
||||||
} else {
|
} else {
|
||||||
fg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask];
|
fg = attr & 15;
|
||||||
bg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask];
|
bg = attr >> 4;
|
||||||
if (attr & 0x80 && svga->attrregs[0x10] & 8) {
|
if (attr & 0x80 && svga->attrregs[0x10] & 8) {
|
||||||
bg = svga->pallook[svga->egapal[(attr >> 4) & 7] & svga->dac_mask];
|
bg = (attr >> 4) & 7;
|
||||||
if (svga->blink & 16)
|
if (svga->blink & 16)
|
||||||
fg = bg;
|
fg = bg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dat = svga->vram[charaddr + (svga->scanline << 2)];
|
dat = svga->vram[charaddr + (svga->scanline << 2)];
|
||||||
|
|
||||||
|
if (svga->attrregs[0x10] & 0x40) {
|
||||||
|
pclog("256-color text mode\n");
|
||||||
|
if (svga->seqregs[1] & 1) {
|
||||||
|
for (xx = 0; xx < 8; xx++) {
|
||||||
|
uint32_t col16 = (dat & (0x80 >> xx)) ? fg : bg;
|
||||||
|
if ((x + xx - svga->scrollcache) & 1) {
|
||||||
|
col |= col16;
|
||||||
|
if ((x + xx - 1) >= 0)
|
||||||
|
p[xx - 1] = svga->pallook[col & svga->dac_mask];
|
||||||
|
if ((x + xx) >= 0)
|
||||||
|
p[xx] = svga->pallook[col & svga->dac_mask];
|
||||||
|
} else
|
||||||
|
col = col16 << 4;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (xx = 0; xx < 9; xx++) {
|
||||||
|
uint32_t col16;
|
||||||
|
if (xx < 8)
|
||||||
|
col16 = (dat & (0x80 >> xx)) ? fg : bg;
|
||||||
|
else if ((chr & ~0x1F) != 0xC0 || !(svga->attrregs[0x10] & 4))
|
||||||
|
col16 = bg;
|
||||||
|
else
|
||||||
|
col16 = (dat & 1) ? fg : bg;
|
||||||
|
if ((x + xx - svga->scrollcache) & 1) {
|
||||||
|
col |= col16;
|
||||||
|
if ((x + xx - 1) >= 0)
|
||||||
|
p[xx - 1] = svga->pallook[col & svga->dac_mask];
|
||||||
|
if ((x + xx) >= 0)
|
||||||
|
p[xx] = svga->pallook[col & svga->dac_mask];
|
||||||
|
} else
|
||||||
|
col = col16 << 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fg = svga->pallook[svga->egapal[fg] & svga->dac_mask];
|
||||||
|
bg = svga->pallook[svga->egapal[bg] & svga->dac_mask];
|
||||||
|
|
||||||
if (svga->seqregs[1] & 1) {
|
if (svga->seqregs[1] & 1) {
|
||||||
for (xx = 0; xx < 8; xx++)
|
for (xx = 0; xx < 8; xx++)
|
||||||
p[xx] = (dat & (0x80 >> xx)) ? fg : bg;
|
p[xx] = (dat & (0x80 >> xx)) ? fg : bg;
|
||||||
@@ -287,6 +327,8 @@ svga_render_text_80(svga_t *svga)
|
|||||||
else
|
else
|
||||||
p[8] = (dat & 1) ? fg : bg;
|
p[8] = (dat & 1) ? fg : bg;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
svga->memaddr += 4;
|
svga->memaddr += 4;
|
||||||
p += xinc;
|
p += xinc;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user