summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/crbaloon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/crbaloon.c')
-rw-r--r--src/mame/drivers/crbaloon.c418
1 files changed, 418 insertions, 0 deletions
diff --git a/src/mame/drivers/crbaloon.c b/src/mame/drivers/crbaloon.c
new file mode 100644
index 00000000000..5d19aabd8e1
--- /dev/null
+++ b/src/mame/drivers/crbaloon.c
@@ -0,0 +1,418 @@
+/***************************************************************************
+
+Crazy Balloon memory map (preliminary)
+
+0000-2fff ROM
+4000-43ff RAM
+4800-4bff Video RAM
+5000-53ff Color RAM
+
+I/O:
+
+read:
+00 dsw
+01 joystick
+02 bit 0-3 from chip PC3259 (bit 3 is the sprite/char collision detection)
+ bit 4-7 dsw
+03 bit 0 dsw
+ bit 1 high score name reset
+ bit 2 service
+ bit 3 tilt
+ bit 4-7 from chip PC3092; coin inputs & start buttons
+06-0a-0e mirror addresses for 02; address lines 2 and 3 go to the PC3256 chip
+ so they probably alter its output, while the dsw bits (4-7) stay the same.
+
+write:
+01 ?
+02 bit 0-3 sprite code bit 4-7 sprite color
+03 sprite X pos
+04 sprite Y pos
+05 music?? to a counter?
+06 sound
+ bit 0 IRQ enable/acknowledge
+ bit 1 sound enable
+ bit 2 sound related (to amplifier)
+ bit 3 explosion (to 76477)
+ bit 4 breath (to 76477)
+ bit 5 appear (to 76477)
+ bit 6 sound related (to 555)
+ bit 7 to chip PC3259
+07 to chip PC3092 (bits 0-3)
+08 to chip PC3092 (bits 0-3)
+ bit 0 seems to be flip screen
+ bit 1 might enable coin input
+09 to chip PC3092 (bits 0-3)
+0a to chip PC3092 (bits 0-3)
+0b to chip PC3092 (bits 0-3)
+0c MSK (to chip PC3259)
+0d CC (not used)
+
+***************************************************************************/
+
+#include "driver.h"
+#include "sound/sn76477.h"
+#include "sound/custom.h"
+#include "crbaloon.h"
+
+
+
+static UINT8 val06,val08,val0a;
+
+static MACHINE_START( crbaloon )
+{
+ state_save_register_global(val06);
+ state_save_register_global(val08);
+ state_save_register_global(val0a);
+}
+
+static WRITE8_HANDLER( crbaloon_06_w )
+{
+ val06 = data;
+
+ interrupt_enable_w(offset,data & 1);
+
+ /* SOUND STOP is really sound enable */
+ sound_global_enable(data & 0x02);
+
+ /* enable is connected to EXPLOSION */
+ SN76477_enable_w(0, (data & 0x08) ? 1 : 0);
+
+ /* BREATH changes slf_res to 10k (middle of two 10k resistors) */
+ /* it also puts a tantal capacitor against GND on the output,
+ but this section of the schematics is not readable. */
+ SN76477_slf_res_w(0, (data & 0x10) ? RES_K(10) : RES_K(20) );
+
+ /* APPEAR is connected to MIXER B */
+ SN76477_mixer_b_w(0, (data & 0x20) ? 1 : 0);
+
+ discrete_sound_w(CRBALOON_MUSIC_EN, data & 0x04);
+ discrete_sound_w(CRBALOON_LAUGH_EN, data & 0x40);
+}
+
+static WRITE8_HANDLER( crbaloon_08_w )
+{
+ val08 = data;
+
+ crbaloon_flipscreen_w(offset,data & 1);
+}
+
+static WRITE8_HANDLER( crbaloon_0a_w )
+{
+ val0a = data;
+}
+
+static READ8_HANDLER( crbaloon_IN2_r )
+{
+ if (crbaloon_collision != 0)
+ {
+ return (input_port_2_r(0) & 0xf0) | 0x08;
+ }
+
+ /* the following is needed for the game to boot up */
+ if (val06 & 0x80)
+ {
+logerror("PC %04x: %02x high\n",activecpu_get_pc(),offset);
+ return (input_port_2_r(0) & 0xf0) | 0x07;
+ }
+ else
+ {
+logerror("PC %04x: %02x low\n",activecpu_get_pc(),offset);
+ return (input_port_2_r(0) & 0xf0) | 0x07;
+ }
+}
+
+static READ8_HANDLER( crbaloon_IN3_r )
+{
+ if (val08 & 0x02)
+ /* enable coin & start input? Wild guess!!! */
+ return input_port_3_r(0);
+
+ /* the following is needed for the game to boot up */
+ if (val0a & 0x01)
+ {
+logerror("PC %04x: 03 high\n",activecpu_get_pc());
+ return (input_port_3_r(0) & 0x0f) | 0x00;
+ }
+ else
+ {
+logerror("PC %04x: 03 low\n",activecpu_get_pc());
+ return (input_port_3_r(0) & 0x0f) | 0x00;
+ }
+}
+
+
+static READ8_HANDLER( crbaloon_IN_r )
+{
+ switch (offset & 0x03)
+ {
+ case 0:
+ return input_port_0_r(offset);
+
+ case 1:
+ return input_port_1_r(offset);
+
+ case 2:
+ return crbaloon_IN2_r(offset);
+
+ case 3:
+ return crbaloon_IN3_r(offset);
+ }
+
+ return 0;
+}
+
+static WRITE8_HANDLER( crbaloon_tone_w )
+{
+ discrete_sound_w(CRBALOON_MUSIC_DATA, data);
+}
+
+
+
+static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x2fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x4000, 0x43ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x4800, 0x4bff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x5000, 0x53ff) AM_READ(MRA8_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x2fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x4000, 0x43ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x4800, 0x4bff) AM_WRITE(crbaloon_videoram_w) AM_BASE(&videoram)
+ AM_RANGE(0x5000, 0x53ff) AM_WRITE(crbaloon_colorram_w) AM_BASE(&colorram)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x0f) AM_READ(crbaloon_IN_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x02, 0x04) AM_WRITE(crbaloon_spritectrl_w)
+ AM_RANGE(0x05, 0x05) AM_WRITE(crbaloon_tone_w)
+ AM_RANGE(0x06, 0x06) AM_WRITE(crbaloon_06_w)
+ AM_RANGE(0x08, 0x08) AM_WRITE(crbaloon_08_w)
+ AM_RANGE(0x0a, 0x0a) AM_WRITE(crbaloon_0a_w)
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( crbaloon )
+ PORT_START_TAG("DSW0") // 0
+ PORT_DIPNAME( 0x01, 0x01, "Test?" )
+ PORT_DIPSETTING( 0x01, "I/O Check?" )
+ PORT_DIPSETTING( 0x00, "RAM Check?" )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x0c, 0x04, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x00, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x08, "4" )
+ PORT_DIPSETTING( 0x0c, "5" )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x00, "5000" )
+ PORT_DIPSETTING( 0x10, "10000" )
+ PORT_DIPNAME( 0xe0, 0x80, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0xa0, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0xe0, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x00, "Disable" )
+
+ PORT_START_TAG("IN0") // 1
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
+
+ PORT_START_TAG("DSW1") // 2
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* from chip PC3259 */
+ PORT_DIPNAME( 0x10, 0x10, "Invulnerability (Cheat)")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START_TAG("IN1") // 3
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("High Score Name Reset")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) /* should be COIN2 */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT )
+ /* the following four bits come from chip PC3092 */
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START_TAG("VR2") // 4
+ PORT_ADJUSTER(50, "VR2 - Beep")
+
+ PORT_START_TAG("VR3") // 5
+ PORT_ADJUSTER(50, "VR3 - Music")
+
+INPUT_PORTS_END
+
+
+
+static const gfx_layout charlayout =
+{
+ 8,8, /* 8*8 characters */
+ 256, /* 256 characters */
+ 1, /* 1 bit per pixel */
+ { 0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 7*8, 6*8, 5*8, 4*8, 3*8, 2*8, 1*8, 0*8 },
+ 8*8 /* every char takes 8 consecutive bytes */
+};
+static const gfx_layout spritelayout =
+{
+ 32,32, /* 32*32 sprites */
+ 16, /* 16 sprites */
+ 1, /* 1 bit per pixel */
+ { 0 },
+ { 3*32*8+0, 3*32*8+1, 3*32*8+2, 3*32*8+3, 3*32*8+4, 3*32*8+5, 3*32*8+6, 3*32*8+7,
+ 2*32*8+0, 2*32*8+1, 2*32*8+2, 2*32*8+3, 2*32*8+4, 2*32*8+5, 2*32*8+6, 2*32*8+7,
+ 1*32*8+0, 1*32*8+1, 1*32*8+2, 1*32*8+3, 1*32*8+4, 1*32*8+5, 1*32*8+6, 1*32*8+7,
+ 0*32*8+0, 0*32*8+1, 0*32*8+2, 0*32*8+3, 0*32*8+4, 0*32*8+5, 0*32*8+6, 0*32*8+7 },
+ { 31*8, 30*8, 29*8, 28*8, 27*8, 26*8, 25*8, 24*8,
+ 23*8, 22*8, 21*8, 20*8, 19*8, 18*8, 17*8, 16*8,
+ 15*8, 14*8, 13*8, 12*8, 11*8, 10*8, 9*8, 8*8,
+ 7*8, 6*8, 5*8, 4*8, 3*8, 2*8, 1*8, 0*8 },
+ 32*4*8 /* every sprite takes 128 consecutive bytes */
+};
+
+
+static GFXDECODE_START( crbaloon )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 16 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, spritelayout, 0, 16 )
+GFXDECODE_END
+
+
+static struct SN76477interface sn76477_interface =
+{
+ RES_K( 47), /* 4 noise_res */
+ RES_K(330), /* 5 filter_res */
+ CAP_P(470), /* 6 filter_cap */
+ RES_K(220), /* 7 decay_res */
+ CAP_U(1.0), /* 8 attack_decay_cap */
+ RES_K(4.7), /* 10 attack_res */
+ RES_M( 1), /* 11 amplitude_res */
+ RES_K(200), /* 12 feedback_res */
+ 5.0, /* 16 vco_voltage */
+ CAP_P(470), /* 17 vco_cap */
+ RES_K(330), /* 18 vco_res */
+ 5.0, /* 19 pitch_voltage */
+ RES_K( 20), /* 20 slf_res (variable) */
+ CAP_P(420), /* 21 slf_cap */
+ CAP_U(1.0), /* 23 oneshot_cap */
+ RES_K( 47), /* 24 oneshot_res */
+ 0, /* 22 vco */
+ 0, /* 26 mixer A */
+ 0, /* 25 mixer B (variable) */
+ 1, /* 27 mixer C */
+ 1, /* 1 envelope 1 */
+ 0, /* 28 envelope 2 */
+ 0 /* 9 enable (variable) */
+};
+
+
+static MACHINE_DRIVER_START( crbaloon )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 3072000) /* 3.072 MHz ????? */
+ MDRV_CPU_PROGRAM_MAP(readmem,writemem)
+ MDRV_CPU_IO_MAP(readport,writeport)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_MACHINE_START(crbaloon)
+
+ /* 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, 0*8, 28*8-1)
+ MDRV_GFXDECODE(crbaloon)
+ MDRV_PALETTE_LENGTH(16)
+ MDRV_COLORTABLE_LENGTH(16*2)
+
+ MDRV_PALETTE_INIT(crbaloon)
+ MDRV_VIDEO_START(crbaloon)
+ MDRV_VIDEO_UPDATE(crbaloon)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(SN76477, 0)
+ MDRV_SOUND_CONFIG(sn76477_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0)
+
+ MDRV_SOUND_ADD_TAG("discrete", DISCRETE, 0)
+ MDRV_SOUND_CONFIG_DISCRETE(crbaloon)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_DRIVER_END
+
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( crbaloon )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "cl01.bin", 0x0000, 0x0800, CRC(9d4eef0b) SHA1(a8dd814ac2612073982123c91fa62deaf5bee242) )
+ ROM_LOAD( "cl02.bin", 0x0800, 0x0800, CRC(10f7a6f7) SHA1(e672a7dcdaae08b202cfc2e19033846ebb267e1b) )
+ ROM_LOAD( "cl03.bin", 0x1000, 0x0800, CRC(44ed6030) SHA1(8bbf5d9e893710138be15e56682037f128c83527) )
+ ROM_LOAD( "cl04.bin", 0x1800, 0x0800, CRC(62f66f6c) SHA1(d173b12d6b5e0719d7b25ff0cafebbe64ec6b134) )
+ ROM_LOAD( "cl05.bin", 0x2000, 0x0800, CRC(c8f1e2be) SHA1(a4603ce0268fa987f7f780702b6ca04e28759674) )
+ ROM_LOAD( "cl06.bin", 0x2800, 0x0800, CRC(7d465691) SHA1(f5dc7abe8db232f702419d126cee6607ea6a5168) )
+
+ ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "cl07.bin", 0x0000, 0x0800, CRC(2c1fbea8) SHA1(41cf2aef74d56173057886512d989f6fa3682056) )
+
+ ROM_REGION( 0x0800, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "cl08.bin", 0x0000, 0x0800, CRC(ba898659) SHA1(4291059b113ff91896f1f61a4c14956716edfe1e) )
+ROM_END
+
+ROM_START( crbalon2 )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "cl01.bin", 0x0000, 0x0800, CRC(9d4eef0b) SHA1(a8dd814ac2612073982123c91fa62deaf5bee242) )
+ ROM_LOAD( "crazybal.ep2", 0x0800, 0x0800, CRC(87572086) SHA1(dba842c7c4cb16154ae0da43d71f8f03a56441c3) )
+ ROM_LOAD( "crazybal.ep3", 0x1000, 0x0800, CRC(575fe995) SHA1(829db1da27cc9b706db6d9563bd271ffcd42be4a) )
+ ROM_LOAD( "cl04.bin", 0x1800, 0x0800, CRC(62f66f6c) SHA1(d173b12d6b5e0719d7b25ff0cafebbe64ec6b134) )
+ ROM_LOAD( "cl05.bin", 0x2000, 0x0800, CRC(c8f1e2be) SHA1(a4603ce0268fa987f7f780702b6ca04e28759674) )
+ ROM_LOAD( "crazybal.ep6", 0x2800, 0x0800, CRC(fed6ff5c) SHA1(e6ed276949fd1511c6abe97026793193fda36e92) )
+
+ ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "cl07.bin", 0x0000, 0x0800, CRC(2c1fbea8) SHA1(41cf2aef74d56173057886512d989f6fa3682056) )
+
+ ROM_REGION( 0x0800, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "cl08.bin", 0x0000, 0x0800, CRC(ba898659) SHA1(4291059b113ff91896f1f61a4c14956716edfe1e) )
+ROM_END
+
+
+
+GAME( 1980, crbaloon, 0, crbaloon, crbaloon, 0, ROT90, "Taito Corporation", "Crazy Balloon (set 1)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
+GAME( 1980, crbalon2, crbaloon, crbaloon, crbaloon, 0, ROT90, "Taito Corporation", "Crazy Balloon (set 2)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )