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
This commit is contained in:
cam900 2018-02-22 22:10:11 +09:00 committed by Vas Crabb
parent 638f84f3db
commit 4457a26752
8 changed files with 234 additions and 232 deletions

View File

@ -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));

View File

@ -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)

View File

@ -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 )

View File

@ -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 )

View File

@ -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,27 +1173,15 @@ 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)
{
if (state)
@ -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, 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 | 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, 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 | 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( 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 | MACHINE_IMPERFECT_SOUND )
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 | 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( 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 )

View File

@ -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)

View File

@ -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
};

View File

@ -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);