From c5b07e0fe76e452a1e0b14b09c8b70a9620a7412 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Sat, 7 May 2022 10:34:23 +0200 Subject: [PATCH] slap fight: Correct placement --- src/mame/drivers/slapfght.cpp | 18 +++++++++++++++++- src/mame/includes/slapfght.h | 2 ++ src/mame/video/slapfght.cpp | 18 +++++++++--------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/mame/drivers/slapfght.cpp b/src/mame/drivers/slapfght.cpp index 30cef7c02b3..ed52274a41e 100644 --- a/src/mame/drivers/slapfght.cpp +++ b/src/mame/drivers/slapfght.cpp @@ -67,7 +67,7 @@ $00 Status register - cycle 0xc7, 0x55, 0x00 (Thanks to Dave Spicer for the Known Info ---------- -2K Character RAM at write only address $f000-$f7fff looks to be organised +2K Character RAM at write only address $f000-$f7ff looks to be organised 64x32 chars with the screen rotated through 90 degrees clockwise. There appears to be some kind of attribute(?) RAM above at $f800-$ffff organised in the same manner. @@ -79,6 +79,12 @@ Print function maybe around $09a2 based on info from log file. $e000 looks like sprite ram, setup routines at $0008. +Partial hand-made schematics don't show a buffer, but the games most +definitely need it. Could be the second half of the ram, which seems +otherwise unused, but it would be weird bandwidth-wise. It's not +double-buffering through page swapping, sprite updates are +incremental. + Sound System CPU Details ------------------------ @@ -910,9 +916,12 @@ void slapfght_state::perfrman(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(36_MHz_XTAL/6, 388, 0, 296, 270, 0, 240); m_screen->set_screen_update(FUNC(slapfght_state::screen_update_perfrman)); + m_screen->screen_vblank().set(m_spriteram_buffer, FUNC(buffered_spriteram8_device::vblank_copy_falling)); m_screen->screen_vblank().append(FUNC(slapfght_state::vblank_irq)); m_screen->set_palette(m_palette); + BUFFERED_SPRITERAM8(config, m_spriteram_buffer); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_perfrman); PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256); MCFG_VIDEO_START_OVERRIDE(slapfght_state, perfrman) @@ -956,9 +965,12 @@ void slapfght_state::tigerh(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(36_MHz_XTAL/6, 388, 0, 296, 270, 0, 240); m_screen->set_screen_update(FUNC(slapfght_state::screen_update_slapfight)); + m_screen->screen_vblank().set(m_spriteram_buffer, FUNC(buffered_spriteram8_device::vblank_copy_falling)); m_screen->screen_vblank().append(FUNC(slapfght_state::vblank_irq)); m_screen->set_palette(m_palette); + BUFFERED_SPRITERAM8(config, m_spriteram_buffer); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_slapfght); PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256); MCFG_VIDEO_START_OVERRIDE(slapfght_state, slapfight) @@ -1036,9 +1048,12 @@ void slapfght_state::slapfigh(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(36_MHz_XTAL/6, 388, 0, 296, 270, 0, 240); m_screen->set_screen_update(FUNC(slapfght_state::screen_update_slapfight)); + m_screen->screen_vblank().set(m_spriteram_buffer, FUNC(buffered_spriteram8_device::vblank_copy_falling)); m_screen->screen_vblank().append(FUNC(slapfght_state::vblank_irq)); m_screen->set_palette(m_palette); + BUFFERED_SPRITERAM8(config, m_spriteram_buffer); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_slapfght); PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256); MCFG_VIDEO_START_OVERRIDE(slapfght_state, slapfight) @@ -2101,3 +2116,4 @@ GAME( 1986, grdian, 0, slapfigh, getstar, slapfght_state, init_sl GAME( 1986, getstarj, grdian, slapfigh, getstarj, slapfght_state, init_slapfigh, ROT0, "Toaplan / Taito", "Get Star (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, getstarb1, grdian, getstarb1, getstarj, slapfght_state, init_getstarb1, ROT0, "bootleg", "Get Star (bootleg set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) GAME( 1986, getstarb2, grdian, getstarb2, getstarb2, slapfght_state, init_getstarb2, ROT0, "bootleg", "Get Star (bootleg set 2)", MACHINE_SUPPORTS_SAVE ) +z diff --git a/src/mame/includes/slapfght.h b/src/mame/includes/slapfght.h index 3ecbf90dff1..015faa57fdc 100644 --- a/src/mame/includes/slapfght.h +++ b/src/mame/includes/slapfght.h @@ -31,6 +31,7 @@ public: m_videoram(*this, "videoram"), m_colorram(*this, "colorram"), m_spriteram(*this, "spriteram"), + m_spriteram_buffer(*this, "spriteram"), m_fixvideoram(*this, "fixvideoram"), m_fixcolorram(*this, "fixcolorram") { } @@ -64,6 +65,7 @@ private: required_shared_ptr m_videoram; required_shared_ptr m_colorram; required_shared_ptr m_spriteram; + required_device m_spriteram_buffer; optional_shared_ptr m_fixvideoram; optional_shared_ptr m_fixcolorram; diff --git a/src/mame/video/slapfght.cpp b/src/mame/video/slapfght.cpp index 0418c2d6cb8..e64a5b6262e 100644 --- a/src/mame/video/slapfght.cpp +++ b/src/mame/video/slapfght.cpp @@ -63,8 +63,8 @@ VIDEO_START_MEMBER(slapfght_state, slapfight) m_pf1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(slapfght_state::get_pf1_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(slapfght_state::get_fix_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); - m_fix_tilemap->set_scrolldy(0, 15); - m_pf1_tilemap->set_scrolldy(0, 14); + m_fix_tilemap->set_scrolldy(-16, 0); + m_pf1_tilemap->set_scrolldy(-17, -1); m_fix_tilemap->set_transparent_pen(0); } @@ -136,9 +136,9 @@ WRITE_LINE_MEMBER(slapfght_state::palette_bank_w) void slapfght_state::draw_perfrman_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer) { - const uint8_t *src = m_spriteram; + const uint8_t *src = m_spriteram_buffer->buffer(); - for (int offs = 0; offs < m_spriteram.bytes(); offs += 4) + for (int offs = 0; offs < 0x800; offs += 4) { /* 0: xxxxxxxx - code @@ -186,9 +186,9 @@ uint32_t slapfght_state::screen_update_perfrman(screen_device &screen, bitmap_in void slapfght_state::draw_slapfight_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) { - const uint8_t *src = m_spriteram; + const uint8_t *src = m_spriteram_buffer->buffer(); - for (int offs = 0; offs < m_spriteram.bytes(); offs += 4) + for (int offs = 0; offs < 0x800; offs += 4) { /* 0: xxxxxxxx - code low @@ -201,14 +201,14 @@ void slapfght_state::draw_slapfight_sprites(bitmap_ind16 &bitmap, const rectangl */ int code = src[offs + 0] | ((src[offs + 2] & 0xc0) << 2); - int sy = src[offs + 3] + 2; - int sx = (src[offs + 1] | (src[offs + 2] << 8 & 0x100)) - 17; + int sy = src[offs + 3] - 17; + int sx = (src[offs + 1] | (src[offs + 2] << 8 & 0x100)) - 13; int color = src[offs + 2] >> 1 & 0xf; int fx = 0, fy = 0; if (flip_screen()) { - sy = (238 - sy) & 0xff; + sy = (206 - sy) & 0xff; sx = 284 - sx; fx = fy = 1; }