diff --git a/src/mame/seibu/seibucats.cpp b/src/mame/seibu/seibucats.cpp index 8e18612f46a62..f1840a6ecbb98 100644 --- a/src/mame/seibu/seibucats.cpp +++ b/src/mame/seibu/seibucats.cpp @@ -68,51 +68,44 @@ #include "emu.h" #include "seibuspi.h" +//#include "seibuspi_m.h" -#include "cpu/i386/i386.h" //#include "bus/rs232/rs232.h" +#include "cpu/i386/i386.h" #include "machine/i8251.h" //#include "machine/microtch.h" //#include "machine/rtc4543.h" -#include "seibuspi_m.h" #include "sound/ymz280b.h" + #include "screen.h" #include "speaker.h" namespace { -// TBD, assume same as Seibu SPI -#define MAIN_CLOCK (XTAL(50'000'000)/2) -#define PIXEL_CLOCK (XTAL(28'636'363)/4) - -#define SPI_HTOTAL (448) -#define SPI_HBEND (0) -#define SPI_HBSTART (320) - -#define SPI_VTOTAL (296) -#define SPI_VBEND (0) -#define SPI_VBSTART (240) /* actually 253, but visible area is 240 lines */ - - -class seibucats_state : public seibuspi_state +class seibucats_state : public seibuspi_base_state { public: seibucats_state(const machine_config &mconfig, device_type type, const char *tag) - : seibuspi_state(mconfig, type, tag) -// m_key(*this, "KEY.%u", 0) + : seibuspi_base_state(mconfig, type, tag) +// m_key(*this, "KEY%u", 0) { } - void seibucats(machine_config &config); + void seibucats(machine_config &config) ATTR_COLD; + + void init_seibucats() ATTR_COLD; - void init_seibucats(); +protected: + // driver_device overrides + virtual void machine_start() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; private: // screen updates -// u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); -// IRQ_CALLBACK_MEMBER(spi_irq_callback); -// INTERRUPT_GEN_MEMBER(spi_interrupt); + //u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + //IRQ_CALLBACK_MEMBER(irq_callback); + //INTERRUPT_GEN_MEMBER(interrupt); u16 input_mux_r(); void input_select_w(u16 data); @@ -121,41 +114,30 @@ class seibucats_state : public seibuspi_state void seibucats_map(address_map &map) ATTR_COLD; - // driver_device overrides - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - virtual void video_start() override ATTR_COLD; - u16 m_input_select = 0; -// optional_ioport_array<5> m_key; -// optional_ioport m_special; + //optional_ioport_array<5> m_key; + //optional_ioport m_special; }; void seibucats_state::video_start() { + seibuspi_base_state::video_start(); + m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; - m_layer_bank = 0; - m_rf2_layer_bank = 0; - m_rowscroll_enable = false; - set_layer_offsets(); - m_tilemap_ram_size = 0; m_palette_ram_size = 0x4000; // TODO : correct? m_sprite_ram_size = 0x2000; // TODO : correct? m_sprite_bpp = 6; // see above - m_tilemap_ram = nullptr; m_palette_ram = make_unique_clear(m_palette_ram_size/4); m_sprite_ram = make_unique_clear(m_sprite_ram_size/4); m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); memset(m_alpha_table, 0, 0x2000); // TODO : no alpha blending? - - register_video_state(); } // identical to EJ Sakura @@ -179,9 +161,9 @@ void seibucats_state::input_select_w(u16 data) void seibucats_state::output_latch_w(u16 data) { - m_eeprom->di_write((data & 0x8000) ? 1 : 0); - m_eeprom->clk_write((data & 0x4000) ? ASSERT_LINE : CLEAR_LINE); - m_eeprom->cs_write((data & 0x2000) ? ASSERT_LINE : CLEAR_LINE); + m_eeprom->di_write(BIT(data, 15)); + m_eeprom->clk_write(BIT(data, 14) ? ASSERT_LINE : CLEAR_LINE); + m_eeprom->cs_write(BIT(data, 13) ? ASSERT_LINE : CLEAR_LINE); } void seibucats_state::aux_rtc_w(u16 data) @@ -191,7 +173,7 @@ void seibucats_state::aux_rtc_w(u16 data) void seibucats_state::seibucats_map(address_map &map) { // TODO: map devices - map(0x00000000, 0x0003ffff).ram().share("mainram"); + map(0x00000000, 0x0003ffff).ram().share(m_mainram); map(0x00000010, 0x00000010).r(FUNC(seibucats_state::spi_status_r)); map(0x00000400, 0x00000401).w(FUNC(seibucats_state::input_select_w)); @@ -216,7 +198,7 @@ void seibucats_state::seibucats_map(address_map &map) } static INPUT_PORTS_START( spi_mahjong_keyboard ) - PORT_START("KEY.0") + PORT_START("KEY0") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_L ) @@ -224,7 +206,7 @@ static INPUT_PORTS_START( spi_mahjong_keyboard ) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_MAHJONG_D ) PORT_BIT( 0xffffffe0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("KEY.1") + PORT_START("KEY1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_BIG ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_FLIP_FLOP ) PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP ) @@ -233,7 +215,7 @@ static INPUT_PORTS_START( spi_mahjong_keyboard ) PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_MAHJONG_SMALL ) PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("KEY.2") + PORT_START("KEY2") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_K ) @@ -241,7 +223,7 @@ static INPUT_PORTS_START( spi_mahjong_keyboard ) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_MAHJONG_C ) PORT_BIT( 0xffffffe0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("KEY.3") + PORT_START("KEY3") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_M ) PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_I ) @@ -250,7 +232,7 @@ static INPUT_PORTS_START( spi_mahjong_keyboard ) PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("KEY.4") + PORT_START("KEY4") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_MAHJONG_N ) PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_MAHJONG_J ) @@ -272,7 +254,7 @@ static INPUT_PORTS_START( seibucats ) PORT_BIT( 0xffffbf3f, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END -static const gfx_layout sys386f_spritelayout = +static const gfx_layout spritelayout = { 16,16, RGN_FRAC(1,4), @@ -285,27 +267,25 @@ static const gfx_layout sys386f_spritelayout = static GFXDECODE_START( gfx_seibucats ) - GFXDECODE_ENTRY( "sprites", 0, sys386f_spritelayout, 0, 64 ) + GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0, 64 ) GFXDECODE_END void seibucats_state::machine_start() { - save_item(NAME(m_input_select)); -} + seibuspi_base_state::machine_start(); -void seibucats_state::machine_reset() -{ + save_item(NAME(m_input_select)); } #if 0 // do not remove, might be needed for the DVD stuff (unchecked) -INTERRUPT_GEN_MEMBER(seibucats_state::spi_interrupt) +INTERRUPT_GEN_MEMBER(seibucats_state::interrupt) { device.execute().set_input_line(0, HOLD_LINE); // where is ack? } -IRQ_CALLBACK_MEMBER(seibucats_state::spi_irq_callback) +IRQ_CALLBACK_MEMBER(seibucats_state::irq_callback) { return 0x20; } @@ -313,13 +293,25 @@ IRQ_CALLBACK_MEMBER(seibucats_state::spi_irq_callback) void seibucats_state::seibucats(machine_config &config) { + // TBD, assume same as Seibu SPI + constexpr XTAL MAIN_CLOCK = XTAL(50'000'000)/2; + constexpr XTAL PIXEL_CLOCK = XTAL(28'636'363)/4; + + constexpr u16 SPI_HTOTAL = 448; + constexpr u16 SPI_HBEND = 0; + constexpr u16 SPI_HBSTART = 320; + + constexpr u16 SPI_VTOTAL = 296; + constexpr u16 SPI_VBEND = 0; + constexpr u16 SPI_VBSTART = 240; /* actually 253, but visible area is 240 lines */ + /* basic machine hardware */ I386(config, m_maincpu, MAIN_CLOCK); m_maincpu->set_addrmap(AS_PROGRAM, &seibucats_state::seibucats_map); - m_maincpu->set_vblank_int("screen", FUNC(seibuspi_state::spi_interrupt)); - m_maincpu->set_irq_acknowledge_callback(FUNC(seibuspi_state::spi_irq_callback)); + m_maincpu->set_vblank_int("screen", FUNC(seibucats_state::interrupt)); + m_maincpu->set_irq_acknowledge_callback(FUNC(seibucats_state::irq_callback)); - EEPROM_93C46_16BIT(config, "eeprom"); + EEPROM_93C46_16BIT(config, m_eeprom); //JRC6355E(config, m_rtc, XTAL(32'768)); @@ -328,8 +320,8 @@ void seibucats_state::seibucats(machine_config &config) /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); -// screen.set_screen_update(FUNC(seibucats_state::screen_update)); - screen.set_screen_update(FUNC(seibuspi_state::screen_update_sys386f)); + //screen.set_screen_update(FUNC(seibucats_state::screen_update)); + screen.set_screen_update(FUNC(seibucats_state::screen_update_sys386f)); screen.set_raw(PIXEL_CLOCK, SPI_HTOTAL, SPI_HBEND, SPI_HBSTART, SPI_VTOTAL, SPI_VBEND, SPI_VBSTART); GFXDECODE(config, m_gfxdecode, m_palette, gfx_seibucats); @@ -353,7 +345,7 @@ void seibucats_state::seibucats(machine_config &config) #define SEIBUCATS_OBJ_LOAD \ ROM_REGION( 0x400000, "sprites", ROMREGION_ERASE00) \ -/* obj4.u0234 empty slot */ \ + /* obj4.u0234 empty slot */ \ ROM_LOAD16_WORD_SWAP("obj03.u0232", 0x100000, 0x100000, BAD_DUMP CRC(15c230cf) SHA1(7e12871d6e34e28cd4b5b23af6b0cbdff9432500) ) \ ROM_LOAD16_WORD_SWAP("obj02.u0233", 0x200000, 0x100000, BAD_DUMP CRC(dffd0114) SHA1(b74254061b6da5a2ce310ea89684db430b43583e) ) \ ROM_LOAD16_WORD_SWAP("obj01.u0231", 0x300000, 0x100000, BAD_DUMP CRC(ee5ae0fd) SHA1(0baff6ca4e8bceac4e09732da267f57578dcc280) ) @@ -403,7 +395,7 @@ ROM_END void seibucats_state::init_seibucats() { u16 *src = (u16 *)memregion("sprites")->base(); - u16 tmp[0x40 / 2], offset; + u16 tmp[0x40 / 2]; // sprite_reorder() only for (int i = 0; i < memregion("sprites")->bytes() / 0x40; i++) @@ -412,7 +404,7 @@ void seibucats_state::init_seibucats() for (int j = 0; j < 0x40 / 2; j++) { - offset = (j >> 1) | (j << 4 & 0x10); + const u16 offset = (j >> 1) | (j << 4 & 0x10); *src++ = tmp[offset]; } } diff --git a/src/mame/seibu/seibuspi.cpp b/src/mame/seibu/seibuspi.cpp index 2bb6907a25803..54735ca5bc845 100644 --- a/src/mame/seibu/seibuspi.cpp +++ b/src/mame/seibu/seibuspi.cpp @@ -895,15 +895,15 @@ SYS386F V2.0 // default values written to CRTC (note: SYS386F does not have this chip) -#define PIXEL_CLOCK (XTAL(28'636'363)/4) +static constexpr XTAL PIXEL_CLOCK = XTAL(28'636'363)/4; -#define SPI_HTOTAL (448) -#define SPI_HBEND (0) -#define SPI_HBSTART (320) +static constexpr u16 SPI_HTOTAL = 448; +static constexpr u16 SPI_HBEND = 0; +static constexpr u16 SPI_HBSTART = 320; -#define SPI_VTOTAL (296) -#define SPI_VBEND (0) -#define SPI_VBSTART (240) /* actually 253, but visible area is 240 lines */ +static constexpr u16 SPI_VTOTAL = 296; +static constexpr u16 SPI_VBEND = 0; +static constexpr u16 SPI_VBSTART = 240; /* actually 253, but visible area is 240 lines */ #define ENABLE_SPEEDUP_HACKS 1 /* speed up at idle loops */ @@ -911,7 +911,7 @@ SYS386F V2.0 /*****************************************************************************/ -u8 seibuspi_state::sound_fifo_status_r() +u8 seibuspi_z80_state::sound_fifo_status_r() { // d0: fifo full flag (z80) // d1: fifo empty flag (main) @@ -920,27 +920,27 @@ u8 seibuspi_state::sound_fifo_status_r() return d1 | m_soundfifo[0]->ff_r(); } -u8 seibuspi_state::spi_status_r() +u8 seibuspi_base_state::spi_status_r() { // d0: unknown status, waits for it to be set, video/dma related? // other bits: unused? return 0x01; } -u8 seibuspi_state::spi_ds2404_unknown_r() +u8 seibuspi_z80_state::spi_ds2404_unknown_r() { // d0, d1, d2: unknown, waits for it to be cleared return 0x00; } -void seibuspi_state::eeprom_w(u8 data) +void seibuspi_base_state::eeprom_w(u8 data) { - m_eeprom->di_write((data & 0x80) ? 1 : 0); - m_eeprom->clk_write((data & 0x40) ? ASSERT_LINE : CLEAR_LINE); - m_eeprom->cs_write((data & 0x20) ? ASSERT_LINE : CLEAR_LINE); + m_eeprom->di_write(BIT(data, 7)); + m_eeprom->clk_write(BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); + m_eeprom->cs_write(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE); } -void seibuspi_state::spi_layerbanks_eeprom_w(u8 data) +void seibuspi_tilemap_state::spi_layerbanks_eeprom_w(u8 data) { // low bits: tile banks rf2_layer_bank_w(data); @@ -949,9 +949,9 @@ void seibuspi_state::spi_layerbanks_eeprom_w(u8 data) eeprom_w(data); } -void seibuspi_state::oki_bank_w(u8 data) +void sys386i_state::oki_bank_w(u8 data) { - m_oki[1]->set_rom_bank((data >> 2) & 1); + m_oki[1]->set_rom_bank(BIT(data, 2)); } void seibuspi_state::z80_prg_transfer_w(u8 data) @@ -968,10 +968,10 @@ void seibuspi_state::z80_enable_w(u8 data) // d0: reset z80 // other bits: unused m_z80_prg_transfer_pos = 0; - m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x01) ? CLEAR_LINE : ASSERT_LINE); + m_audiocpu->set_input_line(INPUT_LINE_RESET, BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); } -u8 seibuspi_state::sb_coin_r() +u8 seibuspi_z80_state::sb_coin_r() { const u8 ret = m_sb_coin_latch; if (!machine().side_effects_disabled()) @@ -979,38 +979,38 @@ u8 seibuspi_state::sb_coin_r() return ret; } -u32 seibuspi_state::ejsakura_keyboard_r() +u32 sys386f_state::input_mux_r() { // coins/eeprom data u32 ret = m_special->read(); // switch matrix - if (BIT(m_ejsakura_input_port, 0)) ret &= m_key[3]->read(); - if (BIT(m_ejsakura_input_port, 1)) ret &= m_key[4]->read(); - if (BIT(m_ejsakura_input_port, 2)) ret &= m_key[2]->read(); - if (BIT(m_ejsakura_input_port, 3)) ret &= m_key[0]->read(); - if (BIT(m_ejsakura_input_port, 4)) ret &= m_key[1]->read(); + if (BIT(m_input_select, 0)) ret &= m_key[3]->read(); + if (BIT(m_input_select, 1)) ret &= m_key[4]->read(); + if (BIT(m_input_select, 2)) ret &= m_key[2]->read(); + if (BIT(m_input_select, 3)) ret &= m_key[0]->read(); + if (BIT(m_input_select, 4)) ret &= m_key[1]->read(); ret = (ret & ~u32(0x1f)) | bitswap<5>(ret, 0, 1, 2, 3, 4); return ret; } -void seibuspi_state::ejsakura_input_select_w(u32 data) +void sys386f_state::input_select_w(u32 data) { - m_ejsakura_input_port = data; + m_input_select = data; } -void seibuspi_state::base_map(address_map &map) +void seibuspi_tilemap_state::base_map(address_map &map) { - map(0x00000000, 0x0003ffff).ram().share("mainram"); + map(0x00000000, 0x0003ffff).ram().share(m_mainram); map(0x00000400, 0x0000043f).rw("crtc", FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); - map(0x00000480, 0x00000483).w(FUNC(seibuspi_state::tilemap_dma_start_w)); - map(0x00000484, 0x00000487).w(FUNC(seibuspi_state::palette_dma_start_w)); - map(0x00000490, 0x00000493).w(FUNC(seibuspi_state::video_dma_length_w)); - map(0x00000494, 0x00000497).w(FUNC(seibuspi_state::video_dma_address_w)); + map(0x00000480, 0x00000483).w(FUNC(seibuspi_tilemap_state::tilemap_dma_start_w)); + map(0x00000484, 0x00000487).w(FUNC(seibuspi_tilemap_state::palette_dma_start_w)); + map(0x00000490, 0x00000493).w(FUNC(seibuspi_tilemap_state::video_dma_length_w)); + map(0x00000494, 0x00000497).w(FUNC(seibuspi_tilemap_state::video_dma_address_w)); map(0x00000498, 0x0000049b).nopw(); // ? dma address high bits? (always writes 0) - map(0x00000600, 0x00000600).r(FUNC(seibuspi_state::spi_status_r)); + map(0x00000600, 0x00000600).r(FUNC(seibuspi_tilemap_state::spi_status_r)); map(0x00000604, 0x00000607).portr("INPUTS"); map(0x00000608, 0x0000060b).portr("EXCH"); map(0x0000060c, 0x0000060f).portr("SYSTEM"); @@ -1018,10 +1018,10 @@ void seibuspi_state::base_map(address_map &map) map(0xffe00000, 0xffffffff).rom().region("maincpu", 0); // ROM location in real-mode } -void seibuspi_state::sei252_map(address_map &map) +void seibuspi_z80_state::sei252_map(address_map &map) { //map(0x00000500, 0x0000057f).rw("obj", FUNC(sei252_device::read_xor), FUNC(sei252_device::write_xor)); - map(0x0000050e, 0x0000050f).w(FUNC(seibuspi_state::sprite_dma_start_w)); + map(0x0000050e, 0x0000050f).w(FUNC(seibuspi_z80_state::sprite_dma_start_w)); map(0x00000524, 0x00000527).nopw(); // SEI252 sprite decryption key, see machine/spisprit.c map(0x00000528, 0x0000052b).nopw(); // SEI252 sprite decryption unknown map(0x00000530, 0x00000533).nopw(); // SEI252 sprite decryption table key, see machine/spisprit.c @@ -1029,11 +1029,11 @@ void seibuspi_state::sei252_map(address_map &map) map(0x0000053c, 0x0000053f).nopw(); // SEI252 sprite decryption table index, see machine/spisprit.c } -void seibuspi_state::rise_map(address_map &map) +void seibuspi_base_state::rise_map(address_map &map) { //map(0x00000500, 0x0000057f).rw("obj", FUNC(seibu_encrypted_sprite_device::read), FUNC(seibu_encrypted_sprite_device::write)); map(0x0000054c, 0x0000054f).nopw(); // RISE10/11 sprite decryption key, see machine/seibuspi.c - map(0x00000562, 0x00000563).w(FUNC(seibuspi_state::sprite_dma_start_w)); + map(0x00000562, 0x00000563).w(FUNC(seibuspi_base_state::sprite_dma_start_w)); } void seibuspi_state::spi_map(address_map &map) @@ -1041,8 +1041,8 @@ void seibuspi_state::spi_map(address_map &map) base_map(map); sei252_map(map); map(0x00000600, 0x00000603).nopw(); // ? - map(0x00000680, 0x00000680).r("soundfifo2", FUNC(fifo7200_device::data_byte_r)); - map(0x00000680, 0x00000680).w("soundfifo1", FUNC(fifo7200_device::data_byte_w)); + map(0x00000680, 0x00000680).r(m_soundfifo[1], FUNC(fifo7200_device::data_byte_r)); + map(0x00000680, 0x00000680).w(m_soundfifo[0], FUNC(fifo7200_device::data_byte_w)); map(0x00000684, 0x00000684).r(FUNC(seibuspi_state::sound_fifo_status_r)); map(0x00000688, 0x00000688).w(FUNC(seibuspi_state::z80_prg_transfer_w)); map(0x0000068c, 0x0000068c).w(FUNC(seibuspi_state::z80_enable_w)); @@ -1060,8 +1060,8 @@ void seibuspi_state::rdft2_map(address_map &map) base_map(map); rise_map(map); map(0x00000600, 0x00000603).nopw(); // ? - map(0x00000680, 0x00000680).r("soundfifo2", FUNC(fifo7200_device::data_byte_r)); - map(0x00000680, 0x00000680).w("soundfifo1", FUNC(fifo7200_device::data_byte_w)); + map(0x00000680, 0x00000680).r(m_soundfifo[1], FUNC(fifo7200_device::data_byte_r)); + map(0x00000680, 0x00000680).w(m_soundfifo[0], FUNC(fifo7200_device::data_byte_w)); map(0x00000684, 0x00000684).r(FUNC(seibuspi_state::sound_fifo_status_r)); map(0x00000688, 0x00000688).w(FUNC(seibuspi_state::z80_prg_transfer_w)); map(0x0000068c, 0x0000068c).w(FUNC(seibuspi_state::z80_enable_w)); @@ -1074,57 +1074,57 @@ void seibuspi_state::rdft2_map(address_map &map) map(0x00a00000, 0x013fffff).rom().region("sound01", 0); } -void seibuspi_state::sxx2e_map(address_map &map) +void seibuspi_z80_state::sxx2e_map(address_map &map) { base_map(map); sei252_map(map); - map(0x00000680, 0x00000680).r(FUNC(seibuspi_state::sb_coin_r)); - map(0x00000680, 0x00000680).w("soundfifo1", FUNC(fifo7200_device::data_byte_w)); - map(0x00000684, 0x00000684).r(FUNC(seibuspi_state::sound_fifo_status_r)); + map(0x00000680, 0x00000680).r(FUNC(seibuspi_z80_state::sb_coin_r)); + map(0x00000680, 0x00000680).w(m_soundfifo[0], FUNC(fifo7200_device::data_byte_w)); + map(0x00000684, 0x00000684).r(FUNC(seibuspi_z80_state::sound_fifo_status_r)); map(0x00000688, 0x0000068b).noprw(); // ? map(0x0000068c, 0x0000068f).nopw(); map(0x000006d0, 0x000006d0).w("ds2404", FUNC(ds2404_device::_1w_reset_w)); map(0x000006d4, 0x000006d4).w("ds2404", FUNC(ds2404_device::data_w)); map(0x000006d8, 0x000006d8).w("ds2404", FUNC(ds2404_device::clk_w)); map(0x000006dc, 0x000006dc).r("ds2404", FUNC(ds2404_device::data_r)); - map(0x000006dd, 0x000006dd).r(FUNC(seibuspi_state::spi_ds2404_unknown_r)); + map(0x000006dd, 0x000006dd).r(FUNC(seibuspi_z80_state::spi_ds2404_unknown_r)); } -void seibuspi_state::sxx2f_map(address_map &map) +void seibuspi_z80_state::sxx2f_map(address_map &map) { base_map(map); rise_map(map); - map(0x00000680, 0x00000680).r(FUNC(seibuspi_state::sb_coin_r)); - map(0x00000680, 0x00000680).w("soundfifo1", FUNC(fifo7200_device::data_byte_w)); - map(0x00000684, 0x00000684).r(FUNC(seibuspi_state::sound_fifo_status_r)); + map(0x00000680, 0x00000680).r(FUNC(seibuspi_z80_state::sb_coin_r)); + map(0x00000680, 0x00000680).w(m_soundfifo[0], FUNC(fifo7200_device::data_byte_w)); + map(0x00000684, 0x00000684).r(FUNC(seibuspi_z80_state::sound_fifo_status_r)); map(0x00000688, 0x0000068b).noprw(); // ? - map(0x0000068e, 0x0000068e).w(FUNC(seibuspi_state::spi_layerbanks_eeprom_w)); + map(0x0000068e, 0x0000068e).w(FUNC(seibuspi_z80_state::spi_layerbanks_eeprom_w)); map(0x00000690, 0x00000693).nopw(); // ? } -void seibuspi_state::sys386i_map(address_map &map) +void sys386i_state::sys386i_map(address_map &map) { base_map(map); rise_map(map); - map(0x0000068e, 0x0000068e).w(FUNC(seibuspi_state::spi_layerbanks_eeprom_w)); - map(0x0000068f, 0x0000068f).w(FUNC(seibuspi_state::oki_bank_w)); - map(0x01200000, 0x01200000).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0x01200004, 0x01200004).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x0000068e, 0x0000068e).w(FUNC(sys386i_state::spi_layerbanks_eeprom_w)); + map(0x0000068f, 0x0000068f).w(FUNC(sys386i_state::oki_bank_w)); + map(0x01200000, 0x01200000).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x01200004, 0x01200004).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); } -void seibuspi_state::sys386f_map(address_map &map) +void sys386f_state::sys386f_map(address_map &map) { - map(0x00000000, 0x0003ffff).ram().share("mainram"); + map(0x00000000, 0x0003ffff).ram().share(m_mainram); rise_map(map); - map(0x00000010, 0x00000010).r(FUNC(seibuspi_state::spi_status_r)); - map(0x00000400, 0x00000403).portr("SYSTEM").w(FUNC(seibuspi_state::ejsakura_input_select_w)); - map(0x00000404, 0x00000404).w(FUNC(seibuspi_state::eeprom_w)); + map(0x00000010, 0x00000010).r(FUNC(sys386f_state::spi_status_r)); + map(0x00000400, 0x00000403).portr("SYSTEM").w(FUNC(sys386f_state::input_select_w)); + map(0x00000404, 0x00000404).w(FUNC(sys386f_state::eeprom_w)); map(0x00000408, 0x0000040f).w("ymz", FUNC(ymz280b_device::write)).umask32(0x000000ff); - map(0x00000484, 0x00000487).w(FUNC(seibuspi_state::palette_dma_start_w)); - map(0x00000490, 0x00000493).w(FUNC(seibuspi_state::video_dma_length_w)); - map(0x00000494, 0x00000497).w(FUNC(seibuspi_state::video_dma_address_w)); + map(0x00000484, 0x00000487).w(FUNC(sys386f_state::palette_dma_start_w)); + map(0x00000490, 0x00000493).w(FUNC(sys386f_state::video_dma_length_w)); + map(0x00000494, 0x00000497).w(FUNC(sys386f_state::video_dma_address_w)); map(0x00000600, 0x00000607).r("ymz", FUNC(ymz280b_device::read)).umask32(0x000000ff); - map(0x0000060c, 0x0000060f).r(FUNC(seibuspi_state::ejsakura_keyboard_r)); + map(0x0000060c, 0x0000060f).r(FUNC(sys386f_state::input_mux_r)); map(0x00200000, 0x003fffff).rom().region("maincpu", 0); map(0xffe00000, 0xffffffff).rom().region("maincpu", 0); // ROM location in real-mode } @@ -1132,7 +1132,7 @@ void seibuspi_state::sys386f_map(address_map &map) /*****************************************************************************/ -u8 seibuspi_state::z80_soundfifo_status_r() +u8 seibuspi_z80_state::z80_soundfifo_status_r() { // d0: fifo full flag (main) // d1: fifo empty flag (z80) @@ -1141,7 +1141,7 @@ u8 seibuspi_state::z80_soundfifo_status_r() return d0 | m_soundfifo[0]->ef_r() << 1; } -void seibuspi_state::z80_bank_w(u8 data) +void seibuspi_z80_state::z80_bank_w(u8 data) { // d0-d2: bank @ 8000 const u8 bank = data & 7; @@ -1155,10 +1155,10 @@ void seibuspi_state::z80_bank_w(u8 data) // d3: watchdog? } -void seibuspi_state::spi_coin_w(u8 data) +void seibuspi_z80_state::spi_coin_w(u8 data) { - machine().bookkeeping().coin_counter_w(0, data & 1); - machine().bookkeeping().coin_counter_w(1, data & 2); + machine().bookkeeping().coin_counter_w(0, BIT(data, 0)); + machine().bookkeeping().coin_counter_w(1, BIT(data, 1)); // coin latch used by single boards if (data) @@ -1168,41 +1168,41 @@ void seibuspi_state::spi_coin_w(u8 data) } -void seibuspi_state::sxx2e_soundmap(address_map &map) +void seibuspi_z80_state::sxx2e_soundmap(address_map &map) { map(0x0000, 0x1fff).rom(); map(0x2000, 0x3fff).ram(); map(0x4002, 0x4002).nopw(); // ? map(0x4003, 0x4003).nopw(); // ? - map(0x4004, 0x4004).w(FUNC(seibuspi_state::spi_coin_w)); - map(0x4008, 0x4008).r("soundfifo1", FUNC(fifo7200_device::data_byte_r)); + map(0x4004, 0x4004).w(FUNC(seibuspi_z80_state::spi_coin_w)); + map(0x4008, 0x4008).r(m_soundfifo[0], FUNC(fifo7200_device::data_byte_r)); map(0x4008, 0x4008).nopw(); // ? - map(0x4009, 0x4009).r(FUNC(seibuspi_state::z80_soundfifo_status_r)); + map(0x4009, 0x4009).r(FUNC(seibuspi_z80_state::z80_soundfifo_status_r)); map(0x400b, 0x400b).nopw(); // ? map(0x4013, 0x4013).portr("COIN"); - map(0x401b, 0x401b).w(FUNC(seibuspi_state::z80_bank_w)); + map(0x401b, 0x401b).w(FUNC(seibuspi_z80_state::z80_bank_w)); map(0x6000, 0x600f).rw("ymf", FUNC(ymf271_device::read), FUNC(ymf271_device::write)); - map(0x8000, 0xffff).bankr("z80_bank"); + map(0x8000, 0xffff).bankr(m_z80_bank); } void seibuspi_state::spi_soundmap(address_map &map) { sxx2e_soundmap(map); - map(0x4008, 0x4008).w("soundfifo2", FUNC(fifo7200_device::data_byte_w)); + map(0x4008, 0x4008).w(m_soundfifo[1], FUNC(fifo7200_device::data_byte_w)); map(0x400a, 0x400a).portr("JUMPERS"); // TODO: get these to actually work (only on SXX2C) } void seibuspi_state::spi_ymf271_map(address_map &map) { map.global_mask(0x1fffff); - map(0x000000, 0x0fffff).rw("soundflash1", FUNC(intel_e28f008sa_device::read), FUNC(intel_e28f008sa_device::write)); - map(0x100000, 0x1fffff).rw("soundflash2", FUNC(intel_e28f008sa_device::read), FUNC(intel_e28f008sa_device::write)); + map(0x000000, 0x0fffff).rw(m_soundflash[0], FUNC(intel_e28f008sa_device::read), FUNC(intel_e28f008sa_device::write)); + map(0x100000, 0x1fffff).rw(m_soundflash[1], FUNC(intel_e28f008sa_device::read), FUNC(intel_e28f008sa_device::write)); } /*****************************************************************************/ -void seibuspi_state::ymf_irqhandler(int state) +void seibuspi_z80_state::ymf_irqhandler(int state) { if (state) m_audiocpu->set_input_line_and_vector(0, ASSERT_LINE, 0xd7); // Z80 - IRQ is RST10 @@ -1695,26 +1695,34 @@ GFXDECODE_END /*****************************************************************************/ -INTERRUPT_GEN_MEMBER(seibuspi_state::spi_interrupt) +INTERRUPT_GEN_MEMBER(seibuspi_base_state::interrupt) { device.execute().set_input_line(0, HOLD_LINE); // where is ack? } -IRQ_CALLBACK_MEMBER(seibuspi_state::spi_irq_callback) +IRQ_CALLBACK_MEMBER(seibuspi_base_state::irq_callback) { return 0x20; } +void seibuspi_z80_state::machine_reset() +{ + seibuspi_tilemap_state::machine_reset(); + + m_z80_bank->set_entry(0); + m_z80_lastbank = 0; + m_sb_coin_latch = 0; +} + /* SPI */ -void seibuspi_state::init_spi_common() +void seibuspi_z80_state::init_spi_common() { - if (m_z80_rom != nullptr) - m_z80_bank->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() +void seibuspi_z80_state::init_sei252() { text_decrypt(memregion("chars")->base()); bg_decrypt(memregion("tiles")->base(), memregion("tiles")->bytes()); @@ -1723,74 +1731,93 @@ void seibuspi_state::init_sei252() } +void sys386f_state::machine_start() +{ + seibuspi_base_state::machine_start(); + + // savestates + save_item(NAME(m_input_select)); +} + +void seibuspi_z80_state::machine_start() +{ + seibuspi_tilemap_state::machine_start(); + + // savestates + save_item(NAME(m_z80_lastbank)); + save_item(NAME(m_sb_coin_latch)); +} + void seibuspi_state::machine_start() { + seibuspi_z80_state::machine_start(); + // use this to determine the region code when adding a new SPI cartridge clone set logerror("Game region code: %02X\n", memregion("maincpu")->base()[0x1ffffc]); // savestates save_item(NAME(m_z80_prg_transfer_pos)); - save_item(NAME(m_z80_lastbank)); - save_item(NAME(m_sb_coin_latch)); - save_item(NAME(m_ejsakura_input_port)); - if (m_z80_rom != nullptr) save_pointer(NAME(m_z80_rom->base()), m_z80_rom->bytes()); + save_pointer(NAME(m_z80_rom->base()), m_z80_rom->bytes()); } -MACHINE_RESET_MEMBER(seibuspi_state,spi) +void seibuspi_state::machine_reset() { + seibuspi_z80_state::machine_reset(); + m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - m_z80_bank->set_entry(0); - m_z80_lastbank = 0; m_z80_prg_transfer_pos = 0; - // fix the magic ID byte so users can't "brick" the machine - if (m_soundflash1 && m_soundflash1_region) + // Hack: fix the magic ID byte so users can't "brick" the machine + if (m_soundflash1_region) { - m_soundflash1->write_raw(0, m_soundflash1_region[0]); + m_soundflash[0]->write_raw(0, m_soundflash1_region[0]); } } +void seibuspi_tilemap_state::base_video(machine_config &config) +{ + /* video hardware */ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(PIXEL_CLOCK, SPI_HTOTAL, SPI_HBEND, SPI_HBSTART, SPI_VTOTAL, SPI_VBEND, SPI_VBSTART); + screen.set_screen_update(FUNC(seibuspi_tilemap_state::screen_update_spi)); + + GFXDECODE(config, m_gfxdecode, m_palette, gfx_spi); + + PALETTE(config, m_palette, palette_device::BLACK, 6144); + + seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); + crtc.decrypt_key_callback().set(FUNC(seibuspi_tilemap_state::tile_decrypt_key_w)); + crtc.layer_en_callback().set(FUNC(seibuspi_tilemap_state::layer_enable_w)); + crtc.reg_1a_callback().set(FUNC(seibuspi_tilemap_state::layer_bank_w)); + crtc.layer_scroll_callback().set(FUNC(seibuspi_tilemap_state::scroll_w)); +} + void seibuspi_state::spi(machine_config &config) { /* basic machine hardware */ I386(config, m_maincpu, 50_MHz_XTAL / 2); // AMD or Intel 386DX, 25MHz m_maincpu->set_addrmap(AS_PROGRAM, &seibuspi_state::spi_map); - m_maincpu->set_vblank_int("screen", FUNC(seibuspi_state::spi_interrupt)); - m_maincpu->set_irq_acknowledge_callback(FUNC(seibuspi_state::spi_irq_callback)); + m_maincpu->set_vblank_int("screen", FUNC(seibuspi_state::interrupt)); + m_maincpu->set_irq_acknowledge_callback(FUNC(seibuspi_state::irq_callback)); Z80(config, m_audiocpu, 28.636363_MHz_XTAL / 4); // Z84C0008PEC, 7.159MHz m_audiocpu->set_addrmap(AS_PROGRAM, &seibuspi_state::spi_soundmap); config.set_maximum_quantum(attotime::from_hz(12000)); - MCFG_MACHINE_RESET_OVERRIDE(seibuspi_state, spi) - ds2404_device &rtc(DS2404(config, "ds2404", 32.768_kHz_XTAL)); rtc.ref_year(1995); rtc.ref_month(1); rtc.ref_day(1); - INTEL_E28F008SA(config, "soundflash1"); // Sharp LH28F008 on newer mainboard revision - INTEL_E28F008SA(config, "soundflash2"); // " + INTEL_E28F008SA(config, m_soundflash[0]); // Sharp LH28F008 on newer mainboard revision + INTEL_E28F008SA(config, m_soundflash[1]); // " IDT7201(config, m_soundfifo[0]); // LH5496D, but on single board hw it's one CY7C421 IDT7201(config, m_soundfifo[1]); // " - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(PIXEL_CLOCK, SPI_HTOTAL, SPI_HBEND, SPI_HBSTART, SPI_VTOTAL, SPI_VBEND, SPI_VBSTART); - screen.set_screen_update(FUNC(seibuspi_state::screen_update_spi)); - - GFXDECODE(config, m_gfxdecode, m_palette, gfx_spi); - - PALETTE(config, m_palette, palette_device::BLACK, 6144); - - seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); - crtc.decrypt_key_callback().set(FUNC(seibuspi_state::tile_decrypt_key_w)); - crtc.layer_en_callback().set(FUNC(seibuspi_state::spi_layer_enable_w)); - crtc.reg_1a_callback().set(FUNC(seibuspi_state::spi_layer_bank_w)); - crtc.layer_scroll_callback().set(FUNC(seibuspi_state::scroll_w)); + base_video(config); /* sound hardware */ SPEAKER(config, "speaker", 2).front(); @@ -1822,55 +1849,53 @@ void seibuspi_state::rdft2(machine_config &config) /* single boards */ -MACHINE_RESET_MEMBER(seibuspi_state,sxx2e) -{ - m_z80_bank->set_entry(0); - m_z80_lastbank = 0; - m_sb_coin_latch = 0; -} - -void seibuspi_state::sxx2e(machine_config &config) +void seibuspi_z80_state::sxx2e(machine_config &config) { - spi(config); - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &seibuspi_state::sxx2e_map); + I386(config, m_maincpu, 50_MHz_XTAL / 2); // AMD or Intel 386DX, 25MHz + m_maincpu->set_addrmap(AS_PROGRAM, &seibuspi_z80_state::sxx2e_map); + m_maincpu->set_vblank_int("screen", FUNC(seibuspi_z80_state::interrupt)); + m_maincpu->set_irq_acknowledge_callback(FUNC(seibuspi_z80_state::irq_callback)); - m_audiocpu->set_addrmap(AS_PROGRAM, &seibuspi_state::sxx2e_soundmap); + Z80(config, m_audiocpu, 28.636363_MHz_XTAL / 4); // Unknown part number and clock + m_audiocpu->set_addrmap(AS_PROGRAM, &seibuspi_z80_state::sxx2e_soundmap); - MCFG_MACHINE_RESET_OVERRIDE(seibuspi_state, sxx2e) + config.set_maximum_quantum(attotime::from_hz(12000)); + + ds2404_device &rtc(DS2404(config, "ds2404", 32.768_kHz_XTAL)); + rtc.ref_year(1995); + rtc.ref_month(1); + rtc.ref_day(1); - config.device_remove("soundflash1"); - config.device_remove("soundflash2"); + IDT7201(config, m_soundfifo[0]); // LH5496D, but on single board hw it's one CY7C421 - config.device_remove("soundfifo2"); + base_video(config); /* sound hardware */ // Single PCBs only output mono sound, SXX2E : unverified - config.device_remove("speaker"); SPEAKER(config, "mono").front_center(); - ymf271_device &ymf(YMF271(config.replace(), "ymf", 16.9344_MHz_XTAL)); - ymf.irq_handler().set(FUNC(seibuspi_state::ymf_irqhandler)); + ymf271_device &ymf(YMF271(config, "ymf", 16.9344_MHz_XTAL)); + ymf.irq_handler().set(FUNC(seibuspi_z80_state::ymf_irqhandler)); ymf.add_route(ALL_OUTPUTS, "mono", 1.0); } -void seibuspi_state::sxx2f(machine_config &config) +void seibuspi_z80_state::sxx2f(machine_config &config) { sxx2e(config); /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &seibuspi_state::sxx2f_map); + m_maincpu->set_addrmap(AS_PROGRAM, &seibuspi_z80_state::sxx2f_map); config.device_remove("ds2404"); - EEPROM_93C46_16BIT(config, "eeprom"); + EEPROM_93C46_16BIT(config, m_eeprom); // Z80 is Z84C0006PCS instead of Z84C0008PEC // clock is unknown, possibly slower than 7.159MHz } -void seibuspi_state::sxx2g(machine_config &config) // clocks differ, but otherwise same hw as sxx2f +void seibuspi_z80_state::sxx2g(machine_config &config) // clocks differ, but otherwise same hw as sxx2f { sxx2f(config); @@ -1880,37 +1905,24 @@ void seibuspi_state::sxx2g(machine_config &config) // clocks differ, but otherwi /* sound hardware */ ymf271_device &ymf(YMF271(config.replace(), "ymf", 16.384_MHz_XTAL)); // 16.384MHz(!) - ymf.irq_handler().set(FUNC(seibuspi_state::ymf_irqhandler)); + ymf.irq_handler().set(FUNC(seibuspi_z80_state::ymf_irqhandler)); ymf.add_route(ALL_OUTPUTS, "mono", 1.0); } /* SYS386I */ -void seibuspi_state::sys386i(machine_config &config) +void sys386i_state::sys386i(machine_config &config) { /* basic machine hardware */ I386(config, m_maincpu, 40_MHz_XTAL); // AMD 386DX, 40MHz - m_maincpu->set_addrmap(AS_PROGRAM, &seibuspi_state::sys386i_map); - m_maincpu->set_vblank_int("screen", FUNC(seibuspi_state::spi_interrupt)); - m_maincpu->set_irq_acknowledge_callback(FUNC(seibuspi_state::spi_irq_callback)); - - EEPROM_93C46_16BIT(config, "eeprom"); + m_maincpu->set_addrmap(AS_PROGRAM, &sys386i_state::sys386i_map); + m_maincpu->set_vblank_int("screen", FUNC(sys386i_state::interrupt)); + m_maincpu->set_irq_acknowledge_callback(FUNC(sys386i_state::irq_callback)); - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(PIXEL_CLOCK, SPI_HTOTAL, SPI_HBEND, SPI_HBSTART, SPI_VTOTAL, SPI_VBEND, SPI_VBSTART); - screen.set_screen_update(FUNC(seibuspi_state::screen_update_spi)); - - GFXDECODE(config, m_gfxdecode, m_palette, gfx_spi); - - PALETTE(config, m_palette, palette_device::BLACK, 6144); + EEPROM_93C46_16BIT(config, m_eeprom); - seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); - crtc.decrypt_key_callback().set(FUNC(seibuspi_state::tile_decrypt_key_w)); - crtc.layer_en_callback().set(FUNC(seibuspi_state::spi_layer_enable_w)); - crtc.reg_1a_callback().set(FUNC(seibuspi_state::spi_layer_bank_w)); - crtc.layer_scroll_callback().set(FUNC(seibuspi_state::scroll_w)); + base_video(config); /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -1925,10 +1937,10 @@ void seibuspi_state::sys386i(machine_config &config) /* SYS386F */ -void seibuspi_state::init_sys386f() +void sys386f_state::init_sys386f() { u16 *src = (u16 *)memregion("sprites")->base(); - u16 tmp[0x40 / 2], offset; + u16 tmp[0x40 / 2]; // sprite_reorder() only for (int i = 0; i < memregion("sprites")->bytes() / 0x40; i++) @@ -1937,21 +1949,21 @@ void seibuspi_state::init_sys386f() for (int j = 0; j < 0x40 / 2; j++) { - offset = (j >> 1) | (j << 4 & 0x10); + const u16 offset = (j >> 1) | (j << 4 & 0x10); *src++ = tmp[offset]; } } } -void seibuspi_state::sys386f(machine_config &config) +void sys386f_state::sys386f(machine_config &config) { /* basic machine hardware */ I386(config, m_maincpu, XTAL(50'000'000)/2); // Intel i386DX, 25MHz - m_maincpu->set_addrmap(AS_PROGRAM, &seibuspi_state::sys386f_map); - m_maincpu->set_vblank_int("screen", FUNC(seibuspi_state::spi_interrupt)); - m_maincpu->set_irq_acknowledge_callback(FUNC(seibuspi_state::spi_irq_callback)); + m_maincpu->set_addrmap(AS_PROGRAM, &sys386f_state::sys386f_map); + m_maincpu->set_vblank_int("screen", FUNC(sys386f_state::interrupt)); + m_maincpu->set_irq_acknowledge_callback(FUNC(sys386f_state::irq_callback)); - EEPROM_93C46_16BIT(config, "eeprom"); + EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -1959,14 +1971,12 @@ void seibuspi_state::sys386f(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(64*8, 32*8); screen.set_visarea(0*8, 40*8-1, 0*8, 30*8-1); - screen.set_screen_update(FUNC(seibuspi_state::screen_update_sys386f)); + screen.set_screen_update(FUNC(sys386f_state::screen_update_sys386f)); GFXDECODE(config, m_gfxdecode, m_palette, gfx_sys386f); PALETTE(config, m_palette, palette_device::BLACK, 8192); - MCFG_VIDEO_START_OVERRIDE(seibuspi_state, sys386f) - /* sound hardware */ // Single PCBs only output mono sound SPEAKER(config, "mono").front_center(); @@ -2014,43 +2024,55 @@ void seibuspi_state::init_ejanhs() init_sei252(); } -void seibuspi_state::init_rdft() +void seibuspi_z80_state::init_rdft() { - if (ENABLE_SPEEDUP_HACKS) m_maincpu->space(AS_PROGRAM).install_read_handler(0x00298d0, 0x00298d3, read32smo_delegate(*this, FUNC(seibuspi_state::rdft_speedup_r))); + if (ENABLE_SPEEDUP_HACKS) m_maincpu->space(AS_PROGRAM).install_read_handler(0x00298d0, 0x00298d3, read32smo_delegate(*this, FUNC(seibuspi_z80_state::rdft_speedup_r))); init_sei252(); } -void seibuspi_state::init_rdft2() +void seibuspi_tilemap_state::init_rdft22kc() { - if (ENABLE_SPEEDUP_HACKS) m_maincpu->space(AS_PROGRAM).install_read_handler(0x00282ac, 0x00282af, read32smo_delegate(*this, FUNC(seibuspi_state::rf2_speedup_r))); + if (ENABLE_SPEEDUP_HACKS) m_maincpu->space(AS_PROGRAM).install_read_handler(0x00282ac, 0x00282af, read32smo_delegate(*this, FUNC(seibuspi_tilemap_state::rf2_speedup_r))); rdft2_text_decrypt(memregion("chars")->base()); rdft2_bg_decrypt(memregion("tiles")->base(), memregion("tiles")->bytes()); seibuspi_rise10_sprite_decrypt(memregion("sprites")->base(), 0x600000); +} + +void seibuspi_z80_state::init_rdft2() +{ + init_rdft22kc(); init_spi_common(); } -void seibuspi_state::init_rfjet() +void seibuspi_tilemap_state::init_rfjet2kc() { - if (ENABLE_SPEEDUP_HACKS) m_maincpu->space(AS_PROGRAM).install_read_handler(0x002894c, 0x002894f, read32smo_delegate(*this, FUNC(seibuspi_state::rfjet_speedup_r))); + if (ENABLE_SPEEDUP_HACKS) m_maincpu->space(AS_PROGRAM).install_read_handler(0x002894c, 0x002894f, read32smo_delegate(*this, FUNC(seibuspi_tilemap_state::rfjet_speedup_r))); rfjet_text_decrypt(memregion("chars")->base()); rfjet_bg_decrypt(memregion("tiles")->base(), memregion("tiles")->bytes()); seibuspi_rise11_sprite_decrypt_rfjet(memregion("sprites")->base(), 0x800000); +} + +void seibuspi_z80_state::init_rfjet() +{ + init_rfjet2kc(); init_spi_common(); } u32 seibuspi_state::senkyu_speedup_r() { - if (m_maincpu->pc()==0x00305bb2) m_maincpu->spin_until_interrupt(); // idle + if (!machine().side_effects_disabled()) + if (m_maincpu->pc()==0x00305bb2) m_maincpu->spin_until_interrupt(); // idle return m_mainram[0x0018cb4/4]; } u32 seibuspi_state::senkyua_speedup_r() { - if (m_maincpu->pc()== 0x30582e) m_maincpu->spin_until_interrupt(); // idle + if (!machine().side_effects_disabled()) + if (m_maincpu->pc()== 0x30582e) m_maincpu->spin_until_interrupt(); // idle return m_mainram[0x0018c9c/4]; } @@ -2059,113 +2081,134 @@ u32 seibuspi_state::batlball_speedup_r() { // printf("m_maincpu->pc() %06x\n", m_maincpu->pc()); - /* batlbalu */ - if (m_maincpu->pc()==0x00305996) m_maincpu->spin_until_interrupt(); // idle + if (!machine().side_effects_disabled()) + { + /* batlbalu */ + if (m_maincpu->pc()==0x00305996) m_maincpu->spin_until_interrupt(); // idle - /* batlball */ - if (m_maincpu->pc()==0x003058aa) m_maincpu->spin_until_interrupt(); // idle + /* batlball */ + if (m_maincpu->pc()==0x003058aa) m_maincpu->spin_until_interrupt(); // idle + } return m_mainram[0x0018db4/4]; } u32 seibuspi_state::viprp1_speedup_r() { - /* viprp1 */ - if (m_maincpu->pc()==0x0202769) m_maincpu->spin_until_interrupt(); // idle + if (!machine().side_effects_disabled()) + { + /* viprp1 */ + if (m_maincpu->pc()==0x0202769) m_maincpu->spin_until_interrupt(); // idle - /* viprp1s */ - if (m_maincpu->pc()==0x02027e9) m_maincpu->spin_until_interrupt(); // idle + /* viprp1s */ + if (m_maincpu->pc()==0x02027e9) m_maincpu->spin_until_interrupt(); // idle - /* viprp1ot */ - if (m_maincpu->pc()==0x02026bd) m_maincpu->spin_until_interrupt(); // idle + /* viprp1ot */ + if (m_maincpu->pc()==0x02026bd) m_maincpu->spin_until_interrupt(); // idle -// osd_printf_debug("%08x\n",m_maincpu->pc()); + //osd_printf_debug("%08x\n",m_maincpu->pc()); + } return m_mainram[0x001e2e0/4]; } u32 seibuspi_state::viprp1o_speedup_r() { - /* viperp1o */ - if (m_maincpu->pc()==0x0201f99) m_maincpu->spin_until_interrupt(); // idle -// osd_printf_debug("%08x\n",m_maincpu->pc()); + if (!machine().side_effects_disabled()) + { + /* viperp1o */ + if (m_maincpu->pc()==0x0201f99) m_maincpu->spin_until_interrupt(); // idle + //osd_printf_debug("%08x\n",m_maincpu->pc()); + } return m_mainram[0x001d49c/4]; } // causes input problems? u32 seibuspi_state::ejanhs_speedup_r() { - if (m_maincpu->pc()==0x03032c7) m_maincpu->spin_until_interrupt(); // idle -// osd_printf_debug("%08x\n",m_maincpu->pc()); + if (!machine().side_effects_disabled()) + { + if (m_maincpu->pc()==0x03032c7) m_maincpu->spin_until_interrupt(); // idle + //osd_printf_debug("%08x\n",m_maincpu->pc()); + } return m_mainram[0x002d224/4]; } -u32 seibuspi_state::rdft_speedup_r() +u32 seibuspi_z80_state::rdft_speedup_r() { - /* rdft */ - if (m_maincpu->pc()==0x0203f06) m_maincpu->spin_until_interrupt(); // idle + if (!machine().side_effects_disabled()) + { + /* rdft */ + if (m_maincpu->pc()==0x0203f06) m_maincpu->spin_until_interrupt(); // idle - /* rdftj? */ - if (m_maincpu->pc()==0x0203f0a) m_maincpu->spin_until_interrupt(); // idle + /* rdftj? */ + if (m_maincpu->pc()==0x0203f0a) m_maincpu->spin_until_interrupt(); // idle - /* rdftau */ - if (m_maincpu->pc()==0x0203f16) m_maincpu->spin_until_interrupt(); // idle + /* rdftau */ + if (m_maincpu->pc()==0x0203f16) m_maincpu->spin_until_interrupt(); // idle - /* rdftja? */ - if (m_maincpu->pc()==0x0203f22) m_maincpu->spin_until_interrupt(); // idle + /* rdftja? */ + if (m_maincpu->pc()==0x0203f22) m_maincpu->spin_until_interrupt(); // idle - /* rdfta, rdftadi, rdftam, rdftit */ - if (m_maincpu->pc()==0x0203f46) m_maincpu->spin_until_interrupt(); // idle + /* rdfta, rdftadi, rdftam, rdftit */ + if (m_maincpu->pc()==0x0203f46) m_maincpu->spin_until_interrupt(); // idle - /* rdftu */ - if (m_maincpu->pc()==0x0203f3a) m_maincpu->spin_until_interrupt(); // idle + /* rdftu */ + if (m_maincpu->pc()==0x0203f3a) m_maincpu->spin_until_interrupt(); // idle - /* rdftauge */ - if (m_maincpu->pc()==0x0203f6e) m_maincpu->spin_until_interrupt(); // idle + /* rdftauge */ + if (m_maincpu->pc()==0x0203f6e) m_maincpu->spin_until_interrupt(); // idle -// osd_printf_debug("%08x\n",m_maincpu->pc()); + //osd_printf_debug("%08x\n",m_maincpu->pc()); + } return m_mainram[0x00298d0/4]; } -u32 seibuspi_state::rf2_speedup_r() +u32 seibuspi_tilemap_state::rf2_speedup_r() { - /* rdft22kc */ - if (m_maincpu->pc()==0x0203926) m_maincpu->spin_until_interrupt(); // idle + if (!machine().side_effects_disabled()) + { + /* rdft22kc */ + if (m_maincpu->pc()==0x0203926) m_maincpu->spin_until_interrupt(); // idle - /* rdft2, rdft2j */ - if (m_maincpu->pc()==0x0204372) m_maincpu->spin_until_interrupt(); // idle + /* rdft2, rdft2j */ + if (m_maincpu->pc()==0x0204372) m_maincpu->spin_until_interrupt(); // idle - /* rdft2us */ - if (m_maincpu->pc()==0x020420e) m_maincpu->spin_until_interrupt(); // idle + /* rdft2us */ + if (m_maincpu->pc()==0x020420e) m_maincpu->spin_until_interrupt(); // idle - /* rdft2a */ - if (m_maincpu->pc()==0x0204366) m_maincpu->spin_until_interrupt(); // idle + /* rdft2a */ + if (m_maincpu->pc()==0x0204366) m_maincpu->spin_until_interrupt(); // idle -// osd_printf_debug("%08x\n",m_maincpu->pc()); + //osd_printf_debug("%08x\n",m_maincpu->pc()); + } return m_mainram[0x0282ac/4]; } -u32 seibuspi_state::rfjet_speedup_r() +u32 seibuspi_tilemap_state::rfjet_speedup_r() { - /* rfjet, rfjetu, rfjeta */ - if (m_maincpu->pc()==0x0206082) m_maincpu->spin_until_interrupt(); // idle - - /* rfjetus */ - if (m_maincpu->pc()==0x0205b39) + if (!machine().side_effects_disabled()) { - u32 r; - m_maincpu->spin_until_interrupt(); // idle - // Hack to enter test mode - r = m_mainram[0x002894c/4] & (~0x400); - return r | (((ioport("SYSTEM")->read() ^ 0xff)<<8) & 0x400); - } + /* rfjet, rfjetu, rfjeta */ + if (m_maincpu->pc()==0x0206082) m_maincpu->spin_until_interrupt(); // idle - /* rfjetj */ - if (m_maincpu->pc()==0x0205f2e) m_maincpu->spin_until_interrupt(); // idle + /* rfjetus */ + if (m_maincpu->pc()==0x0205b39) + { + u32 r; + m_maincpu->spin_until_interrupt(); // idle + // Hack to enter test mode + r = m_mainram[0x002894c/4] & (~0x400); + return r | (((ioport("SYSTEM")->read() ^ 0xff)<<8) & 0x400); + } + + /* rfjetj */ + if (m_maincpu->pc()==0x0205f2e) m_maincpu->spin_until_interrupt(); // idle -// osd_printf_debug("%08x\n",m_maincpu->pc()); + //osd_printf_debug("%08x\n",m_maincpu->pc()); + } return m_mainram[0x002894c/4]; } @@ -4232,88 +4275,88 @@ ROM_END /*****************************************************************************/ /* SPI */ -GAME( 1995, senkyu, 0, spi, spi_3button, seibuspi_state, init_senkyu, ROT0, "Seibu Kaihatsu", "Senkyu (Japan, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, senkyua, senkyu, spi, spi_3button, seibuspi_state, init_senkyua, ROT0, "Seibu Kaihatsu", "Senkyu (Japan, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, batlball, senkyu, spi, spi_3button, seibuspi_state, init_batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, batlballo, senkyu, spi, spi_3button, seibuspi_state, init_batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, batlballu, senkyu, spi, spi_3button, seibuspi_state, init_batlball, ROT0, "Seibu Kaihatsu (Fabtek license)", "Battle Balls (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, batlballa, senkyu, spi, spi_3button, seibuspi_state, init_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, init_batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Hong Kong, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, batlballpt, senkyu, spi, spi_3button, seibuspi_state, init_senkyua, ROT0, "Seibu Kaihatsu", "Battle Balls (Portugal)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // 1 program ROM dated 171195 +GAME( 1995, senkyu, 0, spi, spi_3button, seibuspi_state, init_senkyu, ROT0, "Seibu Kaihatsu", "Senkyu (Japan, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, senkyua, senkyu, spi, spi_3button, seibuspi_state, init_senkyua, ROT0, "Seibu Kaihatsu", "Senkyu (Japan, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, batlball, senkyu, spi, spi_3button, seibuspi_state, init_batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, batlballo, senkyu, spi, spi_3button, seibuspi_state, init_batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, batlballu, senkyu, spi, spi_3button, seibuspi_state, init_batlball, ROT0, "Seibu Kaihatsu (Fabtek license)", "Battle Balls (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, batlballa, senkyu, spi, spi_3button, seibuspi_state, init_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, init_batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Hong Kong, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, batlballpt, senkyu, spi, spi_3button, seibuspi_state, init_senkyua, ROT0, "Seibu Kaihatsu", "Battle Balls (Portugal)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // 1 program ROM dated 171195 // these are unique -GAME( 1995, viprp1, 0, spi, spi_3button, seibuspi_state, init_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, init_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, init_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, init_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, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, viprp1, 0, spi, spi_3button, seibuspi_state, init_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, init_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, init_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, init_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, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // same code revision (010995 code base) - SXX2C ROM SUB cart // counterintuitively this seems to be the oldest code base of the game despite playing with the 'new version' rules, it has various typos not present in other sets eg. 'UPDATEING' -GAME( 1995, viprp1s, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Switzerland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, viprp1h, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Holland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, viprp1t, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu (Tuning license)", "Viper Phase 1 (New Version, Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, viprp1pt, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Portugal)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, viprp1s, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Switzerland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, viprp1h, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Holland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, viprp1t, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu (Tuning license)", "Viper Phase 1 (New Version, Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, viprp1pt, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Portugal)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // these are unique -GAME( 1995, viprp1ot, viprp1, spi, spi_3button, seibuspi_state, init_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, init_viprp1o, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, viprp1hk, viprp1, spi, spi_3button, seibuspi_state, init_viprp1, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Viper Phase 1 (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) /* "=HONG KONG=" seems part of title */ +GAME( 1995, viprp1ot, viprp1, spi, spi_3button, seibuspi_state, init_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, init_viprp1o, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1995, viprp1hk, viprp1, spi, spi_3button, seibuspi_state, init_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, init_ejanhs, ROT0, "Seibu Kaihatsu", "E Jong High School (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, ejanhs, 0, ejanhs, spi_ejanhs, seibuspi_state, init_ejanhs, ROT0, "Seibu Kaihatsu", "E Jong High School (Japan)", MACHINE_SUPPORTS_SAVE ) // these are unique -GAME( 1996, rdft, 0, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftj, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftja, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan, earliest)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftu, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftauge, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Evaluation Software For Show, Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdft, 0, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftj, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftja, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan, earliest)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftu, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US, earlier)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftauge, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters (Evaluation Software For Show, Germany)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // this is one revision - SXX2C ROM SUB4 cart -GAME( 1996, rdftua, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftjb, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftau, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Australia)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftam, rdft, spi, spi_3button, seibuspi_state, init_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, init_rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea, SUB4 cart)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftua, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftjb, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan, newer)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftau, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Australia)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftam, rdft, spi, spi_3button, seibuspi_state, init_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, init_rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea, SUB4 cart)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // same code revision - SXX2C ROM SUB2 cart -GAME( 1996, rdfta, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Austria)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftgb, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Great Britain)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftgr, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Greece)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftit, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, rdftadia, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea, SUB2 cart)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdfta, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Austria)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftgb, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Great Britain)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftgr, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Greece)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftit, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdftadia, rdft, spi, spi_3button, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea, SUB2 cart)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // this is one revision -GAME( 1997, rdft2, 0, rdft2, spi_2button, seibuspi_state, init_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, init_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, init_rdft2, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters 2 - Operation Hell Dive (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1997, rdft2s, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Switzerland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, rdft2, 0, rdft2, spi_2button, seibuspi_state, init_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, init_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, init_rdft2, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters 2 - Operation Hell Dive (Hong Kong)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, rdft2s, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Switzerland)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // this is another -GAME( 1997, rdft2ja, rdft2, rdft2, spi_2button, seibuspi_state, init_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, init_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, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, rdft2ja, rdft2, rdft2, spi_2button, seibuspi_state, init_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, init_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, init_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, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1997, rdft2jc, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1997, rdft2t, rdft2, rdft2, spi_2button, seibuspi_state, init_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, init_rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, rdft2jb, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, rdft2jc, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, rdft2t, rdft2, rdft2, spi_2button, seibuspi_state, init_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, init_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, init_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, init_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, init_rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1998, rfjeta, rfjet, rdft2, spi_2button, seibuspi_state, init_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, init_rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Taiwan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1998, rfjet, 0, rdft2, spi_2button, seibuspi_state, init_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, init_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, init_rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1998, rfjeta, rfjet, rdft2, spi_2button, seibuspi_state, init_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, init_rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Taiwan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) /* SXX2E */ -GAME( 1996, rdfts, rdft, sxx2e, sxx2e, seibuspi_state, init_rdft, ROT270, "Seibu Kaihatsu (Explorer System Corp. license)", "Raiden Fighters (Taiwan, single board)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, rdfts, rdft, sxx2e, sxx2e, seibuspi_z80_state, init_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, init_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' +GAME( 1997, rdft2us, rdft2, sxx2f, sxx2f, seibuspi_z80_state, init_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, init_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, init_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 +GAME( 1999, rfjets, rfjet, sxx2g, sxx2f, seibuspi_z80_state, init_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_z80_state, init_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, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive 2000 (China, SYS386I)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 2000, rfjet2kc, rfjet, sys386i, sys386i, seibuspi_state, init_rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet 2000 (China, SYS386I)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 2000, rdft22kc, rdft2, sys386i, sys386i, sys386i_state, init_rdft22kc, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive 2000 (China, SYS386I)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 2000, rfjet2kc, rfjet, sys386i, sys386i, sys386i_state, init_rfjet2kc, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet 2000 (China, SYS386I)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) /* SYS386F */ -GAME( 1999, ejsakura, 0, sys386f, ejsakura, seibuspi_state, init_sys386f, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (Japan, SYS386F V2.0)", MACHINE_SUPPORTS_SAVE ) -GAME( 1999, ejsakura12, ejsakura, sys386f, ejsakura, seibuspi_state, init_sys386f, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (Japan, SYS386F V1.2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, ejsakura, 0, sys386f, ejsakura, sys386f_state, init_sys386f, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (Japan, SYS386F V2.0)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, ejsakura12, ejsakura, sys386f, ejsakura, sys386f_state, init_sys386f, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (Japan, SYS386F V1.2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/seibu/seibuspi.h b/src/mame/seibu/seibuspi.h index f9e2236d572b9..be01407551e10 100644 --- a/src/mame/seibu/seibuspi.h +++ b/src/mame/seibu/seibuspi.h @@ -5,192 +5,288 @@ Seibu SPI hardware ******************************************************************************/ +#ifndef MAME_SEIBU_SEIBUSPI_H +#define MAME_SEIBU_SEIBUSPI_H + +#pragma once -#include "machine/eepromser.h" #include "machine/7200fifo.h" +#include "machine/eepromser.h" #include "machine/intelfsh.h" + #include "sound/okim6295.h" + #include "emupal.h" #include "tilemap.h" -class seibuspi_state : public driver_device +// base state class (sprite only) +class seibuspi_base_state : public driver_device { -public: - seibuspi_state(const machine_config &mconfig, device_type type, const char *tag) +protected: + seibuspi_base_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_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") - , m_soundflash1(*this, "soundflash1") - , m_soundflash2(*this, "soundflash2") - , m_soundflash1_region(*this, "soundflash1") { } - void sys386f(machine_config &config); - void sxx2f(machine_config &config); - void rdft2(machine_config &config); - void ejanhs(machine_config &config); - void sys386i(machine_config &config); - void sxx2g(machine_config &config); - void spi(machine_config &config); - void sxx2e(machine_config &config); - - void init_sei252(); - void init_batlball(); - void init_senkyu(); - void init_viprp1(); - void init_viprp1o(); - void init_rdft(); - void init_rfjet(); - void init_senkyua(); - void init_rdft2(); - void init_ejanhs(); - void init_sys386f(); - - template ioport_value ejanhs_encode(); - - IRQ_CALLBACK_MEMBER(spi_irq_callback); - INTERRUPT_GEN_MEMBER(spi_interrupt); - - u32 screen_update_sys386f(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - -protected: required_device m_maincpu; - optional_device m_audiocpu; required_shared_ptr m_mainram; - optional_memory_region m_z80_rom; optional_device m_eeprom; - optional_device_array m_soundfifo; - optional_device_array m_oki; required_device m_gfxdecode; required_device m_palette; optional_ioport_array<5> m_key; optional_ioport m_special; - optional_memory_bank m_z80_bank; + u32 m_video_dma_length = 0; + u32 m_video_dma_address = 0; + u16 m_layer_enable = 0; + std::unique_ptr m_palette_ram; + std::unique_ptr m_sprite_ram; + u32 m_palette_ram_size = 0; + u32 m_sprite_ram_size = 0; + u8 m_alpha_table[0x2000]{}; + u32 m_sprite_bpp = 0; + + virtual void video_start() override ATTR_COLD; - optional_device m_soundflash1, m_soundflash2; + void palette_dma_start_w(u32 data); + void sprite_dma_start_w(u16 data); + void video_dma_length_w(offs_t offset, u32 data, u32 mem_mask = ~0); + void video_dma_address_w(offs_t offset, u32 data, u32 mem_mask = ~0); + u8 spi_status_r(); + void eeprom_w(u8 data); - optional_region_ptr m_soundflash1_region; + void drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, bitmap_ind8 &primap, u8 primask); + void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap, int priority); - int m_z80_prg_transfer_pos = 0; - int m_z80_lastbank = 0; - u8 m_sb_coin_latch = 0; - u8 m_ejsakura_input_port = 0; + u32 screen_update_sys386f(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + IRQ_CALLBACK_MEMBER(irq_callback); + INTERRUPT_GEN_MEMBER(interrupt); + + void rise_map(address_map &map) ATTR_COLD; +}; + +// with mahjong input, YMZ280B sound +class sys386f_state : public seibuspi_base_state +{ +public: + sys386f_state(const machine_config &mconfig, device_type type, const char *tag) + : seibuspi_base_state(mconfig, type, tag) + { } + + void sys386f(machine_config &config) ATTR_COLD; + + void init_sys386f() ATTR_COLD; + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; + +private: + u8 m_input_select = 0; + + u32 input_mux_r(); + void input_select_w(u32 data); + + void sys386f_map(address_map &map) ATTR_COLD; +}; + +// with tilemap +class seibuspi_tilemap_state : public seibuspi_base_state +{ +public: + seibuspi_tilemap_state(const machine_config &mconfig, device_type type, const char *tag) + : seibuspi_base_state(mconfig, type, tag) + { } + + void init_rdft22kc() ATTR_COLD; + void init_rfjet2kc() ATTR_COLD; + +protected: tilemap_t *m_text_layer = nullptr; tilemap_t *m_back_layer = nullptr; tilemap_t *m_midl_layer = nullptr; tilemap_t *m_fore_layer = nullptr; - u32 m_video_dma_length = 0; - u32 m_video_dma_address = 0; - u16 m_layer_enable = 0; u16 m_layer_bank = 0; u8 m_rf2_layer_bank = 0; u16 m_scrollram[6]{}; bool m_rowscroll_enable = false; - int m_midl_layer_offset = 0; - int m_fore_layer_offset = 0; - int m_text_layer_offset = 0; - int m_fore_layer_d13 = 0; - int m_back_layer_d14 = 0; - int m_midl_layer_d14 = 0; - int m_fore_layer_d14 = 0; + u32 m_midl_layer_offset = 0; + u32 m_fore_layer_offset = 0; + u32 m_text_layer_offset = 0; + u32 m_fore_layer_d13 = 0; + u32 m_back_layer_d14 = 0; + u32 m_midl_layer_d14 = 0; + u32 m_fore_layer_d14 = 0; std::unique_ptr m_tilemap_ram; - std::unique_ptr m_palette_ram; - std::unique_ptr m_sprite_ram; u32 m_tilemap_ram_size = 0; - u32 m_palette_ram_size = 0; - u32 m_sprite_ram_size = 0; u32 m_bg_fore_layer_position = 0; - u8 m_alpha_table[0x2000]{}; - int m_sprite_bpp = 0; + + virtual void video_start() override ATTR_COLD; void tile_decrypt_key_w(u16 data); - void spi_layer_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0); - void spi_layer_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); + void layer_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0); + void layer_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); void rf2_layer_bank_w(u8 data); void scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); void tilemap_dma_start_w(u32 data); - void palette_dma_start_w(u32 data); - void sprite_dma_start_w(u16 data); - void video_dma_length_w(offs_t offset, u32 data, u32 mem_mask = ~0); - void video_dma_address_w(offs_t offset, u32 data, u32 mem_mask = ~0); - u8 spi_status_r(); - u8 spi_ds2404_unknown_r(); - u8 sb_coin_r(); - void spi_coin_w(u8 data); - u8 sound_fifo_status_r(); - void z80_prg_transfer_w(u8 data); - void z80_enable_w(u8 data); - u8 z80_soundfifo_status_r(); - void z80_bank_w(u8 data); - u32 ejsakura_keyboard_r(); - void ejsakura_input_select_w(u32 data); - void eeprom_w(u8 data); void spi_layerbanks_eeprom_w(u8 data); - void oki_bank_w(u8 data); - u32 senkyu_speedup_r(); - u32 senkyua_speedup_r(); - u32 batlball_speedup_r(); - u32 rdft_speedup_r(); - u32 viprp1_speedup_r(); - u32 viprp1o_speedup_r(); - u32 ejanhs_speedup_r(); u32 rf2_speedup_r(); u32 rfjet_speedup_r(); - void ymf_irqhandler(int state); - void set_layer_offsets(); - void drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, bitmap_ind8 &primap, u8 primask); - void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap, int priority); void combine_tilemap(bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tile, int sx, int sy, int opaque, s16 *rowscroll); - virtual void machine_start() override ATTR_COLD; - virtual void video_start() override ATTR_COLD; - DECLARE_MACHINE_RESET(spi); - DECLARE_MACHINE_RESET(sxx2e); - DECLARE_VIDEO_START(ejanhs); - DECLARE_VIDEO_START(sys386f); TILE_GET_INFO_MEMBER(get_text_tile_info); TILE_GET_INFO_MEMBER(get_back_tile_info); TILE_GET_INFO_MEMBER(get_midl_tile_info); TILE_GET_INFO_MEMBER(get_fore_tile_info); u32 screen_update_spi(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - void register_video_state(); - void init_spi_common(); - - void text_decrypt(u8 *rom); - void bg_decrypt(u8 *rom, int size); + void rdft2_text_decrypt(u8 *rom) ATTR_COLD; + void rdft2_bg_decrypt(u8 *rom, int size) ATTR_COLD; - void rdft2_text_decrypt(u8 *rom); - void rdft2_bg_decrypt(u8 *rom, int size); + void rfjet_text_decrypt(u8 *rom) ATTR_COLD; + void rfjet_bg_decrypt(u8 *rom, int size) ATTR_COLD; - void rfjet_text_decrypt(u8 *rom); - void rfjet_bg_decrypt(u8 *rom, int size); + void base_video(machine_config &config) ATTR_COLD; void base_map(address_map &map) ATTR_COLD; - void rdft2_map(address_map &map) ATTR_COLD; - void rise_map(address_map &map) ATTR_COLD; +}; + +// single board with OKI MSM6295 sound subsystem +class sys386i_state : public seibuspi_tilemap_state +{ +public: + sys386i_state(const machine_config &mconfig, device_type type, const char *tag) + : seibuspi_tilemap_state(mconfig, type, tag) + , m_oki(*this, "oki%u", 1) + { } + + void sys386i(machine_config &config) ATTR_COLD; + +private: + required_device_array m_oki; + + void oki_bank_w(u8 data); + + void sys386i_map(address_map &map) ATTR_COLD; +}; + +// with Z80 + YMF271 based sound subsystem +class seibuspi_z80_state : public seibuspi_tilemap_state +{ +public: + seibuspi_z80_state(const machine_config &mconfig, device_type type, const char *tag) + : seibuspi_tilemap_state(mconfig, type, tag) + , m_audiocpu(*this, "audiocpu") + , m_soundfifo(*this, "soundfifo%u", 1) + , m_z80_rom(*this, "audiocpu") + , m_z80_bank(*this, "z80_bank") + { } + + void sxx2e(machine_config &config) ATTR_COLD; + void sxx2f(machine_config &config) ATTR_COLD; + void sxx2g(machine_config &config) ATTR_COLD; + + void init_rdft() ATTR_COLD; + void init_rdft2() ATTR_COLD; + void init_rfjet() ATTR_COLD; + void init_sei252() ATTR_COLD; + +protected: + required_device m_audiocpu; + optional_device_array m_soundfifo; + + required_memory_region m_z80_rom; + required_memory_bank m_z80_bank; + + s32 m_z80_lastbank = 0; + u8 m_sb_coin_latch = 0; + + u8 spi_ds2404_unknown_r(); + u8 sb_coin_r(); + void spi_coin_w(u8 data); + u8 sound_fifo_status_r(); + u8 z80_soundfifo_status_r(); + void z80_bank_w(u8 data); + + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + + u32 rdft_speedup_r(); + + void ymf_irqhandler(int state); + + void init_spi_common() ATTR_COLD; + + void text_decrypt(u8 *rom) ATTR_COLD; + void bg_decrypt(u8 *rom, int size) ATTR_COLD; + void sei252_map(address_map &map) ATTR_COLD; - void spi_map(address_map &map) ATTR_COLD; - void spi_soundmap(address_map &map) ATTR_COLD; - void spi_ymf271_map(address_map &map) ATTR_COLD; void sxx2e_map(address_map &map) ATTR_COLD; void sxx2e_soundmap(address_map &map) ATTR_COLD; void sxx2f_map(address_map &map) ATTR_COLD; - void sys386f_map(address_map &map) ATTR_COLD; - void sys386i_map(address_map &map) ATTR_COLD; }; + +// with interchangeable cartridge, flash ROM for sound samples +class seibuspi_state : public seibuspi_z80_state +{ +public: + seibuspi_state(const machine_config &mconfig, device_type type, const char *tag) + : seibuspi_z80_state(mconfig, type, tag) + , m_soundflash(*this, "soundflash%u", 1U) + , m_soundflash1_region(*this, "soundflash1") + { } + + void ejanhs(machine_config &config) ATTR_COLD; + void rdft2(machine_config &config) ATTR_COLD; + void spi(machine_config &config) ATTR_COLD; + + void init_batlball() ATTR_COLD; + void init_ejanhs() ATTR_COLD; + void init_senkyu() ATTR_COLD; + void init_senkyua() ATTR_COLD; + void init_viprp1() ATTR_COLD; + void init_viprp1o() ATTR_COLD; + + template ioport_value ejanhs_encode(); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + +private: + required_device_array m_soundflash; + + optional_region_ptr m_soundflash1_region; + + u32 m_z80_prg_transfer_pos = 0; + + void z80_prg_transfer_w(u8 data); + void z80_enable_w(u8 data); + + u32 senkyu_speedup_r(); + u32 senkyua_speedup_r(); + u32 batlball_speedup_r(); + u32 viprp1_speedup_r(); + u32 viprp1o_speedup_r(); + u32 ejanhs_speedup_r(); + + DECLARE_VIDEO_START(ejanhs); + + void rdft2_map(address_map &map) ATTR_COLD; + void spi_map(address_map &map) ATTR_COLD; + void spi_soundmap(address_map &map) ATTR_COLD; + void spi_ymf271_map(address_map &map) ATTR_COLD; +}; + +#endif // MAME_SEIBU_SEIBUSPI_H diff --git a/src/mame/seibu/seibuspi_v.cpp b/src/mame/seibu/seibuspi_v.cpp index 35e32c74f9b32..7476783366089 100644 --- a/src/mame/seibu/seibuspi_v.cpp +++ b/src/mame/seibu/seibuspi_v.cpp @@ -87,12 +87,12 @@ cpu #0 (PC=0033B2EB): unmapped program memory dword write to 00000414 = 00004535 cpu #0 (PC=0033B2EB): unmapped program memory dword write to 00000414 = 06DC0000 & FFFF0000 ******************************************************************************************/ -void seibuspi_state::text_decrypt(u8 *rom) +void seibuspi_z80_state::text_decrypt(u8 *rom) { decrypt_text(rom, 0x5a3845, 0x77cf5b, 0x1378df); } -void seibuspi_state::bg_decrypt(u8 *rom, int size) +void seibuspi_z80_state::bg_decrypt(u8 *rom, int size) { decrypt_bg(rom, size, 0x5a3845, 0x77cf5b, 0x1378df); } @@ -107,12 +107,12 @@ cpu #0 (PC=002A097D): unmapped program memory dword write to 00000414 = 0000466B cpu #0 (PC=002A097D): unmapped program memory dword write to 00000414 = 3EDC0000 & FFFF0000 ******************************************************************************************/ -void seibuspi_state::rdft2_text_decrypt(u8 *rom) +void seibuspi_tilemap_state::rdft2_text_decrypt(u8 *rom) { decrypt_text(rom, 0x823146, 0x4de2f8, 0x157adc); } -void seibuspi_state::rdft2_bg_decrypt(u8 *rom, int size) +void seibuspi_tilemap_state::rdft2_bg_decrypt(u8 *rom, int size) { decrypt_bg(rom, size, 0x823146, 0x4de2f8, 0x157adc); } @@ -127,17 +127,17 @@ cpu #0 (PC=002C40F9): unmapped program memory dword write to 00000414 = 0000547C cpu #0 (PC=002C40F9): unmapped program memory dword write to 00000414 = 3EDC0000 & FFFF0000 ******************************************************************************************/ -void seibuspi_state::rfjet_text_decrypt(u8 *rom) +void seibuspi_tilemap_state::rfjet_text_decrypt(u8 *rom) { decrypt_text(rom, 0xaea754, 0xfe8530, 0xccb666); } -void seibuspi_state::rfjet_bg_decrypt(u8 *rom, int size) +void seibuspi_tilemap_state::rfjet_bg_decrypt(u8 *rom, int size) { decrypt_bg(rom, size, 0xaea754, 0xfe8530, 0xccb666); } -void seibuspi_state::tile_decrypt_key_w(u16 data) +void seibuspi_tilemap_state::tile_decrypt_key_w(u16 data) { if (data != 0 && data != 1) logerror("Decryption key: %04X\n", data); @@ -146,7 +146,7 @@ void seibuspi_state::tile_decrypt_key_w(u16 data) /*****************************************************************************/ -void seibuspi_state::set_layer_offsets() +void seibuspi_tilemap_state::set_layer_offsets() { if (m_rowscroll_enable) { @@ -167,7 +167,7 @@ void seibuspi_state::set_layer_offsets() m_fore_layer_d14 = m_rf2_layer_bank << 12 & 0x4000; } -void seibuspi_state::spi_layer_bank_w(offs_t offset, u16 data, u16 mem_mask) +void seibuspi_tilemap_state::layer_bank_w(offs_t offset, u16 data, u16 mem_mask) { //logerror("Writing %04X to layer register\n", data); @@ -178,7 +178,7 @@ void seibuspi_state::spi_layer_bank_w(offs_t offset, u16 data, u16 mem_mask) const u16 prev = m_layer_bank; COMBINE_DATA(&m_layer_bank); - m_rowscroll_enable = m_layer_bank >> 15 & 1; + m_rowscroll_enable = BIT(m_layer_bank, 15); set_layer_offsets(); if ((prev ^ m_layer_bank) & 0x0800) @@ -186,7 +186,7 @@ void seibuspi_state::spi_layer_bank_w(offs_t offset, u16 data, u16 mem_mask) } -void seibuspi_state::rf2_layer_bank_w(u8 data) +void seibuspi_tilemap_state::rf2_layer_bank_w(u8 data) { // 00000fmb // f: fore layer d14 @@ -206,7 +206,7 @@ void seibuspi_state::rf2_layer_bank_w(u8 data) m_fore_layer->mark_all_dirty(); } -void seibuspi_state::spi_layer_enable_w(offs_t offset, u16 data, u16 mem_mask) +void seibuspi_tilemap_state::layer_enable_w(offs_t offset, u16 data, u16 mem_mask) { // 00000000 000stfmb (0=on, 1=off) // s: sprite layer @@ -217,17 +217,17 @@ void seibuspi_state::spi_layer_enable_w(offs_t offset, u16 data, u16 mem_mask) COMBINE_DATA(&m_layer_enable); } -void seibuspi_state::scroll_w(offs_t offset, u16 data, u16 mem_mask) +void seibuspi_tilemap_state::scroll_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_scrollram[offset]); } -void seibuspi_state::video_dma_length_w(offs_t offset, u32 data, u32 mem_mask) +void seibuspi_base_state::video_dma_length_w(offs_t offset, u32 data, u32 mem_mask) { COMBINE_DATA(&m_video_dma_length); } -void seibuspi_state::video_dma_address_w(offs_t offset, u32 data, u32 mem_mask) +void seibuspi_base_state::video_dma_address_w(offs_t offset, u32 data, u32 mem_mask) { COMBINE_DATA(&m_video_dma_address); } @@ -235,14 +235,11 @@ void seibuspi_state::video_dma_address_w(offs_t offset, u32 data, u32 mem_mask) /*****************************************************************************/ -void seibuspi_state::tilemap_dma_start_w(u32 data) +void seibuspi_tilemap_state::tilemap_dma_start_w(u32 data) { - if (!m_tilemap_ram) - return; - // safety check - int dma_length_user = m_rowscroll_enable ? 0x4000 : 0x2800; - int dma_length_real = (m_video_dma_length + 1) * 2; // ideally we should be using this, let's check if we have to: + const int dma_length_user = m_rowscroll_enable ? 0x4000 : 0x2800; + const int dma_length_real = (m_video_dma_length + 1) * 2; // ideally we should be using this, let's check if we have to: if (m_video_dma_length != 0 && dma_length_user != dma_length_real) popmessage("Tile LEN %X %X, contact MAMEdev", dma_length_user, dma_length_real); // shouldn't happen else if (!DWORD_ALIGNED(m_video_dma_address) || (m_video_dma_length & 3) != 3 || (m_video_dma_address + dma_length_user) > 0x40000) @@ -327,7 +324,7 @@ void seibuspi_state::tilemap_dma_start_w(u32 data) } -void seibuspi_state::palette_dma_start_w(u32 data) +void seibuspi_base_state::palette_dma_start_w(u32 data) { const int dma_length = (m_video_dma_length + 1) * 2; @@ -350,7 +347,7 @@ void seibuspi_state::palette_dma_start_w(u32 data) } -void seibuspi_state::sprite_dma_start_w(u16 data) +void seibuspi_base_state::sprite_dma_start_w(u16 data) { // safety check if (!DWORD_ALIGNED(m_video_dma_address) || (m_video_dma_address + m_sprite_ram_size) > 0x40000) @@ -364,7 +361,7 @@ void seibuspi_state::sprite_dma_start_w(u16 data) /*****************************************************************************/ -void seibuspi_state::drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, bitmap_ind8 &primap, u8 primask) +void seibuspi_base_state::drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, bitmap_ind8 &primap, u8 primask) { const int width = gfx->width(); const int height = gfx->height(); @@ -436,8 +433,8 @@ void seibuspi_state::drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &clipre } color = gfx->colorbase() + (color % gfx->colors()) * gfx->granularity(); - const pen_t *pens = m_palette->pens(); - const u8 *src = gfx->get_data(code % gfx->elements()); + const pen_t *const pens = m_palette->pens(); + const u8 *const src = gfx->get_data(code % gfx->elements()); const u8 trans_pen = (1 << m_sprite_bpp) - 1; // draw @@ -465,7 +462,7 @@ void seibuspi_state::drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &clipre } } -void seibuspi_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap, int priority) +void seibuspi_base_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap, int priority) { gfx_element *gfx = m_gfxdecode->gfx(0); const bool has_tile_high = (gfx->elements() > 0x10000); @@ -550,7 +547,7 @@ void seibuspi_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec } } -void seibuspi_state::combine_tilemap(bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tile, int sx, int sy, int opaque, s16 *rowscroll) +void seibuspi_tilemap_state::combine_tilemap(bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tile, int sx, int sy, int opaque, s16 *rowscroll) { bitmap_ind16 &pen_bitmap = tile->pixmap(); bitmap_ind8 &flags_bitmap = tile->flagsmap(); @@ -563,9 +560,9 @@ void seibuspi_state::combine_tilemap(bitmap_rgb32 &bitmap, const rectangle &clip if (rowscroll) rx += rowscroll[(y + 19) & yscroll_mask]; // adder value probably not hardcoded but came from CRTC - u32 *dest = &bitmap.pix(y); - const u16 *src = &pen_bitmap.pix((y + sy) & yscroll_mask); - const u8 *flags = &flags_bitmap.pix((y + sy) & yscroll_mask); + u32 *dest = &bitmap.pix(y, cliprect.min_x); + const u16 *const src = &pen_bitmap.pix((y + sy) & yscroll_mask); + const u8 *const flags = &flags_bitmap.pix((y + sy) & yscroll_mask); for (int x = cliprect.min_x + rx; x <= cliprect.max_x + rx; x++) { if (opaque || (flags[x & xscroll_mask] & (TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1))) @@ -582,7 +579,7 @@ void seibuspi_state::combine_tilemap(bitmap_rgb32 &bitmap, const rectangle &clip } -u32 seibuspi_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 seibuspi_tilemap_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { s16 *back_rowscroll, *midl_rowscroll, *fore_rowscroll; if (m_rowscroll_enable) @@ -635,7 +632,7 @@ u32 seibuspi_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bitma return 0; } -u32 seibuspi_state::screen_update_sys386f(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 seibuspi_base_state::screen_update_sys386f(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { screen.priority().fill(0, cliprect); bitmap.fill(0, cliprect); @@ -651,9 +648,9 @@ u32 seibuspi_state::screen_update_sys386f(screen_device &screen, bitmap_rgb32 &b /*****************************************************************************/ -TILE_GET_INFO_MEMBER(seibuspi_state::get_text_tile_info) +TILE_GET_INFO_MEMBER(seibuspi_tilemap_state::get_text_tile_info) { - int offs = tile_index / 2; + const int offs = tile_index / 2; u32 tile = (m_tilemap_ram[offs + m_text_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff; const u32 color = (tile >> 12) & 0xf; @@ -662,9 +659,9 @@ TILE_GET_INFO_MEMBER(seibuspi_state::get_text_tile_info) tileinfo.set(2, tile, color, 0); } -TILE_GET_INFO_MEMBER(seibuspi_state::get_back_tile_info) +TILE_GET_INFO_MEMBER(seibuspi_tilemap_state::get_back_tile_info) { - int offs = tile_index / 2; + const int offs = tile_index / 2; u32 tile = (m_tilemap_ram[offs] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff; const u32 color = (tile >> 13) & 0x7; @@ -674,9 +671,9 @@ TILE_GET_INFO_MEMBER(seibuspi_state::get_back_tile_info) tileinfo.set(1, tile, color, 0); } -TILE_GET_INFO_MEMBER(seibuspi_state::get_midl_tile_info) +TILE_GET_INFO_MEMBER(seibuspi_tilemap_state::get_midl_tile_info) { - int offs = tile_index / 2; + const int offs = tile_index / 2; u32 tile = (m_tilemap_ram[offs + m_midl_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff; const u32 color = (tile >> 13) & 0x7; @@ -687,9 +684,9 @@ TILE_GET_INFO_MEMBER(seibuspi_state::get_midl_tile_info) tileinfo.set(1, tile, color + 16, 0); } -TILE_GET_INFO_MEMBER(seibuspi_state::get_fore_tile_info) +TILE_GET_INFO_MEMBER(seibuspi_tilemap_state::get_fore_tile_info) { - int offs = tile_index / 2; + const int offs = tile_index / 2; u32 tile = (m_tilemap_ram[offs + m_fore_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff; const u32 color = (tile >> 13) & 0x7; @@ -702,8 +699,22 @@ TILE_GET_INFO_MEMBER(seibuspi_state::get_fore_tile_info) } -void seibuspi_state::video_start() +void seibuspi_base_state::video_start() +{ + m_gfxdecode->gfx(0)->set_granularity(1 << m_sprite_bpp); + + save_item(NAME(m_video_dma_length)); + save_item(NAME(m_video_dma_address)); + save_item(NAME(m_layer_enable)); + + save_pointer(NAME(m_palette_ram), m_palette_ram_size/4); + save_pointer(NAME(m_sprite_ram), m_sprite_ram_size/4); +} + +void seibuspi_tilemap_state::video_start() { + seibuspi_base_state::video_start(); + m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; @@ -718,7 +729,7 @@ void seibuspi_state::video_start() m_scrollram[5] = 0; set_layer_offsets(); - u32 region_length = memregion("tiles")->bytes(); + const u32 region_length = memregion("tiles")->bytes(); if (region_length <= 0x300000) m_bg_fore_layer_position = 0x2000; @@ -738,10 +749,10 @@ void seibuspi_state::video_start() m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); - m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32); - m_back_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_state::get_back_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); - m_midl_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_state::get_midl_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); - m_fore_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_state::get_fore_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_tilemap_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32); + m_back_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_tilemap_state::get_back_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); + m_midl_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_tilemap_state::get_midl_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); + m_fore_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_tilemap_state::get_fore_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); m_text_layer->set_transparent_pen(31); m_back_layer->set_transparent_pen(63); @@ -772,62 +783,45 @@ void seibuspi_state::video_start() memset(m_alpha_table + 0x1600 + 0x170, 1, 0x10); memset(m_alpha_table + 0x1600 + 0x1f0, 1, 0x10); - register_video_state(); + save_item(NAME(m_layer_bank)); + save_item(NAME(m_rf2_layer_bank)); + save_item(NAME(m_rowscroll_enable)); + save_item(NAME(m_scrollram)); + + save_item(NAME(m_midl_layer_offset)); + save_item(NAME(m_fore_layer_offset)); + save_item(NAME(m_text_layer_offset)); + save_item(NAME(m_fore_layer_d13)); + save_item(NAME(m_back_layer_d14)); + save_item(NAME(m_midl_layer_d14)); + save_item(NAME(m_fore_layer_d14)); + + save_pointer(NAME(m_tilemap_ram), m_tilemap_ram_size/4); } VIDEO_START_MEMBER(seibuspi_state,ejanhs) { - video_start(); + seibuspi_state::video_start(); memset(m_alpha_table, 0, 0x2000); // no alpha blending } -VIDEO_START_MEMBER(seibuspi_state,sys386f) +void sys386f_state::video_start() { + seibuspi_base_state::video_start(); + m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; - m_layer_bank = 0; - m_rf2_layer_bank = 0; - m_rowscroll_enable = false; - set_layer_offsets(); - m_tilemap_ram_size = 0; m_palette_ram_size = 0x4000; m_sprite_ram_size = 0x2000; m_sprite_bpp = 8; - m_tilemap_ram = nullptr; m_palette_ram = make_unique_clear(m_palette_ram_size/4); m_sprite_ram = make_unique_clear(m_sprite_ram_size/4); m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); memset(m_alpha_table, 0, 0x2000); // no alpha blending - - register_video_state(); -} - -void seibuspi_state::register_video_state() -{ - m_gfxdecode->gfx(0)->set_granularity(1 << m_sprite_bpp); - save_item(NAME(m_video_dma_length)); - save_item(NAME(m_video_dma_address)); - save_item(NAME(m_layer_enable)); - save_item(NAME(m_layer_bank)); - save_item(NAME(m_rf2_layer_bank)); - save_item(NAME(m_rowscroll_enable)); - save_item(NAME(m_scrollram)); - - save_item(NAME(m_midl_layer_offset)); - save_item(NAME(m_fore_layer_offset)); - save_item(NAME(m_text_layer_offset)); - save_item(NAME(m_fore_layer_d13)); - save_item(NAME(m_back_layer_d14)); - save_item(NAME(m_midl_layer_d14)); - save_item(NAME(m_fore_layer_d14)); - - if (m_tilemap_ram != nullptr) save_pointer(NAME(m_tilemap_ram), m_tilemap_ram_size/4); - save_pointer(NAME(m_palette_ram), m_palette_ram_size/4); - save_pointer(NAME(m_sprite_ram), m_sprite_ram_size/4); }