Merge copies of text_update and plot_text_character in a2_video_device (#10766)

a2_video_device::{text_update,plot_text_character} already had a
template parameter to distinguish II/II+ from IIe/IIc. Extending it
enables {text_update,plot_text_character}{_ultr,_jplus,GS} to be merged
in as well.
This commit is contained in:
benrg 2022-12-31 16:54:07 -08:00 committed by GitHub
parent d81c9d3824
commit 93500d7e6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 295 deletions

View File

@ -119,7 +119,7 @@ public:
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
template <bool invert, bool flip> template <bool Invert, bool Flip>
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_jp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update_jp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_ultr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update_ultr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -373,7 +373,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2_state::apple2_interrupt)
} }
} }
template <bool invert, bool flip> template <bool Invert, bool Flip>
u32 apple2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) u32 apple2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
// always update the flash timer here so it's smooth regardless of mode switches // always update the flash timer here so it's smooth regardless of mode switches
@ -386,7 +386,7 @@ u32 apple2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con
if (m_video->m_mix) if (m_video->m_mix)
{ {
m_video->hgr_update(screen, bitmap, cliprect, 0, 159); m_video->hgr_update(screen, bitmap, cliprect, 0, 159);
m_video->text_update<false, invert, flip>(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::II, Invert, Flip>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -398,7 +398,7 @@ u32 apple2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con
if (m_video->m_mix) if (m_video->m_mix)
{ {
m_video->lores_update(screen, bitmap, cliprect, 0, 159); m_video->lores_update(screen, bitmap, cliprect, 0, 159);
m_video->text_update<false, invert, flip>(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::II, Invert, Flip>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -408,7 +408,7 @@ u32 apple2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con
} }
else else
{ {
m_video->text_update<false, invert, flip>(screen, bitmap, cliprect, 0, 191); m_video->text_update<a2_video_device::model::II, Invert, Flip>(screen, bitmap, cliprect, 0, 191);
} }
return 0; return 0;
@ -426,7 +426,7 @@ u32 apple2_state::screen_update_jp(screen_device &screen, bitmap_ind16 &bitmap,
if (m_video->m_mix) if (m_video->m_mix)
{ {
m_video->hgr_update(screen, bitmap, cliprect, 0, 159); m_video->hgr_update(screen, bitmap, cliprect, 0, 159);
m_video->text_update_jplus(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::II_J_PLUS, true, true>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -438,7 +438,7 @@ u32 apple2_state::screen_update_jp(screen_device &screen, bitmap_ind16 &bitmap,
if (m_video->m_mix) if (m_video->m_mix)
{ {
m_video->lores_update(screen, bitmap, cliprect, 0, 159); m_video->lores_update(screen, bitmap, cliprect, 0, 159);
m_video->text_update_jplus(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::II_J_PLUS, true, true>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -448,7 +448,7 @@ u32 apple2_state::screen_update_jp(screen_device &screen, bitmap_ind16 &bitmap,
} }
else else
{ {
m_video->text_update_jplus(screen, bitmap, cliprect, 0, 191); m_video->text_update<a2_video_device::model::II_J_PLUS, true, true>(screen, bitmap, cliprect, 0, 191);
} }
return 0; return 0;
@ -466,7 +466,7 @@ u32 apple2_state::screen_update_ultr(screen_device &screen, bitmap_ind16 &bitmap
if (m_video->m_mix) if (m_video->m_mix)
{ {
m_video->hgr_update(screen, bitmap, cliprect, 0, 159); m_video->hgr_update(screen, bitmap, cliprect, 0, 159);
m_video->text_update_ultr(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::IVEL_ULTRA, true, false>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -478,7 +478,7 @@ u32 apple2_state::screen_update_ultr(screen_device &screen, bitmap_ind16 &bitmap
if (m_video->m_mix) if (m_video->m_mix)
{ {
m_video->lores_update(screen, bitmap, cliprect, 0, 159); m_video->lores_update(screen, bitmap, cliprect, 0, 159);
m_video->text_update_ultr(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::IVEL_ULTRA, true, false>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -488,7 +488,7 @@ u32 apple2_state::screen_update_ultr(screen_device &screen, bitmap_ind16 &bitmap
} }
else else
{ {
m_video->text_update_ultr(screen, bitmap, cliprect, 0, 191); m_video->text_update<a2_video_device::model::IVEL_ULTRA, true, false>(screen, bitmap, cliprect, 0, 191);
} }
return 0; return 0;

View File

@ -290,7 +290,7 @@ public:
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
template <bool invert, bool flip> template <bool Invert, bool Flip>
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_ff(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return screen_update<false, false>(screen, bitmap, cliprect); } u32 screen_update_ff(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return screen_update<false, false>(screen, bitmap, cliprect); }
@ -1351,7 +1351,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2e_state::apple2_interrupt)
} }
} }
template<bool invert, bool flip> template <bool Invert, bool Flip>
u32 apple2e_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) u32 apple2e_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
bool old_page2 = m_video->m_page2; bool old_page2 = m_video->m_page2;
@ -1380,7 +1380,7 @@ u32 apple2e_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co
m_video->hgr_update(screen, bitmap, cliprect, 0, 159); m_video->hgr_update(screen, bitmap, cliprect, 0, 159);
} }
m_video->text_update<true, invert, flip>(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::IIE, Invert, Flip>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -1407,7 +1407,7 @@ u32 apple2e_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co
m_video->lores_update(screen, bitmap, cliprect, 0, 159); m_video->lores_update(screen, bitmap, cliprect, 0, 159);
} }
m_video->text_update<true, invert, flip>(screen, bitmap, cliprect, 160, 191); m_video->text_update<a2_video_device::model::IIE, Invert, Flip>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -1424,7 +1424,7 @@ u32 apple2e_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co
} }
else else
{ {
m_video->text_update<true, invert, flip>(screen, bitmap, cliprect, 0, 191); m_video->text_update<a2_video_device::model::IIE, Invert, Flip>(screen, bitmap, cliprect, 0, 191);
} }
m_video->m_page2 = old_page2; m_video->m_page2 = old_page2;

View File

@ -195,10 +195,10 @@ WRITE_LINE_MEMBER(a2_video_device::an2_w)
m_an2 = state; m_an2 = state;
} }
template<bool iie, bool invert, bool flip> template <a2_video_device::model Model, bool Invert, bool Flip>
void a2_video_device::plot_text_character(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg) void a2_video_device::plot_text_character(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg)
{ {
if (iie) // IIe/IIc/IIgs if (Model == model::IIE || Model == model::IIGS)
{ {
if (!m_altcharset) if (!m_altcharset)
{ {
@ -213,6 +213,10 @@ void a2_video_device::plot_text_character(bitmap_ind16 &bitmap, int xpos, int yp
} }
} }
} }
else if (Model == model::IIGS)
{
code |= 0x100;
}
else else
{ {
if ((code >= 0x60) && (code <= 0x7f)) if ((code >= 0x60) && (code <= 0x7f))
@ -227,79 +231,31 @@ void a2_video_device::plot_text_character(bitmap_ind16 &bitmap, int xpos, int yp
{ {
if ((code >= 0x40) && (code <= 0x7f)) if ((code >= 0x40) && (code <= 0x7f))
{ {
if (Model == model::II_J_PLUS)
{
code &= 0x3f;
}
if (m_flash) if (m_flash)
{ {
using std::swap; using std::swap;
swap(fg, bg); swap(fg, bg);
} }
} }
else if (code < 0x40) // inverse: flip FG and BG else if (code < 0x40 && Model != model::IVEL_ULTRA) // inverse: flip FG and BG
{ {
using std::swap; using std::swap;
swap(fg, bg); swap(fg, bg);
} }
}
/* look up the character data */ if (Model == model::II_J_PLUS && m_an2)
u8 const *const chardata = &m_char_ptr[(code * 8)];
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 7; x++)
{ {
u16 color; code |= 0x80;
// flip and invert are template parameters, so the compiler will boil this down appropriately
if (flip)
{
if (invert)
{
color = (chardata[y] & (1 << (6 - x))) ? fg : bg;
}
else
{
color = (chardata[y] & (1 << (6 - x))) ? bg : fg;
}
}
else
{
if (invert)
{
color = (chardata[y] & (1 << x)) ? fg : bg;
}
else
{
color = (chardata[y] & (1 << x)) ? bg : fg;
}
}
for (int i = 0; i < xscale; i++)
{
bitmap.pix(ypos + y, xpos + (x * xscale) + i) = color;
}
} }
} }
}
void a2_video_device::plot_text_character_jplus(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg) if (Invert)
{
if ((code >= 0x40) && (code <= 0x7f))
{ {
code &= 0x3f; std::swap(fg, bg);
if (m_flash)
{
using std::swap;
swap(fg, bg);
}
}
else if (code < 0x40) // inverse: flip FG and BG
{
using std::swap;
swap(fg, bg);
}
if (m_an2)
{
code |= 0x80;
} }
/* look up the character data */ /* look up the character data */
@ -309,72 +265,9 @@ void a2_video_device::plot_text_character_jplus(bitmap_ind16 &bitmap, int xpos,
{ {
for (int x = 0; x < 7; x++) for (int x = 0; x < 7; x++)
{ {
uint16_t const color = (chardata[y] & (1 << (6-x))) ? fg : bg; // Model and Flip are template parameters, so the compiler will boil this down appropriately
unsigned const bit = (Model == model::IVEL_ULTRA) ? (2 << x) : Flip ? (64 >> x) : (1 << x);
for (int i = 0; i < xscale; i++) uint16_t const color = (chardata[y] & bit) ? bg : fg;
{
bitmap.pix(ypos + y, xpos + (x * xscale) + i) = color;
}
}
}
}
void a2_video_device::plot_text_character_ultr(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg)
{
if ((code >= 0x40) && (code <= 0x7f))
{
if (m_flash)
{
using std::swap;
swap(fg, bg);
}
}
/* look up the character data */
uint8_t const *const chardata = &m_char_ptr[(code * 8)];
for (int y = 0; y < 8; y++)
{
for (int x = 1; x < 8; x++)
{
uint16_t const color = (chardata[y] & (1 << x)) ? fg : bg;
for (int i = 0; i < xscale; i++)
{
bitmap.pix(ypos + y, xpos + ((x-1) * xscale) + i) = color;
}
}
}
}
void a2_video_device::plot_text_characterGS(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg)
{
if (!m_altcharset)
{
if ((code >= 0x40) && (code <= 0x7f))
{
code &= 0x3f;
if (m_flash)
{
using std::swap;
swap(fg, bg);
}
}
}
else
{
code |= 0x100;
}
/* look up the character data */
uint8_t const *const chardata = &m_char_ptr[(code * 8)];
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 7; x++)
{
uint16_t const color = (chardata[y] & (1 << x)) ? bg : fg;
for (int i = 0; i < xscale; i++) for (int i = 0; i < xscale; i++)
{ {
@ -696,7 +589,7 @@ void a2_video_device::dlores_update(screen_device &screen, bitmap_ind16 &bitmap,
} }
} }
template<bool iie, bool invert, bool flip> template <a2_video_device::model Model, bool Invert, bool Flip>
void a2_video_device::text_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow) void a2_video_device::text_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
{ {
uint8_t const *const aux_page = m_aux_ptr ? m_aux_ptr : m_ram_ptr; uint8_t const *const aux_page = m_aux_ptr ? m_aux_ptr : m_ram_ptr;
@ -713,38 +606,34 @@ void a2_video_device::text_update(screen_device &screen, bitmap_ind16 &bitmap, c
// printf("TXT: row %d startcol %d stopcol %d left %d right %d\n", beginrow, startcol, stopcol, cliprect.left(), cliprect.right()); // printf("TXT: row %d startcol %d stopcol %d left %d right %d\n", beginrow, startcol, stopcol, cliprect.left(), cliprect.right());
int fg = 0; int fg, bg;
int bg = 0; if (Model == model::IIGS)
switch (m_sysconfig & 0x03)
{ {
case 0: fg = m_GSfg;
case 4: bg = m_GSbg;
fg = WHITE; }
break; else
case 1: {
fg = WHITE; switch (m_sysconfig & 0x03)
break; {
case 2: case 2: fg = GREEN; break;
fg = GREEN; case 3: fg = ORANGE; break;
break; default: fg = WHITE; break;
case 3: }
fg = ORANGE; bg = 0;
break;
} }
for (int row = startrow; row < stoprow; row += 8) for (int row = startrow; row < stoprow; row += 8)
{ {
if ((iie) && (m_80col)) if ((Model == model::IIE || Model == model::IIGS) && m_80col)
{ {
for (int col = startcol; col < stopcol; col++) for (int col = startcol; col < stopcol; col++)
{ {
/* calculate address */ /* calculate address */
uint32_t const address = start_address + ((((row / 8) & 0x07) << 7) | (((row / 8) & 0x18) * 5 + col)); uint32_t const address = start_address + ((((row / 8) & 0x07) << 7) | (((row / 8) & 0x18) * 5 + col));
uint32_t const aux_address = (Model == model::IIGS) ? address : (address & m_aux_mask);
plot_text_character<true, invert, flip>(bitmap, col * 14, row, 1, aux_page[address & m_aux_mask], plot_text_character<Model, Invert, Flip>(bitmap, col * 14, row, 1, aux_page[aux_address], fg, bg);
fg, bg); plot_text_character<Model, Invert, Flip>(bitmap, col * 14 + 7, row, 1, m_ram_ptr[address], fg, bg);
plot_text_character<true, invert, flip>(bitmap, col * 14 + 7, row, 1, m_ram_ptr[address],
fg, bg);
} }
} }
else else
@ -753,93 +642,30 @@ void a2_video_device::text_update(screen_device &screen, bitmap_ind16 &bitmap, c
{ {
/* calculate address */ /* calculate address */
uint32_t const address = start_address + ((((row / 8) & 0x07) << 7) | (((row / 8) & 0x18) * 5 + col)); uint32_t const address = start_address + ((((row / 8) & 0x07) << 7) | (((row / 8) & 0x18) * 5 + col));
if (((m_sysconfig & 7) == 4) && (m_dhires)) if ((Model == model::II || Model == model::IIE) && (m_sysconfig & 7) == 4 && m_dhires)
{ {
u8 tmp = aux_page[address]; u8 tmp = aux_page[address];
fg = tmp >> 4; fg = tmp >> 4;
bg = tmp & 0xf; bg = tmp & 0xf;
} }
plot_text_character<iie, invert, flip>(bitmap, col * 14, row, 2, m_ram_ptr[address], fg, bg); plot_text_character<Model, Invert, Flip>(bitmap, col * 14, row, 2, m_ram_ptr[address], fg, bg);
} }
} }
} }
} }
template void a2_video_device::text_update<false, true, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::II, true, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<false, true, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::II, true, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<false, false, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::II, false, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<false, false, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::II, false, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<true, true, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::IIE, true, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<true, true, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::IIE, true, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<true, false, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::IIE, false, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<true, false, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); template void a2_video_device::text_update<a2_video_device::model::IIE, false, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
template void a2_video_device::text_update<a2_video_device::model::IIGS, false, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
void a2_video_device::text_update_jplus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow) template void a2_video_device::text_update<a2_video_device::model::II_J_PLUS, true, true>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
{ template void a2_video_device::text_update<a2_video_device::model::IVEL_ULTRA, true, false>(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
int row, col;
uint32_t start_address = m_page2 ? 0x800 : 0x400;
uint32_t address;
int fg = 0;
int bg = 0;
beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8));
endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7);
const int startrow = (beginrow / 8) * 8;
const int stoprow = ((endrow / 8) + 1) * 8;
switch (m_sysconfig & 0x03)
{
case 0: fg = WHITE; break;
case 1: fg = WHITE; break;
case 2: fg = GREEN; break;
case 3: fg = ORANGE; break;
}
for (row = startrow; row <= stoprow; row += 8)
{
for (col = 0; col < 40; col++)
{
/* calculate address */
address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
plot_text_character_jplus(bitmap, col * 14, row, 2, m_ram_ptr[address], fg, bg);
}
}
}
void a2_video_device::text_update_ultr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
{
int row, col;
uint32_t start_address = m_page2 ? 0x800 : 0x400;
uint32_t address;
int fg = 0;
int bg = 0;
beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8));
endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7);
const int startrow = (beginrow / 8) * 8;
const int stoprow = ((endrow / 8) + 1) * 8;
switch (m_sysconfig & 0x03)
{
case 0: fg = WHITE; break;
case 1: fg = WHITE; break;
case 2: fg = GREEN; break;
case 3: fg = ORANGE; break;
}
for (row = startrow; row <= stoprow; row += 8)
{
for (col = 0; col < 40; col++)
{
/* calculate address */
address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
plot_text_character_ultr(bitmap, col * 14, row, 2, m_ram_ptr[address], fg, bg);
}
}
}
void a2_video_device::hgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow) void a2_video_device::hgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
{ {
@ -1439,7 +1265,7 @@ uint32_t a2_video_device::screen_update_GS_8bit(screen_device &screen, bitmap_in
{ {
hgr_update(screen, bitmap, cliprect, 0, 159); hgr_update(screen, bitmap, cliprect, 0, 159);
} }
text_updateGS(screen, bitmap, cliprect, 160, 191); text_update<model::IIGS, false, false>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -1466,7 +1292,7 @@ uint32_t a2_video_device::screen_update_GS_8bit(screen_device &screen, bitmap_in
lores_update(screen, bitmap, cliprect, 0, 159); lores_update(screen, bitmap, cliprect, 0, 159);
} }
text_updateGS(screen, bitmap, cliprect, 160, 191); text_update<model::IIGS, false, false>(screen, bitmap, cliprect, 160, 191);
} }
else else
{ {
@ -1483,54 +1309,10 @@ uint32_t a2_video_device::screen_update_GS_8bit(screen_device &screen, bitmap_in
} }
else else
{ {
text_updateGS(screen, bitmap, cliprect, cliprect.top(), cliprect.bottom()); text_update<model::IIGS, false, false>(screen, bitmap, cliprect, cliprect.top(), cliprect.bottom());
} }
m_page2 = old_page2; m_page2 = old_page2;
return 0; return 0;
} }
void a2_video_device::text_updateGS(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
{
uint8_t const *const aux_page = m_aux_ptr ? m_aux_ptr : m_ram_ptr;
uint32_t const start_address = m_page2 ? 0x800 : 0x400;
beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8));
endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7);
const int startrow = (beginrow / 8) * 8;
const int stoprow = ((endrow / 8) + 1) * 8;
const int startcol = (cliprect.left() / 14);
const int stopcol = ((cliprect.right() / 14) + 1);
//printf("TXT: row %d startcol %d stopcol %d left %d right %d\n", beginrow, startcol, stopcol, cliprect.left(), cliprect.right());
for (int row = startrow; row < stoprow; row += 8)
{
if (m_80col)
{
for (int col = startcol; col < stopcol; col++)
{
/* calculate address */
uint32_t const address = start_address + ((((row / 8) & 0x07) << 7) | (((row / 8) & 0x18) * 5 + col));
plot_text_characterGS(bitmap, col * 14, row, 1, aux_page[address],
m_GSfg, m_GSbg);
plot_text_characterGS(bitmap, col * 14 + 7, row, 1, m_ram_ptr[address],
m_GSfg, m_GSbg);
}
}
else
{
for (int col = startcol; col < stopcol; col++)
{
/* calculate address */
uint32_t const address = start_address + ((((row / 8) & 0x07) << 7) | (((row / 8) & 0x18) * 5 + col));
plot_text_characterGS(bitmap, col * 14, row, 2, m_ram_ptr[address], m_GSfg, m_GSbg);
}
}
}
}

View File

@ -51,12 +51,12 @@ public:
DECLARE_WRITE_LINE_MEMBER(dhires_w); DECLARE_WRITE_LINE_MEMBER(dhires_w);
DECLARE_WRITE_LINE_MEMBER(an2_w); DECLARE_WRITE_LINE_MEMBER(an2_w);
template<bool iie, bool invert, bool flip> // Models with different text-mode behavior. II includes the II+ and IIE includes the IIc and IIc Plus.
enum class model { II, IIE, IIGS, II_J_PLUS, IVEL_ULTRA };
template <model Model, bool Invert, bool Flip>
void text_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); void text_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
void text_update_ultr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
void text_update_jplus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
void text_updateGS(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
void lores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); void lores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
void dlores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); void dlores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
void hgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow); void hgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
@ -73,11 +73,8 @@ protected:
void init_palette(); void init_palette();
private: private:
template <bool iie, bool invert, bool flip> template <model Model, bool Invert, bool Flip>
void plot_text_character(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg); void plot_text_character(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg);
void plot_text_character_ultr(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg);
void plot_text_character_jplus(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg);
void plot_text_characterGS(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, uint32_t code, int fg, int bg);
}; };
// device type definition // device type definition