diff options
Diffstat (limited to 'src/mame/drivers/snesb.cpp')
-rw-r--r-- | src/mame/drivers/snesb.cpp | 1503 |
1 files changed, 0 insertions, 1503 deletions
diff --git a/src/mame/drivers/snesb.cpp b/src/mame/drivers/snesb.cpp deleted file mode 100644 index 67b7867be51..00000000000 --- a/src/mame/drivers/snesb.cpp +++ /dev/null @@ -1,1503 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Tomasz Slanina, Peter Ferrie,Stephane Humbert -/*************************************************************************** - - Arcade games (hacks of console games) running on SNES hardware. - - Driver (based on nss.cpp) by Tomasz Slanina analog[at]op.pl - - Supported games: - - Killer Instinct - - Final Fight 2 - - Iron (bootleg of Iron Commando) - - Ghost Chaser Densei - - Sonic Blast Man 2 - - Gundam Wing: Endless Duel - - Legend - - Rushing Beat - - Venom & Spider-Man - Separation Anxiety - - Not dumped: - - Final Fight 3 - -TODO: - - - all games : (re)add PORT_DIPLOCATION - - kinstb : fix gfx glitches, missing texts - - ffight2b : remove hack for starting credits (RAM - mainly 0x7eadce where credits are stored - is filled with 0x55, - so you are awarded 55 credits on a hard reset) - - sblast2b : dipswitches - - sblast2b : pressing start during gameplay changes the character used. Intentional? - - denseib,2: fix gfx glitches, missing texts - - legendsb : dipswitches - - rushbets : everything - - venom : gfx glitches on second level - -*************************************************************************** - - Killer Instinct PCB Info: - -------------------------- - - PQFP 100(?)pin chip marked "SP-BE0" - PQFP 100(?)pin chip marked "SP-BH0" - PQFP 100(?)pin chip marked "SP-AF0" - Lattice pLSI 1024-60LJ B604S03 - 6116 SRAM x2 - AS7C256 SRAM x8 - jumper pack (12) - dsw8 x2 - Xtal 24.576 MHz - Xtal 21.47727 MHz - volume pot - 27c801 x4 - two empty eprom sockets - - It's SNES version of KI with few mods (removed copyright messages, - extra code for coin input, etc). - - 256 bytes of RAM (mapped to reserved area) are shared with some - device (probably Lattice PLD) used for handle coin inputs and dips - - Data lines of eproms are bitswapped. - -*************************************************************************** - - Final Fight 2 PCB layout: - ------------------------ - - |----------------------------------------------------------------------------| - | |-----------| | - | | | 21.47727 MHz 24.576 MHz | - | | Lattice | | - | | pLSI | |--------| |--------| HM65256 | - | | 1024-60LJ | |--------| | | | | | - | | | | | | 86A621 | | 86A537 | | - | |-----------| | 86A623 | | JDCF | | JDCF | | - | | JDCF | | | | | D42832C | - | ff2_1.u8 | | |--------| |--------| | - | |--------| | - | |--------| |--------| | - | ff2_2.u7 |--------| | | | | KM62256 | - | | | | 86A617 | | 86A618 | | - | | 86A540 | | JDCF | | JDKF | | - | ff2_3.u6 | JDKF | | | | | | - | | | |--------| |--------| KM62256 | - | |--------| | - | GL324 D41464C D41464C | - | | - | D41464C D41464C DSW2 DSW1 | - | | - | 7414 74245 74245 74245 | - | | - | uPC1242H VR1 GD4021B GD4021B GD4021B GD4021B | - | | - | | - | |---| JAMMA |---| | - |---------------| |------------------------------------| |---------------| - -*************************************************************************** - -Iron PCB (same as Final Fight 2?) - ______________________________________________________________________________________________ -| | -| _____________ XTAL1 XTAL2 | -| | | 21.47727Mhz 24.576Mhz _______ | -| | | |86A619 | | -| | LATTICE | |_______| | -| |pLSL1024_60LJ| | -| | B611S01 | _______________ | -| | | _________ _________ | | | -| | | ______ | 86A621 | | 86A537 | |HM65256BLP_12 | | -| | | | | | JDCF | | JDCF | | 01002990 | | -| |_____________| |86A623| | | | | |_______________| | -| | JDCF | |_________| |_________| _______________ | -| ___________________ | | | | | -| |4.C11 | | | |HM65256BLP_12 | | -| | | |______| | 01002990 | | -| |AM27C020 | |_______________| | -| |___________________| ______ ______ | -| ___________________ | | | | _______________ | -| |5.C10 | ______ |86A617| |86A618| | | | -| | | | | | JDCF | | JDCF | | KM62256BLP_10 | | -| |27C4001 | |86A540| | | | | | 210Y KOREA | | -| |___________________| | JDKF | | | | | |_______________| | -| ___________________ | | |______| |______| _______________ | -| |6.C09 | | | | | | -| | | |______| | KM62256BLP_10 | | -| |27C4001 | | 210Y KOREA | | -| |___________________| ________ ________ |_______________| | -| |D41464C | |D41464C | | -| _______ |________| |________| | -| | GL324 | ________ ________ | -| |_______| ________ ________ | DIP1 | | DIP2 | | -| |D41464C | |D41464C | |1 8| |1 8| | -| |________| |________| |________| |________| | -| | -| ______ _________ _________ _________ | -| |74LS14| |74LS245N | |74LS245N | |74LS245B | | -| |______| |_________| |_________| |_________| | -| | -| ______ ______ ______ ______ | -| |GD4021| |CD4021| |CD4021| |CD4021| | -| |______| |______| |______| |______| | -| | -| _____ 1 28 _____ | -| | || | | | | | | | | | | | | | | | | | | | | | | | | | -| | || | | | | | | | | | | | | | | | | | | | | | | | | | -|_________________| |______________________________________________| |_________________| - -***************************************************************************/ - -#include "emu.h" -#include "includes/snes.h" -#include "speaker.h" - -class snesb_state : public snes_state -{ -public: - snesb_state(const machine_config &mconfig, device_type type, const char *tag) - : snes_state(mconfig, type, tag) - { } - - void ffight2b(machine_config &config); - void kinstb(machine_config &config); - - void init_iron(); - void init_denseib(); - void init_denseib2(); - void init_kinstb(); - void init_sblast2b(); - void init_ffight2b(); - void init_endless(); - void init_legendsb(); - void init_rushbets(); - void init_venom(); - -private: - std::unique_ptr<int8_t[]> m_shared_ram; - uint8_t m_cnt; - std::unique_ptr<int8_t[]> m_shared_ram2; - DECLARE_READ8_MEMBER(sharedram_r); - DECLARE_WRITE8_MEMBER(sharedram_w); - DECLARE_READ8_MEMBER(sb2b_75bd37_r); - DECLARE_READ8_MEMBER(sb2b_6a6xxx_r); - DECLARE_READ8_MEMBER(sb2b_7xxx_r); - DECLARE_READ8_MEMBER(endless_580xxx_r); - DECLARE_READ8_MEMBER(endless_624b7f_r); - DECLARE_READ8_MEMBER(endless_800b_r); - DECLARE_READ8_MEMBER(sharedram2_r); - DECLARE_WRITE8_MEMBER(sharedram2_w); - DECLARE_READ8_MEMBER(snesb_dsw1_r); - DECLARE_READ8_MEMBER(snesb_dsw2_r); - DECLARE_READ8_MEMBER(snesb_coin_r); - DECLARE_READ8_MEMBER(spc_ram_100_r); - DECLARE_WRITE8_MEMBER(spc_ram_100_w); - DECLARE_MACHINE_RESET(ffight2b); - void mcu_io_map(address_map &map); - void snesb_map(address_map &map); - void spc_mem(address_map &map); -}; - - -/* Killer Instinct */ -READ8_MEMBER(snesb_state::sharedram_r) -{ - return m_shared_ram[offset]; -} - -WRITE8_MEMBER(snesb_state::sharedram_w) -{ - m_shared_ram[offset]=data; -} - -/* Sonic Blast Man 2 Special Turbo */ -READ8_MEMBER(snesb_state::sb2b_75bd37_r) -{ - /* protection check */ - return ++m_cnt; -} - -READ8_MEMBER(snesb_state::sb2b_6a6xxx_r) -{ - /* protection checks */ - switch(offset) - { - case 0x26f: return 0xb1; - case 0x3e0: return 0x9e; - case 0x5c8: return 0xf4; - case 0x94b: return 0x3a; - case 0xd1a: return 0xc5; - case 0xfb7: return 0x47; - } - - logerror("Unknown protection read read %x @ %x\n",offset, m_maincpu->pc()); - - return 0; -} - -READ8_MEMBER(snesb_state::sb2b_7xxx_r) -{ - return m_maincpu->space(AS_PROGRAM).read_byte(0xc07000 + offset); -} - - -/* Endless Duel */ -READ8_MEMBER(snesb_state::endless_580xxx_r) -{ - /* protection checks */ - switch(offset) - { - case 0x2bc: return 0xb4; - case 0x36a: return 0x8a; - case 0x7c1: return 0xd9; - case 0x956: return 0xa5; - case 0xe83: return 0x6b; - } - - logerror("Unknown protection read read %x @ %x\n",offset, m_maincpu->pc()); - - return 0; -} - -READ8_MEMBER(snesb_state::endless_624b7f_r) -{ - /* protection check */ - return ++m_cnt; -} - -READ8_MEMBER(snesb_state::endless_800b_r) -{ - if (!offset) - { - return 0x50; - } - - return 0xe8; -} - -READ8_MEMBER(snesb_state::sharedram2_r) -{ - return m_shared_ram2[offset]; -} - -WRITE8_MEMBER(snesb_state::sharedram2_w) -{ - m_shared_ram2[offset]=data; -} - -/* Generic read handlers for Dip Switches and coins inputs */ -READ8_MEMBER(snesb_state::snesb_dsw1_r) -{ - return ioport("DSW1")->read(); -} - -READ8_MEMBER(snesb_state::snesb_dsw2_r) -{ - return ioport("DSW2")->read(); -} - -READ8_MEMBER(snesb_state::snesb_coin_r) -{ - return ioport("COIN")->read(); -} - - -void snesb_state::snesb_map(address_map &map) -{ - map(0x000000, 0x7dffff).rw(FUNC(snesb_state::snes_r_bank1), FUNC(snesb_state::snes_w_bank1)); - map(0x7e0000, 0x7fffff).ram(); /* 8KB Low RAM, 24KB High RAM, 96KB Expanded RAM */ - map(0x800000, 0xffffff).rw(FUNC(snesb_state::snes_r_bank2), FUNC(snesb_state::snes_w_bank2)); /* Mirror and ROM */ -} - -READ8_MEMBER(snesb_state::spc_ram_100_r) -{ - return m_spc700->spc_ram_r(offset + 0x100); -} - -WRITE8_MEMBER(snesb_state::spc_ram_100_w) -{ - m_spc700->spc_ram_w(offset + 0x100, data); -} - -void snesb_state::spc_mem(address_map &map) -{ - map(0x0000, 0x00ef).rw(m_spc700, FUNC(snes_sound_device::spc_ram_r), FUNC(snes_sound_device::spc_ram_w)); /* lower 32k ram */ - map(0x00f0, 0x00ff).rw(m_spc700, FUNC(snes_sound_device::spc_io_r), FUNC(snes_sound_device::spc_io_w)); /* spc io */ - map(0x0100, 0xffff).rw(FUNC(snesb_state::spc_ram_100_r), FUNC(snesb_state::spc_ram_100_w)); -} - -static INPUT_PORTS_START( snes_common ) - - PORT_START("SERIAL1_DATA1") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Button B") PORT_PLAYER(1) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Button Y") PORT_PLAYER(1) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("P1 Select") - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Start") - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Button A") PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Button X") PORT_PLAYER(1) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P1 Button L") PORT_PLAYER(1) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Button R") PORT_PLAYER(1) - PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("SERIAL2_DATA1") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Button B") PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P2 Button Y") PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("P2 Select") - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Start") - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P2 Button A") PORT_PLAYER(2) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P2 Button X") PORT_PLAYER(2) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P2 Button L") PORT_PLAYER(2) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P2 Button R") PORT_PLAYER(2) - PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("SERIAL1_DATA2") - PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("SERIAL2_DATA2") - PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED ) - -#if SNES_LAYER_DEBUG - PORT_START("DEBUG1") - PORT_CONFNAME( 0x03, 0x00, "Select BG1 priority" ) - PORT_CONFSETTING( 0x00, "All" ) - PORT_CONFSETTING( 0x01, "BG1B (lower) only" ) - PORT_CONFSETTING( 0x02, "BG1A (higher) only" ) - PORT_CONFNAME( 0x0c, 0x00, "Select BG2 priority" ) - PORT_CONFSETTING( 0x00, "All" ) - PORT_CONFSETTING( 0x04, "BG2B (lower) only" ) - PORT_CONFSETTING( 0x08, "BG2A (higher) only" ) - PORT_CONFNAME( 0x30, 0x00, "Select BG3 priority" ) - PORT_CONFSETTING( 0x00, "All" ) - PORT_CONFSETTING( 0x10, "BG3B (lower) only" ) - PORT_CONFSETTING( 0x20, "BG3A (higher) only" ) - PORT_CONFNAME( 0xc0, 0x00, "Select BG4 priority" ) - PORT_CONFSETTING( 0x00, "All" ) - PORT_CONFSETTING( 0x40, "BG4B (lower) only" ) - PORT_CONFSETTING( 0x80, "BG4A (higher) only" ) - - PORT_START("DEBUG2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 1") PORT_CODE(KEYCODE_1_PAD) PORT_TOGGLE - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 2") PORT_CODE(KEYCODE_2_PAD) PORT_TOGGLE - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 3") PORT_CODE(KEYCODE_3_PAD) PORT_TOGGLE - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 4") PORT_CODE(KEYCODE_4_PAD) PORT_TOGGLE - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Objects") PORT_CODE(KEYCODE_5_PAD) PORT_TOGGLE - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Main/Sub") PORT_CODE(KEYCODE_6_PAD) PORT_TOGGLE - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Color Math") PORT_CODE(KEYCODE_7_PAD) PORT_TOGGLE - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Windows") PORT_CODE(KEYCODE_8_PAD) PORT_TOGGLE - - PORT_START("DEBUG3") - PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mosaic") PORT_CODE(KEYCODE_9_PAD) PORT_TOGGLE - PORT_CONFNAME( 0x70, 0x00, "Select OAM priority" ) - PORT_CONFSETTING( 0x00, "All" ) - PORT_CONFSETTING( 0x10, "OAM0 only" ) - PORT_CONFSETTING( 0x20, "OAM1 only" ) - PORT_CONFSETTING( 0x30, "OAM2 only" ) - PORT_CONFSETTING( 0x40, "OAM3 only" ) - PORT_CONFNAME( 0x80, 0x00, "Draw sprite in reverse order" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x80, DEF_STR( On ) ) - - PORT_START("DEBUG4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 0 draw") PORT_TOGGLE - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 1 draw") PORT_TOGGLE - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 2 draw") PORT_TOGGLE - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 3 draw") PORT_TOGGLE - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 4 draw") PORT_TOGGLE - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 5 draw") PORT_TOGGLE - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 6 draw") PORT_TOGGLE - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 7 draw") PORT_TOGGLE -#endif -INPUT_PORTS_END - - -/* verified from 5A22 code */ -static INPUT_PORTS_START( kinstb ) - PORT_INCLUDE(snes_common) - - PORT_START("DSW1") - PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Difficulty ) ) - PORT_DIPSETTING( 0x00, "0 (Easiest)" ) /* "EASY" (0 star) */ - PORT_DIPSETTING( 0x01, "1" ) /* (1 star) */ - PORT_DIPSETTING( 0x02, "2" ) /* (2 stars) */ - PORT_DIPSETTING( 0x03, "3" ) /* (3 stars) */ - PORT_DIPSETTING( 0x04, "4" ) /* (4 stars) */ - PORT_DIPSETTING( 0x05, "5" ) /* "HARD" (5 stars) */ - PORT_DIPSETTING( 0x06, "6" ) /* undefined */ - PORT_DIPSETTING( 0x07, "7" ) /* undefined */ - PORT_DIPSETTING( 0x08, "8" ) /* undefined */ - PORT_DIPSETTING( 0x09, "9" ) /* undefined */ - PORT_DIPSETTING( 0x0a, "10" ) /* undefined */ - PORT_DIPSETTING( 0x0b, "11" ) /* undefined */ - PORT_DIPSETTING( 0x0c, "12" ) /* undefined */ - PORT_DIPSETTING( 0x0d, "13" ) /* undefined */ - PORT_DIPSETTING( 0x0e, "14" ) /* undefined */ - PORT_DIPSETTING( 0x0f, "15 (Hardest)" ) /* undefined */ - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x0f, 0x01, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x0f, "15 Coins/1 Credit" ) - PORT_DIPSETTING( 0x0e, "14 Coins/1 Credit" ) - PORT_DIPSETTING( 0x0d, "13 Coins/1 Credit" ) - PORT_DIPSETTING( 0x0c, "12 Coins/1 Credit" ) - PORT_DIPSETTING( 0x0b, "11 Coins/1 Credit" ) - PORT_DIPSETTING( 0x0a, "10 Coins/1 Credit" ) - PORT_DIPSETTING( 0x09, DEF_STR( 9C_1C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 8C_1C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 7C_1C ) ) - PORT_DIPSETTING( 0x06, DEF_STR( 6C_1C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 5C_1C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) -INPUT_PORTS_END - -/* verified from 5A22 code */ -static INPUT_PORTS_START( ffight2b ) - PORT_INCLUDE(snes_common) - - PORT_START("DSW1") - PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) /* duplicate setting */ - PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPNAME( 0x18, 0x08, DEF_STR( Lives ) ) - PORT_DIPSETTING( 0x18, "1" ) - PORT_DIPSETTING( 0x10, "2" ) - PORT_DIPSETTING( 0x08, "3" ) - PORT_DIPSETTING( 0x00, "4" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) /* "GAME LEVEL" */ - PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) /* "EXPERT" */ - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x00, "100k 300k 200k+" ) - PORT_DIPSETTING( 0x80, DEF_STR( None ) ) - - PORT_START("DSW2") - PORT_DIPUNUSED( 0x01, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x02, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x04, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) -INPUT_PORTS_END - -/* verified from 5A22 code */ -static INPUT_PORTS_START( iron ) - PORT_INCLUDE(snes_common) - - PORT_START("DSW1") - PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) /* duplicate setting */ - PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) /* "LEVEL" */ - PORT_DIPSETTING( 0x01, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x03, DEF_STR( Normal ) ) /* "MEDIUM" */ - PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) /* duplicate setting */ - PORT_DIPNAME( 0x04, 0x04, "Suffered Damages" ) /* code at 0x(8)082d0 */ - PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, "More" ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) /* table at 0x(8)3ffda (4 * 1 word) gives 02 03 04 05 (add 1) but extra LSRA before TAY at 0x(8)3ffcf */ - PORT_DIPSETTING( 0x18, "3" ) - PORT_DIPSETTING( 0x08, "4" ) - PORT_DIPSETTING( 0x10, "769 (Bug)" ) - PORT_DIPSETTING( 0x00, "1025 (Bug)" ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - - PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) -INPUT_PORTS_END - -/* verified from 5A22 code */ -static INPUT_PORTS_START( denseib ) - PORT_INCLUDE(snes_common) - - PORT_START("DSW1") - PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) /* duplicate setting */ - PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPNAME( 0x18, 0x10, DEF_STR( Difficulty ) ) /* "RANK" */ - PORT_DIPSETTING( 0x18, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) /* duplicate setting */ - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x80, 0x00, "Mode" ) - PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x80, "Battle" ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x07, 0x07, "Suffered Damages" ) /* code at 0x(8)0f810 */ - PORT_DIPSETTING( 0x07, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x06, "x1.5" ) - PORT_DIPSETTING( 0x05, "x2.5" ) - PORT_DIPSETTING( 0x04, "x3.5" ) - PORT_DIPSETTING( 0x03, "x4.5" ) - PORT_DIPSETTING( 0x02, "x5.5" ) - PORT_DIPSETTING( 0x01, "x6.5" ) - PORT_DIPSETTING( 0x00, "x7.5" ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) -INPUT_PORTS_END - -/* verified from 5A22 code */ -static INPUT_PORTS_START( sblast2b ) - PORT_INCLUDE(snes_common) - - PORT_START("DSW1") - PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) /* duplicate setting */ - PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPNAME( 0x38, 0x38, DEF_STR( Difficulty ) ) /* "LEVEL" */ - PORT_DIPSETTING( 0x38, "0 (Easiest)" ) /* "NORMAL" */ - PORT_DIPSETTING( 0x30, "1" ) /* "HARD" */ - PORT_DIPSETTING( 0x28, "2" ) /* undefined */ - PORT_DIPSETTING( 0x20, "3" ) /* undefined */ - PORT_DIPSETTING( 0x18, "4" ) /* undefined */ - PORT_DIPSETTING( 0x10, "5" ) /* undefined */ - PORT_DIPSETTING( 0x08, "6" ) /* undefined */ - PORT_DIPSETTING( 0x00, "7 (Hardest)" ) /* undefined */ - PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Lives ) ) - PORT_DIPSETTING( 0xc0, "1" ) - PORT_DIPSETTING( 0x80, "2" ) - PORT_DIPSETTING( 0x40, "3" ) - PORT_DIPSETTING( 0x00, "4" ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x0f, 0x04, "Power" ) - PORT_DIPSETTING( 0x07, "0" ) - PORT_DIPSETTING( 0x06, "1" ) - PORT_DIPSETTING( 0x05, "2" ) - PORT_DIPSETTING( 0x04, "3" ) - PORT_DIPSETTING( 0x03, "4" ) - PORT_DIPSETTING( 0x02, "5" ) - PORT_DIPSETTING( 0x01, "6" ) - PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( endless ) - PORT_INCLUDE(snes_common) - - PORT_START("DSW1") - PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) /* duplicate setting */ - PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPNAME( 0x38, 0x38, DEF_STR( Difficulty ) ) /* "LEVEL" */ - PORT_DIPSETTING( 0x38, "0 (Easiest)" ) /* "EASY" */ - PORT_DIPSETTING( 0x30, "1" ) /* "NORMAL" */ - PORT_DIPSETTING( 0x28, "2" ) /* "HARD" */ - PORT_DIPSETTING( 0x20, "3" ) /* undefined */ - PORT_DIPSETTING( 0x18, "4" ) /* undefined */ - PORT_DIPSETTING( 0x10, "5" ) /* undefined */ - PORT_DIPSETTING( 0x08, "6" ) /* undefined */ - PORT_DIPSETTING( 0x00, "7 (Hardest)" ) /* undefined */ - PORT_DIPNAME( 0xc0, 0xc0, "Time" ) /* "TIME" */ - PORT_DIPSETTING( 0xc0, "99" ) /* "LIMIT" */ - PORT_DIPSETTING( 0x80, "60" ) /* undefined */ - PORT_DIPSETTING( 0x40, "30" ) /* undefined */ - PORT_DIPSETTING( 0x00, "Infinite" ) /* "NO LIMIT" */ - - PORT_START("DSW2") - PORT_DIPUNUSED( 0x01, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x02, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x04, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) -INPUT_PORTS_END - -static INPUT_PORTS_START( venom ) - PORT_INCLUDE(snes_common) - - PORT_START("DSW1") - PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) /* duplicate setting */ - PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("DSW2") - PORT_DIPUNUSED( 0x01, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x02, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x04, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x10, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) - - PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - - // The game code has been hacked to use only 3 buttons (the arcade panel) as a result many moves are not even possible and some buttons have multiple purposes compared to the original game - PORT_MODIFY("SERIAL1_DATA1") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_MODIFY("SERIAL2_DATA1") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void snesb_state::kinstb(machine_config &config) -{ - /* basic machine hardware */ - _5A22(config, m_maincpu, 3580000*6); /* 2.68Mhz, also 3.58Mhz */ - m_maincpu->set_addrmap(AS_PROGRAM, &snesb_state::snesb_map); - - /* audio CPU */ - // runs at 24.576 MHz / 12 = 2.048 MHz - SPC700(config, m_soundcpu, XTAL(24'576'000) / 12); - m_soundcpu->set_addrmap(AS_PROGRAM, &snesb_state::spc_mem); - - config.set_perfect_quantum(m_maincpu); - - /* video hardware */ - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(DOTCLK_NTSC * 2, SNES_HTOTAL * 2, 0, SNES_SCR_WIDTH * 2, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC); - m_screen->set_video_attributes(VIDEO_VARIABLE_WIDTH); - m_screen->set_screen_update(FUNC(snes_state::screen_update)); - - SNES_PPU(config, m_ppu, MCLK_NTSC); - m_ppu->open_bus_callback().set([this] { return snes_open_bus_r(); }); // lambda because overloaded function name - m_ppu->set_screen("screen"); - - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - SNES_SOUND(config, m_spc700, XTAL(24'576'000) / 12); - m_spc700->add_route(0, "lspeaker", 1.00); - m_spc700->add_route(1, "rspeaker", 1.00); -} - -MACHINE_RESET_MEMBER( snesb_state, ffight2b ) -{ - address_space &cpu0space = m_maincpu->space(AS_PROGRAM); - snes_state::machine_reset(); - - /* Hack: avoid starting with 55 credits. It's either a work RAM init fault or MCU clears it by his own, hard to tell ... */ - cpu0space.write_byte(0x7eadce, 0x00); -} - -void snesb_state::ffight2b(machine_config &config) -{ - kinstb(config); - MCFG_MACHINE_RESET_OVERRIDE( snesb_state, ffight2b ) -} - -void snesb_state::init_kinstb() -{ - uint8_t *rom = memregion("user3")->base(); - - for (int32_t i = 0; i < 0x400000; i++) - { - rom[i] = bitswap<8>(rom[i], 5, 0, 6, 1, 7, 4, 3, 2); - } - - m_shared_ram = std::make_unique<int8_t[]>(0x100); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x781000, 0x7810ff, read8_delegate(*this, FUNC(snesb_state::sharedram_r)), write8_delegate(*this, FUNC(snesb_state::sharedram_w))); - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes_hirom(); -} - -void snesb_state::init_ffight2b() -{ - uint8_t *rom = memregion("user3")->base(); - - for (int32_t i = 0; i < 0x200000; i++) - { - rom[i] = rom[i] ^ 0xff; - - if (i < 0x10000) /* 0x00000 - 0x0ffff */ - { - rom[i] = bitswap<8>(rom[i],3,1,6,4,7,0,2,5); - } - else if (i < 0x20000) /* 0x10000 - 0x1ffff */ - { - rom[i] = bitswap<8>(rom[i],3,7,0,5,1,6,2,4); - } - else if (i < 0x30000) /* 0x20000 - 0x2ffff */ - { - rom[i] = bitswap<8>(rom[i],1,7,6,4,5,2,3,0); - } - else if (i < 0x40000) /* 0x30000 - 0x3ffff */ - { - rom[i] = bitswap<8>(rom[i],0,3,2,5,4,6,7,1); - } - else if (i < 0x150000) - { - rom[i] = bitswap<8>(rom[i],6,4,0,5,1,3,2,7); - } - } - - /* boot vector */ - rom[0x7ffd] = 0x89; - rom[0x7ffc] = 0x54; - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes(); -} - -void snesb_state::init_iron() -{ - uint8_t *rom = memregion("user3")->base(); - - for (int32_t i = 0; i < 0x140000; i++) - { - if (i < 0x80000) - { - rom[i] = bitswap<8>(rom[i]^0xff,2,7,1,6,3,0,5,4); - } - else - { - rom[i] = bitswap<8>(rom[i],6,3,0,5,1,4,7,2); - } - } - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes(); -} - -void snesb_state::init_denseib() -{ - uint8_t *rom = memregion("user3")->base(); - - for (int32_t i = 0; i < 0x200000; i++) - { - rom[i] = rom[i] ^ 0xff; - switch (i >> 16) - { - case 0x00: rom[i] = bitswap<8>(rom[i],1,7,0,6,3,4,5,2); break; - case 0x01: rom[i] = bitswap<8>(rom[i],3,4,7,2,0,6,5,1); break; - case 0x02: rom[i] = bitswap<8>(rom[i],5,4,2,1,7,0,6,3); break; - case 0x03: rom[i] = bitswap<8>(rom[i],0,1,3,7,2,6,5,4); break; - - default: rom[i] = bitswap<8>(rom[i],4,5,1,0,2,3,7,6); break; - } - } - - /* boot vector */ - rom[0xfffc] = 0x40; - rom[0xfffd] = 0xf7; - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes_hirom(); -} - -void snesb_state::init_denseib2() -{ - uint8_t *src = memregion("user7")->base(); - uint8_t *dst = memregion("user3")->base(); - - static const uint8_t address_tab_high[0x40] = { - 0x0b, 0x1d, 0x05, 0x15, 0x09, 0x19, 0x04, 0x13, 0x02, 0x1f, 0x07, 0x17, 0x0d, 0x11, 0x0a, 0x1a, - 0x14, 0x0e, 0x18, 0x06, 0x1e, 0x01, 0x10, 0x0c, 0x1b, 0x0f, 0x16, 0x00, 0x12, 0x08, 0x1c, 0x03, - 0x2b, 0x3d, 0x25, 0x35, 0x29, 0x39, 0x24, 0x33, 0x22, 0x3f, 0x27, 0x37, 0x2d, 0x31, 0x2a, 0x3a, - 0x34, 0x2e, 0x38, 0x26, 0x3e, 0x21, 0x30, 0x2c, 0x3b, 0x2f, 0x36, 0x20, 0x32, 0x28, 0x3c, 0x23 - }; - - static const uint8_t address_tab_low[0x40] = { - 0x14, 0x1d, 0x11, 0x3c, 0x0a, 0x29, 0x2d, 0x2e, 0x30, 0x32, 0x16, 0x36, 0x05, 0x25, 0x26, 0x37, - 0x20, 0x21, 0x27, 0x28, 0x33, 0x34, 0x23, 0x12, 0x1e, 0x1f, 0x3b, 0x24, 0x2c, 0x35, 0x38, 0x39, - 0x3d, 0x0c, 0x2a, 0x0d, 0x22, 0x18, 0x19, 0x1a, 0x03, 0x08, 0x04, 0x3a, 0x0b, 0x0f, 0x15, 0x17, - 0x1b, 0x13, 0x00, 0x1c, 0x2b, 0x01, 0x06, 0x2f, 0x07, 0x09, 0x02, 0x31, 0x10, 0x0e, 0x3f, 0x3e - }; - - static const uint8_t data_high[16] = { - 0x03, 0x04, 0x85, 0x01, 0x81, 0x87, 0x07, 0x05, 0x86, 0x00, 0x02, 0x82, 0x84, 0x83, 0x06, 0x80 - }; - - static const uint8_t data_low[16] = { - 0x30, 0x40, 0x58, 0x10, 0x18, 0x78, 0x70, 0x50, 0x68, 0x00, 0x20, 0x28, 0x48, 0x38, 0x60, 0x08 - }; - - for (int i = 0; i < 0x200000; i++) - { - int j = (address_tab_high[i >> 15] << 15) + (i & 0x7fc0) + address_tab_low[i & 0x3f]; - - dst[i] = data_high[src[j]>>4] | data_low[src[j]&0xf]; - - if (i >= 0x00000 && i < 0x10000) { - dst[i] = bitswap<8>(dst[i],2,1,3,0,7,4,5,6) ^ 0xff; - } - - if (i >= 0x10000 && i < 0x20000) { - dst[i] = bitswap<8>(dst[i],1,7,4,5,6,0,3,2); - } - - if (i >= 0x20000 && i < 0x30000) { - dst[i] = bitswap<8>(dst[i],0,2,6,7,5,3,4,1) ^ 0xff; - } - - if (i >= 0x30000 && i < 0x40000) { - dst[i] = bitswap<8>(dst[i],6,5,0,3,1,7,2,4) ^ 0xff; - } - } - - /* boot vector */ - dst[0xfffc] = 0x40; - dst[0xfffd] = 0xf7; - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes_hirom(); -} - -void snesb_state::init_legendsb() -{ - u8 *rom = memregion("user3")->base(); - - for(int i = 0; i < 0x100000; i++) - { - u8 val = rom[i] ^ 0xff; - - if (i < 0x10000) - rom[i] = bitswap<8>(val,6,5,4,2,1,0,3,7); // 0x00000 - 0x0ffff - else if (i < 0x20000) - rom[i] = bitswap<8>(val,6,1,3,5,2,0,7,4); // 0x10000 - 0x1ffff - else if (i < 0x30000) - rom[i] = bitswap<8>(val,2,6,3,0,4,5,7,1); // 0x20000 - 0x2ffff - else if (i < 0x40000) - rom[i] = bitswap<8>(val,5,4,2,7,0,3,6,1); // 0x30000 - 0x3ffff - else - rom[i] = bitswap<8>(val,3,6,0,5,1,4,7,2); // 0x40000 - 0xfffff - } - - // boot vector - rom[0x7ffc] = 0x19; - rom[0x7ffd] = 0x80; - - // extra inputs - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes(); -} - -static const uint8_t data_substitution0[] = {0x88,0x02,0x2a,0x08,0x28,0xaa,0x8a,0x0a,0xa2,0x00,0x80,0xa0,0x22,0xa8,0x82,0x20,}; -static const uint8_t data_substitution1[] = {0x44,0x01,0x51,0x40,0x50,0x55,0x45,0x41,0x15,0x00,0x04,0x14,0x11,0x54,0x05,0x10,}; -static const uint8_t address_substitution_low[] = -{ - 0x32,0x35,0x3a,0x28,0x2a,0x0c,0x36,0x38,0x29,0x39,0x04,0x2c,0x21,0x23,0x3d,0x2d, - 0x3c,0x02,0x17,0x31,0x00,0x2e,0x0a,0x2f,0x25,0x26,0x27,0x30,0x33,0x01,0x18,0x19, - 0x10,0x11,0x24,0x16,0x1b,0x0d,0x0e,0x12,0x13,0x05,0x22,0x34,0x1c,0x06,0x07,0x37, - 0x08,0x3b,0x09,0x14,0x15,0x1d,0x0b,0x0f,0x1e,0x1f,0x2b,0x1a,0x03,0x20,0x3f,0x3e, -}; - -static const uint8_t address_substitution_high[] = -{ - 0x1b,0x15,0x08,0x1f,0x06,0x02,0x13,0x0a,0x1d,0x04,0x0e,0x00,0x17,0x0c,0x11,0x19, - 0x16,0x0d,0x1c,0x07,0x10,0x03,0x1a,0x0b,0x12,0x05,0x0f,0x18,0x1e,0x01,0x14,0x09, - 0x2b,0x25,0x28,0x2f,0x26,0x22,0x23,0x2a,0x2d,0x24,0x2e,0x20,0x27,0x2c,0x21,0x29 -}; - -void snesb_state::init_sblast2b() -{ - uint8_t *src = memregion("user7")->base(); - uint8_t *dst = memregion("user3")->base(); - - for (int i = 0; i < 0x80000 * 3; i++) - { - int cipherText = src[i]; - int plainText = data_substitution0[cipherText & 0xf] | data_substitution1[cipherText >> 4]; - int newAddress = (address_substitution_high[i >> 15] << 15) | (i & 0x7fc0) | (address_substitution_low[i & 0x3f]); - - if (newAddress < 0x10000) - { - plainText = bitswap<8>(plainText, 6,3,5,4,2,0,7,1) ^ 0xff; - } - else if (newAddress < 0x20000) - { - plainText = bitswap<8>(plainText, 4,0,7,6,3,1,2,5) ^ 0xff; - } - else if (newAddress < 0x30000) - { - plainText = bitswap<8>(plainText, 5,7,6,1,4,3,0,2); - } - else if (newAddress < 0x40000) - { - plainText = bitswap<8>(plainText, 3,1,2,0,5,6,4,7) ^ 0xff; - } - dst[newAddress] = plainText; - } - - /* boot vector */ - dst[0xfffc] = 0xc0; - dst[0xfffd] = 0x7a; - - /* protection checks */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x75bd37, 0x75bd37, read8_delegate(*this, FUNC(snesb_state::sb2b_75bd37_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x6a6000, 0x6a6fff, read8_delegate(*this, FUNC(snesb_state::sb2b_6a6xxx_r))); - - /* handler to read boot code */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x007000, 0x007fff, read8_delegate(*this, FUNC(snesb_state::sb2b_7xxx_r))); - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes_hirom(); -} - -void snesb_state::init_endless() -{ - uint8_t *src = memregion("user7")->base(); - uint8_t *dst = memregion("user3")->base(); - - static const uint8_t address_tab_high[0x40] = { - 0x3b, 0x1d, 0x35, 0x15, 0x39, 0x19, 0x34, 0x13, 0x32, 0x1f, 0x37, 0x17, 0x3d, 0x11, 0x3a, 0x1a, - 0x14, 0x3e, 0x18, 0x36, 0x1e, 0x31, 0x10, 0x3c, 0x1b, 0x3f, 0x16, 0x30, 0x12, 0x38, 0x1c, 0x33, - 0x2b, 0x0d, 0x25, 0x05, 0x29, 0x09, 0x24, 0x03, 0x22, 0x0f, 0x27, 0x07, 0x2d, 0x01, 0x2a, 0x0a, - 0x04, 0x2e, 0x08, 0x26, 0x0e, 0x21, 0x00, 0x2c, 0x0b, 0x2f, 0x06, 0x20, 0x02, 0x28, 0x0c, 0x23 - }; - - static const uint8_t address_tab_low[0x40] = { - 0x14, 0x1d, 0x11, 0x3c, 0x0a, 0x29, 0x2d, 0x2e, 0x30, 0x32, 0x16, 0x36, 0x05, 0x25, 0x26, 0x37, - 0x20, 0x21, 0x27, 0x28, 0x33, 0x34, 0x23, 0x12, 0x1e, 0x1f, 0x3b, 0x24, 0x2c, 0x35, 0x38, 0x39, - 0x3d, 0x0c, 0x2a, 0x0d, 0x22, 0x18, 0x19, 0x1a, 0x03, 0x08, 0x04, 0x3a, 0x0b, 0x0f, 0x15, 0x17, - 0x1b, 0x13, 0x00, 0x1c, 0x2b, 0x01, 0x06, 0x2f, 0x07, 0x09, 0x02, 0x31, 0x10, 0x0e, 0x3f, 0x3e - }; - - static const uint8_t data_high[16] = { - 0x88, 0x38, 0x10, 0x98, 0x90, 0x00, 0x08, 0x18, 0x20, 0xb8, 0xa8, 0xa0, 0x30, 0x80, 0x28, 0xb0 - }; - - static const uint8_t data_low[16] = { - 0x41, 0x46, 0x02, 0x43, 0x03, 0x00, 0x40, 0x42, 0x04, 0x47, 0x45, 0x05, 0x06, 0x01, 0x44, 0x07 - }; - - for (int i = 0; i < 0x200000; i++) { - int j = (address_tab_high[i >> 15] << 15) + (i & 0x7fc0) + address_tab_low[i & 0x3f]; - - dst[i] = data_high[src[j]>>4] | data_low[src[j]&0xf]; - - if (i >= 0x00000 && i < 0x10000) { - dst[i] = bitswap<8>(dst[i],2,3,4,1,7,0,6,5); - } - - if (i >= 0x10000 && i < 0x20000) { - dst[i] = bitswap<8>(dst[i],1,5,6,0,2,4,7,3) ^ 0xff; - } - - if (i >= 0x20000 && i < 0x30000) { - dst[i] = bitswap<8>(dst[i],3,0,1,6,4,5,2,7); - } - - if (i >= 0x30000 && i < 0x40000) { - dst[i] = bitswap<8>(dst[i],0,4,2,3,5,6,7,1) ^ 0xff; - } - } - - /* boot vector */ - dst[0x7ffc] = 0x00; - dst[0x7ffd] = 0x80; - - /* protection checks */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x580000, 0x580fff, read8_delegate(*this, FUNC(snesb_state::endless_580xxx_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x624b7f, 0x624b7f, read8_delegate(*this, FUNC(snesb_state::endless_624b7f_r))); - - /* work around missing content */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x800b, 0x800c, read8_delegate(*this, FUNC(snesb_state::endless_800b_r))); - - m_shared_ram = std::make_unique<int8_t[]>(0x22); - m_shared_ram2 = std::make_unique<int8_t[]>(0x22); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x781000, 0x781021, read8_delegate(*this, FUNC(snesb_state::sharedram_r)), write8_delegate(*this, FUNC(snesb_state::sharedram_w))); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x781200, 0x781221, read8_delegate(*this, FUNC(snesb_state::sharedram2_r)), write8_delegate(*this, FUNC(snesb_state::sharedram2_w))); - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes(); -} - -void snesb_state::init_rushbets() -{ - uint8_t *src = memregion("user7")->base(); - uint8_t *dst = memregion("user3")->base(); - - static const uint8_t address_tab_high[32] = { - 0x0b, 0x1d, 0x05, 0x15, 0x09, 0x19, 0x04, 0x13, 0x02, 0x1f, 0x07, 0x17, 0x0d, 0x11, 0x0a, 0x1a, - 0x14, 0x0e, 0x18, 0x06, 0x1e, 0x01, 0x10, 0x0c, 0x1b, 0x0f, 0x16, 0x00, 0x12, 0x08, 0x1c, 0x03 - }; - - static const uint8_t address_tab_low[64] = { - 0x14, 0x1d, 0x11, 0x3c, 0x0a, 0x29, 0x2d, 0x2e, 0x30, 0x32, 0x16, 0x36, 0x05, 0x25, 0x26, 0x37, - 0x20, 0x21, 0x27, 0x28, 0x33, 0x34, 0x23, 0x12, 0x1e, 0x1f, 0x3b, 0x24, 0x2c, 0x35, 0x38, 0x39, - 0x3d, 0x0c, 0x2a, 0x0d, 0x22, 0x18, 0x19, 0x1a, 0x03, 0x08, 0x04, 0x3a, 0x0b, 0x0f, 0x15, 0x17, - 0x1b, 0x13, 0x00, 0x1c, 0x2b, 0x01, 0x06, 0x2f, 0x07, 0x09, 0x02, 0x31, 0x10, 0x0e, 0x3f, 0x3e - }; - - static const uint8_t data_table[256] = { - 0xac, 0x85, 0xe5, 0xa4, 0xe4, 0xed, 0xad, 0xa5, 0xcd, 0x84, 0x8c, 0xcc, 0xc5, 0xec, 0x8d, 0xc4, - 0x38, 0x11, 0x71, 0x30, 0x70, 0x79, 0x39, 0x31, 0x59, 0x10, 0x18, 0x58, 0x51, 0x78, 0x19, 0x50, - 0xba, 0x93, 0xf3, 0xb2, 0xf2, 0xfb, 0xbb, 0xb3, 0xdb, 0x92, 0x9a, 0xda, 0xd3, 0xfa, 0x9b, 0xd2, - 0xa8, 0x81, 0xe1, 0xa0, 0xe0, 0xe9, 0xa9, 0xa1, 0xc9, 0x80, 0x88, 0xc8, 0xc1, 0xe8, 0x89, 0xc0, - 0xaa, 0x83, 0xe3, 0xa2, 0xe2, 0xeb, 0xab, 0xa3, 0xcb, 0x82, 0x8a, 0xca, 0xc3, 0xea, 0x8b, 0xc2, - 0xbe, 0x97, 0xf7, 0xb6, 0xf6, 0xff, 0xbf, 0xb7, 0xdf, 0x96, 0x9e, 0xde, 0xd7, 0xfe, 0x9f, 0xd6, - 0xbc, 0x95, 0xf5, 0xb4, 0xf4, 0xfd, 0xbd, 0xb5, 0xdd, 0x94, 0x9c, 0xdc, 0xd5, 0xfc, 0x9d, 0xd4, - 0xb8, 0x91, 0xf1, 0xb0, 0xf0, 0xf9, 0xb9, 0xb1, 0xd9, 0x90, 0x98, 0xd8, 0xd1, 0xf8, 0x99, 0xd0, - 0x3e, 0x17, 0x77, 0x36, 0x76, 0x7f, 0x3f, 0x37, 0x5f, 0x16, 0x1e, 0x5e, 0x57, 0x7e, 0x1f, 0x56, - 0x28, 0x01, 0x61, 0x20, 0x60, 0x69, 0x29, 0x21, 0x49, 0x00, 0x08, 0x48, 0x41, 0x68, 0x09, 0x40, - 0x2c, 0x05, 0x65, 0x24, 0x64, 0x6d, 0x2d, 0x25, 0x4d, 0x04, 0x0c, 0x4c, 0x45, 0x6c, 0x0d, 0x44, - 0x2e, 0x07, 0x67, 0x26, 0x66, 0x6f, 0x2f, 0x27, 0x4f, 0x06, 0x0e, 0x4e, 0x47, 0x6e, 0x0f, 0x46, - 0x3a, 0x13, 0x73, 0x32, 0x72, 0x7b, 0x3b, 0x33, 0x5b, 0x12, 0x1a, 0x5a, 0x53, 0x7a, 0x1b, 0x52, - 0xae, 0x87, 0xe7, 0xa6, 0xe6, 0xef, 0xaf, 0xa7, 0xcf, 0x86, 0x8e, 0xce, 0xc7, 0xee, 0x8f, 0xc6, - 0x3c, 0x15, 0x75, 0x34, 0x74, 0x7d, 0x3d, 0x35, 0x5d, 0x14, 0x1c, 0x5c, 0x55, 0x7c, 0x1d, 0x54, - 0x2a, 0x03, 0x63, 0x22, 0x62, 0x6b, 0x2b, 0x23, 0x4b, 0x02, 0x0a, 0x4a, 0x43, 0x6a, 0x0b, 0x42 - }; - - for (int i = 0; i < 0x200000; i++) { - int j = (address_tab_high[(i >> 15) & 0x1f] << 15) + (i & 0x107fc0) + address_tab_low[i & 0x3f]; - - dst[i] = data_table[src[j]]; - - if (i >= 0x00000 && i < 0x10000) { - dst[i] = bitswap<8>(dst[i], 0, 7, 6, 3, 5, 4, 1, 2) ^ 0xff; - } - - if (i >= 0x10000 && i < 0x20000) { - dst[i] = bitswap<8>(dst[i], 2, 1, 3, 7, 6, 5, 4, 0) ^ 0xff; - } - - if (i >= 0x20000 && i < 0x30000) { - dst[i] = bitswap<8>(dst[i], 4, 6, 0, 2, 7, 3, 5, 1); - } - - if (i >= 0x30000 && i < 0x40000) { - dst[i] = bitswap<8>(dst[i], 5, 4, 7, 1, 0, 6, 2, 3) ^ 0xff; - } - } - - // boot vector - dst[0xfffc] = 0xec; - dst[0xfffd] = 0x80; - - init_snes_hirom(); -} - -void snesb_state::init_venom() -{ - uint8_t *src = memregion("user7")->base(); - uint8_t *dst = memregion("user3")->base(); - - static uint8_t address_tab_high[0x60] = { - 0x00, 0x11, 0x02, 0x13, 0x04, 0x15, 0x06, 0x17, 0x08, 0x19, 0x0a, 0x1b, 0x0c, 0x1d, 0x0e, 0x1f, - 0x20, 0x31, 0x22, 0x33, 0x24, 0x35, 0x26, 0x37, 0x28, 0x39, 0x2a, 0x3b, 0x2c, 0x3d, 0x2e, 0x3f, - 0x10, 0x01, 0x12, 0x03, 0x14, 0x05, 0x16, 0x07, 0x18, 0x09, 0x1a, 0x0b, 0x1c, 0x0d, 0x1e, 0x0f, - 0x30, 0x21, 0x32, 0x23, 0x34, 0x25, 0x36, 0x27, 0x38, 0x29, 0x3a, 0x2b, 0x3c, 0x2d, 0x3e, 0x2f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f - }; - - static uint8_t address_tab_low[0x40] = { - 0x14, 0x1d, 0x11, 0x3c, 0x0a, 0x29, 0x2d, 0x2e, 0x30, 0x32, 0x16, 0x36, 0x05, 0x25, 0x26, 0x37, - 0x20, 0x21, 0x27, 0x28, 0x33, 0x34, 0x23, 0x12, 0x1e, 0x1f, 0x3b, 0x24, 0x2c, 0x35, 0x38, 0x39, - 0x3d, 0x0c, 0x2a, 0x0d, 0x22, 0x18, 0x19, 0x1a, 0x03, 0x08, 0x04, 0x3a, 0x0b, 0x0f, 0x15, 0x17, - 0x1b, 0x13, 0x00, 0x1c, 0x2b, 0x01, 0x06, 0x2f, 0x07, 0x09, 0x02, 0x31, 0x10, 0x0e, 0x3f, 0x3e - }; - - static uint8_t data_table[0x100] = { - 0x6a, 0xf2, 0xe0, 0xea, 0xe8, 0x60, 0x62, 0xe2, 0x70, 0xfa, 0x7a, 0x78, 0xf0, 0x68, 0x72, 0xf8, - 0x4f, 0xd7, 0xc5, 0xcf, 0xcd, 0x45, 0x47, 0xc7, 0x55, 0xdf, 0x5f, 0x5d, 0xd5, 0x4d, 0x57, 0xdd, - 0x0e, 0x96, 0x84, 0x8e, 0x8c, 0x04, 0x06, 0x86, 0x14, 0x9e, 0x1e, 0x1c, 0x94, 0x0c, 0x16, 0x9c, - 0x6e, 0xf6, 0xe4, 0xee, 0xec, 0x64, 0x66, 0xe6, 0x74, 0xfe, 0x7e, 0x7c, 0xf4, 0x6c, 0x76, 0xfc, - 0x2e, 0xb6, 0xa4, 0xae, 0xac, 0x24, 0x26, 0xa6, 0x34, 0xbe, 0x3e, 0x3c, 0xb4, 0x2c, 0x36, 0xbc, - 0x0a, 0x92, 0x80, 0x8a, 0x88, 0x00, 0x02, 0x82, 0x10, 0x9a, 0x1a, 0x18, 0x90, 0x08, 0x12, 0x98, - 0x4a, 0xd2, 0xc0, 0xca, 0xc8, 0x40, 0x42, 0xc2, 0x50, 0xda, 0x5a, 0x58, 0xd0, 0x48, 0x52, 0xd8, - 0x4e, 0xd6, 0xc4, 0xce, 0xcc, 0x44, 0x46, 0xc6, 0x54, 0xde, 0x5e, 0x5c, 0xd4, 0x4c, 0x56, 0xdc, - 0x0b, 0x93, 0x81, 0x8b, 0x89, 0x01, 0x03, 0x83, 0x11, 0x9b, 0x1b, 0x19, 0x91, 0x09, 0x13, 0x99, - 0x6f, 0xf7, 0xe5, 0xef, 0xed, 0x65, 0x67, 0xe7, 0x75, 0xff, 0x7f, 0x7d, 0xf5, 0x6d, 0x77, 0xfd, - 0x6b, 0xf3, 0xe1, 0xeb, 0xe9, 0x61, 0x63, 0xe3, 0x71, 0xfb, 0x7b, 0x79, 0xf1, 0x69, 0x73, 0xf9, - 0x2b, 0xb3, 0xa1, 0xab, 0xa9, 0x21, 0x23, 0xa3, 0x31, 0xbb, 0x3b, 0x39, 0xb1, 0x29, 0x33, 0xb9, - 0x0f, 0x97, 0x85, 0x8f, 0x8d, 0x05, 0x07, 0x87, 0x15, 0x9f, 0x1f, 0x1d, 0x95, 0x0d, 0x17, 0x9d, - 0x2a, 0xb2, 0xa0, 0xaa, 0xa8, 0x20, 0x22, 0xa2, 0x30, 0xba, 0x3a, 0x38, 0xb0, 0x28, 0x32, 0xb8, - 0x4b, 0xd3, 0xc1, 0xcb, 0xc9, 0x41, 0x43, 0xc3, 0x51, 0xdb, 0x5b, 0x59, 0xd1, 0x49, 0x53, 0xd9, - 0x2f, 0xb7, 0xa5, 0xaf, 0xad, 0x25, 0x27, 0xa7, 0x35, 0xbf, 0x3f, 0x3d, 0xb5, 0x2d, 0x37, 0xbd - }; - - for (int i = 0; i < 0x300000; i++) - { - int j = (address_tab_high[i >> 15] << 15) + (i & 0x7fc0) + address_tab_low[i & 0x3f]; - - dst[i] = data_table[src[j]]; - - if (i >= 0x00000 && i < 0x10000) { - dst[i] = bitswap<8>(dst[i], 6, 7, 0, 3, 1, 4, 2, 5) ^ 0xff; - } - - if (i >= 0x10000 && i < 0x20000) { - dst[i] = bitswap<8>(dst[i], 0, 1, 4, 5, 3, 7, 6, 2); - } - - if (i >= 0x20000 && i < 0x30000) { - dst[i] = bitswap<8>(dst[i], 1, 3, 2, 6, 5, 4, 0, 7) ^ 0xff; - } - - if (i >= 0x30000 && i < 0x40000) { - dst[i] = bitswap<8>(dst[i], 4, 0, 7, 6, 2, 1, 5, 3); - } - } - - // boot vector - dst[0x7ffc] = 0x98; - dst[0x7ffd] = 0xff; - - m_shared_ram = std::make_unique<int8_t[]>(0x22); - m_shared_ram2 = std::make_unique<int8_t[]>(0x22); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x781000, 0x781021, read8_delegate(*this, FUNC(snesb_state::sharedram_r)), write8_delegate(*this, FUNC(snesb_state::sharedram_w))); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x781200, 0x781221, read8_delegate(*this, FUNC(snesb_state::sharedram2_r)), write8_delegate(*this, FUNC(snesb_state::sharedram2_w))); - - /* extra inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(*this, FUNC(snesb_state::snesb_dsw1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(*this, FUNC(snesb_state::snesb_dsw2_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(*this, FUNC(snesb_state::snesb_coin_r))); - - init_snes(); -} - -ROM_START( kinstb ) - ROM_REGION( 0x400000, "user3", 0 ) - ROM_LOAD( "1.u14", 0x000000, 0x100000, CRC(70889919) SHA1(1451714cbdacb7f6ced2bc7afa478ad7264cf3b7) ) - ROM_LOAD( "2.u15", 0x100000, 0x100000, CRC(e4a5d1da) SHA1(6ae566bd2f740a251d7a81b8ebb92a651cfaac8d) ) - ROM_LOAD( "3.u16", 0x200000, 0x100000, CRC(7a40f7dd) SHA1(cebe632e8d2d68d0619077cc1e931af73c9a723b) ) - ROM_LOAD( "4.u17", 0x300000, 0x100000, CRC(3d7564c1) SHA1(392b513991897668d5dd469ac84a34f785895774) ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) -ROM_END - -ROM_START( ffight2b ) - ROM_REGION( 0x400000, "user3", 0 ) - ROM_LOAD( "ff2_3.u6", 0x000000, 0x008000, CRC(343bf582) SHA1(cc6b7219bb2fe61f0b377b606ad28b0e5a78be0b) ) - ROM_CONTINUE( 0x088000, 0x008000 ) - ROM_CONTINUE( 0x010000, 0x008000 ) - ROM_CONTINUE( 0x098000, 0x008000 ) - ROM_CONTINUE( 0x020000, 0x008000 ) - ROM_CONTINUE( 0x0a8000, 0x008000 ) - ROM_CONTINUE( 0x030000, 0x008000 ) - ROM_CONTINUE( 0x0b8000, 0x008000 ) - ROM_CONTINUE( 0x040000, 0x008000 ) - ROM_CONTINUE( 0x0c8000, 0x008000 ) - ROM_CONTINUE( 0x050000, 0x008000 ) - ROM_CONTINUE( 0x0d8000, 0x008000 ) - ROM_CONTINUE( 0x060000, 0x008000 ) - ROM_CONTINUE( 0x0e8000, 0x008000 ) - ROM_CONTINUE( 0x070000, 0x008000 ) - ROM_CONTINUE( 0x0f8000, 0x008000 ) - ROM_LOAD( "ff2_2.u7", 0x080000, 0x008000, CRC(b2078ae5) SHA1(e7bc3ad26ed672707d0dcfcaff238aad74986532) ) - ROM_CONTINUE( 0x008000, 0x008000 ) - ROM_CONTINUE( 0x090000, 0x008000 ) - ROM_CONTINUE( 0x018000, 0x008000 ) - ROM_CONTINUE( 0x0a0000, 0x008000 ) - ROM_CONTINUE( 0x028000, 0x008000 ) - ROM_CONTINUE( 0x0b0000, 0x008000 ) - ROM_CONTINUE( 0x038000, 0x008000 ) - ROM_CONTINUE( 0x0c0000, 0x008000 ) - ROM_CONTINUE( 0x048000, 0x008000 ) - ROM_CONTINUE( 0x0d0000, 0x008000 ) - ROM_CONTINUE( 0x058000, 0x008000 ) - ROM_CONTINUE( 0x0e0000, 0x008000 ) - ROM_CONTINUE( 0x068000, 0x008000 ) - ROM_CONTINUE( 0x0f0000, 0x008000 ) - ROM_CONTINUE( 0x078000, 0x008000 ) - ROM_LOAD( "ff2_1.u8", 0x100000, 0x040000, CRC(ea315ac1) SHA1(a85de091882d35bc77dc99677511828ff7c20350) ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) -ROM_END - -ROM_START( iron ) - ROM_REGION( 0x400000, "user3", 0 ) - ROM_LOAD( "6.c09.bin", 0x000000, 0x080000, CRC(50ea1457) SHA1(092f9a0e34deeb090b8c88553be3b1596ded60ef) ) - ROM_LOAD( "5.c10.bin", 0x080000, 0x080000, CRC(0c3a0b5b) SHA1(1e8ab860689137e0e94731f1af2cfc561492b5bd) ) - ROM_LOAD( "4.c11.bin", 0x100000, 0x040000, CRC(2aa417c7) SHA1(24b375e5bbd4be5dcd31b63ea98fbbadd53d543e) ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) -ROM_END - -ROM_START( denseib ) - ROM_REGION( 0x200000, "user3", ROMREGION_ERASEFF ) - ROM_LOAD( "dj.u14", 0x000000, 0x0080000, CRC(487ded13) SHA1(624edce30fe2f2d750bcb49c609ceb511b2279b1) ) - ROM_LOAD( "dj.u15", 0x080000, 0x0080000, CRC(5932a440) SHA1(6048372268a097b08d9f56ad30f083267d798165) ) - ROM_LOAD( "dj.u16", 0x100000, 0x0080000, CRC(7cb71fd7) SHA1(7673e9dcaabe804e2d637e67eabca1683dad4245) ) - ROM_LOAD( "dj.u17", 0x180000, 0x0080000, CRC(de29dd89) SHA1(441aefbc7ee64515ee66431ef504e76dc8dc5ca3) ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) -ROM_END - -ROM_START( denseib2 ) - ROM_REGION( 0x200000, "user3", ROMREGION_ERASEFF ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) - - ROM_REGION( 0x200000, "user7", 0 ) - ROM_LOAD( "u31.bin", 0x000000, 0x080000, CRC(834723a8) SHA1(3f56bba5017f77147e7d52618678f1e2eff4991b) ) - ROM_LOAD( "u32.bin", 0x080000, 0x080000, CRC(9748e86b) SHA1(68a62e0961d735602ae6ebd1aca5990c588ccbb1) ) - ROM_LOAD( "u33.bin", 0x100000, 0x080000, CRC(abcc6b61) SHA1(ef90f23b674f6dd36b3d60c9c395a1d4bc853798) ) - ROM_LOAD( "u34.bin", 0x180000, 0x080000, CRC(0a16ac96) SHA1(ddc11009d4b35a151aa7e357346f3ac109e112ef) ) -ROM_END - -ROM_START( sblast2b ) - ROM_REGION( 0x180000, "user3", ROMREGION_ERASEFF ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) - - ROM_REGION( 0x180000, "user7", 0 ) - ROM_LOAD( "1.bin", 0x000000, 0x0080000, CRC(bea10c40) SHA1(d9cc65267b9b57145d714f2c17b436c1fb21513f) ) - ROM_LOAD( "2.bin", 0x080000, 0x0080000, CRC(57d2b6e9) SHA1(1a7b347101f67b254e2f86294d501b0669431644) ) - ROM_LOAD( "3.bin", 0x100000, 0x0080000, CRC(9e63a5ce) SHA1(1d18606fbb28b55a921fc37e1af1aff4caae9003) ) - -ROM_END - -ROM_START( legendsb ) - ROM_REGION( 0x100000, "user3", 0 ) - ROM_LOAD( "u37_0", 0x000000, 0x080000, BAD_DUMP CRC(44101f23) SHA1(7563886598b290faa616397f7e87a56e2f984b79) ) // U37 ROM is bad, was unable to get stable reads - ROM_LOAD( "u37_1", 0x000000, 0x080000, BAD_DUMP CRC(d2e835bb) SHA1(0620e099f43cde95d6b4b210eef13abbff5f40e9) ) - ROM_LOAD( "u37_2", 0x000000, 0x008000, BAD_DUMP CRC(1bc6f429) SHA1(eb4e1a483d2aa545a1ba33243afd9693ee5bebd0) ) - ROM_CONTINUE( 0x088000, 0x008000 ) - ROM_CONTINUE( 0x010000, 0x008000 ) - ROM_CONTINUE( 0x098000, 0x008000 ) - ROM_CONTINUE( 0x020000, 0x008000 ) - ROM_CONTINUE( 0x0a8000, 0x008000 ) - ROM_CONTINUE( 0x030000, 0x008000 ) - ROM_CONTINUE( 0x0b8000, 0x008000 ) - ROM_CONTINUE( 0x040000, 0x008000 ) - ROM_CONTINUE( 0x0c8000, 0x008000 ) - ROM_CONTINUE( 0x050000, 0x008000 ) - ROM_CONTINUE( 0x0d8000, 0x008000 ) - ROM_CONTINUE( 0x060000, 0x008000 ) - ROM_CONTINUE( 0x0e8000, 0x008000 ) - ROM_CONTINUE( 0x070000, 0x008000 ) - ROM_CONTINUE( 0x0f8000, 0x008000 ) - ROM_LOAD( "u36", 0x080000, 0x008000, CRC(c33a5362) SHA1(537b1b7ef22baa289523fac8f9843db155408c56) ) - ROM_CONTINUE( 0x008000, 0x008000 ) - ROM_CONTINUE( 0x090000, 0x008000 ) - ROM_CONTINUE( 0x018000, 0x008000 ) - ROM_CONTINUE( 0x0a0000, 0x008000 ) - ROM_CONTINUE( 0x028000, 0x008000 ) - ROM_CONTINUE( 0x0b0000, 0x008000 ) - ROM_CONTINUE( 0x038000, 0x008000 ) - ROM_CONTINUE( 0x0c0000, 0x008000 ) - ROM_CONTINUE( 0x048000, 0x008000 ) - ROM_CONTINUE( 0x0d0000, 0x008000 ) - ROM_CONTINUE( 0x058000, 0x008000 ) - ROM_CONTINUE( 0x0e0000, 0x008000 ) - ROM_CONTINUE( 0x068000, 0x008000 ) - ROM_CONTINUE( 0x0f0000, 0x008000 ) - ROM_CONTINUE( 0x078000, 0x008000 ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) -ROM_END - -ROM_START( endless ) - ROM_REGION( 0x200000, "user3", ROMREGION_ERASEFF ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) - - ROM_REGION( 0x200000, "user7", 0 ) - ROM_LOAD( "endlessduel.unknownposition1", 0x000000, 0x80000, CRC(e49acd29) SHA1(ac137261fe7a7691738ac812bea9591256eb9038) ) - ROM_LOAD( "endlessduel.unknownposition2", 0x080000, 0x80000, CRC(ad2052f9) SHA1(d61382e3d93eb0bff45fb534cec0ce5ae3626165) ) - ROM_LOAD( "endlessduel.unknownposition3", 0x100000, 0x80000, CRC(30d06d7a) SHA1(17c617d94abb10c3bdf9d51013b116f4ef4debe8) ) - ROM_LOAD( "endlessduel.unknownposition4", 0x180000, 0x80000, CRC(9a9493ad) SHA1(82ee4fce9cc2014cb8404fd43eebb7941cdb9ac1) ) -ROM_END - -ROM_START( rushbets ) - ROM_REGION( 0x200000, "user3", ROMREGION_ERASEFF ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) - - ROM_REGION( 0x200000, "user7", 0 ) - ROM_LOAD( "ic19.bin", 0x000000, 0x80000, CRC(8aa0ad59) SHA1(83facb65c53ade99f1f057a8de27bee4a9c2efd8) ) - ROM_LOAD( "ic20.bin", 0x080000, 0x80000, CRC(a8afe28b) SHA1(16d1c4f957804d22dc05a97c56ae10c408dbc1f2) ) - ROM_LOAD( "ic21.bin", 0x100000, 0x80000, CRC(2f6e8711) SHA1(fe4030ef3445594455fe93e374a41e9ba2147bf6) ) - ROM_LOAD( "ic22.bin", 0x180000, 0x80000, CRC(95a234d2) SHA1(31a556c8ed395f61ba198631ee086c18cc740792) ) -ROM_END - -ROM_START( venom ) - ROM_REGION( 0x300000, "user3", ROMREGION_ERASEFF ) - - ROM_REGION(0x100, "sound_ipl", 0) - ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) - - ROM_REGION(0x800, "user6", ROMREGION_ERASEFF) - - ROM_REGION( 0x300000, "user7", 0 ) - ROM_LOAD( "u31.bin", 0x000000, 0x0100000, CRC(d1034a76) SHA1(541dd92197ca2e4eb686e426c840aad847d02be8) ) - ROM_LOAD( "u32.bin", 0x100000, 0x0100000, CRC(fbe865b0) SHA1(25467a6faa912bf180c5dd7aecee77c3b5f207f8) ) - ROM_LOAD( "u33.bin", 0x200000, 0x0080000, CRC(ed874ca2) SHA1(cfc90b38ea2eea07e990f0b72d7c1af2a7076beb) ) - ROM_LOAD( "u34.bin", 0x280000, 0x0080000, CRC(7a09c9e0) SHA1(794965d5501ec0e21f1f3a8cb8fd66f913d42760) ) -ROM_END - -GAME( 199?, kinstb, 0, kinstb, kinstb, snesb_state, init_kinstb, ROT0, "bootleg", "Killer Instinct (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, ffight2b, 0, ffight2b, ffight2b, snesb_state, init_ffight2b, ROT0, "bootleg", "Final Fight 2 (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, iron, 0, kinstb, iron, snesb_state, init_iron, ROT0, "bootleg", "Iron (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, denseib, 0, kinstb, denseib, snesb_state, init_denseib, ROT0, "bootleg", "Ghost Chaser Densei (SNES bootleg, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, denseib2, denseib, kinstb, denseib, snesb_state, init_denseib2, ROT0, "bootleg", "Ghost Chaser Densei (SNES bootleg, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1997, sblast2b, 0, kinstb, sblast2b, snesb_state, init_sblast2b, ROT0, "bootleg", "Sonic Blast Man 2 Special Turbo (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS) -GAME( 1996, endless, 0, kinstb, endless, snesb_state, init_endless, ROT0, "bootleg", "Gundam Wing: Endless Duel (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, legendsb, 0, kinstb, kinstb, snesb_state, init_legendsb, ROT0, "bootleg", "Legend (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1997, rushbets, 0, kinstb, kinstb, snesb_state, init_rushbets, ROT0, "bootleg", "Rushing Beat Shura (SNES bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1997, venom, 0, kinstb, venom, snesb_state, init_venom, ROT0, "bootleg", "Venom & Spider-Man - Separation Anxiety (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) |