new machines (1 working, 1 not working) (#6587)

new machines marked as NOT WORKING
----
Mastery's Fury [Miso Kim, David Haywood]

(this is a bad dump, mask ROMS are half size, at least the sprites)

new WORKING machines
----
Goori Goori [Miso Kim, David Haywood]
This commit is contained in:
David Haywood 2020-04-24 17:44:09 +01:00 committed by GitHub
parent 17e99cc740
commit 1b91ee3133
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 527 additions and 84 deletions

View File

@ -4330,6 +4330,7 @@ files {
MAME_DIR .. "src/mame/drivers/unico.cpp",
MAME_DIR .. "src/mame/includes/unico.h",
MAME_DIR .. "src/mame/video/unico.cpp",
MAME_DIR .. "src/mame/drivers/goori.cpp",
}
createMAMEProjects(_target, _subtarget, "univers")

View File

@ -8,6 +8,8 @@ the hardware seems to fall somewhere between the
hardware playmark commonly used and the hardware
unico used for zero point etc.
(also seems to be related to cps1 bootlegs?)
PCB Layout
----------
@ -46,32 +48,32 @@ Notes:
#include "speaker.h"
WRITE16_MEMBER(drgnmst_state::coin_w)
WRITE16_MEMBER(drgnmst_base_state::coin_w)
{
machine().bookkeeping().coin_counter_w(0, data & 0x100);
machine().bookkeeping().coin_lockout_w(0, ~data & 0x400);
machine().bookkeeping().coin_lockout_w(1, ~data & 0x800);
}
WRITE8_MEMBER(drgnmst_state::snd_command_w)
WRITE8_MEMBER(drgnmst_pic_state::snd_command_w)
{
m_snd_command = data;
m_maincpu->yield();
}
WRITE8_MEMBER(drgnmst_state::snd_flag_w)
WRITE8_MEMBER(drgnmst_pic_state::snd_flag_w)
{
/* Enables the following 68K write operation to latch through to the PIC */
m_snd_flag = 1;
}
READ8_MEMBER(drgnmst_state::pic16c5x_port0_r)
READ8_MEMBER(drgnmst_pic_state::pic16c5x_port0_r)
{
return m_pic16c5x_port0;
}
READ8_MEMBER(drgnmst_state::snd_command_r)
READ8_MEMBER(drgnmst_pic_state::snd_command_r)
{
uint8_t data = 0;
@ -87,7 +89,7 @@ READ8_MEMBER(drgnmst_state::snd_command_r)
return data;
}
READ8_MEMBER(drgnmst_state::snd_flag_r)
READ8_MEMBER(drgnmst_pic_state::snd_flag_r)
{
if (m_snd_flag)
{
@ -98,7 +100,7 @@ READ8_MEMBER(drgnmst_state::snd_flag_r)
return 0x00;
}
WRITE8_MEMBER(drgnmst_state::pcm_banksel_w)
WRITE8_MEMBER(drgnmst_pic_state::pcm_banksel_w)
{
/* This is a 4 bit port.
Each pair of bits is used in part of the OKI PCM ROM bank selectors.
@ -108,12 +110,12 @@ WRITE8_MEMBER(drgnmst_state::pcm_banksel_w)
m_pic16c5x_port0 = data;
}
WRITE8_MEMBER(drgnmst_state::oki_w)
WRITE8_MEMBER(drgnmst_pic_state::oki_w)
{
m_oki_command = data;
}
WRITE8_MEMBER(drgnmst_state::snd_control_w)
WRITE8_MEMBER(drgnmst_pic_state::snd_control_w)
{
/* This port controls communications to and from the 68K, both OKI
devices, and part of the OKI PCM ROM bank selection.
@ -177,32 +179,46 @@ WRITE8_MEMBER(drgnmst_state::snd_control_w)
/***************************** 68000 Memory Map *****************************/
void drgnmst_state::drgnmst_main_map(address_map &map)
void drgnmst_base_state::drgnmst_main_map(address_map &map)
{
map(0x000000, 0x0fffff).rom();
map(0x800000, 0x800001).portr("P1_P2");
map(0x800018, 0x800019).portr("SYSTEM");
map(0x80001a, 0x80001b).portr("DSW1");
map(0x80001c, 0x80001d).portr("DSW2");
map(0x800030, 0x800031).w(FUNC(drgnmst_state::coin_w));
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(0x800154, 0x800155).writeonly().share("vidregs2"); // seems to be priority control
map(0x800176, 0x800177).portr("EXTRA");
map(0x800181, 0x800181).w(FUNC(drgnmst_state::snd_command_w));
map(0x800189, 0x800189).w(FUNC(drgnmst_state::snd_flag_w));
map(0x8001e0, 0x8001e1).nopw();
map(0x900000, 0x903fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x904000, 0x907fff).ram().w(FUNC(drgnmst_state::md_videoram_w)).share("md_videoram");
map(0x908000, 0x90bfff).ram().w(FUNC(drgnmst_state::bg_videoram_w)).share("bg_videoram");
map(0x90c000, 0x90ffff).ram().w(FUNC(drgnmst_state::fg_videoram_w)).share("fg_videoram");
map(0x904000, 0x907fff).ram().w(FUNC(drgnmst_base_state::md_videoram_w)).share("md_videoram");
map(0x908000, 0x90bfff).ram().w(FUNC(drgnmst_base_state::bg_videoram_w)).share("bg_videoram");
map(0x90c000, 0x90ffff).ram().w(FUNC(drgnmst_base_state::fg_videoram_w)).share("fg_videoram");
map(0x920000, 0x923fff).ram().share("rowscrollram"); // rowscroll ram
map(0x930000, 0x9307ff).ram().share("spriteram"); // Sprites
map(0xff0000, 0xffffff).ram();
}
void drgnmst_state::drgnmst_oki1_map(address_map &map)
void drgnmst_pic_state::drgnmst_main_map_with_pic(address_map& map)
{
drgnmst_main_map(map);
map(0x800181, 0x800181).w(FUNC(drgnmst_pic_state::snd_command_w));
map(0x800189, 0x800189).w(FUNC(drgnmst_pic_state::snd_flag_w));
}
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));
}
void drgnmst_pic_state::drgnmst_oki1_map(address_map &map)
{
map(0x00000, 0x1ffff).rom();
map(0x20000, 0x3ffff).bankr("oki1bank");
@ -354,8 +370,13 @@ static GFXDECODE_START( gfx_drgnmst )
GFXDECODE_END
void drgnmst_state::machine_start()
void drgnmst_base_state::machine_start()
{
}
void drgnmst_pic_state::machine_start()
{
drgnmst_base_state::machine_start();
save_item(NAME(m_snd_flag));
save_item(NAME(m_oki_control));
save_item(NAME(m_oki_command));
@ -363,8 +384,14 @@ void drgnmst_state::machine_start()
save_item(NAME(m_oki_bank));
}
void drgnmst_state::machine_reset()
void drgnmst_base_state::machine_reset()
{
}
void drgnmst_pic_state::machine_reset()
{
drgnmst_base_state::machine_reset();
m_snd_flag = 0;
m_oki_control = 0;
m_oki_command = 0;
@ -373,19 +400,12 @@ void drgnmst_state::machine_reset()
m_oki_bank[0] = 0;
}
void drgnmst_state::drgnmst(machine_config &config)
void drgnmst_base_state::drgnmst(machine_config &config)
{
M68000(config, m_maincpu, 12_MHz_XTAL); /* Confirmed */
m_maincpu->set_addrmap(AS_PROGRAM, &drgnmst_state::drgnmst_main_map);
m_maincpu->set_vblank_int("screen", FUNC(drgnmst_state::irq2_line_hold));
PIC16C55(config, m_audiocpu, 32_MHz_XTAL / 8); /* 4MHz - Confirmed */
m_audiocpu->read_a().set(FUNC(drgnmst_state::pic16c5x_port0_r));
m_audiocpu->write_a().set(FUNC(drgnmst_state::pcm_banksel_w));
m_audiocpu->read_b().set(FUNC(drgnmst_state::snd_command_r));
m_audiocpu->write_b().set(FUNC(drgnmst_state::oki_w));
m_audiocpu->read_c().set(FUNC(drgnmst_state::snd_flag_r));
m_audiocpu->write_c().set(FUNC(drgnmst_state::snd_control_w));
m_maincpu->set_addrmap(AS_PROGRAM, &drgnmst_base_state::drgnmst_main_map);
m_maincpu->set_vblank_int("screen", FUNC(drgnmst_base_state::irq2_line_hold));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_drgnmst);
@ -394,22 +414,75 @@ void drgnmst_state::drgnmst(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(8*8, 56*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(drgnmst_state::screen_update));
screen.set_screen_update(FUNC(drgnmst_base_state::screen_update));
screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(2, &drgnmst_state::drgnmst_IIIIRRRRGGGGBBBB, 0x2000);
PALETTE(config, m_palette).set_format(2, &drgnmst_base_state::drgnmst_IIIIRRRRGGGGBBBB, 0x2000);
/* sound hardware */
SPEAKER(config, "mono").front_center();
}
void drgnmst_pic_state::drgnmst_with_pic(machine_config& config)
{
drgnmst(config);
m_maincpu->set_addrmap(AS_PROGRAM, &drgnmst_pic_state::drgnmst_main_map_with_pic);
PIC16C55(config, m_audiocpu, 32_MHz_XTAL / 8); /* 4MHz - Confirmed */
m_audiocpu->read_a().set(FUNC(drgnmst_pic_state::pic16c5x_port0_r));
m_audiocpu->write_a().set(FUNC(drgnmst_pic_state::pcm_banksel_w));
m_audiocpu->read_b().set(FUNC(drgnmst_pic_state::snd_command_r));
m_audiocpu->write_b().set(FUNC(drgnmst_pic_state::oki_w));
m_audiocpu->read_c().set(FUNC(drgnmst_pic_state::snd_flag_r));
m_audiocpu->write_c().set(FUNC(drgnmst_pic_state::snd_control_w));
OKIM6295(config, m_oki[0], 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH);
m_oki[0]->set_addrmap(0, &drgnmst_state::drgnmst_oki1_map);
m_oki[0]->set_addrmap(0, &drgnmst_pic_state::drgnmst_oki1_map);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.00);
OKIM6295(config, m_oki[1], 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH);
m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.00);
}
void drgnmst_ym_state::drgnmst_ym(machine_config& config)
{
drgnmst(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);
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);
}
ROM_START( mastfury )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "master012.4m", 0x000000, 0x080000, CRC(020a3c50) SHA1(d6762b66f06fe91f3bff8cdcbff42c247df64671) )
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_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_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_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_LOAD16_BYTE( "mf0016-3", 0x000000, 0x200000, CRC(0946bc61) SHA1(8b10c7f76daf21afb2aa6961100d83b1f6ca89bb) )
ROM_LOAD16_BYTE( "mf0016-4", 0x000001, 0x200000, CRC(8f5b7c82) SHA1(5947c015c8a13539a3125c7ffe07cca0691b4348) )
ROM_END
ROM_START( drgnmst )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
@ -485,7 +558,7 @@ ROM_START( drgnmst2 ) // only the maincpu ROMs were provided for this set
ROM_LOAD16_BYTE( "dm1008", 0x000000, 0x100000, CRC(b8572be3) SHA1(29aab76821e0a56033cf06b0a1890b11804da8d8) )
ROM_END
uint8_t drgnmst_state::drgnmst_asciitohex( uint8_t data )
uint8_t drgnmst_pic_state::drgnmst_asciitohex( uint8_t data )
{
/* Convert ASCII data to HEX */
@ -497,7 +570,7 @@ uint8_t drgnmst_state::drgnmst_asciitohex( uint8_t data )
}
void drgnmst_state::init_drgnmst()
void drgnmst_pic_state::init_drgnmst()
{
uint8_t *drgnmst_PICROM_HEX = memregion("user1")->base();
uint16_t *drgnmst_PICROM = (uint16_t *)memregion("audiocpu")->base();
@ -566,5 +639,7 @@ void drgnmst_state::init_drgnmst()
}
GAME( 1994, drgnmst, 0, drgnmst, drgnmst, drgnmst_state, init_drgnmst, ROT0, "Unico", "Dragon Master (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, drgnmst2, drgnmst, drgnmst, drgnmst, drgnmst_state, init_drgnmst, ROT0, "Unico", "Dragon Master (set 2)", MACHINE_SUPPORTS_SAVE )
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

318
src/mame/drivers/goori.cpp Normal file
View File

@ -0,0 +1,318 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
// hardware is loosely derived from snowbros / Kaneko Pandora
// background image is visible briefly at the start of level, is this correct?
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
#include "sound/okim6295.h"
#include "sound/ym2151.h"
#include "speaker.h"
class goori_state : public driver_device
{
public:
goori_state(const machine_config& mconfig, device_type type, const char* tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
m_oki(*this, "oki"),
m_spriteram(*this, "spriteram"),
m_bg_videoram(*this, "bg_videoram"),
m_screen(*this, "screen")
{ }
void goori(machine_config& config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
uint32_t screen_update(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect);
private:
void goori_map(address_map& map);
DECLARE_WRITE16_MEMBER(goori_300008_w);
DECLARE_WRITE16_MEMBER(goori_30000e_w);
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
optional_device<okim6295_device> m_oki;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_bg_videoram;
required_device<screen_device> m_screen;
tilemap_t* m_bg_tilemap;
DECLARE_WRITE16_MEMBER(bg_videoram_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
};
WRITE16_MEMBER(goori_state::bg_videoram_w)
{
COMBINE_DATA(&m_bg_videoram[offset]);
m_bg_tilemap->mark_tile_dirty(offset/2);
}
TILE_GET_INFO_MEMBER(goori_state::get_bg_tile_info)
{
int tilenolow = (m_bg_videoram[(tile_index * 2) + 1] & 0xff00) >> 8;
int tilenohigh = (m_bg_videoram[(tile_index * 2) + 0] & 0xff00) >> 8;
int tile = tilenolow | (tilenohigh << 8);
tileinfo.set(1, tile, 0x1f, 0);
}
void goori_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(goori_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
}
uint32_t goori_state::screen_update(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect)
{
//bitmap.fill(0, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
// is this sprite format a clone of anything? (looks VERY similar to snowbros but this hardware also has a higer resolution, a tile layer and 8bpp)
for (int i = 0; i < 0x2000 / 2; i += 8)
{
// 0 unused
// 1 unused
// 2 unused
// 3 colour and xpos msb
// 4 xpos
// 5 ypos
// 6 tile low
// 7 tile high (and flip)
uint16_t tile = m_spriteram[i + 6] | ((m_spriteram[i + 7] & 0x3f) << 8);
int x = m_spriteram[i + 4];
int y = m_spriteram[i + 5];
uint16_t colour = (m_spriteram[i + 3] & 0xf8) >> 3;
int flipx = m_spriteram[i + 7] & 0x80;
x |= (m_spriteram[i + 3] & 1) << 8;
int realx = x;
if (realx >= 0x3e0)
realx -= 0x400;
gfx_element *gfx = m_gfxdecode->gfx(0);
gfx->transpen(bitmap,cliprect,tile,colour,flipx,0,realx,y,0xff);
}
return 0;
}
WRITE16_MEMBER(goori_state::goori_300008_w)
{
//popmessage("goori_300008_w %04x %04x\n", data, mem_mask); // possibly display disable?
}
WRITE16_MEMBER(goori_state::goori_30000e_w)
{
//popmessage("goori_30000e_w %04x %04x\n", data, mem_mask); // startup only?
}
void goori_state::goori_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).ram(); // RAM main
map(0x300000, 0x300003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0xff00);
map(0x300004, 0x300004).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x300008, 0x300009).w(FUNC(goori_state::goori_300008_w));
map(0x30000e, 0x30000f).w(FUNC(goori_state::goori_30000e_w));
map(0x400000, 0x400fff).ram().w(FUNC(goori_state::bg_videoram_w)).share("bg_videoram"); // 8-bit?
map(0x500000, 0x500001).portr("DSW1");
map(0x500002, 0x500003).portr("DSW2");
map(0x500004, 0x500005).portr("SYSTEM");
map(0x600000, 0x603fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x700000, 0x701fff).ram().share("spriteram"); // RAM sprites (8-bit?)
map(0x800000, 0x800001).noprw(); // irq ack?
}
static INPUT_PORTS_START( goori )
PORT_START("DSW1") /* 500001 */
PORT_DIPNAME( 0x0001, 0x0001, "DSW1" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 )
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("DSW2") /* 500003 */
PORT_DIPNAME( 0x0001, 0x0001, "DSW2" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("SYSTEM") /* 500005 */
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static const gfx_layout layout_16x16x8 =
{
16,16,
RGN_FRAC(1,1),
8,
{ 8,9,10,11, 0,1,2,3},
{ 0,4,16,20,32,36,48,52, 512+0, 512+4, 512+16, 512+20, 512+32, 512+36, 512+48, 512+52 },
{ STEP8(0,8*8), STEP8(1024,8*8)},
8*8*8*4,
};
static const gfx_layout layout_16x16x8_alt =
{
16,16,
RGN_FRAC(1,1),
8,
{ 0,1,2,3,4,5,6,7 },
{ 0 * 8, 1 * 8, 2 * 8, 3 * 8, 4 * 8, 5 * 8, 6 * 8, 7 * 8, 8 * 8, 9 * 8, 10 * 8, 11 * 8, 12 * 8, 13 * 8, 14 * 8, 15 * 8 },
{ STEP16(0,16*8) },
16*16*8,
};
static GFXDECODE_START( gfx_unico )
GFXDECODE_ENTRY( "gfx1", 0, layout_16x16x8, 0x0, 0x20 )
GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x8_alt, 0x0, 0x20 )
GFXDECODE_END
void goori_state::machine_start()
{
}
void goori_state::goori(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &goori_state::goori_map);
m_maincpu->set_vblank_int("screen", FUNC(goori_state::irq4_line_hold));
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60); // not verified
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(48*8, 262);
m_screen->set_visarea(0*8, 48*8-1, 2*8, 30*8-1);
m_screen->set_screen_update(FUNC(goori_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_unico);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x2000);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
OKIM6295(config, m_oki, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
YM2151(config, "ymsnd", XTAL(3'579'545)).add_route(0, "lspeaker", 0.40).add_route(1, "rspeaker", 0.40); // not verified
}
ROM_START( goori )
ROM_REGION( 0x080000, "maincpu", 0 ) // first half empty
ROM_LOAD16_BYTE( "goori02.4m", 0x000000, 0x040000, CRC(65a8568e) SHA1(c1a07f3a009df4af898ab62c15416073fcf768d9) )
ROM_CONTINUE(0x000000, 0x040000)
ROM_LOAD16_BYTE( "goori03.4m", 0x000001, 0x040000, CRC(de4b8818) SHA1(599ab6a354ab21d50c1b8c11e980f0b16f18e4dd) )
ROM_CONTINUE(0x000001, 0x040000)
ROM_REGION( 0x400000, "gfx1", 0 ) // sprites
ROM_LOAD( "goori04ol.16m", 0x000000, 0x200000, CRC(f26451b9) SHA1(c6818a44115d3efed2566442295dc0b253057602) )
ROM_LOAD( "goori05oh.16m", 0x200000, 0x200000, CRC(058ceaec) SHA1(8639d41685a6f3fb2d81b9aaf3c160666de8155d) )
ROM_REGION( 0x400000, "gfx2", 0 ) // bgs
ROM_LOAD( "goori06cl.16m", 0x000000, 0x200000, CRC(8603a662) SHA1(fbe5ccb3fded60b431ffee27471158c95a8328f8) )
ROM_LOAD( "goori07ch.16m", 0x200000, 0x200000, CRC(4223383e) SHA1(aa17eab343dad3f6eab05a844081370e3eebcd2e) )
ROM_REGION( 0x040000, "oki", 0 )
ROM_LOAD( "goori01.2m", 0x000000, 0x040000, CRC(c74351b9) SHA1(397f4b6aea23e6619e099c5cc99f38bae74bc3e8) )
ROM_END
GAME( 1999, goori, 0, goori, goori, goori_state, empty_init, ROT0, "Unico", "Goori Goori", 0 )

View File

@ -7,14 +7,18 @@
#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"
class drgnmst_state : public driver_device
class drgnmst_base_state : public driver_device
{
public:
drgnmst_state(const machine_config &mconfig, device_type type, const char *tag) :
drgnmst_base_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_vidregs(*this, "vidregs"),
m_fg_videoram(*this, "fg_videoram"),
m_bg_videoram(*this, "bg_videoram"),
@ -22,23 +26,20 @@ public:
m_rowscrollram(*this, "rowscrollram"),
m_vidregs2(*this, "vidregs2"),
m_spriteram(*this, "spriteram"),
m_oki1bank(*this, "oki1bank"),
m_oki(*this, "oki%u", 1U),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void drgnmst(machine_config &config);
void init_drgnmst();
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void drgnmst_main_map(address_map &map);
required_device<cpu_device> m_maincpu;
private:
/* memory pointers */
required_shared_ptr<uint16_t> m_vidregs;
@ -49,32 +50,14 @@ private:
required_shared_ptr<uint16_t> m_vidregs2;
required_shared_ptr<uint16_t> m_spriteram;
required_memory_bank m_oki1bank;
/* video-related */
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_md_tilemap;
/* misc */
uint8_t m_snd_command;
uint16_t m_snd_flag;
uint8_t m_oki_control;
uint8_t m_oki_command;
uint8_t m_pic16c5x_port0;
uint8_t m_oki_bank[2];
/* devices */
required_device_array<okim6295_device, 2> m_oki;
DECLARE_WRITE16_MEMBER(coin_w);
DECLARE_WRITE8_MEMBER(snd_command_w);
DECLARE_WRITE8_MEMBER(snd_flag_w);
DECLARE_READ8_MEMBER(pic16c5x_port0_r);
DECLARE_READ8_MEMBER(snd_command_r);
DECLARE_READ8_MEMBER(snd_flag_r);
DECLARE_WRITE8_MEMBER(pcm_banksel_w);
DECLARE_WRITE8_MEMBER(oki_w);
DECLARE_WRITE8_MEMBER(snd_control_w);
DECLARE_WRITE16_MEMBER(fg_videoram_w);
DECLARE_WRITE16_MEMBER(bg_videoram_w);
DECLARE_WRITE16_MEMBER(md_videoram_w);
@ -87,13 +70,74 @@ private:
static rgb_t drgnmst_IIIIRRRRGGGGBBBB(uint32_t raw);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
uint8_t drgnmst_asciitohex( uint8_t data );
required_device<cpu_device> m_maincpu;
required_device<pic16c55_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void drgnmst_main_map(address_map &map);
};
class drgnmst_pic_state : public drgnmst_base_state
{
public:
drgnmst_pic_state(const machine_config& mconfig, device_type type, const char* tag) :
drgnmst_base_state(mconfig, type, tag),
m_audiocpu(*this, "audiocpu"),
m_oki1bank(*this, "oki1bank"),
m_oki(*this, "oki%u", 1U)
{ }
void init_drgnmst();
void drgnmst_with_pic(machine_config& config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
optional_device<pic16c55_device> m_audiocpu;
uint8_t drgnmst_asciitohex(uint8_t data);
required_memory_bank m_oki1bank;
optional_device_array<okim6295_device, 2> m_oki;
/* misc */
uint8_t m_snd_command;
uint16_t m_snd_flag;
uint8_t m_oki_control;
uint8_t m_oki_command;
uint8_t m_pic16c5x_port0;
uint8_t m_oki_bank[2];
DECLARE_WRITE8_MEMBER(snd_command_w);
DECLARE_WRITE8_MEMBER(snd_flag_w);
DECLARE_READ8_MEMBER(pic16c5x_port0_r);
DECLARE_READ8_MEMBER(snd_command_r);
DECLARE_READ8_MEMBER(snd_flag_r);
DECLARE_WRITE8_MEMBER(pcm_banksel_w);
DECLARE_WRITE8_MEMBER(oki_w);
DECLARE_WRITE8_MEMBER(snd_control_w);
void drgnmst_main_map_with_pic(address_map& map);
void drgnmst_oki1_map(address_map &map);
};
class drgnmst_ym_state : public drgnmst_base_state
{
public:
drgnmst_ym_state(const machine_config& mconfig, device_type type, const char* tag) :
drgnmst_base_state(mconfig, type, tag),
m_oki(*this, "oki")
{ }
void drgnmst_ym(machine_config& config);
private:
required_device<okim6295_device> m_oki;
void drgnmst_main_map_with_ym(address_map& map);
};
#endif // MAME_INCLUDES_DRGNMST_H

View File

@ -12310,6 +12310,8 @@ rolcrusha // (c) 1999 SemiCom
@source:drgnmst.cpp
drgnmst // (c) 1994
drgnmst2 // (c) 1994
mastfury
@source:dribling.cpp
dribling // (c) 1983 Model Racing
@ -15163,6 +15165,9 @@ goodejan // (c) 1991 Seibu/Tecmo
goodejana // (c) 1991 Seibu/Tecmo
totmejan // (c) 1991 Seibu/Tecmo
@source:goori.cpp
goori
@source:gotcha.cpp
gotcha // (c) 1997 Dongsung + "presented by Para"
ppchamp // (c) 1997 Dongsung + "presented by Para"

View File

@ -8,7 +8,7 @@
#include "includes/drgnmst.h"
rgb_t drgnmst_state::drgnmst_IIIIRRRRGGGGBBBB(uint32_t raw)
rgb_t drgnmst_base_state::drgnmst_IIIIRRRRGGGGBBBB(uint32_t raw)
{
int const bright = 0x5 + ((raw >> 12) & 0xf); // TODO : verify brightness value from real pcb
int r = (pal4bit((raw >> 8) & 0x0f) * bright) / 0x14;
@ -25,24 +25,24 @@ rgb_t drgnmst_state::drgnmst_IIIIRRRRGGGGBBBB(uint32_t raw)
return rgb_t(r, g, b);
}
TILE_GET_INFO_MEMBER(drgnmst_state::get_fg_tile_info)
TILE_GET_INFO_MEMBER(drgnmst_base_state::get_fg_tile_info)
{
int tileno, colour, flipyx;
tileno = m_fg_videoram[tile_index * 2] & 0xfff;
colour = m_fg_videoram[tile_index * 2 + 1] & 0x1f;
flipyx = (m_fg_videoram[tile_index * 2 + 1] & 0x60)>>5;
tileno |= (BIT(tile_index, 5)) << 15; // 8x8 tile bank seems like cps1
tileno |= (BIT(tile_index, 5)) << 15; // 8x8 tile bank seems like cps1 (not on mastfury? or because bad dump)
tileinfo.set(1, tileno, colour, TILE_FLIPYX(flipyx));
}
WRITE16_MEMBER(drgnmst_state::fg_videoram_w)
WRITE16_MEMBER(drgnmst_base_state::fg_videoram_w)
{
COMBINE_DATA(&m_fg_videoram[offset]);
m_fg_tilemap->mark_tile_dirty(offset / 2);
}
TILE_GET_INFO_MEMBER(drgnmst_state::get_bg_tile_info)
TILE_GET_INFO_MEMBER(drgnmst_base_state::get_bg_tile_info)
{
int tileno, colour, flipyx;
tileno = (m_bg_videoram[tile_index * 2]& 0x1fff) + 0x800;
@ -52,13 +52,13 @@ TILE_GET_INFO_MEMBER(drgnmst_state::get_bg_tile_info)
tileinfo.set(3, tileno, colour, TILE_FLIPYX(flipyx));
}
WRITE16_MEMBER(drgnmst_state::bg_videoram_w)
WRITE16_MEMBER(drgnmst_base_state::bg_videoram_w)
{
COMBINE_DATA(&m_bg_videoram[offset]);
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
TILE_GET_INFO_MEMBER(drgnmst_state::get_md_tile_info)
TILE_GET_INFO_MEMBER(drgnmst_base_state::get_md_tile_info)
{
int tileno, colour, flipyx;
tileno = (m_md_videoram[tile_index * 2] & 0x7fff) - 0x2000;
@ -68,13 +68,13 @@ TILE_GET_INFO_MEMBER(drgnmst_state::get_md_tile_info)
tileinfo.set(2, tileno, colour, TILE_FLIPYX(flipyx));
}
WRITE16_MEMBER(drgnmst_state::md_videoram_w)
WRITE16_MEMBER(drgnmst_base_state::md_videoram_w)
{
COMBINE_DATA(&m_md_videoram[offset]);
m_md_tilemap->mark_tile_dirty(offset / 2);
}
void drgnmst_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect )
void drgnmst_base_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect )
{
gfx_element *gfx = m_gfxdecode->gfx(0);
uint16_t *source = m_spriteram;
@ -121,37 +121,37 @@ void drgnmst_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect
}
TILEMAP_MAPPER_MEMBER(drgnmst_state::fg_tilemap_scan_cols)
TILEMAP_MAPPER_MEMBER(drgnmst_base_state::fg_tilemap_scan_cols)
{
return ((col & 0x3f) << 5) | (row & 0x1f) | ((row & 0x20) << 6);
}
TILEMAP_MAPPER_MEMBER(drgnmst_state::md_tilemap_scan_cols)
TILEMAP_MAPPER_MEMBER(drgnmst_base_state::md_tilemap_scan_cols)
{
return ((col & 0x3f) << 4) | (row & 0x0f) | ((row & 0x30) << 6);
}
TILEMAP_MAPPER_MEMBER(drgnmst_state::bg_tilemap_scan_cols)
TILEMAP_MAPPER_MEMBER(drgnmst_base_state::bg_tilemap_scan_cols)
{
return ((col & 0x3f) << 3) | (row & 0x07) | ((row & 0x38) << 6);
}
void drgnmst_state::video_start()
void drgnmst_base_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(drgnmst_state::get_fg_tile_info)), tilemap_mapper_delegate(*this, FUNC(drgnmst_state::fg_tilemap_scan_cols)), 8, 8, 64,64);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(drgnmst_base_state::get_fg_tile_info)), tilemap_mapper_delegate(*this, FUNC(drgnmst_base_state::fg_tilemap_scan_cols)), 8, 8, 64,64);
m_fg_tilemap->set_transparent_pen(15);
m_md_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(drgnmst_state::get_md_tile_info)), tilemap_mapper_delegate(*this, FUNC(drgnmst_state::md_tilemap_scan_cols)), 16, 16, 64,64);
m_md_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(drgnmst_base_state::get_md_tile_info)), tilemap_mapper_delegate(*this, FUNC(drgnmst_base_state::md_tilemap_scan_cols)), 16, 16, 64,64);
m_md_tilemap->set_transparent_pen(15);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(drgnmst_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(drgnmst_state::bg_tilemap_scan_cols)), 32, 32, 64,64);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(drgnmst_base_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(drgnmst_base_state::bg_tilemap_scan_cols)), 32, 32, 64,64);
m_bg_tilemap->set_transparent_pen(15);
// do the other tilemaps have rowscroll too? probably not ..
m_md_tilemap->set_scroll_rows(1024);
}
uint32_t drgnmst_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t drgnmst_base_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int y, rowscroll_bank;