apple2gs: pass TrueGS SHR Linearization test. [R. Belmont, Peter Ferrie, John Brooks]

This commit is contained in:
arbee 2021-07-26 21:08:40 -04:00
parent 7b5f61f8ff
commit 1b1bfc36a4
2 changed files with 104 additions and 29 deletions

View File

@ -510,7 +510,7 @@ private:
bool m_ioudis;
u8 m_shadow, m_speed, m_textcol;
u8 m_motors_active, m_slotromsel, m_intflag, m_vgcint, m_inten;
u8 m_motors_active, m_slotromsel, m_intflag, m_vgcint, m_inten, m_newvideo;
bool m_last_speed;
@ -1520,6 +1520,7 @@ void apple2gs_state::machine_start()
save_item(NAME(m_accel_temp_slowdown));
save_item(NAME(m_accel_speed));
save_item(NAME(m_motoroff_time));
save_item(NAME(m_newvideo));
}
void apple2gs_state::machine_reset()
@ -1541,6 +1542,7 @@ void apple2gs_state::machine_reset()
m_ramrd = false;
m_ramwrt = false;
m_ioudis = true;
m_newvideo = 0x01;
m_clock_frame = 0;
m_mouse_x = 0x00;
m_mouse_y = 0x00;
@ -1777,8 +1779,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2gs_state::apple2_interrupt)
if ((m_video->m_newvideo & 0x80) && (scanline >= (BORDER_TOP-1)) && (scanline < (200+BORDER_TOP-1)))
{
u8 scb;
const int shrline = scanline - BORDER_TOP + 1;
scb = m_megaii_ram[0x19d00 + scanline - BORDER_TOP + 1];
if (shrline & 1)
{
scb = m_megaii_ram[0x19e80 + (shrline >> 1)];
}
else
{
scb = m_megaii_ram[0x15e80 + (shrline >> 1)];
}
if (scb & 0x40)
{
@ -2476,7 +2486,7 @@ u8 apple2gs_state::c000_r(offs_t offset)
#endif
case 0x29: // NEWVIDEO
return m_video->m_newvideo;
return m_newvideo;
case 0x2d: // SLOTROMSEL
return m_slotromsel;
@ -2813,7 +2823,7 @@ void apple2gs_state::c000_w(offs_t offset, u8 data)
#endif
case 0x29: // NEWVIDEO
m_video->m_newvideo = data;
m_video->m_newvideo = m_newvideo = data;
break;
case 0x2d: // SLOTROMSEL
@ -3704,20 +3714,51 @@ u8 apple2gs_state::read_floatingbus()
u8 apple2gs_state::ram0000_r(offs_t offset) { slow_cycle(); return m_megaii_ram[offset]; }
void apple2gs_state::ram0000_w(offs_t offset, u8 data) { slow_cycle(); m_megaii_ram[offset] = data; }
u8 apple2gs_state::auxram0000_r(offs_t offset) { slow_cycle(); return m_megaii_ram[offset+0x10000]; }
void apple2gs_state::auxram0000_w(offs_t offset, u8 data)
u8 apple2gs_state::auxram0000_r(offs_t offset)
{
slow_cycle();
if ((offset >= 0x2000) && (offset < 0xa000) && ((m_newvideo & 0xc0) != 0))
{
if (offset & 1)
{
offset = ((offset - 0x2000) >> 1) + 0x6000;
}
else
{
offset = ((offset - 0x2000) >> 1) + 0x2000;
}
}
return m_megaii_ram[offset+0x10000];
}
void apple2gs_state::auxram0000_w(offs_t offset, u8 data)
{
u16 orig_addr = offset;
slow_cycle();
if ((offset >= 0x2000) && (offset < 0xa000) && ((m_newvideo & 0xc0) != 0))
{
if (offset & 1)
{
offset = ((offset - 0x2000) >> 1) + 0x6000;
}
else
{
offset = ((offset - 0x2000) >> 1) + 0x2000;
}
}
m_megaii_ram[offset+0x10000] = data;
if ((offset >= 0x9e00) && (offset <= 0x9fff))
if ((orig_addr >= 0x9e00) && (orig_addr <= 0x9fff))
{
int color = (offset - 0x9e00) >> 1;
int color = (orig_addr - 0x9e00) >> 1;
m_video->m_shr_palette[color] = rgb_t(
((m_megaii_ram[0x19E00 + (color * 2) + 1] >> 0) & 0x0F) * 17,
((m_megaii_ram[0x19E00 + (color * 2) + 0] >> 4) & 0x0F) * 17,
((m_megaii_ram[0x19E00 + (color * 2) + 0] >> 0) & 0x0F) * 17);
((m_megaii_ram[0x19f00 + color] >> 0) & 0x0f) * 17,
((m_megaii_ram[0x15f00 + color] >> 4) & 0x0f) * 17,
((m_megaii_ram[0x15f00 + color] >> 0) & 0x0f) * 17);
}
}
@ -3895,8 +3936,7 @@ void apple2gs_state::bank1_0000_sh_w(offs_t offset, u8 data)
case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
if ((!(m_shadow & SHAD_HIRESPG1) && !(m_shadow & SHAD_AUXHIRES)) || (!(m_shadow & SHAD_SUPERHIRES)))
{
slow_cycle();
m_megaii_ram[offset + 0x10000] = data;
auxram0000_w(offset, data);
}
break;
@ -3907,8 +3947,7 @@ void apple2gs_state::bank1_0000_sh_w(offs_t offset, u8 data)
case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
if ((!(m_shadow & SHAD_HIRESPG2) && !(m_shadow & SHAD_AUXHIRES)) || (!(m_shadow & SHAD_SUPERHIRES)))
{
slow_cycle();
m_megaii_ram[offset + 0x10000] = data;
auxram0000_w(offset, data);
}
break;

View File

@ -1485,10 +1485,20 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
{
int const shrline = beamy - BORDER_TOP;
uint8_t const scb = m_aux_ptr[0x9D00 + shrline];
uint8_t scb;
if (shrline & 1)
{
scb = m_aux_ptr[0x9e80 + (shrline >> 1)];
}
else
{
scb = m_aux_ptr[0x5e80 + (shrline >> 1)];
}
int const palette = ((scb & 0x0f) << 4);
uint8_t const *const vram = &m_aux_ptr[0x2000 + (shrline * 160)];
uint8_t const *const vram = &m_aux_ptr[0x2000 + (shrline * 80)];
uint8_t const *const vram2 = &m_aux_ptr[0x6000 + (shrline * 80)];
uint32_t *const scanline = &bitmap.pix(beamy);
// draw left and right borders
@ -1500,13 +1510,19 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
if (scb & 0x80) // 640 mode
{
for (int col = 0; col < 160; col++)
for (int col = 0; col < 80; col++)
{
uint8_t const b = vram[col];
scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[palette + 0 + ((b >> 6) & 0x03)];
scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[palette + 4 + ((b >> 4) & 0x03)];
scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[palette + 8 + ((b >> 2) & 0x03)];
scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
uint8_t b = vram[col];
scanline[col * 8 + 0 + BORDER_LEFT] = m_shr_palette[palette + 0 + ((b >> 6) & 0x03)];
scanline[col * 8 + 1 + BORDER_LEFT] = m_shr_palette[palette + 4 + ((b >> 4) & 0x03)];
scanline[col * 8 + 2 + BORDER_LEFT] = m_shr_palette[palette + 8 + ((b >> 2) & 0x03)];
scanline[col * 8 + 3 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
b = vram2[col];
scanline[col * 8 + 4 + BORDER_LEFT] = m_shr_palette[palette + 0 + ((b >> 6) & 0x03)];
scanline[col * 8 + 5 + BORDER_LEFT] = m_shr_palette[palette + 4 + ((b >> 4) & 0x03)];
scanline[col * 8 + 6 + BORDER_LEFT] = m_shr_palette[palette + 8 + ((b >> 2) & 0x03)];
scanline[col * 8 + 7 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
}
}
else // 320 mode
@ -1520,7 +1536,7 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
};
uint32_t last_pixel = fillmode_init[scb & 0x1f];
for (int col = 0; col < 160; col++)
for (int col = 0; col < 80; col++)
{
uint8_t b;
uint32_t pixel;
@ -1533,10 +1549,9 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
else
last_pixel = pixel;
pixel += palette;
scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 8 + 0 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 8 + 1 + BORDER_LEFT] = m_shr_palette[pixel];
b = vram[col];
pixel = (b >> 0) & 0x0f;
if ((scb & 0x20) && !pixel)
@ -1544,8 +1559,29 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
else
last_pixel = pixel;
pixel += palette;
scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 8 + 2 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 8 + 3 + BORDER_LEFT] = m_shr_palette[pixel];
b = vram2[col];
pixel = (b >> 4) & 0x0f;
if ((scb & 0x20) && !pixel)
pixel = last_pixel;
else
last_pixel = pixel;
pixel += palette;
scanline[col * 8 + 4 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 8 + 5 + BORDER_LEFT] = m_shr_palette[pixel];
pixel = (b >> 0) & 0x0f;
if ((scb & 0x20) && !pixel)
pixel = last_pixel;
else
last_pixel = pixel;
pixel += palette;
scanline[col * 8 + 6 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 8 + 7 + BORDER_LEFT] = m_shr_palette[pixel];
}
}
}