summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <mamehaze@users.noreply.github.com>2015-07-11 13:24:46 +0100
committer David Haywood <mamehaze@users.noreply.github.com>2015-07-11 13:24:46 +0100
commit9937f167c09e1e485a4aed3ba435a1534a61adf8 (patch)
tree8bd7cbdf634239194c1a18b2a8d4fb5c0d535d51
parentc576d46ea7a8eaee16ae964f95b6eeda6ae40f74 (diff)
fix rowscroll in cutefght (nw)
-rw-r--r--src/mame/drivers/dreamwld.c91
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 )