summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2018-02-22 22:10:11 +0900
committer Vas Crabb <cuavas@users.noreply.github.com>2018-02-23 00:10:11 +1100
commit4457a26752fd95f79f27d8475a51033cd1a43822 (patch)
treea955e809275c90241c815c0c96c7ace73f37b2fc
parent638f84f3db917f08a7e105f5d53e4b587b30efd8 (diff)
Allow YMF271 4 Channel Output, Move Imperfect_sound tags into ymf271.h (#3229)
* ymf271 : Allow 4 channel output, Add notes, Convert external memory handler to address space, Add notes, Move global imperfect_sound tags to device imperfect_features ms32, bnstars, seibuspi : Minor bankswitching cleanup, Add notes ms32 : Real mobo can output stereo sound (ex: http: //www.nicovideo.jp/watch/sm23743949) And mobo has a second stereo sound connector, Accurate this seibuspi : Single PCBs only output mono sound(sxx2e PCB : unverified), Accurate this * seibuspi : Fix unneeded * seibuspi.h : REAL remove unneeded * seibuspi.cpp : Remove duplicates * seibuspi.h : Minor cleanup
-rw-r--r--src/devices/sound/ymf271.cpp116
-rw-r--r--src/devices/sound/ymf271.h23
-rw-r--r--src/mame/drivers/bnstars.cpp21
-rw-r--r--src/mame/drivers/ms32.cpp62
-rw-r--r--src/mame/drivers/seibuspi.cpp173
-rw-r--r--src/mame/drivers/vgmplay.cpp8
-rw-r--r--src/mame/includes/ms32.h28
-rw-r--r--src/mame/includes/seibuspi.h43
8 files changed, 238 insertions, 236 deletions
diff --git a/src/devices/sound/ymf271.cpp b/src/devices/sound/ymf271.cpp
index 601e4d16c45..5df9075a090 100644
--- a/src/devices/sound/ymf271.cpp
+++ b/src/devices/sound/ymf271.cpp
@@ -13,7 +13,6 @@
- Src B and Src NOTE bits
- statusreg Busy flag
- timer register 0x11
- - ch2/ch3 (4 speakers)
- PFM (FM using external PCM waveform)
- detune (should be same as on other Yamaha chips)
- Acc On bit (some sound effects in viprp1?). The documentation says
@@ -25,6 +24,8 @@
#include "emu.h"
#include "ymf271.h"
+#include <algorithm>
+
#define STD_CLOCK (16934400)
#define MAXOUT (+32767)
@@ -452,7 +453,7 @@ void ymf271_device::update_pcm(int slotnum, int32_t *mixp, int length)
int i;
int64_t final_volume;
int16_t sample;
- int64_t ch0_vol, ch1_vol; //, ch2_vol, ch3_vol;
+ int64_t ch0_vol, ch1_vol, ch2_vol, ch3_vol;
YMF271Slot *slot = &m_slots[slotnum];
@@ -490,15 +491,15 @@ void ymf271_device::update_pcm(int slotnum, int32_t *mixp, int length)
if (slot->bits == 8)
{
// 8bit
- sample = ymf271_read_memory(slot->startaddr + (slot->stepptr>>16))<<8;
+ sample = read_byte(slot->startaddr + (slot->stepptr>>16))<<8;
}
else
{
// 12bit
if (slot->stepptr & 0x10000)
- sample = ymf271_read_memory(slot->startaddr + (slot->stepptr>>17)*3 + 2)<<8 | ((ymf271_read_memory(slot->startaddr + (slot->stepptr>>17)*3 + 1) << 4) & 0xf0);
+ sample = read_byte(slot->startaddr + (slot->stepptr>>17)*3 + 2)<<8 | ((read_byte(slot->startaddr + (slot->stepptr>>17)*3 + 1) << 4) & 0xf0);
else
- sample = ymf271_read_memory(slot->startaddr + (slot->stepptr>>17)*3)<<8 | (ymf271_read_memory(slot->startaddr + (slot->stepptr>>17)*3 + 1) & 0xf0);
+ sample = read_byte(slot->startaddr + (slot->stepptr>>17)*3)<<8 | (read_byte(slot->startaddr + (slot->stepptr>>17)*3 + 1) & 0xf0);
}
update_envelope(slot);
@@ -508,14 +509,18 @@ void ymf271_device::update_pcm(int slotnum, int32_t *mixp, int length)
ch0_vol = (final_volume * m_lut_attenuation[slot->ch0_level]) >> 16;
ch1_vol = (final_volume * m_lut_attenuation[slot->ch1_level]) >> 16;
-// ch2_vol = (final_volume * m_lut_attenuation[slot->ch2_level]) >> 16;
-// ch3_vol = (final_volume * m_lut_attenuation[slot->ch3_level]) >> 16;
+ ch2_vol = (final_volume * m_lut_attenuation[slot->ch2_level]) >> 16;
+ ch3_vol = (final_volume * m_lut_attenuation[slot->ch3_level]) >> 16;
if (ch0_vol > 65536) ch0_vol = 65536;
if (ch1_vol > 65536) ch1_vol = 65536;
-
+ if (ch2_vol > 65536) ch2_vol = 65536;
+ if (ch3_vol > 65536) ch3_vol = 65536;
+
*mixp++ += (sample * ch0_vol) >> 16;
*mixp++ += (sample * ch1_vol) >> 16;
+ *mixp++ += (sample * ch2_vol) >> 16;
+ *mixp++ += (sample * ch3_vol) >> 16;
// go to next step
slot->stepptr += slot->step;
@@ -567,12 +572,12 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int op;
int32_t *mixp;
- memset(m_mix_buffer.get(), 0, sizeof(m_mix_buffer[0])*samples*2);
+ std::fill(m_mix_buffer.begin(), m_mix_buffer.end(), 0);
for (j = 0; j < 12; j++)
{
YMF271Group *slot_group = &m_groups[j];
- mixp = m_mix_buffer.get();
+ mixp = &m_mix_buffer[0];
if (slot_group->pfm && slot_group->sync != 3)
{
@@ -590,7 +595,7 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int slot2 = j + (1*12);
int slot3 = j + (2*12);
int slot4 = j + (3*12);
- mixp = m_mix_buffer.get();
+ mixp = &m_mix_buffer[0];
if (m_slots[slot1].active)
{
@@ -804,6 +809,14 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
(output2 * m_lut_attenuation[m_slots[slot2].ch1_level]) +
(output3 * m_lut_attenuation[m_slots[slot3].ch1_level]) +
(output4 * m_lut_attenuation[m_slots[slot4].ch1_level])) >> 16;
+ *mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch2_level]) +
+ (output2 * m_lut_attenuation[m_slots[slot2].ch2_level]) +
+ (output3 * m_lut_attenuation[m_slots[slot3].ch2_level]) +
+ (output4 * m_lut_attenuation[m_slots[slot4].ch2_level])) >> 16;
+ *mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch3_level]) +
+ (output2 * m_lut_attenuation[m_slots[slot2].ch3_level]) +
+ (output3 * m_lut_attenuation[m_slots[slot3].ch3_level]) +
+ (output4 * m_lut_attenuation[m_slots[slot4].ch3_level])) >> 16;
}
}
break;
@@ -817,7 +830,7 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int slot1 = j + ((op + 0) * 12);
int slot3 = j + ((op + 2) * 12);
- mixp = m_mix_buffer.get();
+ mixp = &m_mix_buffer[0];
if (m_slots[slot1].active)
{
for (i = 0; i < samples; i++)
@@ -867,6 +880,10 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
(output3 * m_lut_attenuation[m_slots[slot3].ch0_level])) >> 16;
*mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch1_level]) +
(output3 * m_lut_attenuation[m_slots[slot3].ch1_level])) >> 16;
+ *mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch2_level]) +
+ (output3 * m_lut_attenuation[m_slots[slot3].ch2_level])) >> 16;
+ *mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch3_level]) +
+ (output3 * m_lut_attenuation[m_slots[slot3].ch3_level])) >> 16;
}
}
}
@@ -879,7 +896,7 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int slot1 = j + (0*12);
int slot2 = j + (1*12);
int slot3 = j + (2*12);
- mixp = m_mix_buffer.get();
+ mixp = &m_mix_buffer[0];
if (m_slots[slot1].active)
{
@@ -979,10 +996,16 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
*mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch1_level]) +
(output2 * m_lut_attenuation[m_slots[slot2].ch1_level]) +
(output3 * m_lut_attenuation[m_slots[slot3].ch1_level])) >> 16;
+ *mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch2_level]) +
+ (output2 * m_lut_attenuation[m_slots[slot2].ch2_level]) +
+ (output3 * m_lut_attenuation[m_slots[slot3].ch2_level])) >> 16;
+ *mixp++ += ((output1 * m_lut_attenuation[m_slots[slot1].ch3_level]) +
+ (output2 * m_lut_attenuation[m_slots[slot2].ch3_level]) +
+ (output3 * m_lut_attenuation[m_slots[slot3].ch3_level])) >> 16;
}
}
- mixp = m_mix_buffer.get();
+ mixp = &m_mix_buffer[0];
update_pcm(j + (3*12), mixp, samples);
break;
}
@@ -999,11 +1022,13 @@ void ymf271_device::sound_stream_update(sound_stream &stream, stream_sample_t **
}
}
- mixp = m_mix_buffer.get();
+ mixp = &m_mix_buffer[0];
for (i = 0; i < samples; i++)
{
outputs[0][i] = (*mixp++)>>2;
outputs[1][i] = (*mixp++)>>2;
+ outputs[2][i] = (*mixp++)>>2;
+ outputs[3][i] = (*mixp++)>>2;
}
}
@@ -1036,6 +1061,7 @@ void ymf271_device::write_register(int slotnum, int reg, uint8_t data)
{
if (slot->active)
{
+ //calculate_status_end(slotnum,true); status changes if keyoff? verify this from real hardware.
slot->env_state = ENV_RELEASE;
}
}
@@ -1325,24 +1351,6 @@ void ymf271_device::device_timer(emu_timer &timer, device_timer_id id, int param
}
}
-uint8_t ymf271_device::ymf271_read_memory(uint32_t offset)
-{
- if (m_ext_read_handler.isnull())
- {
- if (offset < m_mem_size)
- return m_mem_base[offset];
-
- /* 8MB chip limit (shouldn't happen) */
- else if (offset > 0x7fffff)
- return ymf271_read_memory(offset & 0x7fffff);
-
- else
- return 0;
- }
- else
- return m_ext_read_handler(offset);
-}
-
void ymf271_device::ymf271_write_timer(uint8_t address, uint8_t data)
{
if ((address & 0xf0) == 0)
@@ -1433,8 +1441,8 @@ void ymf271_device::ymf271_write_timer(uint8_t address, uint8_t data)
case 0x17:
m_ext_address = (m_ext_address + 1) & 0x7fffff;
- if (!m_ext_rw && !m_ext_write_handler.isnull())
- m_ext_write_handler(m_ext_address, data);
+ if (!m_ext_rw)
+ space(0).write_byte(m_ext_address, data);
break;
case 0x20:
@@ -1513,7 +1521,7 @@ READ8_MEMBER( ymf271_device::read )
uint8_t ret = m_ext_readlatch;
m_ext_address = (m_ext_address + 1) & 0x7fffff;
- m_ext_readlatch = ymf271_read_memory(m_ext_address);
+ m_ext_readlatch = read_byte(m_ext_address);
return ret;
}
@@ -1721,6 +1729,7 @@ void ymf271_device::init_state()
save_item(NAME(m_ext_address));
save_item(NAME(m_ext_rw));
save_item(NAME(m_ext_readlatch));
+ save_item(NAME(m_master_clock));
}
//-------------------------------------------------
@@ -1732,18 +1741,14 @@ void ymf271_device::device_start()
m_timA = timer_alloc(0);
m_timB = timer_alloc(1);
- m_mem_size = m_mem_base.bytes();
-
m_irq_handler.resolve();
- m_ext_read_handler.resolve();
- m_ext_write_handler.resolve();
-
+ m_master_clock = clock();
init_tables();
init_state();
-
- m_stream = machine().sound().stream_alloc(*this, 0, 2, clock()/384);
- m_mix_buffer = std::make_unique<int32_t[]>(44100*2);
+
+ m_mix_buffer.resize(m_master_clock/(384/4));
+ m_stream = machine().sound().stream_alloc(*this, 0, 4, m_master_clock/384);
}
//-------------------------------------------------
@@ -1777,15 +1782,30 @@ void ymf271_device::device_reset()
void ymf271_device::device_clock_changed()
{
- m_stream->set_sample_rate(clock() / 384);
+ uint32_t old_clock = m_master_clock;
+ m_master_clock = clock();
+
+ if (m_master_clock != old_clock)
+ {
+ if (old_clock < m_master_clock)
+ m_mix_buffer.resize(m_master_clock/(384/4));
+
+ m_stream->set_sample_rate(m_master_clock / 384);
+ }
calculate_clock_correction();
}
+void ymf271_device::rom_bank_updated()
+{
+ m_stream->update();
+}
+
DEFINE_DEVICE_TYPE(YMF271, ymf271_device, "ymf271", "Yamaha YMF271 OPX")
ymf271_device::ymf271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, YMF271, tag, owner, clock)
, device_sound_interface(mconfig, *this)
+ , device_rom_interface(mconfig, *this, 23)
, m_timerA(0)
, m_timerB(0)
, m_irqstate(0)
@@ -1794,15 +1814,11 @@ ymf271_device::ymf271_device(const machine_config &mconfig, const char *tag, dev
, m_ext_address(0)
, m_ext_rw(0)
, m_ext_readlatch(0)
- , m_mem_base(*this, DEVICE_SELF)
- , m_mem_size(0)
+ , m_master_clock(0)
, m_timA(nullptr)
, m_timB(nullptr)
, m_stream(nullptr)
- , m_mix_buffer(nullptr)
, m_irq_handler(*this)
- , m_ext_read_handler(*this)
- , m_ext_write_handler(*this)
{
memset(m_slots, 0, sizeof(m_slots));
memset(m_groups, 0, sizeof(m_groups));
diff --git a/src/devices/sound/ymf271.h b/src/devices/sound/ymf271.h
index a93df6fcdcb..f49b08cec2d 100644
--- a/src/devices/sound/ymf271.h
+++ b/src/devices/sound/ymf271.h
@@ -9,21 +9,15 @@
#define MCFG_YMF271_IRQ_HANDLER(_devcb) \
devcb = &ymf271_device::set_irq_handler(*device, DEVCB_##_devcb);
-#define MCFG_YMF271_EXT_READ_HANDLER(_devcb) \
- devcb = &ymf271_device::set_ext_read_handler(*device, DEVCB_##_devcb);
-
-#define MCFG_YMF271_EXT_WRITE_HANDLER(_devcb) \
- devcb = &ymf271_device::set_ext_write_handler(*device, DEVCB_##_devcb);
-
-class ymf271_device : public device_t, public device_sound_interface
+class ymf271_device : public device_t, public device_sound_interface, public device_rom_interface
{
public:
+ static constexpr feature_type imperfect_features() { return feature::SOUND; }
+
ymf271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// static configuration helpers
template <class Object> static devcb_base &set_irq_handler(device_t &device, Object &&cb) { return downcast<ymf271_device &>(device).m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &set_ext_read_handler(device_t &device, Object &&cb) { return downcast<ymf271_device &>(device).m_ext_read_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &set_ext_write_handler(device_t &device, Object &&cb) { return downcast<ymf271_device &>(device).m_ext_write_handler.set_callback(std::forward<Object>(cb)); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
@@ -38,6 +32,9 @@ protected:
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
+ // device_rom_interface overrides
+ virtual void rom_bank_updated() override;
+
private:
struct YMF271Slot
{
@@ -113,7 +110,6 @@ private:
void ymf271_write_fm(int bank, uint8_t address, uint8_t data);
void ymf271_write_pcm(uint8_t address, uint8_t data);
void ymf271_write_timer(uint8_t address, uint8_t data);
- uint8_t ymf271_read_memory(uint32_t offset);
inline int get_keyscaled_rate(int rate, int keycode, int keyscale);
inline int get_internal_keycode(int block, int fns);
@@ -149,17 +145,14 @@ private:
uint8_t m_ext_rw;
uint8_t m_ext_readlatch;
- optional_region_ptr<uint8_t> m_mem_base;
- uint32_t m_mem_size;
+ uint32_t m_master_clock;
emu_timer *m_timA;
emu_timer *m_timB;
sound_stream *m_stream;
- std::unique_ptr<int32_t[]> m_mix_buffer;
+ std::vector<int32_t> m_mix_buffer;
devcb_write_line m_irq_handler;
- devcb_read8 m_ext_read_handler;
- devcb_write8 m_ext_write_handler;
};
DECLARE_DEVICE_TYPE(YMF271, ymf271_device)
diff --git a/src/mame/drivers/bnstars.cpp b/src/mame/drivers/bnstars.cpp
index 97f2d7a05d1..822d8f44982 100644
--- a/src/mame/drivers/bnstars.cpp
+++ b/src/mame/drivers/bnstars.cpp
@@ -155,7 +155,6 @@ public:
TILE_GET_INFO_MEMBER(get_ms32_bg1_tile_info);
TILE_GET_INFO_MEMBER(get_ms32_roz0_tile_info);
TILE_GET_INFO_MEMBER(get_ms32_roz1_tile_info);
- virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_bnstars_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_bnstars_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -797,17 +796,10 @@ ADDRESS_MAP_START(bnstars_state::bnstars_sound_map)
AM_RANGE(0x3f70, 0x3f70) AM_WRITENOP // watchdog? banking? very noisy
AM_RANGE(0x3f80, 0x3f80) AM_WRITE(ms32_snd_bank_w)
AM_RANGE(0x4000, 0x7fff) AM_RAM
- AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank4")
- AM_RANGE(0xc000, 0xffff) AM_ROMBANK("bank5")
+ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("z80bank1")
+ AM_RANGE(0xc000, 0xffff) AM_ROMBANK("z80bank2")
ADDRESS_MAP_END
-void bnstars_state::machine_reset()
-{
- irq_init();
- membank("bank4")->set_entry(0);
- membank("bank5")->set_entry(1);
-}
-
MACHINE_CONFIG_START(bnstars_state::bnstars)
@@ -818,7 +810,7 @@ MACHINE_CONFIG_START(bnstars_state::bnstars)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", bnstars_state, ms32_interrupt, "lscreen", 0, 1)
- MCFG_CPU_ADD("audiocpu", Z80, 4000000)
+ MCFG_CPU_ADD("audiocpu", Z80, 4000000) // Unverified; it's possibly higher than 4MHz
MCFG_CPU_PROGRAM_MAP(bnstars_sound_map)
MCFG_QUANTUM_TIME(attotime::from_hz(60000))
@@ -856,14 +848,19 @@ MACHINE_CONFIG_START(bnstars_state::bnstars)
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI))
MCFG_SOUND_ADD("ymf1", YMF271, 16934400)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+// MCFG_SOUND_ROUTE(2, "lspeaker", 1.0) Output 2/3 not used?
+// MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
MCFG_SOUND_ADD("ymf2", YMF271, 16934400)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+// MCFG_SOUND_ROUTE(2, "lspeaker", 1.0) Output 2/3 not used?
+// MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
MACHINE_CONFIG_END
@@ -937,4 +934,4 @@ DRIVER_INIT_MEMBER(bnstars_state,bnstars)
configure_banks();
}
-GAME( 1997, bnstars1, 0, bnstars, bnstars, bnstars_state, bnstars, ROT0, "Jaleco", "Vs. Janshi Brandnew Stars", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, bnstars1, 0, bnstars, bnstars, bnstars_state, bnstars, ROT0, "Jaleco", "Vs. Janshi Brandnew Stars", MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/ms32.cpp b/src/mame/drivers/ms32.cpp
index bb0f9507bbf..32439a510bb 100644
--- a/src/mame/drivers/ms32.cpp
+++ b/src/mame/drivers/ms32.cpp
@@ -523,7 +523,6 @@ READ32_MEMBER(ms32_state::ms32_read_inputs3)
WRITE32_MEMBER(ms32_state::ms32_sound_w)
{
m_soundlatch->write(space, 0, data & 0xff);
- m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
// give the Z80 time to respond
m_maincpu->spin_until_time(attotime::from_usec(40));
@@ -1656,14 +1655,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(ms32_state::ms32_interrupt)
READ8_MEMBER(ms32_state::latch_r)
{
- m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
return m_soundlatch->read(space,0)^0xff;
}
WRITE8_MEMBER(ms32_state::ms32_snd_bank_w)
{
- membank("bank4")->set_entry((data >> 0) & 0x0F);
- membank("bank5")->set_entry((data >> 4) & 0x0F);
+ m_z80bank[0]->set_entry((data >> 0) & 0x0F);
+ m_z80bank[1]->set_entry((data >> 4) & 0x0F);
}
WRITE8_MEMBER(ms32_state::to_main_w)
@@ -1682,8 +1680,8 @@ ADDRESS_MAP_START(ms32_state::ms32_sound_map)
AM_RANGE(0x3f70, 0x3f70) AM_WRITENOP // watchdog? banking? very noisy
AM_RANGE(0x3f80, 0x3f80) AM_WRITE(ms32_snd_bank_w)
AM_RANGE(0x4000, 0x7fff) AM_RAM
- AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank4")
- AM_RANGE(0xc000, 0xffff) AM_ROMBANK("bank5")
+ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("z80bank1")
+ AM_RANGE(0xc000, 0xffff) AM_ROMBANK("z80bank2")
ADDRESS_MAP_END
@@ -1691,8 +1689,9 @@ ADDRESS_MAP_END
void ms32_state::machine_reset()
{
- membank("bank4")->set_entry(0);
- membank("bank5")->set_entry(1);
+ for (int bank = 0; bank < 2; bank++)
+ m_z80bank[bank]->set_entry(bank);
+
irq_init();
}
@@ -1707,7 +1706,7 @@ MACHINE_CONFIG_START(ms32_state::ms32)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ms32_state, ms32_interrupt, "screen", 0, 1)
- MCFG_CPU_ADD("audiocpu", Z80, 4000000)
+ MCFG_CPU_ADD("audiocpu", Z80, 4000000) // Unverified; it's possibly higher than 4MHz
MCFG_CPU_PROGRAM_MAP(ms32_sound_map)
MCFG_QUANTUM_TIME(attotime::from_hz(60000))
@@ -1726,12 +1725,16 @@ MACHINE_CONFIG_START(ms32_state::ms32)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI))
MCFG_SOUND_ADD("ymf", YMF271, 16934400)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+// MCFG_SOUND_ROUTE(2, "lspeaker", 1.0) Output 2/3 not used?
+// MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
MACHINE_CONFIG_END
@@ -2496,8 +2499,9 @@ ROM_END
void ms32_state::configure_banks()
{
save_item(NAME(m_to_main));
- membank("bank4")->configure_entries(0, 16, memregion("audiocpu")->base() + 0x4000, 0x4000);
- membank("bank5")->configure_entries(0, 16, memregion("audiocpu")->base() + 0x4000, 0x4000);
+ for (int bank = 0; bank < 2; bank++)
+ m_z80bank[bank]->configure_entries(0, 16, memregion("audiocpu")->base() + 0x4000, 0x4000);
+
}
DRIVER_INIT_MEMBER(ms32_state,ms32_common)
@@ -2570,22 +2574,22 @@ DRIVER_INIT_MEMBER(ms32_state,bnstars)
-GAME( 1994, hayaosi2, 0, ms32, hayaosi2, ms32_state, ss92046_01, ROT0, "Jaleco", "Hayaoshi Quiz Grand Champion Taikai", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1994, hayaosi3, 0, ms32, hayaosi3, ms32_state, ss92046_01, ROT0, "Jaleco", "Hayaoshi Quiz Nettou Namahousou (ver 1.5)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1994, bbbxing, 0, ms32, bbbxing, ms32_state, ss92046_01, ROT0, "Jaleco", "Best Bout Boxing (ver 1.3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1994, suchie2, 0, ms32, suchie2, ms32_state, suchie2, ROT0, "Jaleco", "Idol Janshi Suchie-Pai II (ver 1.1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1994, suchie2o, suchie2, ms32, suchie2, ms32_state, suchie2, ROT0, "Jaleco", "Idol Janshi Suchie-Pai II (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, desertwr, 0, ms32, desertwr, ms32_state, ss91022_10, ROT270, "Jaleco", "Desert War / Wangan Sensou (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, gametngk, 0, ms32, gametngk, ms32_state, ss91022_10, ROT270, "Jaleco", "The Game Paradise - Master of Shooting! / Game Tengoku - The Game Paradise (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, tetrisp, 0, ms32, tetrisp, ms32_state, ss92046_01, ROT0, "Jaleco / BPS", "Tetris Plus (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, p47aces, 0, ms32, p47aces, ms32_state, ss92048_01, ROT0, "Jaleco", "P-47 Aces", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, akiss, 0, ms32, suchie2, ms32_state, kirarast, ROT0, "Jaleco", "Mahjong Angel Kiss (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1996, gratia, 0, ms32, gratia, ms32_state, ss92047_01, ROT0, "Jaleco", "Gratia - Second Earth (ver 1.0, 92047-01 version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1996, gratiaa, gratia, ms32, gratia, ms32_state, ss91022_10, ROT0, "Jaleco", "Gratia - Second Earth (ver 1.0, 91022-10 version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1996, kirarast, 0, ms32, kirarast, ms32_state, kirarast, ROT0, "Jaleco", "Ryuusei Janshi Kirara Star", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1997, tp2m32, tetrisp2, ms32, tp2m32, ms32_state, ss91022_10, ROT0, "Jaleco", "Tetris Plus 2 (ver 1.0, MegaSystem 32 Version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1997, bnstars, bnstars1, ms32, suchie2, ms32_state, bnstars, ROT0, "Jaleco", "Vs. Janshi Brandnew Stars (Ver 1.1, MegaSystem32 Version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1996, wpksocv2, 0, ms32, wpksocv2, ms32_state, ss92046_01, ROT0, "Jaleco", "World PK Soccer V2 (ver 1.1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1994, hayaosi2, 0, ms32, hayaosi2, ms32_state, ss92046_01, ROT0, "Jaleco", "Hayaoshi Quiz Grand Champion Taikai", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1994, hayaosi3, 0, ms32, hayaosi3, ms32_state, ss92046_01, ROT0, "Jaleco", "Hayaoshi Quiz Nettou Namahousou (ver 1.5)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1994, bbbxing, 0, ms32, bbbxing, ms32_state, ss92046_01, ROT0, "Jaleco", "Best Bout Boxing (ver 1.3)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1994, suchie2, 0, ms32, suchie2, ms32_state, suchie2, ROT0, "Jaleco", "Idol Janshi Suchie-Pai II (ver 1.1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1994, suchie2o, suchie2, ms32, suchie2, ms32_state, suchie2, ROT0, "Jaleco", "Idol Janshi Suchie-Pai II (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, desertwr, 0, ms32, desertwr, ms32_state, ss91022_10, ROT270, "Jaleco", "Desert War / Wangan Sensou (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, gametngk, 0, ms32, gametngk, ms32_state, ss91022_10, ROT270, "Jaleco", "The Game Paradise - Master of Shooting! / Game Tengoku - The Game Paradise (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, tetrisp, 0, ms32, tetrisp, ms32_state, ss92046_01, ROT0, "Jaleco / BPS", "Tetris Plus (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, p47aces, 0, ms32, p47aces, ms32_state, ss92048_01, ROT0, "Jaleco", "P-47 Aces", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, akiss, 0, ms32, suchie2, ms32_state, kirarast, ROT0, "Jaleco", "Mahjong Angel Kiss (ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1996, gratia, 0, ms32, gratia, ms32_state, ss92047_01, ROT0, "Jaleco", "Gratia - Second Earth (ver 1.0, 92047-01 version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1996, gratiaa, gratia, ms32, gratia, ms32_state, ss91022_10, ROT0, "Jaleco", "Gratia - Second Earth (ver 1.0, 91022-10 version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1996, kirarast, 0, ms32, kirarast, ms32_state, kirarast, ROT0, "Jaleco", "Ryuusei Janshi Kirara Star", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1997, tp2m32, tetrisp2, ms32, tp2m32, ms32_state, ss91022_10, ROT0, "Jaleco", "Tetris Plus 2 (ver 1.0, MegaSystem 32 Version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1997, bnstars, bnstars1, ms32, suchie2, ms32_state, bnstars, ROT0, "Jaleco", "Vs. Janshi Brandnew Stars (Ver 1.1, MegaSystem32 Version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1996, wpksocv2, 0, ms32, wpksocv2, ms32_state, ss92046_01, ROT0, "Jaleco", "World PK Soccer V2 (ver 1.1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
/* these boot and show something */
GAME( 1994, f1superb, 0, f1superb, f1superb, ms32_state, f1superb, ROT0, "Jaleco", "F1 Super Battle", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/seibuspi.cpp b/src/mame/drivers/seibuspi.cpp
index 1380841965c..41f54dabfd4 100644
--- a/src/mame/drivers/seibuspi.cpp
+++ b/src/mame/drivers/seibuspi.cpp
@@ -878,12 +878,9 @@ Notes:
#include "cpu/i386/i386.h"
#include "cpu/z80/z80.h"
-#include "machine/7200fifo.h"
#include "machine/ds2404.h"
-#include "machine/eepromser.h"
#include "machine/intelfsh.h"
#include "machine/seibuspi.h"
-#include "sound/okim6295.h"
#include "sound/ymf271.h"
#include "sound/ymz280b.h"
#include "video/seibu_crtc.h"
@@ -914,8 +911,8 @@ READ8_MEMBER(seibuspi_state::sound_fifo_status_r)
// d0: fifo full flag (z80)
// d1: fifo empty flag (main)
// other bits: unused?
- int d1 = (m_soundfifo2 != nullptr) ? m_soundfifo2->ef_r() << 1 : 0;
- return d1 | m_soundfifo1->ff_r();
+ int d1 = (m_soundfifo[1] != nullptr) ? m_soundfifo[1]->ef_r() << 1 : 0;
+ return d1 | m_soundfifo[0]->ff_r();
}
READ8_MEMBER(seibuspi_state::spi_status_r)
@@ -949,7 +946,7 @@ WRITE8_MEMBER(seibuspi_state::spi_layerbanks_eeprom_w)
WRITE8_MEMBER(seibuspi_state::oki_bank_w)
{
- m_oki2->set_rom_bank((data >> 2) & 1);
+ m_oki[1]->set_rom_bank((data >> 2) & 1);
}
WRITE8_MEMBER(seibuspi_state::z80_prg_transfer_w)
@@ -1123,8 +1120,8 @@ READ8_MEMBER(seibuspi_state::z80_soundfifo_status_r)
// d0: fifo full flag (main)
// d1: fifo empty flag (z80)
// other bits: unused?
- int d0 = (m_soundfifo2 != nullptr) ? m_soundfifo2->ff_r() : 0;
- return d0 | m_soundfifo1->ef_r() << 1;
+ int d0 = (m_soundfifo[1] != nullptr) ? m_soundfifo[1]->ff_r() : 0;
+ return d0 | m_soundfifo[0]->ef_r() << 1;
}
WRITE8_MEMBER(seibuspi_state::z80_bank_w)
@@ -1135,7 +1132,7 @@ WRITE8_MEMBER(seibuspi_state::z80_bank_w)
if (bank != m_z80_lastbank)
{
m_z80_lastbank = bank;
- membank("bank1")->set_entry(bank);
+ m_z80_bank->set_entry(bank);
}
// d3: watchdog?
@@ -1167,7 +1164,7 @@ ADDRESS_MAP_START(seibuspi_state::sxx2e_soundmap)
AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN")
AM_RANGE(0x401b, 0x401b) AM_WRITE(z80_bank_w)
AM_RANGE(0x6000, 0x600f) AM_DEVREADWRITE("ymf", ymf271_device, read, write)
- AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1")
+ AM_RANGE(0x8000, 0xffff) AM_ROMBANK("z80_bank")
ADDRESS_MAP_END
ADDRESS_MAP_START(seibuspi_state::spi_soundmap)
@@ -1176,26 +1173,14 @@ ADDRESS_MAP_START(seibuspi_state::spi_soundmap)
AM_RANGE(0x400a, 0x400a) AM_READ_PORT("JUMPERS") // TO DO: get these to actually work
ADDRESS_MAP_END
+ADDRESS_MAP_START(seibuspi_state::spi_ymf271_map)
+ ADDRESS_MAP_GLOBAL_MASK(0x1fffff)
+ AM_RANGE(0x000000, 0x0fffff) AM_DEVREADWRITE("soundflash1", intel_e28f008sa_device, read, write)
+ AM_RANGE(0x100000, 0x1fffff) AM_DEVREADWRITE("soundflash2", intel_e28f008sa_device, read, write)
+ADDRESS_MAP_END
-/*****************************************************************************/
-
-READ8_MEMBER(seibuspi_state::flashrom_read)
-{
- offset &= 0x1fffff;
- if (offset < 0x100000)
- return m_soundflash1->read(offset);
- else
- return m_soundflash2->read(offset & 0x0fffff);
-}
-WRITE8_MEMBER(seibuspi_state::flashrom_write)
-{
- offset &= 0x1fffff;
- if (offset < 0x100000)
- m_soundflash1->write(offset, data);
- else
- m_soundflash2->write(offset & 0x0fffff, data);
-}
+/*****************************************************************************/
WRITE_LINE_MEMBER(seibuspi_state::ymf_irqhandler)
{
@@ -1829,7 +1814,7 @@ IRQ_CALLBACK_MEMBER(seibuspi_state::spi_irq_callback)
void seibuspi_state::init_spi_common()
{
if (m_z80_rom != nullptr)
- membank("bank1")->configure_entries(0, 8, m_z80_rom->base(), 0x8000);
+ m_z80_bank->configure_entries(0, 8, m_z80_rom->base(), 0x8000);
}
void seibuspi_state::init_sei252()
@@ -1858,7 +1843,7 @@ MACHINE_RESET_MEMBER(seibuspi_state,spi)
{
m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
- membank("bank1")->set_entry(0);
+ m_z80_bank->set_entry(0);
m_z80_lastbank = 0;
m_z80_prg_transfer_pos = 0;
}
@@ -1906,11 +1891,12 @@ MACHINE_CONFIG_START(seibuspi_state::spi)
MCFG_SOUND_ADD("ymf", YMF271, XTAL(16'934'400))
MCFG_YMF271_IRQ_HANDLER(WRITELINE(seibuspi_state, ymf_irqhandler))
- MCFG_YMF271_EXT_READ_HANDLER(READ8(seibuspi_state, flashrom_read))
- MCFG_YMF271_EXT_WRITE_HANDLER(WRITE8(seibuspi_state, flashrom_write))
+ MCFG_DEVICE_ADDRESS_MAP(0, spi_ymf271_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+// MCFG_SOUND_ROUTE(2, "lspeaker", 1.0) Output 2/3 not used?
+// MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(seibuspi_state::ejanhs)
@@ -1931,7 +1917,7 @@ MACHINE_CONFIG_END
MACHINE_RESET_MEMBER(seibuspi_state,sxx2e)
{
- membank("bank1")->set_entry(0);
+ m_z80_bank->set_entry(0);
m_z80_lastbank = 0;
m_sb_coin_latch = 0;
}
@@ -1952,13 +1938,17 @@ MACHINE_CONFIG_START(seibuspi_state::sxx2e)
MCFG_DEVICE_REMOVE("soundflash2")
MCFG_DEVICE_REMOVE("soundfifo2")
-
+
/* sound hardware */
+ // Single PCBs only output mono sound, SXX2E : unverified
+ MCFG_DEVICE_REMOVE("lspeaker")
+ MCFG_DEVICE_REMOVE("rspeaker")
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
MCFG_SOUND_REPLACE("ymf", YMF271, XTAL(16'934'400))
MCFG_YMF271_IRQ_HANDLER(WRITELINE(seibuspi_state, ymf_irqhandler))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(seibuspi_state::sxx2f)
@@ -1990,8 +1980,7 @@ MACHINE_CONFIG_START(seibuspi_state::sxx2g) // clocks differ, but otherwise same
MCFG_SOUND_REPLACE("ymf", YMF271, XTAL(16'384'000)) // 16.384MHz(!)
MCFG_YMF271_IRQ_HANDLER(WRITELINE(seibuspi_state, ymf_irqhandler))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -2079,11 +2068,11 @@ MACHINE_CONFIG_START(seibuspi_state::sys386f)
MCFG_VIDEO_START_OVERRIDE(seibuspi_state, sys386f)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ // Single PCBs only output mono sound
+ MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL(16'384'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -3998,68 +3987,68 @@ ROM_END
/*****************************************************************************/
/* SPI */
-GAME( 1995, senkyu, 0, spi, spi_3button, seibuspi_state, senkyu, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, senkyua, senkyu, spi, spi_3button, seibuspi_state, senkyua, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, batlball, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, batlballu, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Fabtek license)", "Battle Balls (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, batlballa, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, batlballe, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Hong Kong, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-
-GAME( 1995, viprp1, 0, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, viprp1k, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Dream Island license)", "Viper Phase 1 (New Version, Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, viprp1u, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* New version, "=U.S.A=" seems part of title */
-GAME( 1995, viprp1ua, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* New version, "=U.S.A=" seems part of title */
-GAME( 1995, viprp1j, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, viprp1s, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Switzerland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // counterintuitively this seems to be the oldest set of the game despite playing with the 'new version' rules, it has various typos not present in other sets eg. 'UPDATEING'
-GAME( 1995, viprp1h, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Holland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Code is the same as the above Switzerland set, just different region byte
-
-GAME( 1995, viprp1ot, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Tuning license)", "Viper Phase 1 (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, viprp1oj, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, viprp1hk, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Viper Phase 1 (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) /* "=HONG KONG=" seems part of title */
-
-GAME( 1996, ejanhs, 0, ejanhs, spi_ejanhs, seibuspi_state, ejanhs, ROT0, "Seibu Kaihatsu", "E Jong High School (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
-
-GAME( 1996, rdft, 0, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftj, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftja, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftjb, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftu, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftam, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftadi, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftau, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Australia)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftauge, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Evaluation Software For Show, Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftit, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdfta, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Austria)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, rdftgb, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Great Britain)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, senkyu, 0, spi, spi_3button, seibuspi_state, senkyu, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, senkyua, senkyu, spi, spi_3button, seibuspi_state, senkyua, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, batlball, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, batlballu, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Fabtek license)", "Battle Balls (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, batlballa, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, batlballe, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Hong Kong, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+
+GAME( 1995, viprp1, 0, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, viprp1k, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Dream Island license)", "Viper Phase 1 (New Version, Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, viprp1u, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) /* New version, "=U.S.A=" seems part of title */
+GAME( 1995, viprp1ua, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) /* New version, "=U.S.A=" seems part of title */
+GAME( 1995, viprp1j, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, viprp1s, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Switzerland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // counterintuitively this seems to be the oldest set of the game despite playing with the 'new version' rules, it has various typos not present in other sets eg. 'UPDATEING'
+GAME( 1995, viprp1h, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Holland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // Code is the same as the above Switzerland set, just different region byte
+
+GAME( 1995, viprp1ot, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Tuning license)", "Viper Phase 1 (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, viprp1oj, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, viprp1hk, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Viper Phase 1 (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) /* "=HONG KONG=" seems part of title */
+
+GAME( 1996, ejanhs, 0, ejanhs, spi_ejanhs, seibuspi_state, ejanhs, ROT0, "Seibu Kaihatsu", "E Jong High School (Japan)", MACHINE_SUPPORTS_SAVE )
+
+GAME( 1996, rdft, 0, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftj, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftja, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftjb, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftu, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftam, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftadi, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftau, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Australia)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftauge, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Evaluation Software For Show, Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftit, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdfta, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Austria)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, rdftgb, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Great Britain)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
// this is one revision
-GAME( 1997, rdft2, 0, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters 2 - Operation Hell Dive (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, rdft2j, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, rdft2a, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters 2 - Operation Hell Dive (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, rdft2, 0, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters 2 - Operation Hell Dive (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rdft2j, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rdft2a, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters 2 - Operation Hell Dive (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
// this is another
-GAME( 1997, rdft2ja, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, rdft2aa, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters 2 - Operation Hell Dive (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, rdft2it, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, rdft2ja, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rdft2aa, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters 2 - Operation Hell Dive (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rdft2it, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
// these are unique
-GAME( 1997, rdft2jb, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, rdft2t, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Taiwan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, rdft2u, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, rdft2jb, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rdft2t, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Taiwan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rdft2u, rdft2, rdft2, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1998, rfjet, 0, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters Jet (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, rfjetu, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters Jet (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, rfjetj, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, rfjeta, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters Jet (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, rfjett, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Taiwan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1998, rfjet, 0, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters Jet (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1998, rfjetu, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters Jet (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1998, rfjetj, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1998, rfjeta, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters Jet (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1998, rfjett, rfjet, rdft2, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Taiwan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
/* SXX2E */
-GAME( 1996, rdfts, rdft, sxx2e, sxx2e, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Explorer System Corp. license)", "Raiden Fighters (Taiwan, single board)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, rdfts, rdft, sxx2e, sxx2e, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Explorer System Corp. license)", "Raiden Fighters (Taiwan, single board)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
/* SXX2F */
-GAME( 1997, rdft2us, rdft2, sxx2f, sxx2f, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US, single board)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // title screen shows small '.1'
+GAME( 1997, rdft2us, rdft2, sxx2f, sxx2f, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US, single board)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // title screen shows small '.1'
/* SXX2G */
-GAME( 1999, rfjets, rfjet, sxx2g, sxx2f, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has 1998-99 copyright + planes unlocked
-GAME( 1999, rfjetsa, rfjet, sxx2g, sxx2f, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board, test version?)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // maybe test/proto? see notes at romdefs
+GAME( 1999, rfjets, rfjet, sxx2g, sxx2f, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // has 1998-99 copyright + planes unlocked
+GAME( 1999, rfjetsa, rfjet, sxx2g, sxx2f, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board, test version?)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // maybe test/proto? see notes at romdefs
/* SYS386I */
GAME( 2000, rdft22kc, rdft2, sys386i, sys386i, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive 2000 (China, SYS386I)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp
index 2d3991b0563..d4f4f767c39 100644
--- a/src/mame/drivers/vgmplay.cpp
+++ b/src/mame/drivers/vgmplay.cpp
@@ -201,7 +201,9 @@ public:
void segapcm_map(address_map &map);
void soundchips16_map(address_map &map);
void soundchips_map(address_map &map);
+ void ymf271_map(address_map &map);
void ymz280b_map(address_map &map);
+
private:
std::vector<uint8_t> m_file_data;
required_device<bitbanger_device> m_file;
@@ -1570,6 +1572,10 @@ ADDRESS_MAP_START(vgmplay_state::qsound_map)
AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, qsound_rom_r)
ADDRESS_MAP_END
+ADDRESS_MAP_START(vgmplay_state::ymf271_map)
+ AM_RANGE(0, 0x7fffff) AM_DEVREAD("vgmplay", vgmplay_device, ymf271_rom_r)
+ADDRESS_MAP_END
+
ADDRESS_MAP_START(vgmplay_state::ymz280b_map)
AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, ymz280b_rom_r)
ADDRESS_MAP_END
@@ -1705,7 +1711,7 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25)
MCFG_SOUND_ADD("ymf271", YMF271, 16934400)
- MCFG_YMF271_EXT_READ_HANDLER(DEVREAD8("vgmplay", vgmplay_device, ymf271_rom_r))
+ MCFG_DEVICE_ADDRESS_MAP(0, ymf271_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 1)
MCFG_SOUND_ROUTE(1, "rspeaker", 1)
diff --git a/src/mame/includes/ms32.h b/src/mame/includes/ms32.h
index bcba83e5184..b4c9f517d3c 100644
--- a/src/mame/includes/ms32.h
+++ b/src/mame/includes/ms32.h
@@ -10,6 +10,12 @@ class ms32_state : public driver_device
public:
ms32_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_audiocpu(*this, "audiocpu"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_screen(*this, "screen"),
+ m_palette(*this, "palette"),
+ m_soundlatch(*this, "soundlatch"),
m_mainram(*this, "mainram"),
m_roz_ctrl(*this, "roz_ctrl"),
m_tx_scroll(*this, "tx_scroll"),
@@ -23,12 +29,14 @@ public:
m_txram(*this, "txram", 32),
m_bgram(*this, "bgram", 32),
m_f1superb_extraram(*this, "f1sb_extraram", 32),
- m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_gfxdecode(*this, "gfxdecode"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette"),
- m_soundlatch(*this, "soundlatch") { }
+ m_z80bank(*this, "z80bank%u", 1) { }
+
+ required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_audiocpu;
+ required_device<gfxdecode_device> m_gfxdecode;
+ optional_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ optional_device<generic_latch_8_device> m_soundlatch;
optional_shared_ptr<uint32_t> m_mainram;
optional_shared_ptr<uint32_t> m_roz_ctrl;
@@ -43,6 +51,8 @@ public:
optional_shared_ptr<uint16_t> m_txram;
optional_shared_ptr<uint16_t> m_bgram;
optional_shared_ptr<uint16_t> m_f1superb_extraram;
+
+ optional_memory_bank_array<2> m_z80bank;
std::unique_ptr<uint8_t[]> m_nvram_8;
uint32_t m_to_main;
uint16_t m_irqreq;
@@ -118,15 +128,9 @@ public:
void draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, uint16_t *sprram_top, size_t sprram_size, int gfxnum, int reverseorder);
void draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect,int priority);
void configure_banks();
- required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_audiocpu;
- required_device<gfxdecode_device> m_gfxdecode;
- optional_device<screen_device> m_screen;
- required_device<palette_device> m_palette;
void ms32(machine_config &config);
void f1superb(machine_config &config);
void f1superb_map(address_map &map);
void ms32_map(address_map &map);
void ms32_sound_map(address_map &map);
- optional_device<generic_latch_8_device> m_soundlatch; //not for bnstars.cpp
};
diff --git a/src/mame/includes/seibuspi.h b/src/mame/includes/seibuspi.h
index 7ec3a258100..ae6f38100a6 100644
--- a/src/mame/includes/seibuspi.h
+++ b/src/mame/includes/seibuspi.h
@@ -6,7 +6,6 @@
******************************************************************************/
-#include "machine/intelfsh.h"
#include "machine/eepromser.h"
#include "machine/7200fifo.h"
#include "sound/okim6295.h"
@@ -15,22 +14,19 @@ class seibuspi_state : public driver_device
{
public:
seibuspi_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_mainram(*this, "mainram"),
- m_z80_rom(*this, "audiocpu"),
- m_eeprom(*this, "eeprom"),
- m_soundflash1(*this, "soundflash1"),
- m_soundflash2(*this, "soundflash2"),
- m_soundfifo1(*this, "soundfifo1"),
- m_soundfifo2(*this, "soundfifo2"),
- m_oki1(*this, "oki1"),
- m_oki2(*this, "oki2"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_key(*this, "KEY.%u", 0),
- m_special(*this, "SPECIAL")
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_audiocpu(*this, "audiocpu")
+ , m_mainram(*this, "mainram")
+ , m_z80_rom(*this, "audiocpu")
+ , m_eeprom(*this, "eeprom")
+ , m_soundfifo(*this, "soundfifo%u", 1)
+ , m_oki(*this, "oki%u", 1)
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palette(*this, "palette")
+ , m_key(*this, "KEY.%u", 0)
+ , m_special(*this, "SPECIAL")
+ , m_z80_bank(*this, "z80_bank")
{ }
required_device<cpu_device> m_maincpu;
@@ -38,18 +34,16 @@ public:
required_shared_ptr<uint32_t> m_mainram;
optional_memory_region m_z80_rom;
optional_device<eeprom_serial_93cxx_device> m_eeprom;
- optional_device<intel_e28f008sa_device> m_soundflash1;
- optional_device<intel_e28f008sa_device> m_soundflash2;
- optional_device<fifo7200_device> m_soundfifo1;
- optional_device<fifo7200_device> m_soundfifo2;
- optional_device<okim6295_device> m_oki1;
- optional_device<okim6295_device> m_oki2;
+ optional_device_array<fifo7200_device, 2> m_soundfifo;
+ optional_device_array<okim6295_device, 2> m_oki;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
optional_ioport_array<5> m_key;
optional_ioport m_special;
+ optional_memory_bank m_z80_bank;
+
int m_z80_prg_transfer_pos;
int m_z80_lastbank;
uint8_t m_sb_coin_latch;
@@ -106,8 +100,6 @@ public:
DECLARE_WRITE8_MEMBER(eeprom_w);
DECLARE_WRITE8_MEMBER(spi_layerbanks_eeprom_w);
DECLARE_WRITE8_MEMBER(oki_bank_w);
- DECLARE_READ8_MEMBER(flashrom_read);
- DECLARE_WRITE8_MEMBER(flashrom_write);
DECLARE_READ32_MEMBER(senkyu_speedup_r);
DECLARE_READ32_MEMBER(senkyua_speedup_r);
@@ -178,6 +170,7 @@ public:
void sei252_map(address_map &map);
void spi_map(address_map &map);
void spi_soundmap(address_map &map);
+ void spi_ymf271_map(address_map &map);
void sxx2e_map(address_map &map);
void sxx2e_soundmap(address_map &map);
void sxx2f_map(address_map &map);