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?
This commit is contained in:
David Haywood 2013-02-03 21:04:21 +00:00
parent 944baeb5aa
commit c083fd6c15
3 changed files with 49 additions and 6 deletions

View File

@ -151,8 +151,8 @@ static ADDRESS_MAP_START( spbactn_map, AS_PROGRAM, 16, spbactn_state )
AM_RANGE(0x00000, 0x3ffff) AM_ROM AM_RANGE(0x00000, 0x3ffff) AM_ROM
AM_RANGE(0x40000, 0x43fff) AM_RAM // main ram AM_RANGE(0x40000, 0x43fff) AM_RAM // main ram
AM_RANGE(0x50000, 0x50fff) AM_RAM AM_SHARE("spvideoram") AM_RANGE(0x50000, 0x50fff) AM_RAM AM_SHARE("spvideoram")
AM_RANGE(0x60000, 0x67fff) AM_RAM AM_SHARE("fgvideoram") AM_RANGE(0x60000, 0x67fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fgvideoram")
AM_RANGE(0x70000, 0x77fff) AM_RAM AM_SHARE("bgvideoram") 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(0x80000, 0x827ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_word_w) AM_SHARE("paletteram")
AM_RANGE(0x90000, 0x90001) AM_READ_PORT("IN0") AM_RANGE(0x90000, 0x90001) AM_READ_PORT("IN0")
AM_RANGE(0x90010, 0x90011) AM_READ_PORT("IN1") 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(0x00000, 0x3ffff) AM_ROM
AM_RANGE(0x40000, 0x43fff) AM_RAM // main ram AM_RANGE(0x40000, 0x43fff) AM_RAM // main ram
AM_RANGE(0x50000, 0x50fff) AM_RAM AM_SHARE("spvideoram") AM_RANGE(0x50000, 0x50fff) AM_RAM AM_SHARE("spvideoram")
AM_RANGE(0x60000, 0x67fff) AM_RAM AM_SHARE("fgvideoram") AM_RANGE(0x60000, 0x67fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fgvideoram")
AM_RANGE(0x70000, 0x77fff) AM_RAM AM_SHARE("bgvideoram") 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(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 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_ADD("audiocpu", Z80, XTAL_4MHz)
MCFG_CPU_PROGRAM_MAP(spbactn_sound_map) // wrong 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 */ /* video hardware */
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)

View File

@ -11,6 +11,14 @@ public:
required_shared_ptr<UINT16> m_fgvideoram; required_shared_ptr<UINT16> m_fgvideoram;
required_shared_ptr<UINT16> m_spvideoram; required_shared_ptr<UINT16> 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_bg;
bitmap_ind16 m_tile_bitmap_fg; bitmap_ind16 m_tile_bitmap_fg;
DECLARE_WRITE16_MEMBER(soundcommand_w); DECLARE_WRITE16_MEMBER(soundcommand_w);

View File

@ -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() void spbactn_state::video_start()
{ {
/* allocate bitmaps */ /* allocate bitmaps */
machine().primary_screen->register_screen_bitmap(m_tile_bitmap_bg); machine().primary_screen->register_screen_bitmap(m_tile_bitmap_bg);
machine().primary_screen->register_screen_bitmap(m_tile_bitmap_fg); 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) int spbactn_state::draw_video(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, bool alt_sprites)