From c083fd6c158fe7d0689f06bbc5ed0987155e4cc6 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sun, 3 Feb 2013 21:04:21 +0000 Subject: [PATCH] start converting spbactn to tilemaps, it's now clear that the prototype uploads the backgrounds once and uses the scroll regs (not hooked up) whereas the release version just uploads them as it needs them before each level. I wonder if the extra z80 rom + gfx on the proto are for a 2nd screen, some kind of fake dmd? --- src/mame/drivers/spbactn.c | 12 ++++++------ src/mame/includes/spbactn.h | 8 ++++++++ src/mame/video/spbactn.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/mame/drivers/spbactn.c b/src/mame/drivers/spbactn.c index d4f6bd2cec2..af4e453d128 100644 --- a/src/mame/drivers/spbactn.c +++ b/src/mame/drivers/spbactn.c @@ -151,8 +151,8 @@ static ADDRESS_MAP_START( spbactn_map, AS_PROGRAM, 16, spbactn_state ) AM_RANGE(0x00000, 0x3ffff) AM_ROM AM_RANGE(0x40000, 0x43fff) AM_RAM // main ram AM_RANGE(0x50000, 0x50fff) AM_RAM AM_SHARE("spvideoram") - AM_RANGE(0x60000, 0x67fff) AM_RAM AM_SHARE("fgvideoram") - AM_RANGE(0x70000, 0x77fff) AM_RAM AM_SHARE("bgvideoram") + AM_RANGE(0x60000, 0x67fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fgvideoram") + AM_RANGE(0x70000, 0x77fff) AM_RAM_WRITE(bg_videoram_w) AM_SHARE("bgvideoram") AM_RANGE(0x80000, 0x827ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_word_w) AM_SHARE("paletteram") AM_RANGE(0x90000, 0x90001) AM_READ_PORT("IN0") AM_RANGE(0x90010, 0x90011) AM_READ_PORT("IN1") @@ -199,9 +199,9 @@ static ADDRESS_MAP_START( spbactnp_map, AS_PROGRAM, 16, spbactn_state ) AM_RANGE(0x00000, 0x3ffff) AM_ROM AM_RANGE(0x40000, 0x43fff) AM_RAM // main ram AM_RANGE(0x50000, 0x50fff) AM_RAM AM_SHARE("spvideoram") - AM_RANGE(0x60000, 0x67fff) AM_RAM AM_SHARE("fgvideoram") - AM_RANGE(0x70000, 0x77fff) AM_RAM AM_SHARE("bgvideoram") - AM_RANGE(0x80000, 0x827ff) AM_RAM_WRITE(paletteram_xxxxBBBBRRRRGGGG_word_w) AM_SHARE("paletteram") // yes R and G are swapped vs. the released version + AM_RANGE(0x60000, 0x67fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fgvideoram") + AM_RANGE(0x70000, 0x77fff) AM_RAM_WRITE(bg_videoram_w) AM_SHARE("bgvideoram") + AM_RANGE(0x80000, 0x827ff) AM_RAM_WRITE(paletteram_xxxxBBBBRRRRGGGG_word_w) AM_SHARE("paletteram") // yes R and G are swapped vs. the released version AM_RANGE(0x90000, 0x900ff) AM_READ(temp_read_handler_r) // temp @@ -434,7 +434,7 @@ static MACHINE_CONFIG_START( spbactnp, spbactn_state ) MCFG_CPU_ADD("audiocpu", Z80, XTAL_4MHz) MCFG_CPU_PROGRAM_MAP(spbactn_sound_map) // wrong - // there is a rom for another Z80?? + // there is a rom for another Z80 and a socket for one.. /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/includes/spbactn.h b/src/mame/includes/spbactn.h index 188196aefb2..e79c6cae034 100644 --- a/src/mame/includes/spbactn.h +++ b/src/mame/includes/spbactn.h @@ -11,6 +11,14 @@ public: required_shared_ptr m_fgvideoram; required_shared_ptr m_spvideoram; + tilemap_t *m_bg_tilemap; + tilemap_t *m_fg_tilemap; + DECLARE_WRITE16_MEMBER(bg_videoram_w); + DECLARE_WRITE16_MEMBER(fg_videoram_w); + TILE_GET_INFO_MEMBER(get_bg_tile_info); + TILE_GET_INFO_MEMBER(get_fg_tile_info); + + bitmap_ind16 m_tile_bitmap_bg; bitmap_ind16 m_tile_bitmap_fg; DECLARE_WRITE16_MEMBER(soundcommand_w); diff --git a/src/mame/video/spbactn.c b/src/mame/video/spbactn.c index 361c6f3f188..588fa5ad137 100644 --- a/src/mame/video/spbactn.c +++ b/src/mame/video/spbactn.c @@ -117,11 +117,46 @@ static int draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const re } +WRITE16_MEMBER(spbactn_state::bg_videoram_w) +{ + COMBINE_DATA(&m_bgvideoram[offset]); + m_bg_tilemap->mark_tile_dirty(offset&0x1fff); +} + +TILE_GET_INFO_MEMBER(spbactn_state::get_bg_tile_info) +{ + int attr = m_bgvideoram[tile_index]; + int tileno = m_bgvideoram[tile_index+0x2000]; + SET_TILE_INFO_MEMBER(1, tileno, ((attr & 0x00f0)>>4), 0); +} + + +WRITE16_MEMBER(spbactn_state::fg_videoram_w) +{ + COMBINE_DATA(&m_fgvideoram[offset]); + m_fg_tilemap->mark_tile_dirty(offset&0x1fff); +} + +TILE_GET_INFO_MEMBER(spbactn_state::get_fg_tile_info) +{ + int attr = m_fgvideoram[tile_index]; + int tileno = m_fgvideoram[tile_index+0x2000]; + + SET_TILE_INFO_MEMBER(0, tileno, ((attr & 0x00f0)>>4), 0); +} + + + void spbactn_state::video_start() { /* allocate bitmaps */ machine().primary_screen->register_screen_bitmap(m_tile_bitmap_bg); machine().primary_screen->register_screen_bitmap(m_tile_bitmap_fg); + + + m_bg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(spbactn_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 8, 64, 128); + m_fg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(spbactn_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 8, 64, 128); + } int spbactn_state::draw_video(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, bool alt_sprites)