diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index c74ed10efe3..539d6fb003d 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -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") diff --git a/src/mame/drivers/drgnmst.cpp b/src/mame/drivers/drgnmst.cpp index 5928ea8497c..512d8158f0a 100644 --- a/src/mame/drivers/drgnmst.cpp +++ b/src/mame/drivers/drgnmst.cpp @@ -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 diff --git a/src/mame/drivers/goori.cpp b/src/mame/drivers/goori.cpp new file mode 100644 index 00000000000..2dada59658e --- /dev/null +++ b/src/mame/drivers/goori.cpp @@ -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 m_maincpu; + required_device m_palette; + required_device m_gfxdecode; + optional_device m_oki; + required_shared_ptr m_spriteram; + required_shared_ptr m_bg_videoram; + required_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 ) + diff --git a/src/mame/includes/drgnmst.h b/src/mame/includes/drgnmst.h index 22f1b34df91..6da75cde549 100644 --- a/src/mame/includes/drgnmst.h +++ b/src/mame/includes/drgnmst.h @@ -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 m_maincpu; + private: /* memory pointers */ required_shared_ptr m_vidregs; @@ -49,32 +50,14 @@ private: required_shared_ptr m_vidregs2; required_shared_ptr 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 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 m_maincpu; - required_device m_audiocpu; required_device m_gfxdecode; required_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 m_audiocpu; + + uint8_t drgnmst_asciitohex(uint8_t data); + + required_memory_bank m_oki1bank; + optional_device_array 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 m_oki; + + void drgnmst_main_map_with_ym(address_map& map); +}; + + #endif // MAME_INCLUDES_DRGNMST_H diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 9b6c80c70d8..5900a918aef 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -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" diff --git a/src/mame/video/drgnmst.cpp b/src/mame/video/drgnmst.cpp index ff40909892f..45b29e14d31 100644 --- a/src/mame/video/drgnmst.cpp +++ b/src/mame/video/drgnmst.cpp @@ -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;