summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/kinstb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/kinstb.c')
-rw-r--r--src/mame/drivers/kinstb.c286
1 files changed, 286 insertions, 0 deletions
diff --git a/src/mame/drivers/kinstb.c b/src/mame/drivers/kinstb.c
new file mode 100644
index 00000000000..a6567897f90
--- /dev/null
+++ b/src/mame/drivers/kinstb.c
@@ -0,0 +1,286 @@
+/***************************************************************************
+
+ Killer Instinct bootleg/hack.
+ -----------------------------
+
+ Driver (based on nss.c ) by Tomasz Slanina analog[at]op.pl
+
+ PCB Info:
+ ---------
+
+ (Nintendo SNES hardware)
+
+ 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.
+
+***************************************************************************/
+#include "driver.h"
+#include "includes/snes.h"
+
+extern DRIVER_INIT( snes_hirom );
+
+static INT8 shared_ram[0x100];
+
+static READ8_HANDLER(sharedram_r)
+{
+ //check coins
+ static INT32 oldinput=0;
+ INT32 coincnt;
+#ifdef MAME_DEBUG
+ INT32 input=readinputport(13);
+#else
+ INT32 input=readinputport(10);
+#endif
+
+ if(input&3)
+ {
+ if( ((input&1)==1)&&((oldinput&1)==0)) {shared_ram[0]++;}
+
+ coincnt=shared_ram[0];
+
+ if(coincnt>99){coincnt=99;}
+
+ shared_ram[0xb]=(coincnt/10)+'0';
+ shared_ram[0xa]=(coincnt%10)+'0';
+ }
+ oldinput=input;
+ return shared_ram[offset];
+}
+
+static WRITE8_HANDLER(sharedram_w)
+{
+ shared_ram[offset]=data;
+}
+
+static ADDRESS_MAP_START( kinstb_map, ADDRESS_SPACE_PROGRAM, 8)
+ AM_RANGE(0x000000, 0x2fffff) AM_READWRITE(snes_r_bank1, snes_w_bank1) /* I/O and ROM (repeats for each bank) */
+ AM_RANGE(0x300000, 0x3fffff) AM_READWRITE(snes_r_bank2, snes_w_bank2) /* I/O and ROM (repeats for each bank) */
+ AM_RANGE(0x400000, 0x5fffff) AM_READWRITE(snes_r_bank3, MWA8_ROM) /* ROM (and reserved in Mode 20) */
+ AM_RANGE(0x600000, 0x6fffff) AM_READWRITE(snes_r_bank6, snes_w_bank6) /* used by Mode 20 DSP-1 */
+ AM_RANGE(0x700000, 0x77ffff) AM_READWRITE(snes_r_sram, snes_w_sram) /* 256KB Mode 20 save ram + reserved from 0x8000 - 0xffff */
+ AM_RANGE(0x781000, 0x7810ff) AM_READWRITE(sharedram_r, sharedram_w) /*shared with some device - mcu ? */
+ AM_RANGE(0x7e0000, 0x7fffff) AM_RAM /* 8KB Low RAM, 24KB High RAM, 96KB Expanded RAM */
+ AM_RANGE(0x800000, 0xffffff) AM_READWRITE(snes_r_bank4, snes_w_bank4) /* Mirror and ROM */
+ADDRESS_MAP_END
+
+static READ8_HANDLER( spc_ram_100_r )
+{
+ return spc_ram_r(offset + 0x100);
+}
+
+static WRITE8_HANDLER( spc_ram_100_w )
+{
+ spc_ram_w(offset + 0x100, data);
+}
+
+static ADDRESS_MAP_START( spc_mem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x00ef) AM_READWRITE(spc_ram_r, spc_ram_w) AM_BASE(&spc_ram) /* lower 32k ram */
+ AM_RANGE(0x00f0, 0x00ff) AM_READWRITE(spc_io_r, spc_io_w) /* spc io */
+ AM_RANGE(0x0100, 0xffff) AM_WRITE(spc_ram_100_w)
+ AM_RANGE(0x0100, 0xffbf) AM_READ(spc_ram_100_r)
+ AM_RANGE(0xffc0, 0xffff) AM_READ(spc_ipl_r)
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( kinstb )
+ PORT_START /* IN 0 : Joypad 1 - L */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Button A") PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Button X") PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Button L") PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P1 Button R") PORT_PLAYER(1)
+ PORT_START /* IN 1 : Joypad 1 - H */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Button B") PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Button Y") PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("P1 Select")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Start")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+
+ PORT_START /* IN 2 : Joypad 2 - L */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P2 Button A") PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P2 Button X") PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P2 Button L") PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P2 Button R") PORT_PLAYER(2)
+ PORT_START /* IN 3 : Joypad 2 - H */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Button B") PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P2 Button Y") PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("P2 Select")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Start")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+
+ PORT_START /* IN 4 : Joypad 3 - L */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P3 Button A") PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P3 Button X") PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P3 Button L") PORT_PLAYER(3)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P3 Button R") PORT_PLAYER(3)
+ PORT_START /* IN 5 : Joypad 3 - H */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P3 Button B") PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P3 Button Y") PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE3 ) PORT_NAME("P3 Select")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("P3 Start")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(3)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3)
+
+ PORT_START /* IN 6 : Joypad 4 - L */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P4 Button A") PORT_PLAYER(4)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P4 Button X") PORT_PLAYER(4)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P4 Button L") PORT_PLAYER(4)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P4 Button R") PORT_PLAYER(4)
+ PORT_START /* IN 7 : Joypad 4 - H */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P4 Button B") PORT_PLAYER(4)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P4 Button Y") PORT_PLAYER(4)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE4 ) PORT_NAME("P4 Select")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START4 ) PORT_NAME("P4 Start")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(4)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4)
+
+ PORT_START /* IN 8 : Internal switches */
+ PORT_DIPNAME( 0x1, 0x1, "Enforce 32 sprites/line" )
+ PORT_DIPSETTING( 0x0, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x1, DEF_STR( Yes ) )
+
+#ifdef MAME_DEBUG
+ PORT_START /* IN 9 : debug switches */
+ PORT_DIPNAME( 0x3, 0x0, "Browse tiles" )
+ PORT_DIPSETTING( 0x0, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1, "2bpl" )
+ PORT_DIPSETTING( 0x2, "4bpl" )
+ PORT_DIPSETTING( 0x3, "8bpl" )
+ PORT_DIPNAME( 0xc, 0x0, "Browse maps" )
+ PORT_DIPSETTING( 0x0, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4, "2bpl" )
+ PORT_DIPSETTING( 0x8, "4bpl" )
+ PORT_DIPSETTING( 0xc, "8bpl" )
+
+ PORT_START /* IN 10 : debug switches */
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Toggle BG 1") PORT_PLAYER(2)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Toggle BG 2") PORT_PLAYER(2)
+ PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Toggle BG 3") PORT_PLAYER(2)
+ PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Toggle BG 4") PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Toggle Objects") PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Toggle Main/Sub") PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Toggle Back col") PORT_PLAYER(3)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Toggle Windows") PORT_PLAYER(3)
+
+ PORT_START /* IN 11 : debug input */
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Pal prev")
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Pal next")
+ PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Toggle Transparency") PORT_PLAYER(4)
+#endif
+
+ PORT_START /* IN 12 : dip-switches */
+
+ PORT_START /* IN 13 : coins */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
+
+INPUT_PORTS_END
+
+static struct CustomSound_interface snes_sound_interface =
+{ snes_sh_start };
+
+static GFXDECODE_START( kinstb )
+GFXDECODE_END
+
+static PALETTE_INIT( snes )
+{
+ int i;
+
+ for( i = 0; i < 32768; i++ )
+ palette_set_color_rgb( machine, i, pal5bit(i >> 0), pal5bit(i >> 5), pal5bit(i >> 10) );
+
+ /* The colortable can be black */
+ for( i = 0; i < 256; i++ )
+ colortable[i] = 0;
+}
+
+static MACHINE_DRIVER_START( kinstb )
+ /* basic machine hardware */
+ MDRV_CPU_ADD_TAG("main", G65816, 3580000) /* 2.68Mhz, also 3.58Mhz */
+ MDRV_CPU_PROGRAM_MAP(kinstb_map, 0)
+
+ MDRV_CPU_ADD_TAG("sound", SPC700, 2048000/2) /* 2.048 Mhz, but internal divider */
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(spc_mem, 0)
+ MDRV_CPU_VBLANK_INT(NULL, 0)
+
+ MDRV_INTERLEAVE(400)
+
+ MDRV_MACHINE_START( snes )
+ MDRV_MACHINE_RESET( snes )
+
+ /* video hardware */
+ MDRV_VIDEO_START( generic_bitmapped )
+ MDRV_VIDEO_UPDATE( snes )
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_GFXDECODE(kinstb)
+ MDRV_PALETTE_LENGTH(32768)
+ MDRV_COLORTABLE_LENGTH(257)
+ MDRV_PALETTE_INIT( snes )
+
+ MDRV_SCREEN_ADD("main", 0)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(CUSTOM, 0)
+ MDRV_SOUND_CONFIG(snes_sound_interface)
+ MDRV_SOUND_ROUTE(0, "left", 1.00)
+ MDRV_SOUND_ROUTE(1, "right", 1.00)
+MACHINE_DRIVER_END
+
+static DRIVER_INIT(kinstb)
+{
+ INT32 i;
+ for(i=0;i<0x400000;i++)
+ {
+ memory_region(REGION_USER3)[i]=BITSWAP8(memory_region(REGION_USER3)[i],5,0,6,1,7,4,3,2 );
+ }
+ driver_init_snes_hirom(machine);
+}
+
+ROM_START( kinstb )
+ ROM_REGION( 0x400000, REGION_USER3, ROMREGION_DISPOSE )
+ 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, REGION_USER5, 0)
+ ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) )
+
+ ROM_REGION(0x800, REGION_USER6, ROMREGION_ERASEFF)
+
+ROM_END
+
+GAME( 199?, kinstb, 0, kinstb, kinstb, kinstb, ROT0, "bootleg", "Killer Instinct (SNES bootleg)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )