diff options
Diffstat (limited to 'src/mame/technos/mystston.cpp')
-rw-r--r-- | src/mame/technos/mystston.cpp | 678 |
1 files changed, 678 insertions, 0 deletions
diff --git a/src/mame/technos/mystston.cpp b/src/mame/technos/mystston.cpp new file mode 100644 index 00000000000..d12abae1653 --- /dev/null +++ b/src/mame/technos/mystston.cpp @@ -0,0 +1,678 @@ +// license:BSD-3-Clause +// copyright-holders:Nicola Salmoria +/*************************************************************************** + + Technos Mysterious Stones hardware + + driver by Nicola Salmoria + + Notes: + * The subtitle of the two sets is slightly different: + "Dr. John's Adventure" vs. "Dr. Kick in Adventure". + The Dr John's is a bug fix. See the routine at 4376/4384 for example. + The old set thrashes the Y register, the new one saves in on + the stack. The newer set also resets the audio chips more often. + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/m6502/m6502.h" +#include "sound/ay8910.h" +#include "video/resnet.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" +#include "tilemap.h" + + +namespace { + +class mystston_state : public driver_device +{ +public: + mystston_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_ay8910(*this, "ay%u", 1U), + m_ay8910_data(*this, "ay8910_data"), + m_ay8910_select(*this, "ay8910_select"), + m_dsw1(*this, "DSW1"), + m_bg_videoram(*this, "bg_videoram"), + m_fg_videoram(*this, "fg_videoram"), + m_spriteram(*this, "spriteram"), + m_paletteram(*this, "paletteram"), + m_scroll(*this, "scroll"), + m_video_control(*this, "video_control"), + m_color_prom(*this, "proms"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette") { } + + void mystston(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); + +protected: + virtual void video_start() override ATTR_COLD; + virtual void video_reset() override ATTR_COLD; + +private: + static constexpr XTAL MASTER_CLOCK = XTAL(12'000'000); + + // machine state + required_device<cpu_device> m_maincpu; + required_device_array<ay8910_device, 2> m_ay8910; + required_shared_ptr<uint8_t> m_ay8910_data; + required_shared_ptr<uint8_t> m_ay8910_select; + required_ioport m_dsw1; + + // video state + tilemap_t *m_fg_tilemap = nullptr; + tilemap_t *m_bg_tilemap = nullptr; + emu_timer *m_interrupt_timer = nullptr; + required_shared_ptr<uint8_t> m_bg_videoram; + required_shared_ptr<uint8_t> m_fg_videoram; + required_shared_ptr<uint8_t> m_spriteram; + required_shared_ptr<uint8_t> m_paletteram; + required_shared_ptr<uint8_t> m_scroll; + required_shared_ptr<uint8_t> m_video_control; + required_region_ptr<uint8_t> m_color_prom; + required_device<gfxdecode_device> m_gfxdecode; + required_device<screen_device> m_screen; + required_device<palette_device> m_palette; + + // HMC20 + // set_raw(MASTER_CLOCK / 2, 384, 0, 256, 272, 8, 248) + static constexpr XTAL PIXEL_CLOCK = (MASTER_CLOCK / 2); + static constexpr int HTOTAL = (384); + static constexpr int HBEND = (0); + static constexpr int HBSTART = (256); + static constexpr int VTOTAL = (272); // counts from 0x08-0xff, then from 0xe8-0xff + static constexpr int VBEND = (8); + static constexpr int VBSTART = (248); + static constexpr int FIRST_INT_VPOS = (0x008); + static constexpr int INT_HPOS = (0x100); + + void irq_clear_w(uint8_t data); + void ay8910_select_w(uint8_t data); + void video_control_w(uint8_t data); + TILE_GET_INFO_MEMBER(get_bg_tile_info); + TILE_GET_INFO_MEMBER(get_fg_tile_info); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + TIMER_CALLBACK_MEMBER(interrupt_callback); + void set_palette(); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, int flip); + void on_scanline_interrupt(); + void main_map(address_map &map) ATTR_COLD; +}; + + +/*************************************************************************** + + There are only a few differences between the video hardware of Mysterious + Stones and Mat Mania. The tile bank select bit is different and the sprite + selection seems to be different as well. Additionally, the palette is stored + differently. I'm also not sure that the 2nd tile page is really used in + Mysterious Stones. + +***************************************************************************/ + + +/************************************* + * + * Scanline interrupt system + * + * There is an interrupt every 16 + * scanlines, starting with 8. + * + *************************************/ + +TIMER_CALLBACK_MEMBER(mystston_state::interrupt_callback) +{ + int scanline = param; + + on_scanline_interrupt(); + + scanline = scanline + 16; + if (scanline >= VTOTAL) + scanline = FIRST_INT_VPOS; + + // the vertical synch chain is clocked by H256 -- this is probably not important, but oh well + m_interrupt_timer->adjust(m_screen->time_until_pos(scanline - 1, INT_HPOS), scanline); +} + + + +/************************************* + * + * Palette handling + * + *************************************/ + +void mystston_state::set_palette() +{ + static const int resistances_rg[3] = { 4700, 3300, 1500 }; + static const int resistances_b [2] = { 3300, 1500 }; + double weights_rg[3], weights_b[2]; + + compute_resistor_weights(0, 255, -1.0, + 3, resistances_rg, weights_rg, 0, 4700, + 2, resistances_b, weights_b, 0, 4700, + 0, nullptr, nullptr, 0, 0); + + for (int i = 0; i < 0x40; i++) + { + uint8_t data; + + // first half is dynamic, second half is from the PROM + if (i & 0x20) + data = m_color_prom[i & 0x1f]; + else + data = m_paletteram[i]; + + // red component + int bit0 = (data >> 0) & 0x01; + int bit1 = (data >> 1) & 0x01; + int bit2 = (data >> 2) & 0x01; + int r = combine_weights(weights_rg, bit0, bit1, bit2); + + // green component + bit0 = (data >> 3) & 0x01; + bit1 = (data >> 4) & 0x01; + bit2 = (data >> 5) & 0x01; + int g = combine_weights(weights_rg, bit0, bit1, bit2); + + // blue component + bit0 = (data >> 6) & 0x01; + bit1 = (data >> 7) & 0x01; + int b = combine_weights(weights_b, bit0, bit1); + + m_palette->set_pen_color(i, rgb_t(r, g, b)); + } +} + + + +/************************************* + * + * Video control register + * + *************************************/ + +void mystston_state::video_control_w(uint8_t data) +{ + *m_video_control = data; + + // D0-D1 - foreground text color + // D2 - background page select + // D3 - unused + + // D4-D5 - coin counters in flipped order + machine().bookkeeping().coin_counter_w(0, data & 0x20); + machine().bookkeeping().coin_counter_w(1, data & 0x10); + + // D6 - unused + // D7 - screen flip +} + + + +/************************************* + * + * Tilemap callbacks + * + *************************************/ + +TILE_GET_INFO_MEMBER(mystston_state::get_bg_tile_info) +{ + int page = (*m_video_control & 0x04) << 8; + int code = ((m_bg_videoram[page | 0x200 | tile_index] & 0x01) << 8) | m_bg_videoram[page | tile_index]; + int flags = (tile_index & 0x10) ? TILE_FLIPY : 0; + + tileinfo.set(1, code, 0, flags); +} + + +TILE_GET_INFO_MEMBER(mystston_state::get_fg_tile_info) +{ + int code = ((m_fg_videoram[0x400 | tile_index] & 0x07) << 8) | m_fg_videoram[tile_index]; + int color = ((*m_video_control & 0x01) << 1) | ((*m_video_control & 0x02) >> 1); + + tileinfo.set(0, code, color, 0); +} + + + +/************************************* + * + * Sprite drawing + * + *************************************/ + +void mystston_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, int flip) +{ + for (int offs = 0; offs < 0x60; offs += 4) + { + int const attr = m_spriteram[offs]; + + if (attr & 0x01) + { + int const code = ((attr & 0x10) << 4) | m_spriteram[offs + 1]; + int const color = (attr & 0x08) >> 3; + int flipx = attr & 0x04; + int flipy = attr & 0x02; + int x = 240 - m_spriteram[offs + 3]; + int y = (240 - m_spriteram[offs + 2]) & 0xff; + + if (flip) + { + x = 240 - x; + y = 240 - y; + flipx = !flipx; + flipy = !flipy; + } + + gfx->transpen(bitmap, cliprect, code, color, flipx, flipy, x, y, 0); + } + } +} + + + +/************************************* + * + * Start + * + *************************************/ + +void mystston_state::video_start() +{ + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mystston_state::get_bg_tile_info)), TILEMAP_SCAN_COLS_FLIP_X, 16, 16, 16, 32); + + m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mystston_state::get_fg_tile_info)), TILEMAP_SCAN_COLS_FLIP_X, 8, 8, 32, 32); + m_fg_tilemap->set_transparent_pen(0); + + // create the interrupt timer + m_interrupt_timer = timer_alloc(FUNC(mystston_state::interrupt_callback), this); +} + + + +/************************************* + * + * Reset + * + *************************************/ + +void mystston_state::video_reset() +{ + m_interrupt_timer->adjust(m_screen->time_until_pos(FIRST_INT_VPOS - 1, INT_HPOS), FIRST_INT_VPOS); +} + + + +/************************************* + * + * Update + * + *************************************/ + +uint32_t mystston_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int const flip = (*m_video_control & 0x80) ^ ((m_dsw1->read() & 0x20) << 2); + + set_palette(); + + machine().tilemap().mark_all_dirty(); + m_bg_tilemap->set_scrolly(0, *m_scroll); + machine().tilemap().set_flip_all(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + draw_sprites(bitmap, cliprect, m_gfxdecode->gfx(2), flip); + m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + + return 0; +} + + + +/************************************* + * + * Graphics decoding + * + *************************************/ + +static const gfx_layout spritelayout = +{ + 16,16, + RGN_FRAC(1,3), + 3, + { RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) }, + { 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7, + 16*0+0, 16*0+1, 16*0+2, 16*0+3, 16*0+4, 16*0+5, 16*0+6, 16*0+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 }, + 32*8 +}; + + +static GFXDECODE_START( gfx_mystston ) + GFXDECODE_ENTRY( "fgtiles_sprites", 0, gfx_8x8x3_planar, 4*8, 4 ) + GFXDECODE_ENTRY( "bgtiles", 0, spritelayout, 2*8, 1 ) + GFXDECODE_ENTRY( "fgtiles_sprites", 0, spritelayout, 0*8, 2 ) +GFXDECODE_END + + +/************************************* + * + * Interrupt system + * + *************************************/ + +void mystston_state::on_scanline_interrupt() +{ + m_maincpu->set_input_line(0, ASSERT_LINE); +} + + +void mystston_state::irq_clear_w(uint8_t data) +{ + m_maincpu->set_input_line(0, CLEAR_LINE); +} + + + +/************************************* + * + * Coin handling + * + *************************************/ + +INPUT_CHANGED_MEMBER(mystston_state::coin_inserted) +{ + // coin insertion causes an NMI + m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE); +} + + + +/************************************* + * + * AY-8910 memory interface + * + *************************************/ + +void mystston_state::ay8910_select_w(uint8_t data) +{ + // bit 5 goes to 8910 #0 BDIR pin + if (((*m_ay8910_select & 0x20) == 0x20) && ((data & 0x20) == 0x00)) + { + // bit 4 goes to the 8910 #0 BC1 pin + m_ay8910[0]->data_address_w(*m_ay8910_select >> 4, *m_ay8910_data); + } + + // bit 7 goes to 8910 #1 BDIR pin + if (((*m_ay8910_select & 0x80) == 0x80) && ((data & 0x80) == 0x00)) + { + // bit 6 goes to the 8910 #1 BC1 pin + m_ay8910[1]->data_address_w(*m_ay8910_select >> 6, *m_ay8910_data); + } + + *m_ay8910_select = data; +} + + + +/************************************* + * + * Memory map + * + *************************************/ + +void mystston_state::main_map(address_map &map) +{ + map(0x0000, 0x077f).ram(); + map(0x0780, 0x07df).ram().share(m_spriteram); + map(0x07e0, 0x0fff).ram(); + map(0x1000, 0x17ff).ram().share(m_fg_videoram); + map(0x1800, 0x1fff).ram().share(m_bg_videoram); + map(0x2000, 0x2000).mirror(0x1f8f).portr("IN0").w(FUNC(mystston_state::video_control_w)).share(m_video_control); + map(0x2010, 0x2010).mirror(0x1f8f).portr("IN1").w(FUNC(mystston_state::irq_clear_w)); + map(0x2020, 0x2020).mirror(0x1f8f).portr("DSW0").writeonly().share(m_scroll); + map(0x2030, 0x2030).mirror(0x1f8f).portr("DSW1").writeonly().share(m_ay8910_data); + map(0x2040, 0x2040).mirror(0x1f8f).nopr().w(FUNC(mystston_state::ay8910_select_w)).share(m_ay8910_select); + map(0x2050, 0x2050).mirror(0x1f8f).noprw(); + map(0x2060, 0x207f).mirror(0x1f80).ram().share(m_paletteram); + map(0x4000, 0xffff).rom(); +} + + + +/************************************* + * + * Input ports + * + *************************************/ + +static INPUT_PORTS_START( mystston ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(mystston_state::coin_inserted), 0) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(mystston_state::coin_inserted), 0) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_START("DSW0") + PORT_DIPNAME(0x01, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME(0x02, 0x02, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME(0x04, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW2:4" ) // Listed as "Unused" + PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW2:5" ) // Listed as "Unused" + PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW2:6" ) // Listed as "Unused" + PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:7" ) // Listed as "Unused" + PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" ) // Listed as "Unused" + + PORT_START("DSW1") + PORT_DIPNAME(0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME(0x0c, 0x0c, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:3,4") + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW1:5" ) // Listed as "Unused" + PORT_DIPNAME(0x20, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:6") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME(0x40, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:7") + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("screen", FUNC(screen_device::vblank)) +INPUT_PORTS_END + +static INPUT_PORTS_START( myststonoi ) + PORT_INCLUDE(mystston) + + PORT_MODIFY("DSW0") + PORT_DIPNAME(0x01, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x01, "2" ) + PORT_DIPSETTING( 0x00, "3" ) +INPUT_PORTS_END + +/************************************* + * + * Machine driver + * + *************************************/ + +void mystston_state::mystston(machine_config &config) +{ + // basic machine hardware + M6502(config, m_maincpu, MASTER_CLOCK / 8); + m_maincpu->set_addrmap(AS_PROGRAM, &mystston_state::main_map); + + // video hardware + GFXDECODE(config, m_gfxdecode, m_palette, gfx_mystston); + PALETTE(config, m_palette).set_entries(0x40); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART); + m_screen->set_screen_update(FUNC(mystston_state::screen_update)); + m_screen->set_palette(m_palette); + + // audio hardware + SPEAKER(config, "mono").front_center(); + + AY8910(config, m_ay8910[0], MASTER_CLOCK / 8).add_route(ALL_OUTPUTS, "mono", 0.30); + + AY8910(config, m_ay8910[1], MASTER_CLOCK / 8).add_route(ALL_OUTPUTS, "mono", 0.30); +} + + + +/************************************* + * + * ROM definitions + * + *************************************/ + +ROM_START( mystston ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rom6.bin", 0x4000, 0x2000, CRC(7bd9c6cd) SHA1(4d14edc783ba1a6c01d2fb9ea29ec85b8fec3c3b) ) + ROM_LOAD( "rom5.bin", 0x6000, 0x2000, CRC(a83f04a6) SHA1(d8cdf310511c1fef4fbde80ef2161fda00f965d7) ) + ROM_LOAD( "rom4.bin", 0x8000, 0x2000, CRC(46c73714) SHA1(5b9ac3a35aeeea6a0cd2d838c144925d83b36a7f) ) + ROM_LOAD( "rom3.bin", 0xa000, 0x2000, CRC(34f8b8a3) SHA1(a270f6665a9f76f97ac02201d51fe2817e6e8f22) ) + ROM_LOAD( "rom2.bin", 0xc000, 0x2000, CRC(bfd22cfc) SHA1(137cd61c8b1e997e7e50edd57f1671031d8e3ac5) ) + ROM_LOAD( "rom1.bin", 0xe000, 0x2000, CRC(fb163e38) SHA1(d6f02e90bfd9badd7751bc0a87fdfdd1d0a7e202) ) + + ROM_REGION( 0x0c000, "fgtiles_sprites", 0 ) + ROM_LOAD( "ms6", 0x00000, 0x2000, CRC(85c83806) SHA1(cdfed6c224754e8f79b154533b06b7de4a44b4d3) ) + ROM_LOAD( "ms9", 0x02000, 0x2000, CRC(b146c6ab) SHA1(712c0c17780f222be5c8b09185a22e900ab23944) ) + ROM_LOAD( "ms7", 0x04000, 0x2000, CRC(d025f84d) SHA1(eaaaa0bde3db850098d04a0af85993026e503fc5) ) + ROM_LOAD( "ms10", 0x06000, 0x2000, CRC(d85015b5) SHA1(f4afab248dfde354650e59fadd5ab9616b04dac1) ) + ROM_LOAD( "ms8", 0x08000, 0x2000, CRC(53765d89) SHA1(c8bfc311123b076dccae9f7e3b95460bf9fc843d) ) + ROM_LOAD( "ms11", 0x0a000, 0x2000, CRC(919ee527) SHA1(609ee854ab3a4fdbf3404a68a4a657b85250f742) ) + + ROM_REGION( 0x0c000, "bgtiles", 0 ) + ROM_LOAD( "ms12", 0x00000, 0x2000, CRC(72d8331d) SHA1(f0a3bc6c9d9966f169f4721c2453f7ee210f0feb) ) + ROM_LOAD( "ms13", 0x02000, 0x2000, CRC(845a1f9b) SHA1(aa2eabd2a5e89e150b5d2fb3d88f91902e5ebb48) ) + ROM_LOAD( "ms14", 0x04000, 0x2000, CRC(822874b0) SHA1(9376d48045bf67df91d103effd1d08bd8debad26) ) + ROM_LOAD( "ms15", 0x06000, 0x2000, CRC(4594e53c) SHA1(a011a5269a9b0ca7a964181efe8413d5637c34f4) ) + ROM_LOAD( "ms16", 0x08000, 0x2000, CRC(2f470b0f) SHA1(79b50a7d113fed4669361c5f6c60ec96c94344c6) ) + ROM_LOAD( "ms17", 0x0a000, 0x2000, CRC(38966d1b) SHA1(89e3e54d3298cefeb35922d2292e3e7b8e995871) ) + + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "ic61", 0x0000, 0x0020, CRC(e802d6cf) SHA1(233ceb9e3a91939e1925766a696bc65ab0dffa50) ) +ROM_END + +/* +actual label format is: +-------------- +| T.M. | +| MYSTERIOUS | +| STONES | +| BB00- | +| @ 1984 | +| DATA EAST | +-------------- +*/ +ROM_START( myststono ) // TA-0010-P1-1 + TA-0010-P2-1 PCBs + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "bb00.ic102", 0x4000, 0x2000, CRC(6dacc05f) SHA1(43054199901639516205c7ea145462d0abea8fb1) ) + ROM_LOAD( "bw01.ic90", 0x6000, 0x2000, CRC(a3546df7) SHA1(89c0349885a9369406a1121cd3db28963b25f2e6) ) + ROM_LOAD( "bw02.ic76", 0x8000, 0x2000, CRC(43bc6182) SHA1(dc36c10eee20009922e89d9bfdf6c2f6ffb881ce) ) + ROM_LOAD( "bw03.ic75", 0xa000, 0x2000, CRC(9322222b) SHA1(25192ac9e8e66cd2bc21c66c690c57c6b9836f2d) ) + ROM_LOAD( "bw04.ic62", 0xc000, 0x2000, CRC(47cefe9b) SHA1(49422b664b1322373a9cd3cb2907f8f5492faf87) ) + ROM_LOAD( "bw05.ic61", 0xe000, 0x2000, CRC(b37ae12b) SHA1(55ee1193088145c85adddd377d9e5ee58aca922f) ) + + ROM_REGION( 0xc000, "fgtiles_sprites", 0 ) + ROM_LOAD( "bw06.ic105", 0x00000, 0x2000, CRC(85c83806) SHA1(cdfed6c224754e8f79b154533b06b7de4a44b4d3) ) + ROM_LOAD( "bw09.ic93", 0x02000, 0x2000, CRC(b146c6ab) SHA1(712c0c17780f222be5c8b09185a22e900ab23944) ) + ROM_LOAD( "bw07.ic107", 0x04000, 0x2000, CRC(d025f84d) SHA1(eaaaa0bde3db850098d04a0af85993026e503fc5) ) + ROM_LOAD( "bw10.ic95", 0x06000, 0x2000, CRC(d85015b5) SHA1(f4afab248dfde354650e59fadd5ab9616b04dac1) ) + ROM_LOAD( "bw08.ic109", 0x08000, 0x2000, CRC(53765d89) SHA1(c8bfc311123b076dccae9f7e3b95460bf9fc843d) ) + ROM_LOAD( "bw11.ic97", 0x0a000, 0x2000, CRC(919ee527) SHA1(609ee854ab3a4fdbf3404a68a4a657b85250f742) ) + + ROM_REGION( 0x0c000, "bgtiles", 0 ) + ROM_LOAD( "bw12.ic15", 0x00000, 0x2000, CRC(72d8331d) SHA1(f0a3bc6c9d9966f169f4721c2453f7ee210f0feb) ) + ROM_LOAD( "bw13.ic20", 0x02000, 0x2000, CRC(845a1f9b) SHA1(aa2eabd2a5e89e150b5d2fb3d88f91902e5ebb48) ) + ROM_LOAD( "bw14.ic24", 0x04000, 0x2000, CRC(822874b0) SHA1(9376d48045bf67df91d103effd1d08bd8debad26) ) + ROM_LOAD( "bw15.ic29", 0x06000, 0x2000, CRC(4594e53c) SHA1(a011a5269a9b0ca7a964181efe8413d5637c34f4) ) + ROM_LOAD( "bw16.ic34", 0x08000, 0x2000, CRC(2f470b0f) SHA1(79b50a7d113fed4669361c5f6c60ec96c94344c6) ) + ROM_LOAD( "bw17.ic38", 0x0a000, 0x2000, CRC(38966d1b) SHA1(89e3e54d3298cefeb35922d2292e3e7b8e995871) ) + + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "hlo.ic61", 0x0000, 0x0020, CRC(e802d6cf) SHA1(233ceb9e3a91939e1925766a696bc65ab0dffa50) ) +ROM_END + +// looks like Itisa made a (very) minor mod to the ROMs when producing the PCBs +ROM_START( myststonoi ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "14.bin", 0x4000, 0x2000, CRC(78bf2a58) SHA1(92e61041acad3293a103d957507b091321eed8f1) ) // 2 bytes changed in here (values for the lives' dip-switch) + ROM_LOAD( "13.bin", 0x6000, 0x2000, CRC(a3546df7) SHA1(89c0349885a9369406a1121cd3db28963b25f2e6) ) + ROM_LOAD( "12.bin", 0x8000, 0x2000, CRC(43bc6182) SHA1(dc36c10eee20009922e89d9bfdf6c2f6ffb881ce) ) + ROM_LOAD( "11.bin", 0xa000, 0x2000, CRC(9322222b) SHA1(25192ac9e8e66cd2bc21c66c690c57c6b9836f2d) ) + ROM_LOAD( "8.bin", 0xc000, 0x2000, CRC(47cefe9b) SHA1(49422b664b1322373a9cd3cb2907f8f5492faf87) ) + ROM_LOAD( "7.bin", 0xe000, 0x2000, CRC(b37ae12b) SHA1(55ee1193088145c85adddd377d9e5ee58aca922f) ) + + ROM_REGION( 0x0c000, "fgtiles_sprites", 0 ) + ROM_LOAD( "18.bin", 0x00000, 0x2000, CRC(85c83806) SHA1(cdfed6c224754e8f79b154533b06b7de4a44b4d3) ) + ROM_LOAD( "15.bin", 0x02000, 0x2000, CRC(b146c6ab) SHA1(712c0c17780f222be5c8b09185a22e900ab23944) ) + ROM_LOAD( "19.bin", 0x04000, 0x2000, CRC(d025f84d) SHA1(eaaaa0bde3db850098d04a0af85993026e503fc5) ) + ROM_LOAD( "16.bin", 0x06000, 0x2000, CRC(d85015b5) SHA1(f4afab248dfde354650e59fadd5ab9616b04dac1) ) + ROM_LOAD( "20.bin", 0x08000, 0x2000, CRC(53765d89) SHA1(c8bfc311123b076dccae9f7e3b95460bf9fc843d) ) + ROM_LOAD( "17.bin", 0x0a000, 0x2000, CRC(919ee527) SHA1(609ee854ab3a4fdbf3404a68a4a657b85250f742) ) + + ROM_REGION( 0x0c000, "bgtiles", 0 ) + ROM_LOAD( "1.bin", 0x00000, 0x2000, CRC(72d8331d) SHA1(f0a3bc6c9d9966f169f4721c2453f7ee210f0feb) ) + ROM_LOAD( "2.bin", 0x02000, 0x2000, CRC(845a1f9b) SHA1(aa2eabd2a5e89e150b5d2fb3d88f91902e5ebb48) ) + ROM_LOAD( "3.bin", 0x04000, 0x2000, CRC(822874b0) SHA1(9376d48045bf67df91d103effd1d08bd8debad26) ) + ROM_LOAD( "4.bin", 0x06000, 0x2000, CRC(4594e53c) SHA1(a011a5269a9b0ca7a964181efe8413d5637c34f4) ) + ROM_LOAD( "5.bin", 0x08000, 0x2000, CRC(2f470b0f) SHA1(79b50a7d113fed4669361c5f6c60ec96c94344c6) ) + ROM_LOAD( "6.bin", 0x0a000, 0x2000, CRC(38966d1b) SHA1(89e3e54d3298cefeb35922d2292e3e7b8e995871) ) + + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "82s123.bin", 0x0000, 0x0020, CRC(e802d6cf) SHA1(233ceb9e3a91939e1925766a696bc65ab0dffa50) ) + + ROM_REGION( 0x0104, "pals", 0 ) // not verified if these were protected + ROM_LOAD( "pal10l8.bin", 0x0000, 0x002c, CRC(2d4d034c) SHA1(1d43f21d4522c71da507c1ded1b2d3bfa0fe043b) ) + ROM_LOAD( "pal16r4-1.bin", 0x0000, 0x0104, CRC(c57555d0) SHA1(c1cda869de8457b9f8ca4f41f0ed49916110ff2e) ) + ROM_LOAD( "pal16r4-2.bin", 0x0000, 0x0104, CRC(c57555d0) SHA1(c1cda869de8457b9f8ca4f41f0ed49916110ff2e) ) +ROM_END + +} // anonymous namespace + + +/************************************* + * + * Game drivers + * + *************************************/ + +GAME( 1984, mystston, 0, mystston, mystston, mystston_state, empty_init, ROT270, "Technos Japan", "Mysterious Stones - Dr. John's Adventure", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, myststono, mystston, mystston, mystston, mystston_state, empty_init, ROT270, "Technos Japan", "Mysterious Stones - Dr. Kick in Adventure", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, myststonoi, mystston, mystston, myststonoi, mystston_state, empty_init, ROT270, "Technos Japan", "Mysterious Stones - Dr. Kick in Adventure (Itisa PCB)", MACHINE_SUPPORTS_SAVE ) |