summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/carjmbre.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/carjmbre.c')
-rw-r--r--src/mame/drivers/carjmbre.c252
1 files changed, 252 insertions, 0 deletions
diff --git a/src/mame/drivers/carjmbre.c b/src/mame/drivers/carjmbre.c
new file mode 100644
index 00000000000..fcf3f1de91b
--- /dev/null
+++ b/src/mame/drivers/carjmbre.c
@@ -0,0 +1,252 @@
+/*
+Car Jamboree
+Omori Electric CAD (OEC) 1981
+
+c14 c.d19
+c13 c.d18 c10
+c12 c9
+c11 2125 2125
+ 2125 2125
+ 2125 2125 2114 2114
+ 2125 2125 2114 2114
+ 2125 2125 c8
+ 2125 2125 c7
+ c6
+ c5
+ c4
+ c3
+5101 c2
+5101 c1
+ 6116
+18.432MHz
+ 6116
+Z80A c15
+ Z80A
+ 8910 SW
+ 8910
+
+Notes:
+
+- sound cpu speed chosen from coin error countdown, 1.536 MHz is too fast
+ as it loses synchronisation with the onscreen timer
+
+- some sprite glitches from sprite number/colour changes happening on
+ different frames, possibly original behaviour. eg cars changing colour
+ just before exploding, animals displaying as the wrong sprite for one
+ frame when entering the arena
+
+- colours are wrong, sprites and characters only using one of the proms
+
+- background colour calculation is a guess
+*/
+
+#include "driver.h"
+#include "sound/ay8910.h"
+
+WRITE8_HANDLER( carjmbre_flipscreen_w );
+WRITE8_HANDLER( carjmbre_bgcolor_w );
+WRITE8_HANDLER( carjmbre_videoram_w );
+
+PALETTE_INIT( carjmbre );
+VIDEO_START( carjmbre );
+VIDEO_UPDATE( carjmbre );
+
+
+static ADDRESS_MAP_START( carjmbre_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x8000, 0x87ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x8800, 0x8800) AM_READ(MRA8_NOP) //?? possibly watchdog
+ AM_RANGE(0x9000, 0x97ff) AM_READ(videoram_r)
+ AM_RANGE(0xa000, 0xa000) AM_READ(input_port_0_r)
+ AM_RANGE(0xa800, 0xa800) AM_READ(input_port_1_r)
+ AM_RANGE(0xb800, 0xb800) AM_READ(input_port_2_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( carjmbre_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x8000, 0x87ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x8803, 0x8803) AM_WRITE(interrupt_enable_w)
+ AM_RANGE(0x8805, 0x8806) AM_WRITE(carjmbre_bgcolor_w) //guess
+ AM_RANGE(0x8807, 0x8807) AM_WRITE(carjmbre_flipscreen_w)
+ AM_RANGE(0x8fc1, 0x8fc1) AM_WRITE(MWA8_NOP) //overrun during initial screen clear
+ AM_RANGE(0x8fe1, 0x8fe1) AM_WRITE(MWA8_NOP) //overrun during initial screen clear
+ AM_RANGE(0x9000, 0x97ff) AM_WRITE(carjmbre_videoram_w) AM_BASE(&videoram)
+ AM_RANGE(0x9800, 0x985f) AM_WRITE(spriteram_w) AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
+ AM_RANGE(0x9880, 0x98df) AM_WRITE(MWA8_RAM) //spriteram mirror
+ AM_RANGE(0xb800, 0xb800) AM_WRITE(soundlatch_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( carjmbre_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x0fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x1000, 0x10ff) AM_READ(MRA8_NOP) //look to be stray reads from 10/12/14/16/18xx
+ AM_RANGE(0x1200, 0x12ff) AM_READ(MRA8_NOP)
+ AM_RANGE(0x1400, 0x14ff) AM_READ(MRA8_NOP)
+ AM_RANGE(0x1600, 0x16ff) AM_READ(MRA8_NOP)
+ AM_RANGE(0x1800, 0x18ff) AM_READ(MRA8_NOP)
+ AM_RANGE(0x2000, 0x27ff) AM_READ(MRA8_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( carjmbre_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x0fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x2000, 0x27ff) AM_WRITE(MWA8_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( carjmbre_sound_readport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x00) AM_READ(soundlatch_r)
+ AM_RANGE(0x24, 0x24) AM_READ(MRA8_NOP) //??
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( carjmbre_sound_writeport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x10, 0x10) AM_WRITE(MWA8_NOP) //?? written on init/0xff sound command reset
+ AM_RANGE(0x20, 0x20) AM_WRITE(AY8910_control_port_0_w)
+ AM_RANGE(0x21, 0x21) AM_WRITE(AY8910_write_port_0_w)
+ AM_RANGE(0x22, 0x22) AM_WRITE(MWA8_NOP) //?? written before and after 0x21 with same value
+ AM_RANGE(0x30, 0x30) AM_WRITE(AY8910_control_port_1_w)
+ AM_RANGE(0x31, 0x31) AM_WRITE(AY8910_write_port_1_w)
+ AM_RANGE(0x32, 0x32) AM_WRITE(MWA8_NOP) //?? written before and after 0x31 with same value
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( carjmbre )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) //coin error if held high for 1s
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) //or if many coins inserted quickly
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
+
+ PORT_START_TAG("IN2")
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x18, 0x00, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x08, "4" )
+ PORT_DIPSETTING( 0x10, "5" )
+ PORT_DIPSETTING( 0x18, "250 (Cheat)")
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x00, "10k, then every 100k" )
+ PORT_DIPSETTING( 0x20, "20k, then every 100k" )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+INPUT_PORTS_END
+
+static const gfx_layout carjmbre_charlayout =
+{
+ 8,8,
+ RGN_FRAC(2,4),
+ 2,
+ { RGN_FRAC(0,4), RGN_FRAC(2,4) },
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ 8*8
+};
+
+static const gfx_layout carjmbre_spritelayout =
+{
+ 16,16,
+ RGN_FRAC(1,4),
+ 2,
+ { RGN_FRAC(2,4), RGN_FRAC(0,4) },
+ { STEP8(0,1), STEP8(256*16*8,1) },
+ { STEP16(0,8) },
+ 16*8
+};
+
+static GFXDECODE_START( carjmbre )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, carjmbre_charlayout, 0, 16 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, carjmbre_spritelayout, 0, 16 )
+GFXDECODE_END
+
+static MACHINE_DRIVER_START( carjmbre )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80,18432000/6)
+ MDRV_CPU_PROGRAM_MAP(carjmbre_readmem,carjmbre_writemem)
+ MDRV_CPU_VBLANK_INT(nmi_line_pulse,1)
+
+ MDRV_CPU_ADD(Z80, 1500000)
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(carjmbre_sound_readmem,carjmbre_sound_writemem)
+ MDRV_CPU_IO_MAP(carjmbre_sound_readport,carjmbre_sound_writeport)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ MDRV_GFXDECODE(carjmbre)
+ MDRV_PALETTE_LENGTH(64)
+ MDRV_COLORTABLE_LENGTH(64)
+
+ MDRV_PALETTE_INIT(carjmbre)
+ MDRV_VIDEO_START(carjmbre)
+ MDRV_VIDEO_UPDATE(carjmbre)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(AY8910, 1500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.12)
+
+ MDRV_SOUND_ADD(AY8910, 1500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.12)
+MACHINE_DRIVER_END
+
+ROM_START( carjmbre )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "c1", 0x0000, 0x1000, CRC(62b21739) SHA1(710e5c52f27603aa8f864f6f28d7272f21271d60) )
+ ROM_LOAD( "c2", 0x1000, 0x1000, CRC(9ab1a0fa) SHA1(519cf67b98e62b2b42232788ba01ab6637880afc) )
+ ROM_LOAD( "c3", 0x2000, 0x1000, CRC(bb29e100) SHA1(93e3cfcf7f8b0b36327f402d9a64c04c3b2c7549) )
+ ROM_LOAD( "c4", 0x3000, 0x1000, CRC(c63d8f97) SHA1(9f08fd1cd24a1fb4011864c06580985e009d9af4) )
+ ROM_LOAD( "c5", 0x4000, 0x1000, CRC(4d593942) SHA1(30cc649a4be3d7f3705f55d8d0dadb0b63d59ec9) )
+ ROM_LOAD( "c6", 0x5000, 0x1000, CRC(fb576963) SHA1(5bf5c54a7c12aa55272629c12b414bf49cda0f1f) )
+ ROM_LOAD( "c7", 0x6000, 0x1000, CRC(2b8c4511) SHA1(428a48d6b14455d66720a115bc5f35293dc50de7) )
+ ROM_LOAD( "c8", 0x7000, 0x1000, CRC(51cc22a7) SHA1(f614368bfee04f084c70bf145801ac46e5631acb) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "c15", 0x0000, 0x1000, CRC(7d7779d1) SHA1(f8f5246be4cc9632076d3330fc3d3343b911dfee) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "c9", 0x0000, 0x1000, CRC(2accb821) SHA1(ce2804536fc1abd3377dc864c8c9976ca28c1b6e) )
+ ROM_LOAD( "c10", 0x1000, 0x1000, CRC(75ddbe56) SHA1(5e1363967a822265618793ccb74bf3ef5e0e00b5) )
+
+ ROM_REGION( 0x4000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "c11", 0x0000, 0x1000, CRC(d90cd126) SHA1(7ee110cf19b45ee654016ba0ce92f3db6ea2ed92) )
+ ROM_LOAD( "c12", 0x1000, 0x1000, CRC(b3bb39d7) SHA1(89c901be6fae2356ce4d2653e94bf28d6bcf41fe) )
+ ROM_LOAD( "c13", 0x2000, 0x1000, CRC(3004010b) SHA1(00d5d2185014159112eb90d8ed50092a3b4ab664) )
+ ROM_LOAD( "c14", 0x3000, 0x1000, CRC(fb5f0d31) SHA1(7a27af91efc836bb48c6ed3b283b7c5f7b31c4b5) )
+
+ ROM_REGION( 0x0040, REGION_PROMS, 0 )
+ ROM_LOAD( "c.d19", 0x0000, 0x0020, CRC(220bceeb) SHA1(46b9f867d014596e2aa7503f104dc721965f0ed5) )
+ ROM_LOAD( "c.d18", 0x0020, 0x0020, CRC(7b9ed1b0) SHA1(ec5e1f56e5a2fc726083866c08ac0e1de0ed6ace) )
+ROM_END
+
+GAME( 1983, carjmbre, 0, carjmbre, carjmbre, 0, ROT90, "Omori Electric Co., Ltd.", "Car Jamboree", GAME_IMPERFECT_COLORS )