mirror of
https://github.com/holub/mame
synced 2025-04-20 07:22:04 +03:00
apple2gs: pass TrueGS SHR Linearization test. [R. Belmont, Peter Ferrie, John Brooks]
This commit is contained in:
parent
7b5f61f8ff
commit
1b1bfc36a4
@ -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;
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user