From a22ed7162696b4720ccc240e489f887191c9f197 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Mon, 14 Dec 2020 19:30:00 +0000 Subject: [PATCH] redump of 'mastfury' set from partially populated PCB marked "Dragon Master 96" [YarPromat / Yuri] + fix driver and promote it (#7558) Machines promoted to WORKING ----- Master's Fury [YarPromat / Yuri, David Haywood] * redump of 'mastfury' set from partially populated PCB marked "Dragon Master 96" [YarPromat / Yuri] * remove outdated comment * use the proper ym type and mapping while we're here * rebalance * some scollreg tweaks * tweak regs again * more guesswork on scrolling * further improve scrolling * comment no longer applies * buffer sprites * notes on offsets * promote it, remaining issues are minor --- src/mame/drivers/drgnmst.cpp | 48 ++++++++++++++++++++---------------- src/mame/includes/drgnmst.h | 5 ++-- src/mame/video/drgnmst.cpp | 42 ++++++++++++++++++++----------- 3 files changed, 56 insertions(+), 39 deletions(-) diff --git a/src/mame/drivers/drgnmst.cpp b/src/mame/drivers/drgnmst.cpp index de0b955221c..394b099271b 100644 --- a/src/mame/drivers/drgnmst.cpp +++ b/src/mame/drivers/drgnmst.cpp @@ -42,8 +42,6 @@ Notes: #include "includes/drgnmst.h" #include "cpu/m68000/m68000.h" -#include "cpu/pic16c5x/pic16c5x.h" -#include "sound/okim6295.h" #include "screen.h" #include "speaker.h" @@ -187,9 +185,7 @@ void drgnmst_base_state::drgnmst_main_map(address_map &map) map(0x80001a, 0x80001b).portr("DSW1"); map(0x80001c, 0x80001d).portr("DSW2"); map(0x800030, 0x800031).w(FUNC(drgnmst_base_state::coin_w)); - map(0x800100, 0x80011f).writeonly().share("vidregs"); - map(0x800120, 0x800121).nopw(); - map(0x80014a, 0x80014b).nopw(); + map(0x800100, 0x800121).writeonly().share("vidregs"); map(0x800154, 0x800155).writeonly().share("vidregs2"); // seems to be priority control map(0x800176, 0x800177).portr("EXTRA"); map(0x8001e0, 0x8001e1).nopw(); @@ -212,9 +208,8 @@ void drgnmst_pic_state::drgnmst_main_map_with_pic(address_map& map) void drgnmst_ym_state::drgnmst_main_map_with_ym(address_map& map) { drgnmst_main_map(map); - map(0x800189, 0x800189).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // Sound - map(0x80018a, 0x80018a).w("ymsnd", FUNC(ym3812_device::write_port_w)); - map(0x80018c, 0x80018c).rw("ymsnd", FUNC(ym3812_device::status_port_r), FUNC(ym3812_device::control_port_w)); + map(0x800180, 0x800183).umask16(0x00ff).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); + map(0x800189, 0x800189).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); } @@ -416,6 +411,9 @@ void drgnmst_base_state::drgnmst(machine_config &config) screen.set_visarea(8*8, 56*8-1, 2*8, 30*8-1); screen.set_screen_update(FUNC(drgnmst_base_state::screen_update)); screen.set_palette(m_palette); + screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising)); + + BUFFERED_SPRITERAM16(config, m_spriteram); PALETTE(config, m_palette).set_format(2, &drgnmst_base_state::drgnmst_IIIIRRRRGGGGBBBB, 0x2000); @@ -452,11 +450,12 @@ void drgnmst_ym_state::drgnmst_ym(machine_config& config) m_maincpu->set_addrmap(AS_PROGRAM, &drgnmst_ym_state::drgnmst_main_map_with_ym); - ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181)/4)); // not verified - ymsnd.add_route(ALL_OUTPUTS, "mono", 0.40); + ym2151_device &ym2151(YM2151(config, "ymsnd", XTAL(14'318'181)/4)); /* verified on pcb */ + ym2151.add_route(0, "mono", 0.05); + ym2151.add_route(1, "mono", 0.05); OKIM6295(config, m_oki, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki->add_route(ALL_OUTPUTS, "mono", 0.80); + m_oki->add_route(ALL_OUTPUTS, "mono", 0.90); } ROM_START( mastfury ) @@ -465,19 +464,26 @@ ROM_START( mastfury ) ROM_LOAD16_BYTE( "master013.4m", 0x000001, 0x080000, CRC(1e7dd287) SHA1(67764aa054731a0548f6c7d3b898597792d96eec) ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "master011.2m", 0x00000, 0x40000, CRC(fc5161a1) SHA1(999e73e36df317aabefebf94444690f439d64559) ) + ROM_LOAD( "dmast96_voi1x", 0x00000, 0x40000, CRC(fc5161a1) SHA1(999e73e36df317aabefebf94444690f439d64559) ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* Sprites (16x16x4) */ // these are marked as 0032 which seems to be 32MBit, first half is missing - ROM_LOAD16_BYTE( "mf0032-1", 0x200000, 0x080000, BAD_DUMP CRC(a248d170) SHA1(2ceca7087e9aa299f4283508bd32b27a4c37577d) ) // half size + ROM_REGION( 0x800000, "gfx1", 0 ) /* Sprites (16x16x4) */ + // Some versions of the game use 2x32MBit ROMs instead. + // This set comes from a PCB marked "Dragon Master 96" but the PCB was missing program ROMs, was Dragon Master 96 + // an alt title for the Chinese market? + ROM_LOAD16_BYTE( "dmast96_mvo1x", 0x000000, 0x080000, CRC(9a597497) SHA1(4f63e17629a00fa505e2165f7fa46f0c5ef2bc60) ) + ROM_CONTINUE(0x400000, 0x080000) + ROM_CONTINUE(0x100000, 0x080000) + ROM_CONTINUE(0x500000, 0x080000) + ROM_LOAD16_BYTE( "dmast96_mvo3x", 0x000001, 0x080000, CRC(be01b829) SHA1(ab9858aadb0bba8415c674e27f9ea905de27871c) ) + ROM_CONTINUE(0x400001, 0x080000) + ROM_CONTINUE(0x100001, 0x080000) + ROM_CONTINUE(0x500001, 0x080000) + ROM_LOAD16_BYTE( "dmast96_mvo2x", 0x200000, 0x080000, CRC(3eab296c) SHA1(d2add71e01aa6bd1b6539e72ed373bb71f65c437) ) ROM_CONTINUE(0x600000, 0x080000) - ROM_CONTINUE(0x300000, 0x080000) - ROM_CONTINUE(0x700000, 0x080000) - ROM_LOAD16_BYTE( "mf0032-2", 0x200001, 0x080000, BAD_DUMP CRC(09ea6ad0) SHA1(c5173259a8bf5ca44dcf584eab36d662b8b9a1f7) ) // half size + ROM_LOAD16_BYTE( "dmast96_mvo4x", 0x200001, 0x080000, CRC(d870b6ce) SHA1(e81c24eeaa5b857910436bfb6cac2b9fa05839e8) ) ROM_CONTINUE(0x600001, 0x080000) - ROM_CONTINUE(0x300001, 0x080000) - ROM_CONTINUE(0x700001, 0x080000) - ROM_REGION( 0x400000, "gfx2", 0 ) /* BG Tiles (8x8x4, 16x16x4 and 32x32x4) */ // marked as 0016, so probably correct size + ROM_REGION( 0x400000, "gfx2", 0 ) /* BG Tiles (8x8x4, 16x16x4 and 32x32x4) */ ROM_LOAD16_BYTE( "mf0016-3", 0x000000, 0x200000, CRC(0946bc61) SHA1(8b10c7f76daf21afb2aa6961100d83b1f6ca89bb) ) ROM_LOAD16_BYTE( "mf0016-4", 0x000001, 0x200000, CRC(8f5b7c82) SHA1(5947c015c8a13539a3125c7ffe07cca0691b4348) ) ROM_END @@ -642,4 +648,4 @@ void drgnmst_pic_state::init_drgnmst() GAME( 1994, drgnmst, 0, drgnmst_with_pic, drgnmst, drgnmst_pic_state, init_drgnmst, ROT0, "Unico", "Dragon Master (set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, drgnmst2, drgnmst, drgnmst_with_pic, drgnmst, drgnmst_pic_state, init_drgnmst, ROT0, "Unico", "Dragon Master (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, mastfury, 0, drgnmst_ym, drgnmst, drgnmst_ym_state, empty_init, ROT0, "Unico", "Master's Fury", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump +GAME( 1996, mastfury, 0, drgnmst_ym, drgnmst, drgnmst_ym_state, empty_init, ROT0, "Unico", "Master's Fury", MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/includes/drgnmst.h b/src/mame/includes/drgnmst.h index 89f86a924b8..2cf2fc54dbf 100644 --- a/src/mame/includes/drgnmst.h +++ b/src/mame/includes/drgnmst.h @@ -7,11 +7,10 @@ #include "cpu/pic16c5x/pic16c5x.h" #include "sound/okim6295.h" -#include "sound/3812intf.h" -#include "sound/okim6295.h" #include "sound/ym2151.h" #include "emupal.h" #include "tilemap.h" +#include "video/bufsprite.h" class drgnmst_base_state : public driver_device { @@ -56,7 +55,7 @@ private: required_shared_ptr m_md_videoram; required_shared_ptr m_rowscrollram; required_shared_ptr m_vidregs2; - required_shared_ptr m_spriteram; + required_device m_spriteram; /* devices */ void coin_w(uint16_t data); diff --git a/src/mame/video/drgnmst.cpp b/src/mame/video/drgnmst.cpp index dee61d8fa63..c8992140355 100644 --- a/src/mame/video/drgnmst.cpp +++ b/src/mame/video/drgnmst.cpp @@ -98,7 +98,7 @@ void drgnmst_base_state::md_videoram_w(offs_t offset, uint16_t data, uint16_t me void drgnmst_base_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect ) { gfx_element *gfx = m_gfxdecode->gfx(0); - uint16_t *source = m_spriteram; + uint16_t *source = m_spriteram->buffer(); uint16_t *finish = source + 0x800 / 2; while (source < finish) @@ -180,19 +180,16 @@ void drgnmst_ym_state::video_start() uint32_t drgnmst_base_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_fg_tilemap->set_scrollx(0, m_vidregs[0x6] - 18); // verify (test mode colour test needs it) - m_fg_tilemap->set_scrolly(0, m_vidregs[0x7]); // verify int rowscroll_bank = (m_vidregs[4] & 0x30) >> 4; if (!m_alt_scrolling) { - m_bg_tilemap->set_scrollx(0, m_vidregs[0xa] - 18); // verify - m_bg_tilemap->set_scrolly(0, m_vidregs[0xb]); // verify + // drgnmst scrolling + m_fg_tilemap->set_scrollx(0, m_vidregs[0x6] - 18); // verify (test mode colour test needs it) + m_fg_tilemap->set_scrolly(0, m_vidregs[0x7]); // verify - // m_md_tilemap->set_scrollx(0, m_vidregs[0x8] - 16); // rowscrolled m_md_tilemap->set_scrolly(0, m_vidregs[0x9]); // verify - for (int y = 0; y < 1024; y++) m_md_tilemap->set_scrollx(y, m_vidregs[0x8] - 16 + m_rowscrollram[y + 0x800 * rowscroll_bank]); @@ -201,18 +198,27 @@ uint32_t drgnmst_base_state::screen_update(screen_device &screen, bitmap_ind16 & } else { - // m_md_tilemap->set_scrollx(0, m_vidregs[0x9] - 16); // rowscrolled - m_md_tilemap->set_scrolly(0, m_vidregs[0x8]); // verify + // mastfury scrolling + // does layer order change scroll offsets? + int fgys = m_vidregs[0x7]; + m_fg_tilemap->set_scrollx(0, m_vidregs[0x6] - 14); // 14 = continue screen background + m_fg_tilemap->set_scrolly(0, fgys); // verify + + int mgys = m_vidregs[0x8]; // skyscraper lift stage confirms this reg? + m_md_tilemap->set_scrolly(0, mgys); // verify for (int y = 0; y < 1024; y++) - m_md_tilemap->set_scrollx(y, m_vidregs[0x9] - 16 + m_rowscrollram[y + 0x800 * rowscroll_bank]); + m_md_tilemap->set_scrollx(y, m_vidregs[0x9] - 14 + m_rowscrollram[y + 0x800 * rowscroll_bank]); // 14 = char select backround, but vs screen is 16? m_bg_tilemap->set_scrollx(0, m_vidregs[0xa] - 18); // verify - m_bg_tilemap->set_scrolly(0, m_vidregs[0xb] -0x400); // verify + // this reg seems to be more closely related to md_tilemap again? is it some kind of split pos? + //int bgys = m_vidregs[0xb] & 0x1ff; + + int bgys = m_vidregs[0x10]; // skyscraper lift stage confirms this reg? + m_bg_tilemap->set_scrolly(0, bgys); } - // todo: figure out which bits relate to the order switch (m_vidregs2[0]) { @@ -225,17 +231,24 @@ uint32_t drgnmst_base_state::screen_update(screen_device &screen, bitmap_ind16 & m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); break; case 0x23c0: // all ok + case 0x38c0: // mastfury m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); m_md_tilemap->draw(screen, bitmap, cliprect, 0, 0); break; case 0x38da: // fg unsure - case 0x215a: // fg unsure + case 0x215a: // fg unsure (mastfury title) case 0x2140: // all ok m_fg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); m_md_tilemap->draw(screen, bitmap, cliprect, 0, 0); break; + case 0x2780: // mastfury skyscraper lift stage + case 0x279a: // mastfury continue screen + m_md_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + break; case 0x2d80: // all ok m_md_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); @@ -245,8 +258,7 @@ uint32_t drgnmst_base_state::screen_update(screen_device &screen, bitmap_ind16 & m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); m_md_tilemap->draw(screen, bitmap, cliprect, 0, 0); - logerror ("unknown video priority regs %04x\n", m_vidregs2[0]); - + //popmessage("unknown video priority regs %04x\n", m_vidregs2[0]); } draw_sprites(bitmap,cliprect);