diff options
-rw-r--r-- | src/mame/drivers/dreamwld.c | 91 |
1 files changed, 54 insertions, 37 deletions
diff --git a/src/mame/drivers/dreamwld.c b/src/mame/drivers/dreamwld.c index 1bf9aaf0e99..d45c1c8ed5a 100644 --- a/src/mame/drivers/dreamwld.c +++ b/src/mame/drivers/dreamwld.c @@ -121,6 +121,11 @@ public: required_shared_ptr<UINT32> m_vregs; required_shared_ptr<UINT32> m_workram; + UINT16* m_lineram16; + + DECLARE_READ16_MEMBER(lineram16_r) { return m_lineram16[offset]; } + DECLARE_WRITE16_MEMBER(lineram16_w) { COMBINE_DATA(&m_lineram16[offset]); } + /* video-related */ tilemap_t *m_bg_tilemap; tilemap_t *m_bg2_tilemap; @@ -255,15 +260,17 @@ void dreamwld_state::video_start() m_bg2_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(dreamwld_state::get_dreamwld_bg2_tile_info),this),TILEMAP_SCAN_ROWS, 16, 16, 64,64); m_bg2_tilemap->set_transparent_pen(0); - m_bg_tilemap->set_scroll_rows(256); // line scrolling + m_bg_tilemap->set_scroll_rows(64*16); // line scrolling m_bg_tilemap->set_scroll_cols(1); - m_bg2_tilemap->set_scroll_rows(256); // line scrolling + m_bg2_tilemap->set_scroll_rows(64*16); // line scrolling m_bg2_tilemap->set_scroll_cols(1); m_spritebuf1 = auto_alloc_array(machine(), UINT32, 0x2000 / 4); m_spritebuf2 = auto_alloc_array(machine(), UINT32, 0x2000 / 4); + m_lineram16 = (UINT16*)auto_alloc_array_clear(this->machine(), UINT16, 0x400 / 2); + save_pointer(NAME(m_lineram16), 0x400/2); } @@ -287,13 +294,30 @@ UINT32 dreamwld_state::screen_update_dreamwld(screen_device &screen, bitmap_ind1 tmptilemap0 = m_bg_tilemap; tmptilemap1 = m_bg2_tilemap; - int layer0_scrolly = m_vregs[(0x400 / 4)] + 32; - int layer1_scrolly = m_vregs[(0x400 / 4) + 2] + 32; + int layer0_scrolly = m_vregs[(0x000 / 4)]+32; + int layer1_scrolly = m_vregs[(0x008 / 4)]+32; + + int layer0_scrollx = m_vregs[(0x004 / 4)] + 3; + int layer1_scrollx = m_vregs[(0x00c / 4)] + 5; + UINT32 layer0_ctrl = m_vregs[0x010 / 4]; + UINT32 layer1_ctrl = m_vregs[0x014 / 4]; + + m_tilebank[0] = (layer0_ctrl >> 6) & 1; + m_tilebank[1] = (layer1_ctrl >> 6) & 1; + + if (m_tilebank[0] != m_tilebankold[0]) + { + m_tilebankold[0] = m_tilebank[0]; + m_bg_tilemap->mark_all_dirty(); + } + + if (m_tilebank[1] != m_tilebankold[1]) + { + m_tilebankold[1] = m_tilebank[1]; + m_bg2_tilemap->mark_all_dirty(); + } + - int layer0_scrollx = m_vregs[(0x400 / 4) + 1] + 3; - int layer1_scrollx = m_vregs[(0x400 / 4) + 3] + 5; - UINT32 layer0_ctrl = m_vregs[0x412 / 4]; - UINT32 layer1_ctrl = m_vregs[0x416 / 4]; tmptilemap0->set_scrolly(0, layer0_scrolly); tmptilemap1->set_scrolly(0, layer1_scrolly); @@ -322,56 +346,48 @@ UINT32 dreamwld_state::screen_update_dreamwld(screen_device &screen, bitmap_ind1 { int x0 = 0, x1 = 0; + UINT16* linebase; + + + /* layer 0 */ - UINT16 *vregs = reinterpret_cast<UINT16 *>(m_vregs.target()); + linebase = &m_lineram16[0x000]; + if (layer0_ctrl & 0x0300) { if (layer0_ctrl & 0x0200) /* per-tile rowscroll */ - x0 = vregs[BYTE_XOR_BE(0x000/2 + i/16)]; + x0 = linebase[((i+32)&0xff)/16]; else /* per-line rowscroll */ - x0 = vregs[BYTE_XOR_BE(0x000/2 + ((i + layer0_scrolly)&0xff))]; // different handling to psikyo.c? ( + scrolly ) + x0 = linebase[(i+32)&0xff]; } - - tmptilemap0->set_scrollx( - (i + layer0_scrolly) % 256 /*tilemap_width(tm0size) */, - layer0_scrollx + x0 ); + tmptilemap0->set_scrollx( + (i + layer0_scrolly) % 1024, + layer0_scrollx + x0 ); /* layer 1 */ + linebase = &m_lineram16[0x200/2]; + if (layer1_ctrl & 0x0300) { if (layer1_ctrl & 0x0200) /* per-tile rowscroll */ - x1 = vregs[BYTE_XOR_BE(0x200/2 + i/16)]; + x1 = linebase[((i+32)&0xff)/16]; else /* per-line rowscroll */ - x1 = vregs[BYTE_XOR_BE(0x200/2 + ((i + layer1_scrolly)&0xff))]; // different handling to psikyo.c? ( + scrolly ) + x1 = linebase[(i+32)&0xff]; } - tmptilemap1->set_scrollx( - (i + layer1_scrolly) % 256 /* tilemap_width(tm1size) */, - layer1_scrollx + x1 ); + tmptilemap1->set_scrollx( + (i + layer1_scrolly) % 1024, + layer1_scrollx + x1 ); } - m_tilebank[0] = (m_vregs[(0x400 / 4) + 4] >> 6) & 1; - m_tilebank[1] = (m_vregs[(0x400 / 4) + 5] >> 6) & 1; - - if (m_tilebank[0] != m_tilebankold[0]) - { - m_tilebankold[0] = m_tilebank[0]; - m_bg_tilemap->mark_all_dirty(); - } - - if (m_tilebank[1] != m_tilebankold[1]) - { - m_tilebankold[1] = m_tilebank[1]; - m_bg2_tilemap->mark_all_dirty(); - } tmptilemap0->draw(screen, bitmap, cliprect, 0, 0); tmptilemap1->draw(screen, bitmap, cliprect, 0, 0); @@ -434,7 +450,8 @@ static ADDRESS_MAP_START( baryon_map, AS_PROGRAM, 32, dreamwld_state ) AM_RANGE(0x600000, 0x601fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") AM_RANGE(0x800000, 0x801fff) AM_RAM_WRITE(dreamwld_bg_videoram_w ) AM_SHARE("bg_videoram") AM_RANGE(0x802000, 0x803fff) AM_RAM_WRITE(dreamwld_bg2_videoram_w ) AM_SHARE("bg2_videoram") - AM_RANGE(0x804000, 0x805fff) AM_RAM AM_SHARE("vregs") // scroll regs etc. + AM_RANGE(0x804000, 0x8043ff) AM_READWRITE16(lineram16_r, lineram16_w, 0xffffffff) // linescroll + AM_RANGE(0x804400, 0x805fff) AM_RAM AM_SHARE("vregs") AM_RANGE(0xc00000, 0xc00003) AM_READ_PORT("INPUTS") AM_RANGE(0xc00004, 0xc00007) AM_READ_PORT("c00004") @@ -1174,7 +1191,7 @@ ROM_END GAME( 1997, baryon, 0, baryon, baryon, driver_device, 0, ROT270, "SemiCom / Tirano", "Baryon - Future Assault (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1997, baryona, baryon, baryon, baryon, driver_device, 0, ROT270, "SemiCom / Tirano", "Baryon - Future Assault (set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1998, cutefght, 0, dreamwld, cutefght, driver_device, 0, ROT0, "SemiCom", "Cute Fighter", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_GRAPHICS ) // wrong linescroll? -GAME( 1999, rolcrush, 0, baryon, rolcrush, driver_device, 0, ROT0, "Trust / SemiCom", "Rolling Crush (version 1.07.E - 1999/02/11)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_GRAPHICS ) // wrong +GAME( 1998, cutefght, 0, dreamwld, cutefght, driver_device, 0, ROT0, "SemiCom", "Cute Fighter", GAME_SUPPORTS_SAVE ) +GAME( 1999, rolcrush, 0, baryon, rolcrush, driver_device, 0, ROT0, "Trust / SemiCom", "Rolling Crush (version 1.07.E - 1999/02/11)", GAME_SUPPORTS_SAVE ) GAME( 1999, gaialast, 0, baryon, gaialast, driver_device, 0, ROT0, "SemiCom / XESS", "Gaia - The Last Choice of Earth", GAME_NOT_WORKING ) GAME( 2000, dreamwld, 0, dreamwld, dreamwld, driver_device, 0, ROT0, "SemiCom", "Dream World", GAME_SUPPORTS_SAVE ) |