fix rowscroll in cutefght (nw)

This commit is contained in:
David Haywood 2015-07-11 13:24:46 +01:00
parent c576d46ea7
commit 9937f167c0

View File

@ -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 )