mirror of
https://github.com/holub/mame
synced 2025-05-28 16:43:04 +03:00
1387 lines
62 KiB
C++
1387 lines
62 KiB
C++
// license:BSD-3-Clause
|
|
// copyright-holders:David Graves
|
|
// thanks-to:Richard Bush
|
|
/*******************************************************************************
|
|
|
|
Taito Triple Screen Games
|
|
=========================
|
|
|
|
Ninja Warriors (c) 1987 Taito
|
|
Darius 2 (c) 1989 Taito
|
|
|
|
David Graves
|
|
|
|
(this is based on the F2 driver by Bryan McPhail, Brad Oliver, Andrew Prime,
|
|
Nicola Salmoria. Thanks to Richard Bush and the Raine team, whose open
|
|
source was very helpful in many areas particularly the sprites.)
|
|
|
|
*****
|
|
|
|
The triple screen games operate on hardware with various similarities to
|
|
the Taito F2 system, as they share some custom ics e.g. the TC0100SCN.
|
|
|
|
According to Sixtoe: "The multi-monitor systems had 2 or 3 13" screens;
|
|
one in the middle facing the player, and the other 1 or 2 on either side
|
|
mounted below and facing directly up reflecting off special semi-reflecting
|
|
mirrors, with about 1" of the graphics being overlapped on each screen.
|
|
This was the only way to get uninterrupted screens and to be able to see
|
|
through both ways. Otherwise you`d have the monitors' edges visible.
|
|
You can tell if your arcade has been cheap (like one near me) when you
|
|
look at the screens and can see black triangles on the left or right, this
|
|
means they bought ordinary mirrors and you can't see through them the
|
|
wrong way, as the semi-reflecting mirrors were extremely expensive."
|
|
|
|
For each screen the games have 3 separate layers of graphics:- one
|
|
128x64 tiled scrolling background plane of 8x8 tiles, a similar
|
|
foreground plane, and a 128x32 text plane with character definitions
|
|
held in ram.
|
|
|
|
Writing to the first TC0100SCN "writes through" to the two subsidiary
|
|
chips so that all three have identical contents. The subsidiary ones are
|
|
only addressed individually during initial memory checks, I think. (?)
|
|
|
|
There is a single sprite plane which covers all 3 screens.
|
|
The sprites are 16x16 and are not zoomable.
|
|
|
|
Twin 68000 processors are used; both have access to sprite ram and
|
|
the tilemap areas, and they communicate via 64K of shared ram.
|
|
|
|
Sound is dealt with by a Z80 controlling a YM2610. Sound commands
|
|
are written to the Z80 by the 68000 (the same as in Taito F2 games).
|
|
|
|
|
|
Tilemaps
|
|
========
|
|
|
|
TC0100SCN has tilemaps twice as wide as usual. The two BG tilemaps take
|
|
up twice the usual space, $8000 bytes each. The text tilemap takes up
|
|
the usual space, because its height is halved.
|
|
|
|
The triple palette generator (one for each screen) is probably just a
|
|
result of the way the hardware works: the colors in each are the same.
|
|
|
|
|
|
Ninja Warriors
|
|
Taito, 1987
|
|
|
|
PCB Layout
|
|
----------
|
|
|
|
J1100136A
|
|
K1100313A
|
|
SOUND BOARD
|
|
|------------------------------|
|
|
| Z80 16MHz YM2610 |
|
|
|M B31-37.11 |
|
|
| TMM2063 TC0140SYT |
|
|
| TC0060DCA |
|
|
| TC0060DCA YM3016-F |
|
|
| TL074 TL074 TL074 |
|
|
| B31-08.19|
|
|
| B31-09.18|
|
|
| MB3735 MB3735 B31-10.17|
|
|
| B31-11.16|
|
|
| VOL1 VOL2 |
|
|
| S |
|
|
|------------------------------|
|
|
Notes:
|
|
Z80 - clock 4.000MHz [16/4]
|
|
YM2610 - clock 8.000MHz [16/2]
|
|
MB3735 - Audio power AMP
|
|
TC006DCA - Taito custom ceramic DAC/filter module (SIL20)
|
|
TC0140SYT - Taito custom sound control IC (QFP120)
|
|
YM3016F - Yamaha stereo audio DAC (DOIC16)
|
|
TL074 - Texas Instruments low noise quad J-Fet op-amp (DIP14)
|
|
M - 25 pin connector
|
|
S - 30 pin flat cable joining to CPU BOARD
|
|
TMM2063 - 8kx8 SRAM (DIP28)
|
|
B31-37 - TC541000 mask ROM (DIP32)
|
|
Other B31* - 234000 mask ROM (DIP40)
|
|
|
|
|
|
K1100311B
|
|
J1100134B
|
|
CPU BOARD
|
|
|--------------------------------------------------------------|
|
|
| 2018 2063 |
|
|
| TC0070RGB TC0110PCR B31-02.29 43256 |
|
|
| 68000 2018 TC0100SCN B31-01.28 43256 |
|
|
| 26.686MHz 2063 |
|
|
| B31-16.68 16MHZ |
|
|
|H 2018 2063 |
|
|
| B31-36.97 B31-33.87 TC0070RGB TC011PCR B31-02.27 43256 |
|
|
| B31-35.96 B31-32.86 2018 TC0100SCN B31-01.26 43256 |
|
|
| B31-34.95 B31-31.85 B31-15.62 2063 |
|
|
|J DIP28 DIP28 |
|
|
| 43256 43256 |
|
|
| 2063 |
|
|
| 2018 TC0100SCN B31-02.24 43256 |
|
|
| B31-17.82 TC0070RGB TC0110PCR B31-01.24 43256 |
|
|
| B31-14-1.54 2063 |
|
|
| |
|
|
| 2018 43256 |
|
|
|G 43256 |
|
|
| 43256 43256 B31-13.20 |
|
|
| 3771 B31-45.35 B31-47.32 68000 |
|
|
| PC050CM TC0040IOC DSWA B31-29.34 B31-27.31 |
|
|
| DSWB DIP40 B31-12.1 |
|
|
|--------------------------------------------------------------|
|
|
Notes:
|
|
43256 - 32kx8 SRAM (DIP28)
|
|
2063 - 8kx8 SRAM (NDIP28)
|
|
DIP28 - Empty socket(s)
|
|
DIP40 - Socket for mounting 'ROM 5 BOARD'
|
|
2018 - 2kx8 SRAM (NDIP24)
|
|
H - 12 pin connector for power input
|
|
J - 15 pin connector
|
|
G - 22-way edge connector
|
|
B31-12 to B31-17 - PALs
|
|
|
|
|
|
K9100162A
|
|
J9100118A
|
|
ROM 5 BOARD
|
|
|-----------------|
|
|
|B31-38.3 B31-40.6|
|
|
|B31-39.2 B31-41.5|
|
|
| |
|
|
| DIP40 74F139|
|
|
|-----------------|
|
|
|
|
|
|
K1100312A
|
|
J1100135A
|
|
OBJECT BOARD
|
|
|--------------------------------------------------------------|
|
|
| |
|
|
| B31-18.IC78 |
|
|
| TMM2064 TMM2064 TMM2064 |
|
|
| B31-19.IC80 |
|
|
| TMM2064 |
|
|
| |
|
|
| |
|
|
| B31-20.IC119 |
|
|
| B31-21.IC120 |
|
|
| B31-22.IC121 |
|
|
| B31-04.IC173|
|
|
| B31-23.IC143 B31-05.IC174|
|
|
| B31-24.IC144 B31-06.IC175|
|
|
| B31-07.IC176|
|
|
| MB81461 MB81461 MB81461 MB81461 |
|
|
| MB81461 MB81461 MB81461 MB81461 |
|
|
| MB81461 MB81461 MB81461 MB81461 |
|
|
|H MB81461 MB81461 MB81461 MB81461 TC0120SHT |
|
|
| MB81461 MB81461 MB81461 MB81461 |
|
|
| MB81461 MB81461 MB81461 MB81461 |
|
|
| MB81461 MB81461 MB81461 MB81461 |
|
|
| MB81461 MB81461 MB81461 MB81461 |
|
|
|--------------------------------------------------------------|
|
|
Notes:
|
|
B31-04 to 06 - 234000 mask ROM (DIP40)
|
|
B31-18 to 24 - PALs
|
|
MB81461 - 64kx4 dual-port DRAM (ZIP24)
|
|
TMM2064 - 8kx8 SRAM (DIP28)
|
|
|
|
Dumpers Notes
|
|
-------------
|
|
|
|
Ninja Warriors (JPN Ver.)
|
|
(c)1987 Taito
|
|
|
|
Sound Board
|
|
K1100313A
|
|
CPU :Z80
|
|
Sound :YM2610
|
|
OSC :16000.00KHz
|
|
Other :TC0140SYT,TC0060DCA x2
|
|
-----------------------
|
|
B31-08.19
|
|
B31-09.18
|
|
B31-10.17
|
|
B31-11.16
|
|
B31_37.11
|
|
-----------------------
|
|
CPU Board
|
|
M4300086A
|
|
K1100311A
|
|
CPU :TS68000CP8 x2
|
|
Sound :YM2610
|
|
OSC :26686.00KHz,16000.00KHz
|
|
Other :TC0040IOC,TC0070RGB x3,TC0110PCR x3,TC0100SCN x3
|
|
-----------------------
|
|
B31-01.23
|
|
B31-01.26
|
|
B31-01.28
|
|
B31-02.24
|
|
B31-02.27
|
|
B31-02.29
|
|
B31_27.31
|
|
B31_28.32
|
|
B31_29.34
|
|
B31_30.35
|
|
B31_31.85
|
|
B31_32.86
|
|
B31_33.87
|
|
B31_34.95
|
|
B31_35.96
|
|
B31_36.97
|
|
B31_38.3
|
|
B31_39.2
|
|
B31_40.6
|
|
B31_41.5
|
|
-----------------------
|
|
OBJECT Board
|
|
K1100312A
|
|
Other :TC0120SHT
|
|
-----------------------
|
|
B31-04.173
|
|
B31-05.174
|
|
B31-06.175
|
|
B31-07.176
|
|
B31-25.38
|
|
B31-26.58
|
|
|
|
|
|
Stephh's notes (based on the game M68000 code and some tests) :
|
|
|
|
1) 'ninjaw*'
|
|
|
|
- Region stored at 0x01fffe.w
|
|
- Sets :
|
|
* 'ninjaw' : region = 0x0003
|
|
* 'ninjawu' : region = 0x0004
|
|
* 'ninjawj' : region = 0x0000
|
|
- Coinage relies on the region (code at 0x0013bc) :
|
|
* 0x0000 (Japan), 0x0001 (?) and 0x0002 (US) use TAITO_COINAGE_JAPAN_OLD
|
|
* 0x0003 (World) and 0x0004 (licensed to xxx) use TAITO_COINAGE_WORLD
|
|
- Notice screen only if region = 0x0000
|
|
- According to the manual, DSWB bit 6 determines continue pricing :
|
|
("Not Used" on Japanese manual)
|
|
|
|
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Continue_Price ) ) PORT_DIPLOCATION("SW2:7")
|
|
PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) )
|
|
PORT_DIPSETTING( 0x00, "Same as Start" )
|
|
|
|
However, many conditions are required to make it work due to code at 0x001404 :
|
|
* region must not be 0x0000
|
|
* coinage must be the same for both slots
|
|
* coinage must be 2C_1C
|
|
This is why this Dip Switch has NO effect in the sets we have :
|
|
* 'ninjaw' : coinage is always different for the 2 slots
|
|
* 'ninjawj' : region = 0x0000
|
|
|
|
|
|
2) 'darius2'
|
|
|
|
- Region stored at 0x03fffe.w
|
|
- Sets :
|
|
* 'darius2' : region = 0x0001
|
|
- Coinage relies on the region (code at 0x00f37a) :
|
|
* 0x0000 (?), 0x0001 (Japan) and 0x0002 (US) use TAITO_COINAGE_JAPAN_OLD
|
|
* 0x0002 (US, licensed to ROMSTAR) uses slighlty different TAITO_COINAGE_US :
|
|
4C_3C instead of 4C_1C, same other settings otherwise
|
|
* 0x0003 (World) uses TAITO_COINAGE_WORLD
|
|
- Texts and game name rely on the region :
|
|
* 0x0001 : some texts in Japanese - game name is "Darius II"
|
|
* other : all texts in English - game name is "Sagaia"
|
|
- Notice screen only if region = 0x0001
|
|
- FBI logo only if region = 0x0002
|
|
- Japan version resets score on continue, other versions don't
|
|
|
|
|
|
TODO
|
|
====
|
|
|
|
Verify 68000 clock rates. Unknown sprite bits.
|
|
|
|
|
|
Ninjaw
|
|
------
|
|
|
|
"Subwoofer" sound filtering isn't perfect.
|
|
|
|
Some enemies slide relative to the background when they should
|
|
be standing still. High cpu interleaving doesn't help much.
|
|
|
|
|
|
Darius 2
|
|
--------
|
|
|
|
"Subwoofer" sound filtering isn't perfect.
|
|
|
|
(When you lose a life or big enemies appear it's meant to create
|
|
rumbling on a subwoofer in the cabinet.)
|
|
|
|
*******************************************************************************/
|
|
|
|
#include "emu.h"
|
|
|
|
#include "taitoio.h"
|
|
#include "taitoipt.h"
|
|
#include "taitosnd.h"
|
|
|
|
#include "tc0100scn.h"
|
|
#include "tc0110pcr.h"
|
|
|
|
#include "cpu/z80/z80.h"
|
|
#include "cpu/m68000/m68000.h"
|
|
#include "sound/flt_vol.h"
|
|
#include "sound/ymopn.h"
|
|
|
|
#include "emupal.h"
|
|
#include "screen.h"
|
|
#include "speaker.h"
|
|
|
|
#include "ninjaw.lh"
|
|
|
|
|
|
namespace {
|
|
|
|
class ninjaw_state : public driver_device
|
|
{
|
|
public:
|
|
ninjaw_state(const machine_config &mconfig, device_type type, const char *tag) :
|
|
driver_device(mconfig, type, tag),
|
|
m_maincpu(*this, "maincpu"),
|
|
m_subcpu(*this, "sub"),
|
|
m_tc0140syt(*this, "tc0140syt"),
|
|
m_tc0100scn(*this, "tc0100scn_%u", 1),
|
|
m_tc0110pcr(*this, "tc0110pcr_%u", 1),
|
|
m_2610_l(*this, "2610.%u.l", 1),
|
|
m_2610_r(*this, "2610.%u.r", 1),
|
|
m_gfxdecode(*this, "gfxdecode_%u", 1),
|
|
m_spriteram(*this, "spriteram"),
|
|
m_z80bank(*this, "z80bank")
|
|
{ }
|
|
|
|
void darius2(machine_config &config);
|
|
void ninjaw(machine_config &config);
|
|
|
|
protected:
|
|
virtual void device_post_load() override;
|
|
virtual void machine_start() override ATTR_COLD;
|
|
virtual void machine_reset() override ATTR_COLD;
|
|
|
|
private:
|
|
/* devices */
|
|
required_device<cpu_device> m_maincpu;
|
|
required_device<cpu_device> m_subcpu;
|
|
required_device<tc0140syt_device> m_tc0140syt;
|
|
required_device_array<tc0100scn_device, 3> m_tc0100scn;
|
|
required_device_array<tc0110pcr_device, 3> m_tc0110pcr;
|
|
required_device_array<filter_volume_device, 2> m_2610_l;
|
|
required_device_array<filter_volume_device, 2> m_2610_r;
|
|
required_device_array<gfxdecode_device, 3> m_gfxdecode;
|
|
|
|
/* memory pointers */
|
|
required_shared_ptr<u16> m_spriteram;
|
|
|
|
/* memory regions */
|
|
required_memory_bank m_z80bank;
|
|
|
|
/* misc */
|
|
u16 m_cpua_ctrl = 0;
|
|
int m_pandata[4]{};
|
|
|
|
void coin_control_w(u8 data);
|
|
void cpua_ctrl_w(u16 data);
|
|
void sound_bankswitch_w(u8 data);
|
|
void pancontrol_w(offs_t offset, u8 data);
|
|
void tc0100scn_triple_screen_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
|
|
|
u32 screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return update_screen(screen, bitmap, cliprect, 36 * 8, 0); }
|
|
u32 screen_update_middle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return update_screen(screen, bitmap, cliprect, 36 * 8, 1); }
|
|
u32 screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return update_screen(screen, bitmap, cliprect, 36 * 8, 2); }
|
|
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int x_offs, int y_offs, int chip);
|
|
void parse_control();
|
|
u32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffs, int chip);
|
|
void darius2_master_map(address_map &map) ATTR_COLD;
|
|
void darius2_slave_map(address_map &map) ATTR_COLD;
|
|
void ninjaw_master_map(address_map &map) ATTR_COLD;
|
|
void ninjaw_slave_map(address_map &map) ATTR_COLD;
|
|
void sound_map(address_map &map) ATTR_COLD;
|
|
};
|
|
|
|
|
|
/*******************************************************************************
|
|
SUBWOOFER (SOUND)
|
|
*******************************************************************************/
|
|
#if 0
|
|
|
|
class subwoofer_device : public device_t, public device_sound_interface
|
|
{
|
|
public:
|
|
subwoofer_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
|
~subwoofer_device() {}
|
|
|
|
protected:
|
|
// device-level overrides
|
|
virtual void device_start();
|
|
|
|
// sound stream update overrides
|
|
virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
|
|
};
|
|
|
|
extern const device_type SUBWOOFER;
|
|
|
|
const device_type SUBWOOFER = device_creator<subwoofer_device>;
|
|
|
|
subwoofer_device::subwoofer_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
|
|
device_t(mconfig, SUBWOOFER, "Subwoofer", tag, owner, clock),
|
|
device_sound_interface(mconfig, *this)
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------
|
|
// device_start - device-specific startup
|
|
//-------------------------------------------------
|
|
|
|
void subwoofer_device::device_start()
|
|
{
|
|
/* Adjust the lowpass filter of the first three YM2610 channels */
|
|
|
|
/* The 150 Hz is a common top frequency played by a generic */
|
|
/* subwoofer, the real Arcade Machine may differ */
|
|
|
|
mixer_set_lowpass_frequency(0, 20);
|
|
mixer_set_lowpass_frequency(1, 20);
|
|
mixer_set_lowpass_frequency(2, 20);
|
|
|
|
return 0;
|
|
}
|
|
|
|
//-------------------------------------------------
|
|
// sound_stream_update - handle a stream update
|
|
//-------------------------------------------------
|
|
|
|
void subwoofer_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs)
|
|
{
|
|
outputs[0].fill(0);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
/*******************************************************************************
|
|
SPRITE DRAW ROUTINE
|
|
*******************************************************************************/
|
|
|
|
void ninjaw_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int x_offs, int y_offs, int chip)
|
|
{
|
|
#ifdef MAME_DEBUG
|
|
int unknown = 0;
|
|
#endif
|
|
|
|
static const u32 primask[2] =
|
|
{
|
|
GFX_PMASK_4, // draw sprites with priority 0 which are over the mid layer
|
|
(GFX_PMASK_4 | GFX_PMASK_2) // draw sprites with priority 1 which are under the mid layer
|
|
};
|
|
|
|
for (int offs = 0; offs < (m_spriteram.bytes() / 2); offs += 4)
|
|
{
|
|
int data = m_spriteram[offs + 2];
|
|
const u32 tilenum = data & 0x7fff;
|
|
|
|
if (!tilenum)
|
|
continue;
|
|
|
|
data = m_spriteram[offs + 0];
|
|
int x = (data - 32) & 0x3ff; /* aligns sprites on rock outcrops and sewer hole */
|
|
|
|
data = m_spriteram[offs + 1];
|
|
int y = (data - 0) & 0x1ff;
|
|
|
|
/*
|
|
The purpose of the bit at data&0x8 (below) is unknown, but it is set
|
|
on Darius explosions, some enemy missiles and at least 1 boss.
|
|
It is most likely another priority bit but as there are no obvious
|
|
visual problems it will need checked against the original pcb.
|
|
|
|
There is a report this bit is set when the player intersects
|
|
the tank sprite in Ninja Warriors however I was unable to repro
|
|
this or find any use of this bit in that game.
|
|
|
|
Bit&0x8000 is set on some sprites in later levels of Darius
|
|
but is again unknown, and there is no obvious visual problem.
|
|
*/
|
|
data = m_spriteram[offs + 3];
|
|
const bool flipx = (data & 0x1);
|
|
const bool flipy = (data & 0x2) >> 1;
|
|
const int priority = (data & 0x4) >> 2; // 1 = low
|
|
/* data&0x8 - unknown */
|
|
const u32 color = (data & 0x7f00) >> 8;
|
|
/* data&0x8000 - unknown */
|
|
|
|
#ifdef MAME_DEBUG
|
|
if (data & 0x80f0) unknown |= (data &0x80f0);
|
|
#endif
|
|
|
|
x -= x_offs;
|
|
y += y_offs;
|
|
|
|
/* sprite wrap: coords become negative at high values */
|
|
if (x > 0x3c0) x -= 0x400;
|
|
if (y > 0x180) y -= 0x200;
|
|
|
|
const int curx = x;
|
|
const int cury = y;
|
|
const u32 code = tilenum;
|
|
|
|
m_gfxdecode[chip]->gfx(0)->prio_transpen(bitmap,cliprect,
|
|
code, color,
|
|
flipx, flipy,
|
|
curx, cury,
|
|
screen.priority(), primask[priority],
|
|
0);
|
|
}
|
|
|
|
#ifdef MAME_DEBUG
|
|
if (unknown)
|
|
popmessage("unknown sprite bits: %04x",unknown);
|
|
#endif
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
SCREEN REFRESH
|
|
*******************************************************************************/
|
|
|
|
u32 ninjaw_state::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffs, int chip)
|
|
{
|
|
tc0100scn_device *tc0100scn = m_tc0100scn[chip];
|
|
xoffs *= chip;
|
|
u8 layer[3];
|
|
|
|
tc0100scn->tilemap_update();
|
|
|
|
layer[0] = m_tc0100scn[0]->bottomlayer();
|
|
layer[1] = layer[0] ^ 1;
|
|
layer[2] = 2;
|
|
|
|
screen.priority().fill(0, cliprect);
|
|
/* chip 0 does tilemaps on the left, chip 1 center, chip 2 the right */
|
|
// draw bottom layer
|
|
u8 nodraw = tc0100scn->tilemap_draw(screen, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); /* left */
|
|
|
|
/* Ensure screen blanked even when bottom layers not drawn due to disable bit */
|
|
if (nodraw)
|
|
bitmap.fill(m_tc0110pcr[chip]->black_pen(), cliprect);
|
|
|
|
// draw middle layer
|
|
tc0100scn->tilemap_draw(screen, bitmap, cliprect, layer[1], 0, 2);
|
|
|
|
// draw top(text) layer
|
|
tc0100scn->tilemap_draw(screen, bitmap, cliprect, layer[2], 0, 4);
|
|
|
|
/* Sprites can be under/over the layer below text layer */
|
|
draw_sprites(screen, bitmap, cliprect, xoffs, 8, chip);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
MISC. CONTROL
|
|
*******************************************************************************/
|
|
|
|
void ninjaw_state::parse_control() /* assumes Z80 sandwiched between 68Ks */
|
|
{
|
|
/* bit 0 enables cpu B */
|
|
/* however this fails when recovering from a save state
|
|
if cpu B is disabled !! */
|
|
m_subcpu->set_input_line(INPUT_LINE_RESET, (m_cpua_ctrl & 0x1) ? CLEAR_LINE : ASSERT_LINE);
|
|
|
|
}
|
|
|
|
void ninjaw_state::cpua_ctrl_w(u16 data)
|
|
{
|
|
if ((data &0xff00) && ((data &0xff) == 0))
|
|
data = data >> 8;
|
|
m_cpua_ctrl = data;
|
|
|
|
parse_control();
|
|
|
|
logerror("CPU #0 PC %06x: write %04x to cpu control\n", m_maincpu->pc(), data);
|
|
}
|
|
|
|
|
|
void ninjaw_state::coin_control_w(u8 data)
|
|
{
|
|
machine().bookkeeping().coin_lockout_w(0, ~data & 0x01);
|
|
machine().bookkeeping().coin_lockout_w(1, ~data & 0x02);
|
|
machine().bookkeeping().coin_counter_w(0, data & 0x04);
|
|
machine().bookkeeping().coin_counter_w(1, data & 0x08);
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
SOUND
|
|
*******************************************************************************/
|
|
|
|
void ninjaw_state::sound_bankswitch_w(u8 data)
|
|
{
|
|
m_z80bank->set_entry(data & 7);
|
|
}
|
|
|
|
/**** sound pan control ****/
|
|
|
|
void ninjaw_state::pancontrol_w(offs_t offset, u8 data)
|
|
{
|
|
filter_volume_device *flt = nullptr;
|
|
offset &= 3;
|
|
offset ^= 1;
|
|
|
|
switch (offset)
|
|
{
|
|
case 0: flt = m_2610_l[0]; break;
|
|
case 1: flt = m_2610_r[0]; break;
|
|
case 2: flt = m_2610_l[1]; break;
|
|
case 3: flt = m_2610_r[1]; break;
|
|
}
|
|
|
|
m_pandata[offset] = (float)data * (100.f / 255.0f);
|
|
//popmessage(" pan %02x %02x %02x %02x", m_pandata[0], m_pandata[1], m_pandata[2], m_pandata[3] );
|
|
flt->set_gain(m_pandata[offset] / 100.0);
|
|
}
|
|
|
|
|
|
void ninjaw_state::tc0100scn_triple_screen_w(offs_t offset, u16 data, u16 mem_mask)
|
|
{
|
|
m_tc0100scn[0]->ram_w(offset, data, mem_mask);
|
|
m_tc0100scn[1]->ram_w(offset, data, mem_mask);
|
|
m_tc0100scn[2]->ram_w(offset, data, mem_mask);
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
MEMORY STRUCTURES
|
|
*******************************************************************************/
|
|
|
|
void ninjaw_state::ninjaw_master_map(address_map &map)
|
|
{
|
|
map(0x000000, 0x0bffff).rom();
|
|
map(0x0c0000, 0x0cffff).ram(); /* main ram */
|
|
map(0x200000, 0x200003).rw("tc0040ioc", FUNC(tc0040ioc_device::read), FUNC(tc0040ioc_device::write)).umask16(0x00ff);
|
|
map(0x210000, 0x210001).w(FUNC(ninjaw_state::cpua_ctrl_w));
|
|
map(0x220001, 0x220001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
|
|
map(0x220003, 0x220003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
|
|
map(0x240000, 0x24ffff).ram().share("share1");
|
|
map(0x260000, 0x263fff).ram().share("spriteram");
|
|
map(0x280000, 0x293fff).r(m_tc0100scn[0], FUNC(tc0100scn_device::ram_r)).w(FUNC(ninjaw_state::tc0100scn_triple_screen_w)); /* tilemaps (1st screen/all screens) */
|
|
map(0x2a0000, 0x2a000f).rw(m_tc0100scn[0], FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
|
|
map(0x2c0000, 0x2d3fff).rw(m_tc0100scn[1], FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps (2nd screen) */
|
|
map(0x2e0000, 0x2e000f).rw(m_tc0100scn[1], FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
|
|
map(0x300000, 0x313fff).rw(m_tc0100scn[2], FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps (3rd screen) */
|
|
map(0x320000, 0x32000f).rw(m_tc0100scn[2], FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
|
|
map(0x340000, 0x340007).rw(m_tc0110pcr[0], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (1st screen) */
|
|
map(0x350000, 0x350007).rw(m_tc0110pcr[1], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (2nd screen) */
|
|
map(0x360000, 0x360007).rw(m_tc0110pcr[2], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (3rd screen) */
|
|
}
|
|
|
|
// NB there could be conflicts between which cpu writes what to the
|
|
// palette, as our interleaving won't match the original board.
|
|
|
|
void ninjaw_state::ninjaw_slave_map(address_map &map)
|
|
{
|
|
map(0x000000, 0x05ffff).rom();
|
|
map(0x080000, 0x08ffff).ram(); /* main ram */
|
|
map(0x200000, 0x200003).rw("tc0040ioc", FUNC(tc0040ioc_device::read), FUNC(tc0040ioc_device::write)).umask16(0x00ff);
|
|
map(0x240000, 0x24ffff).ram().share("share1");
|
|
map(0x260000, 0x263fff).ram().share("spriteram");
|
|
map(0x280000, 0x293fff).r(m_tc0100scn[0], FUNC(tc0100scn_device::ram_r)).w(FUNC(ninjaw_state::tc0100scn_triple_screen_w)); /* tilemaps (1st screen/all screens) */
|
|
map(0x340000, 0x340007).rw(m_tc0110pcr[0], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (1st screen) */
|
|
map(0x350000, 0x350007).rw(m_tc0110pcr[1], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (2nd screen) */
|
|
map(0x360000, 0x360007).rw(m_tc0110pcr[2], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (3rd screen) */
|
|
}
|
|
|
|
void ninjaw_state::darius2_master_map(address_map &map)
|
|
{
|
|
map(0x000000, 0x0bffff).rom();
|
|
map(0x0c0000, 0x0cffff).ram(); /* main ram */
|
|
map(0x200000, 0x200003).rw("tc0040ioc", FUNC(tc0040ioc_device::read), FUNC(tc0040ioc_device::write)).umask16(0x00ff);
|
|
map(0x210000, 0x210001).w(FUNC(ninjaw_state::cpua_ctrl_w));
|
|
map(0x220001, 0x220001).w(m_tc0140syt, FUNC(tc0140syt_device::master_port_w));
|
|
map(0x220003, 0x220003).rw(m_tc0140syt, FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
|
|
map(0x240000, 0x24ffff).ram().share("share1");
|
|
map(0x260000, 0x263fff).ram().share("spriteram");
|
|
map(0x280000, 0x293fff).r(m_tc0100scn[0], FUNC(tc0100scn_device::ram_r)).w(FUNC(ninjaw_state::tc0100scn_triple_screen_w)); /* tilemaps (1st screen/all screens) */
|
|
map(0x2a0000, 0x2a000f).rw(m_tc0100scn[0], FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
|
|
map(0x2c0000, 0x2d3fff).rw(m_tc0100scn[1], FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps (2nd screen) */
|
|
map(0x2e0000, 0x2e000f).rw(m_tc0100scn[1], FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
|
|
map(0x300000, 0x313fff).rw(m_tc0100scn[2], FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps (3rd screen) */
|
|
map(0x320000, 0x32000f).rw(m_tc0100scn[2], FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w));
|
|
map(0x340000, 0x340007).rw(m_tc0110pcr[0], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (1st screen) */
|
|
map(0x350000, 0x350007).rw(m_tc0110pcr[1], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (2nd screen) */
|
|
map(0x360000, 0x360007).rw(m_tc0110pcr[2], FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_word_w)); /* palette (3rd screen) */
|
|
}
|
|
|
|
void ninjaw_state::darius2_slave_map(address_map &map)
|
|
{
|
|
map(0x000000, 0x05ffff).rom();
|
|
map(0x080000, 0x08ffff).ram(); /* main ram */
|
|
map(0x200000, 0x200003).rw("tc0040ioc", FUNC(tc0040ioc_device::read), FUNC(tc0040ioc_device::write)).umask16(0x00ff);
|
|
map(0x240000, 0x24ffff).ram().share("share1");
|
|
map(0x260000, 0x263fff).ram().share("spriteram");
|
|
map(0x280000, 0x293fff).r(m_tc0100scn[0], FUNC(tc0100scn_device::ram_r)).w(FUNC(ninjaw_state::tc0100scn_triple_screen_w)); /* tilemaps (1st screen/all screens) */
|
|
}
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
void ninjaw_state::sound_map(address_map &map)
|
|
{
|
|
map(0x0000, 0x3fff).rom();
|
|
map(0x4000, 0x7fff).bankr("z80bank");
|
|
map(0xc000, 0xdfff).ram();
|
|
map(0xe000, 0xe003).rw("ymsnd", FUNC(ym2610_device::read), FUNC(ym2610_device::write));
|
|
map(0xe200, 0xe200).nopr().w(m_tc0140syt, FUNC(tc0140syt_device::slave_port_w));
|
|
map(0xe201, 0xe201).rw(m_tc0140syt, FUNC(tc0140syt_device::slave_comm_r), FUNC(tc0140syt_device::slave_comm_w));
|
|
map(0xe400, 0xe403).w(FUNC(ninjaw_state::pancontrol_w)); /* pan */
|
|
map(0xea00, 0xea00).nopr();
|
|
map(0xee00, 0xee00).nopw(); /* ? */
|
|
map(0xf000, 0xf000).nopw(); /* ? */
|
|
map(0xf200, 0xf200).w(FUNC(ninjaw_state::sound_bankswitch_w));
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
INPUT PORTS, DIPs
|
|
*******************************************************************************/
|
|
|
|
static INPUT_PORTS_START( ninjaw )
|
|
/* 0x200000 (port 0) -> 0x0c2291.b and 0x24122c (shared RAM) */
|
|
PORT_START("DSWA")
|
|
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW1:1")
|
|
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
|
|
PORT_DIPSETTING( 0x01, DEF_STR( Yes ) )
|
|
PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "SW1:2" )
|
|
TAITO_DSWA_BITS_2_TO_3_LOC(SW1)
|
|
TAITO_COINAGE_WORLD_LOC(SW1)
|
|
|
|
/* 0x200000 (port 1) -> 0x0c2290.b and 0x24122e (shared RAM) */
|
|
PORT_START("DSWB")
|
|
TAITO_DIFFICULTY_LOC(SW2)
|
|
PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) /* Manual shows switches 3, 4, 5, 6 & 8 as not used */
|
|
PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW2:4" )
|
|
PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" )
|
|
PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW2:6" )
|
|
PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" ) /* see notes */
|
|
PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" )
|
|
|
|
PORT_START("IN0")
|
|
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* Stops working if this is high */
|
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
|
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 )
|
|
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN2 )
|
|
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Freeze") PORT_CODE(KEYCODE_F1)
|
|
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
|
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
|
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
|
|
|
PORT_START("IN1")
|
|
TAITO_JOY_DUAL_UDRL( 1, 2 )
|
|
|
|
PORT_START("IN2")
|
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_TILT )
|
|
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
|
|
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
|
|
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
|
|
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
|
|
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
|
|
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
|
|
INPUT_PORTS_END
|
|
|
|
/* Can't use PORT_INCLUDE because of PORT_DIPLOCATION */
|
|
static INPUT_PORTS_START( ninjawj )
|
|
PORT_INCLUDE(ninjaw)
|
|
|
|
PORT_MODIFY("DSWA")
|
|
TAITO_COINAGE_JAPAN_OLD_LOC(SW1)
|
|
INPUT_PORTS_END
|
|
|
|
/* Can't use PORT_INCLUDE because of PORT_DIPLOCATION */
|
|
static INPUT_PORTS_START( darius2 )
|
|
PORT_INCLUDE(ninjaw)
|
|
|
|
/* 0x200000 (port 0) -> 0x0c2002 (-$5ffe,A5) and 0x0c2006 (-$5ffa,A5) */
|
|
PORT_MODIFY("DSWA")
|
|
PORT_DIPNAME( 0x01, 0x01, "Difficulty Enhancement" ) PORT_DIPLOCATION("SW1:1") /* code at 0x00c20e */
|
|
PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) // Easy Medium Hard Hardest // Japan factory default = "Off"
|
|
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // Easy- Medium+ Hard+ Hardest+ // "Easy-" is easier than "Easy". "Medium+","Hard+" and "hardest+" are harder than "Medium","Hard" and "hardest".
|
|
PORT_DIPNAME( 0x02, 0x02, "Auto Fire" ) PORT_DIPLOCATION("SW1:2")
|
|
PORT_DIPSETTING( 0x02, DEF_STR( Normal ) )
|
|
PORT_DIPSETTING( 0x00, "Fast" )
|
|
TAITO_DSWA_BITS_2_TO_3_LOC(SW1)
|
|
TAITO_COINAGE_JAPAN_OLD_LOC(SW1)
|
|
|
|
/* 0x200000 (port 1) -> 0x0c2004 (-$5ffc,A5) and 0x0c2008 (-$5ff8,A5) */
|
|
PORT_MODIFY("DSWB")
|
|
TAITO_DIFFICULTY_LOC(SW2)
|
|
PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4")
|
|
PORT_DIPSETTING( 0x0c, "every 700k" )
|
|
PORT_DIPSETTING( 0x08, "every 800k" )
|
|
PORT_DIPSETTING( 0x04, "every 900k" )
|
|
PORT_DIPSETTING( 0x00, "every 1000k" )
|
|
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6")
|
|
PORT_DIPSETTING( 0x30, "3" )
|
|
PORT_DIPSETTING( 0x20, "4" )
|
|
PORT_DIPSETTING( 0x10, "5" )
|
|
PORT_DIPSETTING( 0x00, "6" )
|
|
PORT_DIPNAME( 0x40, 0x40, "Invulnerability (Cheat)") PORT_DIPLOCATION("SW2:7")
|
|
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
|
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:8")
|
|
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
|
|
PORT_DIPSETTING( 0x80, DEF_STR( Yes ) )
|
|
INPUT_PORTS_END
|
|
|
|
|
|
/*******************************************************************************
|
|
GFX DECODING (Thanks to Raine for the obj decoding)
|
|
*******************************************************************************/
|
|
|
|
static const gfx_layout tilelayout =
|
|
{
|
|
16,16, /* 16*16 sprites */
|
|
RGN_FRAC(1,1),
|
|
4, /* 4 bits per pixel */
|
|
{ STEP4(0,4) }, /* pixel bits separated, jump 4 to get to next one */
|
|
{ STEP4(3,-1), STEP4(4*4+3,-1), STEP4(4*4*2*8+3,-1), STEP4(4*4*2*8+4*4+3,-1) },
|
|
{ STEP8(0,4*4*2), STEP8(4*4*2*8*2,4*4*2) },
|
|
128*8 /* every sprite takes 128 consecutive bytes */
|
|
};
|
|
|
|
static GFXDECODE_START( gfx_ninjaw )
|
|
GFXDECODE_ENTRY( "sprites", 0, tilelayout, 0, 256 ) /* sprites */
|
|
GFXDECODE_END
|
|
|
|
|
|
/*******************************************************************************
|
|
MACHINE DRIVERS
|
|
--------------------------------------------------------------------------------
|
|
Ninjaw: high interleaving of 100, but doesn't stop enemies
|
|
"sliding" when they should be standing still relative
|
|
to the scrolling background.
|
|
|
|
Darius2: arbitrary interleaving of 10 to keep cpus synced.
|
|
*******************************************************************************/
|
|
|
|
void ninjaw_state::device_post_load()
|
|
{
|
|
parse_control();
|
|
}
|
|
|
|
void ninjaw_state::machine_start()
|
|
{
|
|
m_z80bank->configure_entries(0, 8, memregion("audiocpu")->base(), 0x4000);
|
|
|
|
save_item(NAME(m_cpua_ctrl));
|
|
save_item(NAME(m_pandata));
|
|
}
|
|
|
|
void ninjaw_state::machine_reset()
|
|
{
|
|
m_cpua_ctrl = 0xff;
|
|
memset(m_pandata, 0, sizeof(m_pandata));
|
|
|
|
/**** mixer control enable ****/
|
|
machine().sound().system_mute(false); /* mixer enabled */
|
|
}
|
|
|
|
void ninjaw_state::ninjaw(machine_config &config)
|
|
{
|
|
/* basic machine hardware */
|
|
M68000(config, m_maincpu, 16000000/2); /* 8 MHz ? */
|
|
m_maincpu->set_addrmap(AS_PROGRAM, &ninjaw_state::ninjaw_master_map);
|
|
m_maincpu->set_vblank_int("lscreen", FUNC(ninjaw_state::irq4_line_hold));
|
|
|
|
z80_device &audiocpu(Z80(config, "audiocpu", 16000000/4)); /* 16/4 MHz ? */
|
|
audiocpu.set_addrmap(AS_PROGRAM, &ninjaw_state::sound_map);
|
|
|
|
M68000(config, m_subcpu, 16000000/2); /* 8 MHz ? */
|
|
m_subcpu->set_addrmap(AS_PROGRAM, &ninjaw_state::ninjaw_slave_map);
|
|
m_subcpu->set_vblank_int("lscreen", FUNC(ninjaw_state::irq4_line_hold));
|
|
|
|
// TODO: if CPUs are unsynched then seldomly stages loads up with no enemies
|
|
// Let's use a better timer (was 6000 before) based off actual CPU timing.
|
|
// Might as well bump the divider in case the bug still occurs before resorting to perfect CPU.
|
|
config.set_maximum_quantum(attotime::from_hz(16000000/1024)); /* CPU slices */
|
|
//config.m_perfect_cpu_quantum = subtag("maincpu");
|
|
|
|
tc0040ioc_device &tc0040ioc(TC0040IOC(config, "tc0040ioc", 0));
|
|
tc0040ioc.read_0_callback().set_ioport("DSWA");
|
|
tc0040ioc.read_1_callback().set_ioport("DSWB");
|
|
tc0040ioc.read_2_callback().set_ioport("IN0");
|
|
tc0040ioc.read_3_callback().set_ioport("IN1");
|
|
tc0040ioc.write_4_callback().set(FUNC(ninjaw_state::coin_control_w));
|
|
tc0040ioc.read_7_callback().set_ioport("IN2");
|
|
|
|
/* video hardware */
|
|
GFXDECODE(config, m_gfxdecode[0], m_tc0110pcr[0], gfx_ninjaw);
|
|
GFXDECODE(config, m_gfxdecode[1], m_tc0110pcr[1], gfx_ninjaw);
|
|
GFXDECODE(config, m_gfxdecode[2], m_tc0110pcr[2], gfx_ninjaw);
|
|
|
|
config.set_default_layout(layout_ninjaw);
|
|
|
|
screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
|
|
lscreen.set_refresh_hz(60);
|
|
lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
lscreen.set_size(36*8, 32*8);
|
|
lscreen.set_visarea(0*8, 36*8-1, 3*8, 31*8-1);
|
|
lscreen.set_screen_update(FUNC(ninjaw_state::screen_update_left));
|
|
lscreen.set_palette(m_tc0110pcr[0]);
|
|
|
|
screen_device &mscreen(SCREEN(config, "mscreen", SCREEN_TYPE_RASTER));
|
|
mscreen.set_refresh_hz(60);
|
|
mscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
mscreen.set_size(36*8, 32*8);
|
|
mscreen.set_visarea(0*8, 36*8-1, 3*8, 31*8-1);
|
|
mscreen.set_screen_update(FUNC(ninjaw_state::screen_update_middle));
|
|
mscreen.set_palette(m_tc0110pcr[1]);
|
|
|
|
screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
|
|
rscreen.set_refresh_hz(60);
|
|
rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
rscreen.set_size(36*8, 32*8);
|
|
rscreen.set_visarea(0*8, 36*8-1, 3*8, 31*8-1);
|
|
rscreen.set_screen_update(FUNC(ninjaw_state::screen_update_right));
|
|
rscreen.set_palette(m_tc0110pcr[2]);
|
|
|
|
TC0100SCN(config, m_tc0100scn[0], 0);
|
|
m_tc0100scn[0]->set_offsets(22, 0);
|
|
m_tc0100scn[0]->set_multiscr_xoffs(0);
|
|
m_tc0100scn[0]->set_multiscr_hack(0);
|
|
m_tc0100scn[0]->set_palette(m_tc0110pcr[0]);
|
|
|
|
TC0110PCR(config, m_tc0110pcr[0], 0);
|
|
|
|
TC0100SCN(config, m_tc0100scn[1], 0);
|
|
m_tc0100scn[1]->set_offsets(22, 0);
|
|
m_tc0100scn[1]->set_multiscr_xoffs(2);
|
|
m_tc0100scn[1]->set_multiscr_hack(1);
|
|
m_tc0100scn[1]->set_palette(m_tc0110pcr[1]);
|
|
|
|
TC0110PCR(config, m_tc0110pcr[1], 0);
|
|
|
|
TC0100SCN(config, m_tc0100scn[2], 0);
|
|
m_tc0100scn[2]->set_offsets(22, 0);
|
|
m_tc0100scn[2]->set_multiscr_xoffs(4);
|
|
m_tc0100scn[2]->set_multiscr_hack(1);
|
|
m_tc0100scn[2]->set_palette(m_tc0110pcr[2]);
|
|
|
|
TC0110PCR(config, m_tc0110pcr[2], 0);
|
|
|
|
/* sound hardware */
|
|
SPEAKER(config, "lspeaker").front_left();
|
|
SPEAKER(config, "rspeaker").front_right();
|
|
SPEAKER(config, "subwoofer").seat();
|
|
|
|
ym2610_device &ymsnd(YM2610(config, "ymsnd", 16000000/2));
|
|
ymsnd.irq_handler().set_inputline("audiocpu", 0);
|
|
ymsnd.add_route(0, "subwoofer", 0.75);
|
|
ymsnd.add_route(1, "2610.1.l", 1.0);
|
|
ymsnd.add_route(1, "2610.1.r", 1.0);
|
|
ymsnd.add_route(2, "2610.2.l", 1.0);
|
|
ymsnd.add_route(2, "2610.2.r", 1.0);
|
|
|
|
FILTER_VOLUME(config, "2610.1.l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
|
|
FILTER_VOLUME(config, "2610.1.r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
|
|
FILTER_VOLUME(config, "2610.2.l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
|
|
FILTER_VOLUME(config, "2610.2.r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
|
|
|
|
// SUBWOOFER(config, "subwoofer", 0);
|
|
|
|
TC0140SYT(config, m_tc0140syt, 0);
|
|
m_tc0140syt->nmi_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
|
|
m_tc0140syt->reset_callback().set_inputline("audiocpu", INPUT_LINE_RESET);
|
|
}
|
|
|
|
|
|
void ninjaw_state::darius2(machine_config &config)
|
|
{
|
|
/* basic machine hardware */
|
|
M68000(config, m_maincpu, 16000000/2); /* 8 MHz ? */
|
|
m_maincpu->set_addrmap(AS_PROGRAM, &ninjaw_state::darius2_master_map);
|
|
m_maincpu->set_vblank_int("lscreen", FUNC(ninjaw_state::irq4_line_hold));
|
|
|
|
z80_device &audiocpu(Z80(config, "audiocpu", 16000000/4)); /* 4 MHz ? */
|
|
audiocpu.set_addrmap(AS_PROGRAM, &ninjaw_state::sound_map);
|
|
|
|
M68000(config, m_subcpu, 16000000/2); /* 8 MHz ? */
|
|
m_subcpu->set_addrmap(AS_PROGRAM, &ninjaw_state::darius2_slave_map);
|
|
m_subcpu->set_vblank_int("lscreen", FUNC(ninjaw_state::irq4_line_hold));
|
|
|
|
config.set_maximum_quantum(attotime::from_hz(16000000/1024)); /* CPU slices */
|
|
//config.m_perfect_cpu_quantum = subtag("maincpu");
|
|
|
|
tc0040ioc_device &tc0040ioc(TC0040IOC(config, "tc0040ioc", 0));
|
|
tc0040ioc.read_0_callback().set_ioport("DSWA");
|
|
tc0040ioc.read_1_callback().set_ioport("DSWB");
|
|
tc0040ioc.read_2_callback().set_ioport("IN0");
|
|
tc0040ioc.read_3_callback().set_ioport("IN1");
|
|
tc0040ioc.write_4_callback().set(FUNC(ninjaw_state::coin_control_w));
|
|
tc0040ioc.read_7_callback().set_ioport("IN2");
|
|
|
|
/* video hardware */
|
|
GFXDECODE(config, m_gfxdecode[0], m_tc0110pcr[0], gfx_ninjaw);
|
|
GFXDECODE(config, m_gfxdecode[1], m_tc0110pcr[1], gfx_ninjaw);
|
|
GFXDECODE(config, m_gfxdecode[2], m_tc0110pcr[2], gfx_ninjaw);
|
|
|
|
config.set_default_layout(layout_ninjaw);
|
|
|
|
screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
|
|
lscreen.set_refresh_hz(60);
|
|
lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
lscreen.set_size(36*8, 32*8);
|
|
lscreen.set_visarea(0*8, 36*8-1, 3*8, 31*8-1);
|
|
lscreen.set_screen_update(FUNC(ninjaw_state::screen_update_left));
|
|
lscreen.set_palette(m_tc0110pcr[0]);
|
|
|
|
screen_device &mscreen(SCREEN(config, "mscreen", SCREEN_TYPE_RASTER));
|
|
mscreen.set_refresh_hz(60);
|
|
mscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
mscreen.set_size(36*8, 32*8);
|
|
mscreen.set_visarea(0*8, 36*8-1, 3*8, 31*8-1);
|
|
mscreen.set_screen_update(FUNC(ninjaw_state::screen_update_middle));
|
|
mscreen.set_palette(m_tc0110pcr[1]);
|
|
|
|
screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
|
|
rscreen.set_refresh_hz(60);
|
|
rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
rscreen.set_size(36*8, 32*8);
|
|
rscreen.set_visarea(0*8, 36*8-1, 3*8, 31*8-1);
|
|
rscreen.set_screen_update(FUNC(ninjaw_state::screen_update_right));
|
|
rscreen.set_palette(m_tc0110pcr[2]);
|
|
|
|
TC0100SCN(config, m_tc0100scn[0], 0);
|
|
m_tc0100scn[0]->set_offsets(22, 0);
|
|
m_tc0100scn[0]->set_multiscr_xoffs(0);
|
|
m_tc0100scn[0]->set_multiscr_hack(0);
|
|
m_tc0100scn[0]->set_palette(m_tc0110pcr[0]);
|
|
|
|
TC0110PCR(config, m_tc0110pcr[0], 0);
|
|
|
|
TC0100SCN(config, m_tc0100scn[1], 0);
|
|
m_tc0100scn[1]->set_offsets(22, 0);
|
|
m_tc0100scn[1]->set_multiscr_xoffs(2);
|
|
m_tc0100scn[1]->set_multiscr_hack(1);
|
|
m_tc0100scn[1]->set_palette(m_tc0110pcr[1]);
|
|
|
|
TC0110PCR(config, m_tc0110pcr[1], 0);
|
|
|
|
TC0100SCN(config, m_tc0100scn[2], 0);
|
|
m_tc0100scn[2]->set_offsets(22, 0);
|
|
m_tc0100scn[2]->set_multiscr_xoffs(4);
|
|
m_tc0100scn[2]->set_multiscr_hack(1);
|
|
m_tc0100scn[2]->set_palette(m_tc0110pcr[2]);
|
|
|
|
TC0110PCR(config, m_tc0110pcr[2], 0);
|
|
|
|
/* sound hardware */
|
|
SPEAKER(config, "lspeaker").front_left();
|
|
SPEAKER(config, "rspeaker").front_right();
|
|
SPEAKER(config, "subwoofer").seat();
|
|
|
|
ym2610_device &ymsnd(YM2610(config, "ymsnd", 16000000/2));
|
|
ymsnd.irq_handler().set_inputline("audiocpu", 0);
|
|
ymsnd.add_route(0, "subwoofer", 0.75);
|
|
ymsnd.add_route(1, "2610.1.l", 1.0);
|
|
ymsnd.add_route(1, "2610.1.r", 1.0);
|
|
ymsnd.add_route(2, "2610.2.l", 1.0);
|
|
ymsnd.add_route(2, "2610.2.r", 1.0);
|
|
|
|
FILTER_VOLUME(config, "2610.1.l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
|
|
FILTER_VOLUME(config, "2610.1.r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
|
|
FILTER_VOLUME(config, "2610.2.l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
|
|
FILTER_VOLUME(config, "2610.2.r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
|
|
|
|
// SUBWOOFER(config, "subwoofer", 0);
|
|
|
|
TC0140SYT(config, m_tc0140syt, 0);
|
|
m_tc0140syt->nmi_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
|
|
m_tc0140syt->reset_callback().set_inputline("audiocpu", INPUT_LINE_RESET);
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
ROM DEFINITIONS
|
|
*******************************************************************************/
|
|
|
|
ROM_START( ninjaw )
|
|
ROM_REGION( 0xc0000, "maincpu", 0 ) /* 256K for 68000 CPUA code */
|
|
ROM_LOAD16_BYTE( "b31_45.35", 0x00000, 0x10000, CRC(107902c3) SHA1(026f71a918059e3374ae262304a2ee1270f5c5bd) ) /* For these 2 roms: Revised code base compared to the Japanese set below? */
|
|
ROM_LOAD16_BYTE( "b31_47.32", 0x00001, 0x10000, CRC(bd536b1e) SHA1(39c86cbb3a33fc77a0141b5648a1aca862e0a5fd) ) /* For these 2 roms: higher rom numbers seem to indicate that is the case */
|
|
ROM_LOAD16_BYTE( "b31_29.34", 0x20000, 0x10000, CRC(f2941a37) SHA1(cf1f231d9caddc903116a8b654f49181ca459697) )
|
|
ROM_LOAD16_BYTE( "b31_27.31", 0x20001, 0x10000, CRC(2f3ff642) SHA1(7d6775b51d96b459b163d8fde2385b0e3f5242ca) )
|
|
|
|
ROM_LOAD16_BYTE( "b31_41.5", 0x40000, 0x20000, CRC(0daef28a) SHA1(7c7e16b0eebc589ab99f62ddb98b372596ff5ae6) ) /* data roms ? */
|
|
ROM_LOAD16_BYTE( "b31_39.2", 0x40001, 0x20000, CRC(e9197c3c) SHA1(a7f0ef2b3c4258c09edf05284fec45832a8fb147) )
|
|
ROM_LOAD16_BYTE( "b31_40.6", 0x80000, 0x20000, CRC(2ce0f24e) SHA1(39632397ac7e8457607c32c31fccf1c08d4b2621) )
|
|
ROM_LOAD16_BYTE( "b31_38.3", 0x80001, 0x20000, CRC(bc68cd99) SHA1(bb31ea589339c9f9b61e312e1024b5c8410cdb43) )
|
|
|
|
ROM_REGION( 0x60000, "sub", 0 ) /* 384K for 68000 CPUB code */
|
|
ROM_LOAD16_BYTE( "b31_33.87", 0x00000, 0x10000, CRC(6ce9af44) SHA1(486e332af238c211c3f64f7ead114282661687c4) )
|
|
ROM_LOAD16_BYTE( "b31_36.97", 0x00001, 0x10000, CRC(ba20b0d4) SHA1(fb3dcb7681a95087afac9aa9393765d786243486) )
|
|
ROM_LOAD16_BYTE( "b31_32.86", 0x20000, 0x10000, CRC(e6025fec) SHA1(071f83a9ddebe67bd6c6c2505318e177895163ee) )
|
|
ROM_LOAD16_BYTE( "b31_35.96", 0x20001, 0x10000, CRC(70d9a89f) SHA1(20f846beb052fd8cddcf00c3e42e3304e102a87b) )
|
|
ROM_LOAD16_BYTE( "b31_31.85", 0x40000, 0x10000, CRC(837f47e2) SHA1(88d596f01566456ba18a01afd0a6a7c121d3ca88) )
|
|
ROM_LOAD16_BYTE( "b31_34.95", 0x40001, 0x10000, CRC(d6b5fb2a) SHA1(e3ae0d7ec62740465a90e4939b10341d3866d860) )
|
|
|
|
ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound cpu */
|
|
ROM_LOAD( "b31_37.11", 0x00000, 0x20000, CRC(0ca5799d) SHA1(6485dde076d15b69b9ee65880dda57ad4f8d129c) )
|
|
|
|
ROM_REGION( 0x200000, "sprites", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-07.176", 0x000000, 0x80000, CRC(33568cdb) SHA1(87abf56bbbd3659a1bd3e6ce9e43176be7950b41) ) /* OBJ */
|
|
ROM_LOAD16_WORD_SWAP( "b31-06.175", 0x080000, 0x80000, CRC(0d59439e) SHA1(54d844492888e7fe2c3bc61afe64f8d47fdee8dc) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-05.174", 0x100000, 0x80000, CRC(0a1fc9fb) SHA1(a5d6975fd4f7e689c8cafd7c9cd3787797955779) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-04.173", 0x180000, 0x80000, CRC(2e1e4cb5) SHA1(4733cfc015a68e021108a9e1e8ea807b0e7eac7a) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_1", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.23", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 1) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.24", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_2", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.26", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 2) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.27", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_3", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.28", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 3) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.29", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x180000, "ymsnd:adpcma", 0 ) /* ADPCM samples */
|
|
ROM_LOAD( "b31-09.18", 0x000000, 0x80000, CRC(60a73382) SHA1(0ddeb86fcd4d19a58e62bf8564f996d17e36e5c5) )
|
|
ROM_LOAD( "b31-10.17", 0x080000, 0x80000, CRC(c6434aef) SHA1(3348ce87882e3f668aa85bbb517975ec1fc9b6fd) )
|
|
ROM_LOAD( "b31-11.16", 0x100000, 0x80000, CRC(8da531d4) SHA1(525dfab0a0729e9fb6f0e4c8187bf4ce16321b20) )
|
|
|
|
ROM_REGION( 0x80000, "ymsnd:adpcmb", 0 ) /* Delta-T samples */
|
|
ROM_LOAD( "b31-08.19", 0x000000, 0x80000, CRC(a0a1f87d) SHA1(6b0f8094f3a3ef1ced76984e333e22a17c51af29) )
|
|
|
|
ROM_REGION( 0x01000, "user1", 0 ) /* unknown roms */
|
|
ROM_LOAD( "b31-25.38", 0x00000, 0x200, CRC(a0b4ba48) SHA1(dc9a46366a0cbf63a609f177c3d3ba9675416662) )
|
|
ROM_LOAD( "b31-26.58", 0x00000, 0x200, CRC(13e5fe15) SHA1(c973c7965954a2a0b427908f099592ed89cf0ff0) )
|
|
ROM_END
|
|
|
|
ROM_START( ninjaw1 )
|
|
ROM_REGION( 0xc0000, "maincpu", 0 ) /* 256K for 68000 CPUA code */
|
|
ROM_LOAD16_BYTE( "b31_30.35", 0x00000, 0x10000, CRC(056edd9f) SHA1(8922cede80b31ce0f7a00c8cab13d835464c6058) ) /* For these 2 roms: Same code base as the Japanese set below */
|
|
ROM_LOAD16_BYTE( "b31_43.32", 0x00001, 0x10000, CRC(56ae37a6) SHA1(ddd5be455682df2c63721facee813be652863aa5) ) /* For these 2 roms: original Taito rom, 1 byte region change */
|
|
ROM_LOAD16_BYTE( "b31_29.34", 0x20000, 0x10000, CRC(f2941a37) SHA1(cf1f231d9caddc903116a8b654f49181ca459697) )
|
|
ROM_LOAD16_BYTE( "b31_27.31", 0x20001, 0x10000, CRC(2f3ff642) SHA1(7d6775b51d96b459b163d8fde2385b0e3f5242ca) )
|
|
|
|
ROM_LOAD16_BYTE( "b31_41.5", 0x40000, 0x20000, CRC(0daef28a) SHA1(7c7e16b0eebc589ab99f62ddb98b372596ff5ae6) ) /* data roms ? */
|
|
ROM_LOAD16_BYTE( "b31_39.2", 0x40001, 0x20000, CRC(e9197c3c) SHA1(a7f0ef2b3c4258c09edf05284fec45832a8fb147) )
|
|
ROM_LOAD16_BYTE( "b31_40.6", 0x80000, 0x20000, CRC(2ce0f24e) SHA1(39632397ac7e8457607c32c31fccf1c08d4b2621) )
|
|
ROM_LOAD16_BYTE( "b31_38.3", 0x80001, 0x20000, CRC(bc68cd99) SHA1(bb31ea589339c9f9b61e312e1024b5c8410cdb43) )
|
|
|
|
ROM_REGION( 0x60000, "sub", 0 ) /* 384K for 68000 CPUB code */
|
|
ROM_LOAD16_BYTE( "b31_33.87", 0x00000, 0x10000, CRC(6ce9af44) SHA1(486e332af238c211c3f64f7ead114282661687c4) )
|
|
ROM_LOAD16_BYTE( "b31_36.97", 0x00001, 0x10000, CRC(ba20b0d4) SHA1(fb3dcb7681a95087afac9aa9393765d786243486) )
|
|
ROM_LOAD16_BYTE( "b31_32.86", 0x20000, 0x10000, CRC(e6025fec) SHA1(071f83a9ddebe67bd6c6c2505318e177895163ee) )
|
|
ROM_LOAD16_BYTE( "b31_35.96", 0x20001, 0x10000, CRC(70d9a89f) SHA1(20f846beb052fd8cddcf00c3e42e3304e102a87b) )
|
|
ROM_LOAD16_BYTE( "b31_31.85", 0x40000, 0x10000, CRC(837f47e2) SHA1(88d596f01566456ba18a01afd0a6a7c121d3ca88) )
|
|
ROM_LOAD16_BYTE( "b31_34.95", 0x40001, 0x10000, CRC(d6b5fb2a) SHA1(e3ae0d7ec62740465a90e4939b10341d3866d860) )
|
|
|
|
ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound cpu */
|
|
ROM_LOAD( "b31_37.11", 0x00000, 0x20000, CRC(0ca5799d) SHA1(6485dde076d15b69b9ee65880dda57ad4f8d129c) )
|
|
|
|
ROM_REGION( 0x200000, "sprites", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-07.176", 0x000000, 0x80000, CRC(33568cdb) SHA1(87abf56bbbd3659a1bd3e6ce9e43176be7950b41) ) /* OBJ */
|
|
ROM_LOAD16_WORD_SWAP( "b31-06.175", 0x080000, 0x80000, CRC(0d59439e) SHA1(54d844492888e7fe2c3bc61afe64f8d47fdee8dc) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-05.174", 0x100000, 0x80000, CRC(0a1fc9fb) SHA1(a5d6975fd4f7e689c8cafd7c9cd3787797955779) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-04.173", 0x180000, 0x80000, CRC(2e1e4cb5) SHA1(4733cfc015a68e021108a9e1e8ea807b0e7eac7a) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_1", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.23", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 1) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.24", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_2", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.26", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 2) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.27", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_3", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.28", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 3) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.29", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x180000, "ymsnd:adpcma", 0 ) /* ADPCM samples */
|
|
ROM_LOAD( "b31-09.18", 0x000000, 0x80000, CRC(60a73382) SHA1(0ddeb86fcd4d19a58e62bf8564f996d17e36e5c5) )
|
|
ROM_LOAD( "b31-10.17", 0x080000, 0x80000, CRC(c6434aef) SHA1(3348ce87882e3f668aa85bbb517975ec1fc9b6fd) )
|
|
ROM_LOAD( "b31-11.16", 0x100000, 0x80000, CRC(8da531d4) SHA1(525dfab0a0729e9fb6f0e4c8187bf4ce16321b20) )
|
|
|
|
ROM_REGION( 0x80000, "ymsnd:adpcmb", 0 ) /* Delta-T samples */
|
|
ROM_LOAD( "b31-08.19", 0x000000, 0x80000, CRC(a0a1f87d) SHA1(6b0f8094f3a3ef1ced76984e333e22a17c51af29) )
|
|
|
|
ROM_REGION( 0x01000, "user1", 0 ) /* unknown roms */
|
|
ROM_LOAD( "b31-25.38", 0x00000, 0x200, CRC(a0b4ba48) SHA1(dc9a46366a0cbf63a609f177c3d3ba9675416662) )
|
|
ROM_LOAD( "b31-26.58", 0x00000, 0x200, CRC(13e5fe15) SHA1(c973c7965954a2a0b427908f099592ed89cf0ff0) )
|
|
ROM_END
|
|
|
|
ROM_START( ninjawu )
|
|
ROM_REGION( 0xc0000, "maincpu", 0 ) /* 256K for 68000 CPUA code */
|
|
ROM_LOAD16_BYTE( "b31_49.35", 0x00000, 0x10000, CRC(d38b6391) SHA1(4711e059531566b779e95619c47621fdbfba2e56) ) /* For these 2 roms: Revised code base compared to the Japanese set below? */
|
|
ROM_LOAD16_BYTE( "b31_48.32", 0x00001, 0x10000, CRC(4b5bb3d8) SHA1(b0e2059e0fe682ef8152690d93392bdd4fda8149) ) /* For these 2 roms: higher rom numbers seem to indicate that is the case */
|
|
ROM_LOAD16_BYTE( "b31_29.34", 0x20000, 0x10000, CRC(f2941a37) SHA1(cf1f231d9caddc903116a8b654f49181ca459697) )
|
|
ROM_LOAD16_BYTE( "b31_27.31", 0x20001, 0x10000, CRC(2f3ff642) SHA1(7d6775b51d96b459b163d8fde2385b0e3f5242ca) )
|
|
|
|
ROM_LOAD16_BYTE( "b31_41.5", 0x40000, 0x20000, CRC(0daef28a) SHA1(7c7e16b0eebc589ab99f62ddb98b372596ff5ae6) ) /* data roms ? */
|
|
ROM_LOAD16_BYTE( "b31_39.2", 0x40001, 0x20000, CRC(e9197c3c) SHA1(a7f0ef2b3c4258c09edf05284fec45832a8fb147) )
|
|
ROM_LOAD16_BYTE( "b31_40.6", 0x80000, 0x20000, CRC(2ce0f24e) SHA1(39632397ac7e8457607c32c31fccf1c08d4b2621) )
|
|
ROM_LOAD16_BYTE( "b31_38.3", 0x80001, 0x20000, CRC(bc68cd99) SHA1(bb31ea589339c9f9b61e312e1024b5c8410cdb43) )
|
|
|
|
ROM_REGION( 0x60000, "sub", 0 ) /* 384K for 68000 CPUB code */
|
|
ROM_LOAD16_BYTE( "b31_33.87", 0x00000, 0x10000, CRC(6ce9af44) SHA1(486e332af238c211c3f64f7ead114282661687c4) )
|
|
ROM_LOAD16_BYTE( "b31_36.97", 0x00001, 0x10000, CRC(ba20b0d4) SHA1(fb3dcb7681a95087afac9aa9393765d786243486) )
|
|
ROM_LOAD16_BYTE( "b31_32.86", 0x20000, 0x10000, CRC(e6025fec) SHA1(071f83a9ddebe67bd6c6c2505318e177895163ee) )
|
|
ROM_LOAD16_BYTE( "b31_35.96", 0x20001, 0x10000, CRC(70d9a89f) SHA1(20f846beb052fd8cddcf00c3e42e3304e102a87b) )
|
|
ROM_LOAD16_BYTE( "b31_31.85", 0x40000, 0x10000, CRC(837f47e2) SHA1(88d596f01566456ba18a01afd0a6a7c121d3ca88) )
|
|
ROM_LOAD16_BYTE( "b31_34.95", 0x40001, 0x10000, CRC(d6b5fb2a) SHA1(e3ae0d7ec62740465a90e4939b10341d3866d860) )
|
|
|
|
ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound cpu */
|
|
ROM_LOAD( "b31_37.11", 0x00000, 0x20000, CRC(0ca5799d) SHA1(6485dde076d15b69b9ee65880dda57ad4f8d129c) )
|
|
|
|
ROM_REGION( 0x200000, "sprites", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-07.176", 0x000000, 0x80000, CRC(33568cdb) SHA1(87abf56bbbd3659a1bd3e6ce9e43176be7950b41) ) /* OBJ */
|
|
ROM_LOAD16_WORD_SWAP( "b31-06.175", 0x080000, 0x80000, CRC(0d59439e) SHA1(54d844492888e7fe2c3bc61afe64f8d47fdee8dc) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-05.174", 0x100000, 0x80000, CRC(0a1fc9fb) SHA1(a5d6975fd4f7e689c8cafd7c9cd3787797955779) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-04.173", 0x180000, 0x80000, CRC(2e1e4cb5) SHA1(4733cfc015a68e021108a9e1e8ea807b0e7eac7a) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_1", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.23", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 1) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.24", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_2", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.26", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 2) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.27", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_3", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.28", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 3) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.29", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x180000, "ymsnd:adpcma", 0 ) /* ADPCM samples */
|
|
ROM_LOAD( "b31-09.18", 0x000000, 0x80000, CRC(60a73382) SHA1(0ddeb86fcd4d19a58e62bf8564f996d17e36e5c5) )
|
|
ROM_LOAD( "b31-10.17", 0x080000, 0x80000, CRC(c6434aef) SHA1(3348ce87882e3f668aa85bbb517975ec1fc9b6fd) )
|
|
ROM_LOAD( "b31-11.16", 0x100000, 0x80000, CRC(8da531d4) SHA1(525dfab0a0729e9fb6f0e4c8187bf4ce16321b20) )
|
|
|
|
ROM_REGION( 0x80000, "ymsnd:adpcmb", 0 ) /* Delta-T samples */
|
|
ROM_LOAD( "b31-08.19", 0x000000, 0x80000, CRC(a0a1f87d) SHA1(6b0f8094f3a3ef1ced76984e333e22a17c51af29) )
|
|
|
|
ROM_REGION( 0x01000, "user1", 0 ) /* unknown roms */
|
|
ROM_LOAD( "b31-25.38", 0x00000, 0x200, CRC(a0b4ba48) SHA1(dc9a46366a0cbf63a609f177c3d3ba9675416662) )
|
|
ROM_LOAD( "b31-26.58", 0x00000, 0x200, CRC(13e5fe15) SHA1(c973c7965954a2a0b427908f099592ed89cf0ff0) )
|
|
ROM_END
|
|
|
|
ROM_START( ninjawj )
|
|
ROM_REGION( 0xc0000, "maincpu", 0 ) /* 256K for 68000 CPUA code */
|
|
ROM_LOAD16_BYTE( "b31_30.35", 0x00000, 0x10000, CRC(056edd9f) SHA1(8922cede80b31ce0f7a00c8cab13d835464c6058) )
|
|
ROM_LOAD16_BYTE( "b31_28.32", 0x00001, 0x10000, CRC(cfa7661c) SHA1(a7a6abb33a514d910e3198d5acbd4c31b2434b6c) )
|
|
ROM_LOAD16_BYTE( "b31_29.34", 0x20000, 0x10000, CRC(f2941a37) SHA1(cf1f231d9caddc903116a8b654f49181ca459697) )
|
|
ROM_LOAD16_BYTE( "b31_27.31", 0x20001, 0x10000, CRC(2f3ff642) SHA1(7d6775b51d96b459b163d8fde2385b0e3f5242ca) )
|
|
|
|
ROM_LOAD16_BYTE( "b31_41.5", 0x40000, 0x20000, CRC(0daef28a) SHA1(7c7e16b0eebc589ab99f62ddb98b372596ff5ae6) ) /* data roms ? */
|
|
ROM_LOAD16_BYTE( "b31_39.2", 0x40001, 0x20000, CRC(e9197c3c) SHA1(a7f0ef2b3c4258c09edf05284fec45832a8fb147) )
|
|
ROM_LOAD16_BYTE( "b31_40.6", 0x80000, 0x20000, CRC(2ce0f24e) SHA1(39632397ac7e8457607c32c31fccf1c08d4b2621) )
|
|
ROM_LOAD16_BYTE( "b31_38.3", 0x80001, 0x20000, CRC(bc68cd99) SHA1(bb31ea589339c9f9b61e312e1024b5c8410cdb43) )
|
|
|
|
ROM_REGION( 0x60000, "sub", 0 ) /* 384K for 68000 CPUB code */
|
|
ROM_LOAD16_BYTE( "b31_33.87", 0x00000, 0x10000, CRC(6ce9af44) SHA1(486e332af238c211c3f64f7ead114282661687c4) )
|
|
ROM_LOAD16_BYTE( "b31_36.97", 0x00001, 0x10000, CRC(ba20b0d4) SHA1(fb3dcb7681a95087afac9aa9393765d786243486) )
|
|
ROM_LOAD16_BYTE( "b31_32.86", 0x20000, 0x10000, CRC(e6025fec) SHA1(071f83a9ddebe67bd6c6c2505318e177895163ee) )
|
|
ROM_LOAD16_BYTE( "b31_35.96", 0x20001, 0x10000, CRC(70d9a89f) SHA1(20f846beb052fd8cddcf00c3e42e3304e102a87b) )
|
|
ROM_LOAD16_BYTE( "b31_31.85", 0x40000, 0x10000, CRC(837f47e2) SHA1(88d596f01566456ba18a01afd0a6a7c121d3ca88) )
|
|
ROM_LOAD16_BYTE( "b31_34.95", 0x40001, 0x10000, CRC(d6b5fb2a) SHA1(e3ae0d7ec62740465a90e4939b10341d3866d860) )
|
|
|
|
ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound cpu */
|
|
ROM_LOAD( "b31_37.11", 0x00000, 0x20000, CRC(0ca5799d) SHA1(6485dde076d15b69b9ee65880dda57ad4f8d129c) )
|
|
|
|
ROM_REGION( 0x200000, "sprites", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-07.176", 0x000000, 0x80000, CRC(33568cdb) SHA1(87abf56bbbd3659a1bd3e6ce9e43176be7950b41) ) /* OBJ */
|
|
ROM_LOAD16_WORD_SWAP( "b31-06.175", 0x080000, 0x80000, CRC(0d59439e) SHA1(54d844492888e7fe2c3bc61afe64f8d47fdee8dc) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-05.174", 0x100000, 0x80000, CRC(0a1fc9fb) SHA1(a5d6975fd4f7e689c8cafd7c9cd3787797955779) )
|
|
ROM_LOAD16_WORD_SWAP( "b31-04.173", 0x180000, 0x80000, CRC(2e1e4cb5) SHA1(4733cfc015a68e021108a9e1e8ea807b0e7eac7a) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_1", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.23", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 1) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.24", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_2", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.26", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 2) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.27", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_3", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "b31-01.28", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 3) */
|
|
ROM_LOAD16_WORD_SWAP( "b31-02.29", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) )
|
|
|
|
ROM_REGION( 0x180000, "ymsnd:adpcma", 0 ) /* ADPCM samples */
|
|
ROM_LOAD( "b31-09.18", 0x000000, 0x80000, CRC(60a73382) SHA1(0ddeb86fcd4d19a58e62bf8564f996d17e36e5c5) )
|
|
ROM_LOAD( "b31-10.17", 0x080000, 0x80000, CRC(c6434aef) SHA1(3348ce87882e3f668aa85bbb517975ec1fc9b6fd) )
|
|
ROM_LOAD( "b31-11.16", 0x100000, 0x80000, CRC(8da531d4) SHA1(525dfab0a0729e9fb6f0e4c8187bf4ce16321b20) )
|
|
|
|
ROM_REGION( 0x80000, "ymsnd:adpcmb", 0 ) /* Delta-T samples */
|
|
ROM_LOAD( "b31-08.19", 0x000000, 0x80000, CRC(a0a1f87d) SHA1(6b0f8094f3a3ef1ced76984e333e22a17c51af29) )
|
|
|
|
ROM_REGION( 0x01000, "user1", 0 ) /* unknown roms */
|
|
ROM_LOAD( "b31-25.38", 0x00000, 0x200, CRC(a0b4ba48) SHA1(dc9a46366a0cbf63a609f177c3d3ba9675416662) )
|
|
ROM_LOAD( "b31-26.58", 0x00000, 0x200, CRC(13e5fe15) SHA1(c973c7965954a2a0b427908f099592ed89cf0ff0) )
|
|
ROM_END
|
|
|
|
ROM_START( darius2 )
|
|
ROM_REGION( 0xc0000, "maincpu", 0 ) /* 256K for 68000 CPUA code */
|
|
ROM_LOAD16_BYTE( "c07-32-1", 0x00000, 0x10000, CRC(216c8f6a) SHA1(493b0779b99a228911f56ef9d2d4a3945683bec0) )
|
|
ROM_LOAD16_BYTE( "c07-29-1", 0x00001, 0x10000, CRC(48de567f) SHA1(cdf50052933cd2603fd4374e8bae8b30a6c690b5) )
|
|
ROM_LOAD16_BYTE( "c07-31-1", 0x20000, 0x10000, CRC(8279d2f8) SHA1(bd3c80a024a58e4b554f4867f56d7f5741eb3031) )
|
|
ROM_LOAD16_BYTE( "c07-30-1", 0x20001, 0x10000, CRC(6122e400) SHA1(2f68a423f9db8d69ab74453f8cef755f703cc94c) )
|
|
|
|
ROM_LOAD16_BYTE( "c07-27", 0x40000, 0x20000, CRC(0a6f7b6c) SHA1(0ed915201fbc0bf94fdcbef8dfd021cebe87474f) ) /* data roms ? */
|
|
ROM_LOAD16_BYTE( "c07-25", 0x40001, 0x20000, CRC(059f40ce) SHA1(b05a96580edb66221af2f222df74a020366ce3ea) )
|
|
ROM_LOAD16_BYTE( "c07-26", 0x80000, 0x20000, CRC(1f411242) SHA1(0fca5d864c1925473d0058e4cf81ad926f56cb14) )
|
|
ROM_LOAD16_BYTE( "c07-24", 0x80001, 0x20000, CRC(486c9c20) SHA1(9e98fcc1777f044d69cc93eda674501b3be26097) )
|
|
|
|
ROM_REGION( 0x60000, "sub", 0 ) /* 384K for 68000 CPUB code */
|
|
ROM_LOAD16_BYTE( "c07-35-1", 0x00000, 0x10000, CRC(dd8c4723) SHA1(e17159f894ee661a84ccd53e2d00ee78f2b46196) )
|
|
ROM_LOAD16_BYTE( "c07-38-1", 0x00001, 0x10000, CRC(46afb85c) SHA1(a08fb9fd2bf0929a5599ab015680fa663f1d4fe6) )
|
|
ROM_LOAD16_BYTE( "c07-34-1", 0x20000, 0x10000, CRC(296984b8) SHA1(3ba28e293c9d3ce01ee2f8ae2c2aa450fe021d30) )
|
|
ROM_LOAD16_BYTE( "c07-37-1", 0x20001, 0x10000, CRC(8b7d461f) SHA1(c783491ca23223dc58fa7e8f408407b9a10cbce4) )
|
|
ROM_LOAD16_BYTE( "c07-33-1", 0x40000, 0x10000, CRC(2da03a3f) SHA1(f1f2de82e0addc5e19c8935e4f5810896691118f) )
|
|
ROM_LOAD16_BYTE( "c07-36-1", 0x40001, 0x10000, CRC(02cf2b1c) SHA1(c94a64f26f94f182cfe2b6edb37e4ce35a0f681b) )
|
|
|
|
ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound cpu */
|
|
ROM_LOAD( "c07-28", 0x00000, 0x20000, CRC(da304bc5) SHA1(689b4f329d9a640145f82e12dff3dd1fcf8a28c8) )
|
|
|
|
ROM_REGION( 0x100000, "sprites", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "c07-01", 0x00000, 0x80000, CRC(3cf0f050) SHA1(f5a1f7e327a2617fb95ce2837e72945fd7447346) ) /* OBJ */
|
|
ROM_LOAD16_WORD_SWAP( "c07-02", 0x80000, 0x80000, CRC(75d16d4b) SHA1(795423278b66eca41accce1f8a4425d65af7b629) )
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_1", 0 )
|
|
ROM_LOAD16_WORD_SWAP( "c07-03.12", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) ) /* SCR (screen 1) */
|
|
ROM_LOAD16_WORD_SWAP( "c07-04.11", 0x80000, 0x80000, CRC(50421e81) SHA1(27ac420602f1dac00dc32903543a518e6f47fb2f) )
|
|
|
|
// The actual board duplicates the SCR gfx ROMs for each TC0100SCNs; TODO : ic position
|
|
ROM_REGION( 0x100000, "tc0100scn_2", 0 )
|
|
ROM_COPY( "tc0100scn_1", 0x000000, 0x000000, 0x100000 ) /* SCR (screen 2) */
|
|
|
|
ROM_REGION( 0x100000, "tc0100scn_3", 0 )
|
|
ROM_COPY( "tc0100scn_1", 0x000000, 0x000000, 0x100000 ) /* SCR (screen 3) */
|
|
|
|
ROM_REGION( 0x100000, "ymsnd:adpcma", 0 ) /* ADPCM samples */
|
|
ROM_LOAD( "c07-10.95", 0x00000, 0x80000, CRC(4bbe0ed9) SHA1(081b73c4e4d4fa548445e5548573099bcb1e9213) )
|
|
ROM_LOAD( "c07-11.96", 0x80000, 0x80000, CRC(3c815699) SHA1(0471ff5b0c0da905267f2cee52fd68c8661cccc9) )
|
|
|
|
ROM_REGION( 0x80000, "ymsnd:adpcmb", 0 ) /* Delta-T samples */
|
|
ROM_LOAD( "c07-12.107", 0x00000, 0x80000, CRC(e0b71258) SHA1(0258e308b643d723475824752ebffc4ea29d1ac4) )
|
|
ROM_END
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
/*******************************************************************************
|
|
DRIVERS
|
|
*******************************************************************************/
|
|
|
|
// YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, MONITOR, COMPANY, FULLNAME, FLAGS
|
|
GAME( 1987, ninjaw, 0, ninjaw, ninjaw, ninjaw_state, empty_init, ROT0, "Taito Corporation Japan", "The Ninja Warriors (World, later version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
|
|
GAME( 1987, ninjaw1, ninjaw, ninjaw, ninjaw, ninjaw_state, empty_init, ROT0, "Taito Corporation Japan", "The Ninja Warriors (World, earlier version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
|
|
GAME( 1987, ninjawj, ninjaw, ninjaw, ninjawj, ninjaw_state, empty_init, ROT0, "Taito Corporation", "The Ninja Warriors (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
|
|
GAME( 1987, ninjawu, ninjaw, ninjaw, ninjawj, ninjaw_state, empty_init, ROT0, "Taito Corporation America (licensed to Romstar)", "The Ninja Warriors (US, Romstar license)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) /* Uses same coinage as World, see notes */
|
|
GAME( 1989, darius2, 0, darius2, darius2, ninjaw_state, empty_init, ROT0, "Taito Corporation", "Darius II (triple screen) (Japan, rev 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
|