From 1b1bfc36a4ad7ae95c3fe8de8bd08dc5ec981364 Mon Sep 17 00:00:00 2001 From: arbee Date: Mon, 26 Jul 2021 21:08:40 -0400 Subject: apple2gs: pass TrueGS SHR Linearization test. [R. Belmont, Peter Ferrie, John Brooks] --- src/mame/drivers/apple2gs.cpp | 67 ++++++++++++++++++++++++++++++++++--------- src/mame/video/apple2.cpp | 64 ++++++++++++++++++++++++++++++++--------- 2 files changed, 103 insertions(+), 28 deletions(-) diff --git a/src/mame/drivers/apple2gs.cpp b/src/mame/drivers/apple2gs.cpp index 9297b828f8a..0e1b3022244 100644 --- a/src/mame/drivers/apple2gs.cpp +++ b/src/mame/drivers/apple2gs.cpp @@ -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]; } +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; diff --git a/src/mame/video/apple2.cpp b/src/mame/video/apple2.cpp index d99d3496a75..92590c9ae2d 100644 --- a/src/mame/video/apple2.cpp +++ b/src/mame/video/apple2.cpp @@ -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,30 @@ 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]; + + pixel = (b >> 0) & 0x0f; + + if ((scb & 0x20) && !pixel) + pixel = last_pixel; + else + last_pixel = pixel; + pixel += palette; + 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]; - b = vram[col]; pixel = (b >> 0) & 0x0f; if ((scb & 0x20) && !pixel) @@ -1544,8 +1580,8 @@ 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 + 6 + BORDER_LEFT] = m_shr_palette[pixel]; + scanline[col * 8 + 7 + BORDER_LEFT] = m_shr_palette[pixel]; } } } -- cgit v1.2.3