capcom: Adjust the common screen timings on old capcom games [O. Galibert, Jotego]

This commit is contained in:
Olivier Galibert 2021-05-17 11:20:22 +02:00
parent 2f10c2ee2e
commit 989e9a5ee7
20 changed files with 88 additions and 60 deletions

View File

@ -238,7 +238,7 @@ public:
m_vblank = m_refresh / vtotal * (vtotal - (vbstart - vbend));
m_width = htotal;
m_height = vtotal;
m_visarea.set(hbend, hbstart - 1, vbend, vbstart - 1);
m_visarea.set(hbend, hbstart ? hbstart - 1 : htotal - 1, vbend, vbstart - 1);
return *this;
}
screen_device &set_raw(const XTAL &xtal, u16 htotal, u16 hbend, u16 hbstart, u16 vtotal, u16 vbend, u16 vbstart)

View File

@ -513,10 +513,7 @@ void _1942_state::_1942(machine_config &config)
PALETTE(config, m_palette, FUNC(_1942_state::_1942_palette), 64*4+4*32*8+16*16, 256);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(32*8, 32*8);
m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
m_screen->set_raw(MASTER_CLOCK/2, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
m_screen->set_screen_update(FUNC(_1942_state::screen_update));
m_screen->set_palette(m_palette);
@ -576,10 +573,7 @@ void _1942p_state::_1942p(machine_config &config)
PALETTE(config, m_palette, FUNC(_1942p_state::_1942p_palette), 0x500, 0x400);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(32*8, 32*8);
m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
m_screen->set_raw(MASTER_CLOCK/2, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
m_screen->set_screen_update(FUNC(_1942p_state::screen_update));
m_screen->set_palette(m_palette);

View File

@ -28,7 +28,6 @@
- use priority PROM for drawing sprites
- find and dump an unmodified bme01.12d to correct the 1943 Euro set
- Accurate interrupt handling
- Screen raw parameters
Notes:
@ -297,10 +296,7 @@ void _1943_state::_1943(machine_config &config)
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(32*8, 32*8);
m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
m_screen->set_raw(XTAL(24'000'000)/4, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
m_screen->set_screen_update(FUNC(_1943_state::screen_update));
m_screen->set_palette(m_palette);

View File

@ -401,6 +401,13 @@ void bionicc_state::video_start()
m_fg_tilemap->set_transmask(0, 0xffff, 0x8000); /* split type 0 is completely transparent in front half */
m_fg_tilemap->set_transmask(1, 0xffc1, 0x803e); /* split type 1 has pens 1-5 opaque in front half */
m_bg_tilemap->set_transparent_pen(15);
m_tx_tilemap->set_scrolldx(128, 128);
m_tx_tilemap->set_scrolldy( 6, 6);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
}
@ -649,8 +656,7 @@ void bionicc_state::bionicc(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
/* FIXME: should be 257 visible horizontal pixels, first visible pixel should be repeated, back porch/front porch should be separated */
screen.set_raw(24_MHz_XTAL / 4, 386, 0, 256, 260, 16, 240);
screen.set_raw(24_MHz_XTAL / 4, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(bionicc_state::screen_update));
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);

View File

@ -310,10 +310,7 @@ void blktiger_state::blktiger(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_raw(24_MHz_XTAL / 4, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(blktiger_state::screen_update_blktiger));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram8_device::vblank_copy_rising));
screen.set_palette(m_palette);

View File

@ -46,7 +46,7 @@ Note : there is an ingame typo bug that doesn't display the bonus life values
// Notes by Jose Tejada (jotego):
// The main CPU frequency is 3 MHz, after a two-stage FF clock divider.
// The CPU clock is gated by bus arbitrion logic. The CPU clock is halted until
// The CPU clock is gated by bus arbitration logic. The CPU clock is halted until
// video hardware has an opening in memory access, then the CPU is allowed to
// access common memory. This slows down the CPU but doesn't alter its basic 3MHz frequency.
//
@ -278,10 +278,7 @@ void commando_state::commando(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_raw(XTAL / 2, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(commando_state::screen_update_commando));
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
screen.screen_vblank().append(FUNC(commando_state::vblank_irq));

View File

@ -408,10 +408,7 @@ void gng_state::gng(machine_config &config)
BUFFERED_SPRITERAM8(config, m_spriteram);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(59.59); /* verified on pcb */
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_raw(XTAL(12'000'000)/2, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(gng_state::screen_update_gng));
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
screen.set_palette(m_palette);

View File

@ -316,14 +316,11 @@ void gunsmoke_state::gunsmoke(machine_config &config)
z80_device &audiocpu(Z80(config, "audiocpu", 3000000)); // 3 MHz
audiocpu.set_addrmap(AS_PROGRAM, &gunsmoke_state::sound_map);
audiocpu.set_periodic_int(FUNC(gunsmoke_state::irq0_line_hold), attotime::from_hz(4*59.63));
audiocpu.set_periodic_int(FUNC(gunsmoke_state::irq0_line_hold), attotime::from_ticks(384*262/4, 6000000));
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(59.63);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_raw(6000000, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(gunsmoke_state::screen_update_gunsmoke));
screen.set_palette(m_palette);

View File

@ -131,6 +131,12 @@ void supduck_state::video_start()
m_text_tilemap->set_transparent_pen(0x3);
m_fore_tilemap->set_transparent_pen(0xf);
m_text_tilemap->set_scrolldx(128, 128);
m_text_tilemap->set_scrolldy( 6, 6);
m_fore_tilemap->set_scrolldx(128, 128);
m_fore_tilemap->set_scrolldy( 6, 6);
m_back_tilemap->set_scrolldx(128, 128);
m_back_tilemap->set_scrolldy( 6, 6);
}
uint32_t supduck_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@ -425,11 +431,8 @@ void supduck_state::supduck(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
screen.set_raw(6000000, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(supduck_state::screen_update));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_palette(m_palette);
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));

View File

@ -632,11 +632,9 @@ void tigeroad_state::tigeroad(machine_config &config)
// video hardware
BUFFERED_SPRITERAM16(config, "spriteram");
// Timings may be different, driver originally had 60.08Hz vblank.
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60.08); // verified on pcb
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_raw(6000000, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(tigeroad_state::screen_update));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@ -715,10 +713,7 @@ void tigeroad_state::f1dream_comad(machine_config &config)
BUFFERED_SPRITERAM16(config, "spriteram");
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60.08); // verified on pcb
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_raw(6000000, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(tigeroad_state::screen_update));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);

View File

@ -229,10 +229,7 @@ void vulgus_state::vulgus(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(59.59);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_raw(XTAL(12'000'000)/2, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(vulgus_state::screen_update));
screen.set_palette(m_palette);

View File

@ -135,6 +135,11 @@ void _1942_state::video_start()
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(_1942_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 16);
m_fg_tilemap->set_transparent_pen(0);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
}
void _1942p_state::video_start()
@ -143,6 +148,11 @@ void _1942p_state::video_start()
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(_1942_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 16);
m_fg_tilemap->set_transparent_pen(3);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
}
@ -225,7 +235,7 @@ void _1942_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const rectangle cliprecty(cliprect.min_x, cliprect.max_x, y, y);
uint8_t objdata[4];
uint8_t v = flip_screen() ? ~(y - 1) : y - 1;
uint8_t v = flip_screen() ? ~(y - 1 - 6) : y - 1 - 6;
for (int h = 496; h >= 128; h -= 16)
{
const bool objcnt4 = BIT(h, 8) != BIT(~h, 7);
@ -283,7 +293,7 @@ void _1942_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
do
{
m_gfxdecode->gfx(2)->transpen(bitmap, cliprecty, code + i, col, flip_screen(), flip_screen(), sx, sy + 16 * i * dir, 15);
m_gfxdecode->gfx(2)->transpen(bitmap, cliprecty, code + i, col, flip_screen(), flip_screen(), sx+128, sy + 6 + 16 * i * dir, 15);
} while (i-- > 0);
}
}
@ -319,7 +329,7 @@ void _1942p_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
sy = 240 - sy;
}
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect, code, col, flip_screen(), flip_screen(), sx, sy, 15);
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect, code, col, flip_screen(), flip_screen(), sx+128, sy+6, 15);
}
}

View File

@ -202,6 +202,13 @@ void _1943_state::video_start()
m_bg_tilemap->configure_groups(*m_gfxdecode->gfx(1), 0x0f);
m_fg_tilemap->set_transparent_pen(0);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_bg2_tilemap->set_scrolldx(128, 128);
m_bg2_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
save_item(NAME(m_char_on));
save_item(NAME(m_obj_on));
save_item(NAME(m_bg1_on));
@ -298,7 +305,7 @@ void _1943_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
sy = 240 - sy;
}
_1943_drawgfx(bitmap,cliprect, m_gfxdecode->gfx(3), code, color, flip_screen(), flip_screen(), sx, sy, 0);
_1943_drawgfx(bitmap,cliprect, m_gfxdecode->gfx(3), code, color, flip_screen(), flip_screen(), sx+128, sy+6, 0);
}
}

View File

@ -86,6 +86,13 @@ void blktiger_state::video_start()
m_bg_tilemap4x8->set_transmask(2, 0xff00, 0x80ff);
m_bg_tilemap4x8->set_transmask(3, 0xf000, 0x8fff);
m_tx_tilemap->set_scrolldx(128, 128);
m_tx_tilemap->set_scrolldy( 6, 6);
m_bg_tilemap8x4->set_scrolldx(128, 128);
m_bg_tilemap8x4->set_scrolldy( 6, 6);
m_bg_tilemap4x8->set_scrolldx(128, 128);
m_bg_tilemap4x8->set_scrolldy( 6, 6);
save_pointer(NAME(m_scroll_ram), BGRAM_BANK_SIZE * BGRAM_BANKS);
}
@ -207,7 +214,7 @@ void blktiger_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &clipre
code,
color,
flipx,flip_screen(),
sx,sy,15);
sx+128,sy+6,15);
}
}

View File

@ -86,6 +86,11 @@ void commando_state::video_start()
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(commando_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(commando_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_transparent_pen(3);
}
@ -115,7 +120,7 @@ void commando_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &clipre
}
if (bank < 3)
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy, 15);
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx+128, sy+6, 15);
}
}

View File

@ -53,6 +53,11 @@ void gng_state::video_start()
m_fg_tilemap->set_transparent_pen(3);
m_bg_tilemap->set_transmask(0, 0xff, 0x00); // split type 0 is totally transparent in front half
m_bg_tilemap->set_transmask(1, 0x41, 0xbe); // split type 1 has pens 0 and 6 transparent in front half
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
}
@ -128,7 +133,7 @@ void gng_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
buffered_spriteram[offs] + ((attributes << 2) & 0x300),
(attributes >> 4) & 3,
flipx,flipy,
sx,sy,15);
sx+128,sy+6,15);
}
}

View File

@ -128,6 +128,11 @@ void gunsmoke_state::video_start()
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gunsmoke_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 32, 32, 2048, 8);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gunsmoke_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 0x4f);
}
@ -160,7 +165,7 @@ void gunsmoke_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &clipre
flipy = !flipy;
}
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy, 0);
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx+128, sy+6, 0);
}
}

View File

@ -108,6 +108,11 @@ void tigeroad_state::video_start()
m_fg_tilemap->set_transparent_pen(3);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
save_item(NAME(m_bgcharbank));
}

View File

@ -102,7 +102,7 @@ void tigeroad_spr_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cl
tile_number,
color,
flipx, flipy,
sx, sy, 15);
sx+128, sy+6, 15);
source -= 4;
}

View File

@ -114,6 +114,11 @@ void vulgus_state::video_start()
m_fg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 47);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
save_item(NAME(m_palette_bank));
}
@ -192,7 +197,7 @@ void vulgus_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
if (row == 2) row = 3;
for (; row >= 0; row--)
gfx->transpen(bitmap, cliprect, code + row, color, flip, flip, sx, sy + 16 * row * dir, 15);
gfx->transpen(bitmap, cliprect, code + row, color, flip, flip, sx+128, sy + 6 + 16 * row * dir, 15);
}
}