summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/sderby.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/sderby.c')
-rw-r--r--src/mame/drivers/sderby.c343
1 files changed, 343 insertions, 0 deletions
diff --git a/src/mame/drivers/sderby.c b/src/mame/drivers/sderby.c
new file mode 100644
index 00000000000..6e05453fbda
--- /dev/null
+++ b/src/mame/drivers/sderby.c
@@ -0,0 +1,343 @@
+/*
+ Playmark 'Super Derby' Hardware
+
+
+ Super Derby - Playmark
+ Roulette(?) - Playmark
+
+ Payout / hopper controls not connected
+
+ Roulette appears to have some kind of MCU device
+ between the processor and the hopper
+
+
+*/
+
+
+/*
+
+Super Derby
+Playmark '96
+
+mc 68k 12mhz
+OKI m6295
+
+2x GM 76c88al (8kx8 6264) near program ROMs
+2x 6264 near gfx ROMs
+16k nonvolatile SRAM (Dallas 1220Y)
+two FPGA chips - one labelled 'Playmark 010412'
+4x hm3-65728bk-5
+--
+21.bin 6F9F2F2B - near OKI (samples?)
+
+22.bin A319F1E0 - program code
+23.bin 1D6E2321 /
+
+24.bin 93C917DF - gfx
+25.bin 7BA485CD
+26.bin BEABE4F7
+27.bin 672CE5DF
+28.bin 39CA3B52
+--
+
+*/
+
+/* working notes: (Relating to SDERBY)
+
+Stephh's notes :
+
+ - The game is playable, but :
+
+ * it isn't possible to decrease the bet (but it might be an ingame "feature")
+ * it isn't possible to insert a note
+ * it isn't possible to exchange the winning points against tickets or cash
+
+ - The settings can be modified in the "test mode", but there aren't mapped to
+ input ports.
+
+
+EC notes :
+
+Thinks... Those three reads at the beginning - hopper, ticket and note acceptor tests?
+The system certainly performs those before printing the error.
+(There are three different error graphics in the ROM, depending on what is wrong)
+Also, hardware freezes if we try to turn the dispenser or acceptor on, because it's waiting
+for the response back from NOP?
+
+
+TO DO :
+
+ - figure out the reads from 0x308002.w and 0x30800e.w (see sderby_input_r read handler)
+ (by default, demo sounds are OFF, so change this in the "test mode")
+
+*/
+
+#include "driver.h"
+#include "sound/okim6295.h"
+
+UINT16 *sderby_fg_videoram;
+UINT16 *sderby_md_videoram;
+UINT16 *sderby_videoram;
+
+WRITE16_HANDLER( sderby_videoram_w );
+WRITE16_HANDLER( sderby_md_videoram_w );
+WRITE16_HANDLER( sderby_fg_videoram_w );
+VIDEO_START( sderby );
+VIDEO_UPDATE( sderby );
+VIDEO_UPDATE( pmroulet );
+WRITE16_HANDLER( sderby_scroll_w );
+
+
+static READ16_HANDLER ( sderby_input_r )
+{
+ switch (offset)
+ {
+ case 0x00 >> 1:
+ return readinputport(0);
+ case 0x02 >> 1:
+ return 0xffff; // to avoid game to reset (needs more work)
+ }
+
+ logerror("sderby_input_r : offset = %x - PC = %06x\n",offset*2,activecpu_get_pc());
+
+ return 0xffff;
+}
+
+static READ16_HANDLER( roulette_input_r )
+{
+ switch (offset)
+ {
+ case 0x00 >>1:
+ return readinputport(0);
+ case 0x02 >>1:
+ return readinputport(1);
+ case 0x04 >>1:
+ return readinputport(2);
+ }
+ return 0xffff;
+
+}
+
+static ADDRESS_MAP_START( sderby_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x308000, 0x30800d) AM_READ(sderby_input_r)
+ AM_RANGE(0x30800e, 0x30800f) AM_READ(OKIM6295_status_0_lsb_r)
+ AM_RANGE(0xd00000, 0xd001ff) AM_READ(MRA16_RAM)
+ AM_RANGE(0xf00000, 0xffffff) AM_READ(MRA16_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( sderby_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x100000, 0x100fff) AM_WRITE(sderby_videoram_w) AM_BASE(&sderby_videoram) // bg
+ AM_RANGE(0x101000, 0x101fff) AM_WRITE(sderby_md_videoram_w) AM_BASE(&sderby_md_videoram) // mid
+ AM_RANGE(0x102000, 0x103fff) AM_WRITE(sderby_fg_videoram_w) AM_BASE(&sderby_fg_videoram) // fg
+ AM_RANGE(0x104000, 0x10400b) AM_WRITE(sderby_scroll_w)
+ AM_RANGE(0x10400c, 0x10400d) AM_WRITE(MWA16_NOP) // ??? - check code at 0x000456 (executed once at startup)
+ AM_RANGE(0x10400e, 0x10400f) AM_WRITE(MWA16_NOP) // ??? - check code at 0x000524 (executed once at startup)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ AM_RANGE(0x308008, 0x308009) AM_WRITE(MWA16_NOP) // ???
+ AM_RANGE(0x30800e, 0x30800f) AM_WRITE(OKIM6295_data_0_lsb_w)
+ AM_RANGE(0x380000, 0x380fff) AM_WRITE(paletteram16_RRRRRGGGGGBBBBBx_word_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x500000, 0x500001) AM_WRITE(MWA16_NOP) // ??? - check code at 0x00042e (executed once at startup)
+ AM_RANGE(0xd00000, 0xd001ff) AM_WRITE(MWA16_RAM)
+ AM_RANGE(0xf00000, 0xffffff) AM_WRITE(MWA16_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( roulette_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_ROM
+ AM_RANGE(0x440000, 0x440fff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ AM_RANGE(0x500000, 0x500fff) AM_RAM AM_WRITE(sderby_videoram_w) AM_BASE(&sderby_videoram) // bg
+ AM_RANGE(0x501000, 0x501fff) AM_RAM AM_WRITE(sderby_md_videoram_w) AM_BASE(&sderby_md_videoram) // mid
+ AM_RANGE(0x502000, 0x503fff) AM_RAM AM_WRITE(sderby_fg_videoram_w) AM_BASE(&sderby_fg_videoram) // fg
+ AM_RANGE(0x504000, 0x50400b) AM_RAM AM_WRITE(sderby_scroll_w)
+ AM_RANGE(0x50400e, 0x50400f) AM_WRITE( MWA16_NOP )
+
+ AM_RANGE(0x708000, 0x70800d) AM_READ(roulette_input_r) AM_WRITE(MWA16_NOP) // what are the writes?
+ AM_RANGE(0x708008, 0x708009) AM_WRITE(MWA16_NOP) // ???
+ AM_RANGE(0x70800e, 0x70800f) AM_READ(OKIM6295_status_0_lsb_r) AM_WRITE(OKIM6295_data_0_lsb_w) // ?? it only ever plays 1 sound
+ AM_RANGE(0x780000, 0x780fff) AM_WRITE(paletteram16_RRRRRGGGGGBBBBBx_word_w) AM_BASE(&paletteram16)
+
+ AM_RANGE(0xf00000, 0xffffff) AM_RAM
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( sderby )
+ PORT_START /* 0x308000.w */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Bet")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Collect")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 ) // Adds n credits depending on settings in service menu
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_SERVICE_NO_TOGGLE(0x1000, IP_ACTIVE_LOW)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // check code at 0x00765e
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( pmroulet )
+ PORT_START
+ PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_VBLANK ) // it must be toggled to boot anyway
+ PORT_SERVICE_NO_TOGGLE(0x0020, IP_ACTIVE_LOW) // seems to be ..
+ PORT_BIT( 0x00c0, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0x0f00, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+
+ PORT_START
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x000e, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0x00f0, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0x0f00, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+
+ PORT_START
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0f00, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+ PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ?
+INPUT_PORTS_END
+
+static const gfx_layout tiles8x8_layout =
+{
+ 8,8,
+ RGN_FRAC(1,5),
+ 5,
+ { RGN_FRAC(4,5),RGN_FRAC(3,5),RGN_FRAC(2,5),RGN_FRAC(1,5),RGN_FRAC(0,5) },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+
+static const gfx_layout tiles16x16_layout =
+{
+ 16,16,
+ RGN_FRAC(1,5),
+ 5,
+ { RGN_FRAC(4,5),RGN_FRAC(3,5),RGN_FRAC(2,5),RGN_FRAC(1,5),RGN_FRAC(0,5) },
+ { 0, 1, 2, 3, 4, 5, 6, 7,
+ 128+0, 128+1,128+2,128+3,128+4,128+5,128+6,128+7
+ },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
+ 64+0*8,64+1*8,64+2*8,64+3*8,64+4*8,64+5*8,64+6*8,64+7*8
+
+ },
+
+ 256,
+};
+
+
+
+static GFXDECODE_START( sderby )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tiles8x8_layout, 0x000, 256 ) /* sprites */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tiles16x16_layout, 0x000, 256 ) /* sprites */
+
+GFXDECODE_END
+
+static MACHINE_DRIVER_START( sderby )
+ MDRV_CPU_ADD(M68000, 12000000)
+ MDRV_CPU_PROGRAM_MAP(sderby_readmem,sderby_writemem)
+ MDRV_CPU_VBLANK_INT(irq2_line_hold,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_GFXDECODE(sderby)
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(64*8, 64*8)
+ MDRV_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
+ MDRV_PALETTE_LENGTH(0x1000)
+
+ MDRV_VIDEO_START(sderby)
+ MDRV_VIDEO_UPDATE(sderby)
+
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(OKIM6295, 1056000)
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high) // clock frequency & pin 7 not verified
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( pmroulet )
+ MDRV_CPU_ADD(M68000, 12000000)
+ MDRV_CPU_PROGRAM_MAP(roulette_map,0)
+ MDRV_CPU_VBLANK_INT(irq2_line_hold,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+
+ MDRV_GFXDECODE(sderby)
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(64*8, 64*8)
+ MDRV_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
+ MDRV_PALETTE_LENGTH(0x1000)
+
+ MDRV_VIDEO_START(sderby)
+ MDRV_VIDEO_UPDATE(pmroulet)
+
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(OKIM6295, 1056000)
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high) // clock frequency & pin 7 not verified
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+MACHINE_DRIVER_END
+
+
+ROM_START( sderby )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "22.bin", 0x00000, 0x20000, CRC(a319f1e0) SHA1(d932cc7e990aa87308dcd9ffa5af2aaea333aa9a) )
+ ROM_LOAD16_BYTE( "23.bin", 0x00001, 0x20000, CRC(1d6e2321) SHA1(3bb32021cc9ee6bd6d1fd79a89159fef70f34f41) )
+
+ ROM_REGION( 0x080000, REGION_SOUND1, 0 ) /* Samples */
+ ROM_LOAD( "21.bin", 0x00000, 0x80000, CRC(6f9f2f2b) SHA1(9778439979bc21b3e49f0c16353488a33b93c01b) )
+
+ ROM_REGION( 0xa0000, REGION_GFX1, 0 ) /* Sprites */
+ ROM_LOAD( "24.bin", 0x00000, 0x20000, CRC(93c917df) SHA1(dc2fa5e29749ec92871c66146c0412a23f47e316) )
+ ROM_LOAD( "25.bin", 0x20000, 0x20000, CRC(7ba485cd) SHA1(b0170614d713af9d1556251c76ae762de872abe6) )
+ ROM_LOAD( "26.bin", 0x40000, 0x20000, CRC(beabe4f7) SHA1(a5615450fae930cb2408f201a9faa12551de0d70) )
+ ROM_LOAD( "27.bin", 0x60000, 0x20000, CRC(672ce5df) SHA1(cdf3af842cbcbf53cc73d9986744dc9cfa92c71a) )
+ ROM_LOAD( "28.bin", 0x80000, 0x20000, CRC(39ca3b52) SHA1(9a03e73d88a1551cd3cfe616ab71e67dced1272a) )
+ROM_END
+
+
+ROM_START( pmroulet )
+ ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "2.bin", 0x00000, 0x20000, CRC(1677a2de) SHA1(4dcbb3c1ce9b65e06ba7e0cffa00c0c8016538f5))
+ ROM_LOAD16_BYTE( "3.bin", 0x00001, 0x20000, CRC(11acaac2) SHA1(19e7bbbf4356fc9a866f9f36d0568c42d6a36c07))
+
+ ROM_REGION( 0x080000, REGION_SOUND1, 0 ) /* Samples */
+ ROM_LOAD( "1.bin", 0x00000, 0x40000, CRC(6673de85) SHA1(df390cd6268efc0e743a9020f19bc0cbeb757cfa))
+
+ ROM_REGION( 0x280000, REGION_GFX1, 0 ) /* Sprites */
+ ROM_LOAD( "4.bin", 0x000000, 0x80000, CRC(efcddac9) SHA1(72435ec478b70a067d47f3daf7c224169ee5827a))
+ ROM_LOAD( "5.bin", 0x080000, 0x80000, CRC(bc75ef8f) SHA1(1f3dc457e5ae143d53cfef0e1fcb4586dceefb67))
+ ROM_LOAD( "6.bin", 0x100000, 0x80000, CRC(e47d5f55) SHA1(a341e24f98125265cb3986f8c7ce84eedd056b71))
+ ROM_LOAD( "7.bin", 0x180000, 0x80000, CRC(0fa6ce7d) SHA1(5ba96c9c0625a131d890d9c0c0f65cb2a03fa084))
+ ROM_LOAD( "8.bin", 0x200000, 0x80000, CRC(d4c2b7da) SHA1(515be861443acc5b911241dbaafa42e02f79985a))
+ROM_END
+
+GAME( 1996, sderby, 0, sderby, sderby, 0, ROT0, "Playmark", "Super Derby", 0 )
+GAME( 1997, pmroulet, 0, pmroulet, pmroulet, 0, ROT0, "Playmark", "Croupier (Playmark Roulette)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION )
+