mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
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
This commit is contained in:
parent
a3e378e2db
commit
a22ed71626
@ -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 )
|
||||
|
@ -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<uint16_t> m_md_videoram;
|
||||
required_shared_ptr<uint16_t> m_rowscrollram;
|
||||
required_shared_ptr<uint16_t> m_vidregs2;
|
||||
required_shared_ptr<uint16_t> m_spriteram;
|
||||
required_device<buffered_spriteram16_device> m_spriteram;
|
||||
|
||||
/* devices */
|
||||
void coin_w(uint16_t data);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user