summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/troangel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/troangel.c')
-rw-r--r--src/mame/drivers/troangel.c295
1 files changed, 295 insertions, 0 deletions
diff --git a/src/mame/drivers/troangel.c b/src/mame/drivers/troangel.c
new file mode 100644
index 00000000000..841d37ca324
--- /dev/null
+++ b/src/mame/drivers/troangel.c
@@ -0,0 +1,295 @@
+/****************************************************************************
+
+Tropical Angel
+
+driver by Phil Stroffolino
+
+IREM M57 board stack with a M52-SOUND-E sound PCB.
+
+M57-A-A:
+ TA-A-xx roms and proms
+ NEC D780C (Z80) CPU
+ NANAO KNA6032601 custom chip
+ NANAO KNA6032701 custom chip
+ 8-way dipswitch (x2)
+ M58725P RAM (x3)
+ CN1 - Ribbon cable connector
+ CN2 - Ribbon cable connector
+ Ribbon cable connector to sound PCB
+
+M57-B-A:
+ TA-B-xx roms and proms
+ 18.432 MHz OSC
+ CN1 - Ribbon cable connector
+ CN2 - Ribbon cable connector
+
+M52:
+ HD6803 CPU
+ AY-3-9810 (x2) sound chips
+ MSM5205 OKI sound chip (and an unpopulated socket for a second MSM5202)
+ 3.579545 MHz OSC
+ 2764 Program rom labeled "TA S-1A-"
+ Ribbon cable connector to M57-A-A PCB
+
+New Tropical Angel:
+ Roms where found on an official IREM board with genuine IREM Tropical Angel
+ license seal and genuine IREM serial number sticker.
+ The "new" roms have hand written labels, while those that match the current
+ Tropical Angel set look to be factory labeled chips.
+
+****************************************************************************/
+#include "driver.h"
+#include "audio/irem.h"
+
+extern UINT8 *troangel_scroll;
+WRITE8_HANDLER( troangel_flipscreen_w );
+PALETTE_INIT( troangel );
+VIDEO_UPDATE( troangel );
+
+
+
+static ADDRESS_MAP_START( troangel_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x8000, 0x8fff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x9000, 0x90ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0xd000, 0xd000) AM_READ(input_port_0_r)
+ AM_RANGE(0xd001, 0xd001) AM_READ(input_port_1_r)
+ AM_RANGE(0xd002, 0xd002) AM_READ(input_port_2_r)
+ AM_RANGE(0xd003, 0xd003) AM_READ(input_port_3_r)
+ AM_RANGE(0xd004, 0xd004) AM_READ(input_port_4_r)
+ AM_RANGE(0xe000, 0xe7ff) AM_READ(MRA8_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( troangel_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x8000, 0x87ff) AM_WRITE(videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size)
+// AM_RANGE(0x8800, 0x8fff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x9000, 0x91ff) AM_WRITE(MWA8_RAM) AM_BASE(&troangel_scroll)
+ AM_RANGE(0xc820, 0xc8ff) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
+ AM_RANGE(0xd000, 0xd000) AM_WRITE(irem_sound_cmd_w)
+ AM_RANGE(0xd001, 0xd001) AM_WRITE(troangel_flipscreen_w) /* + coin counters */
+ AM_RANGE(0xe000, 0xe7ff) AM_WRITE(MWA8_RAM)
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( troangel )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
+ /* coin input must be active for 19 frames to be consistently recognized */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(19)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
+
+ PORT_START_TAG("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+
+ PORT_START_TAG("DSW1")
+ PORT_DIPNAME( 0x03, 0x03, "Time" )
+ PORT_DIPSETTING( 0x03, "180 160 140" )
+ PORT_DIPSETTING( 0x02, "160 140 120" )
+ PORT_DIPSETTING( 0x01, "140 120 100" )
+ PORT_DIPSETTING( 0x00, "120 100 100" )
+ PORT_DIPNAME( 0x04, 0x04, "Crash Loss Time" )
+ PORT_DIPSETTING( 0x04, "5" )
+ PORT_DIPSETTING( 0x00, "10" )
+ PORT_DIPNAME( 0x08, 0x08, "Background Sound" )
+ PORT_DIPSETTING( 0x08, "Boat Motor" )
+ PORT_DIPSETTING( 0x00, "Music" )
+ /* TODO: support the different settings which happen in Coin Mode 2 */
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coinage ) ) /* mapped on coin mode 1 */
+ PORT_DIPSETTING( 0xa0, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0xb0, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0xd0, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0xe0, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x70, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x50, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
+ /* settings 0x10, 0x20, 0x80, 0x90 all give 1 Coin/1 Credit */
+
+ PORT_START_TAG("DSW2")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) )
+/* This activates a different coin mode. Look at the dip switch setting schematic */
+ PORT_DIPNAME( 0x04, 0x04, "Coin Mode" )
+ PORT_DIPSETTING( 0x04, "Mode 1" )
+ PORT_DIPSETTING( 0x00, "Mode 2" )
+/* TODO: the following enables an analog accelerator input read from 0xd003 */
+/* however that is the DSW1 input so it must be multiplexed some way */
+ PORT_DIPNAME( 0x08, 0x08, "Analog Accelarator" )
+ PORT_DIPSETTING( 0x08, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ /* In stop mode, press 2 to stop and 1 to restart */
+ PORT_DIPNAME( 0x10, 0x10, "Stop Mode (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, "Invulnerability (Cheat)")
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
+INPUT_PORTS_END
+
+
+
+static const gfx_layout charlayout =
+{
+ 8,8, /* character size */
+ 1024, /* number of characters */
+ 3, /* bits per pixel */
+ { 0, 1024*8*8, 2*1024*8*8 },
+ { 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 /* character offset */
+};
+
+static const gfx_layout spritelayout =
+{
+ 16,32, /* sprite size */
+ 64, /* number of sprites */
+ 3, /* bits per pixel */
+ { 0, 0x4000*8, 2*0x4000*8 },
+ { 0, 1, 2, 3, 4, 5, 6, 7,
+ 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
+ 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8,
+ 256*64+0*8, 256*64+1*8, 256*64+2*8, 256*64+3*8, 256*64+4*8, 256*64+5*8, 256*64+6*8, 256*64+7*8,
+ 256*64+8*8, 256*64+9*8, 256*64+10*8, 256*64+11*8, 256*64+12*8, 256*64+13*8, 256*64+14*8, 256*64+15*8 },
+ 32*8 /* character offset */
+};
+
+static GFXDECODE_START( troangel )
+ GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 32 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0x0000, spritelayout, 32*8, 32 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0x1000, spritelayout, 32*8, 32 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0x2000, spritelayout, 32*8, 32 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0x3000, spritelayout, 32*8, 32 )
+GFXDECODE_END
+
+
+
+static MACHINE_DRIVER_START( troangel )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 3000000) /* 3 MHz ??? */
+ MDRV_CPU_PROGRAM_MAP(troangel_readmem,troangel_writemem)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_SCREEN_REFRESH_RATE(57)
+ MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790) /* accurate frequency, measured on a Moon Patrol board, is 56.75Hz. */)
+ /* the Lode Runner manual (similar but different hardware) */
+ /* talks about 55Hz and 1790ms 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(1*8, 31*8-1, 1*8, 31*8-1)
+ MDRV_GFXDECODE(troangel)
+ MDRV_PALETTE_LENGTH(32*8+16)
+ MDRV_COLORTABLE_LENGTH(32*8+32*8)
+
+ MDRV_PALETTE_INIT(troangel)
+ MDRV_VIDEO_START(generic)
+ MDRV_VIDEO_UPDATE(troangel)
+
+ /* sound hardware */
+ MDRV_IMPORT_FROM(irem_audio)
+MACHINE_DRIVER_END
+
+
+
+
+ROM_START( troangel )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* main CPU */
+ ROM_LOAD( "ta-a-3k", 0x0000, 0x2000, CRC(f21f8196) SHA1(7cbf74b77a559ee70312b799e707394d9b849f5b) )
+ ROM_LOAD( "ta-a-3m", 0x2000, 0x2000, CRC(58801e55) SHA1(91bdda778f2c4486001bc4ad26d6f21ba275ae08) )
+ ROM_LOAD( "ta-a-3n", 0x4000, 0x2000, CRC(de3dea44) SHA1(1290755ffc04dc3b3667e063118669a0eab6fb79) )
+ ROM_LOAD( "ta-a-3q", 0x6000, 0x2000, CRC(fff0fc2a) SHA1(82f3f5a8817e956192323eb555daa85b7766676d) )
+
+ ROM_REGION( 0x10000 , REGION_CPU2, 0 ) /* sound CPU */
+ ROM_LOAD( "ta-s-1a", 0xe000, 0x2000, CRC(15a83210) SHA1(8ada510db689ffa372b2f4dc4bd1b1c69a0c5307) )
+
+ ROM_REGION( 0x06000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "ta-a-3c", 0x00000, 0x2000, CRC(7ff5482f) SHA1(fe8c181fed113007d69d11e8aa467e86a6357ffb) ) /* characters */
+ ROM_LOAD( "ta-a-3d", 0x02000, 0x2000, CRC(06eef241) SHA1(4f327a54169046d8d84b5f5cf5d9f45e1df4dae6) )
+ ROM_LOAD( "ta-a-3e", 0x04000, 0x2000, CRC(e49f7ad8) SHA1(915de1084fd3c5fc81dd8c80107c28cc57b33226) )
+
+ ROM_REGION( 0x0c000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "ta-b-5j", 0x00000, 0x2000, CRC(86895c0c) SHA1(b42b041e3e20dadd8411805d492133d371426ebf) ) /* sprites */
+ ROM_LOAD( "ta-b-5h", 0x02000, 0x2000, CRC(f8cff29d) SHA1(dabf3bbf50f73a381056131c2239c84dd966b63e) )
+ ROM_LOAD( "ta-b-5e", 0x04000, 0x2000, CRC(8b21ee9a) SHA1(1272722211d22d5b153e9415cc189a5aa9028543) )
+ ROM_LOAD( "ta-b-5d", 0x06000, 0x2000, CRC(cd473d47) SHA1(854cb532bd62851a206da2affd66a1257b7085b6) )
+ ROM_LOAD( "ta-b-5c", 0x08000, 0x2000, CRC(c19134c9) SHA1(028660e66fd033473c468b694e870c633ca05ec6) )
+ ROM_LOAD( "ta-b-5a", 0x0a000, 0x2000, CRC(0012792a) SHA1(b4380f5fbe5e9ce9b44f87ce48a8b402bab58b52) )
+
+ ROM_REGION( 0x0320, REGION_PROMS, 0 )
+ ROM_LOAD( "ta-a-5a", 0x0000, 0x0100, CRC(01de1167) SHA1(b9070f8c70eb362fc4d6a0a92235ce0a5b2ab858) ) /* chars palette low 4 bits */
+ ROM_LOAD( "ta-a-5b", 0x0100, 0x0100, CRC(efd11d4b) SHA1(7c7c356063ab35e4ffb8d65cd20c27c2a4b36537) ) /* chars palette high 4 bits */
+ ROM_LOAD( "ta-b-1b", 0x0200, 0x0020, CRC(f94911ea) SHA1(ad61a323476a97156a255a72048a28477b421284) ) /* sprites palette */
+ ROM_LOAD( "ta-b-3d", 0x0220, 0x0100, CRC(ed3e2aa4) SHA1(cfdfc151803080d1ecdd04af1bfea3dbdce8dca0) ) /* sprites lookup table */
+ROM_END
+
+ROM_START( newtangl ) /* Offical "upgrade" or hack? */
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* main CPU */
+ ROM_LOAD( "3k", 0x0000, 0x2000, CRC(3c6299a8) SHA1(a21a8452b75ce6174076878128d4f20b39b6d69d) )
+ ROM_LOAD( "3m", 0x2000, 0x2000, CRC(8d09056c) SHA1(4d2585103cc6e6c04015501d3c9e1578a8f9c0f5) )
+ ROM_LOAD( "3n", 0x4000, 0x2000, CRC(17b5a775) SHA1(d85c3371080bea82f19ac96fa0f1b332e1c86e27) )
+ ROM_LOAD( "3q", 0x6000, 0x2000, CRC(2e5fa773) SHA1(9a34fa43bde021fc7b00d8c3762c248e7b96dbf1) )
+
+ ROM_REGION( 0x10000 , REGION_CPU2, 0 ) /* sound CPU */
+ ROM_LOAD( "ta-s-1a-", 0xe000, 0x2000, CRC(ea8a05cb) SHA1(5683e4dca93066ee788287ab73a766fa303ebe84) )
+
+ ROM_REGION( 0x06000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "ta-a-3c", 0x00000, 0x2000, CRC(7ff5482f) SHA1(fe8c181fed113007d69d11e8aa467e86a6357ffb) ) /* characters */
+ ROM_LOAD( "ta-a-3d", 0x02000, 0x2000, CRC(06eef241) SHA1(4f327a54169046d8d84b5f5cf5d9f45e1df4dae6) )
+ ROM_LOAD( "ta-a-3e", 0x04000, 0x2000, CRC(e49f7ad8) SHA1(915de1084fd3c5fc81dd8c80107c28cc57b33226) )
+
+ ROM_REGION( 0x0c000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "5j", 0x00000, 0x2000, CRC(89409130) SHA1(3f37f820b1b86166cde7c039d657ebd036d490dd) ) /* sprites */
+ ROM_LOAD( "ta-b-5h", 0x02000, 0x2000, CRC(f8cff29d) SHA1(dabf3bbf50f73a381056131c2239c84dd966b63e) )
+ ROM_LOAD( "5e", 0x04000, 0x2000, CRC(5460a467) SHA1(505c1d9e69c39a74369da17f354b90486ee6afcd) )
+ ROM_LOAD( "ta-b-5d", 0x06000, 0x2000, CRC(cd473d47) SHA1(854cb532bd62851a206da2affd66a1257b7085b6) )
+ ROM_LOAD( "5c", 0x08000, 0x2000, CRC(4a20637a) SHA1(74099cb7f1727c2de2f066497097f1a9eeec0cea) )
+ ROM_LOAD( "ta-b-5a", 0x0a000, 0x2000, CRC(0012792a) SHA1(b4380f5fbe5e9ce9b44f87ce48a8b402bab58b52) )
+
+ ROM_REGION( 0x0320, REGION_PROMS, 0 )
+ ROM_LOAD( "ta-a-5a", 0x0000, 0x0100, CRC(01de1167) SHA1(b9070f8c70eb362fc4d6a0a92235ce0a5b2ab858) ) /* chars palette low 4 bits */
+ ROM_LOAD( "ta-a-5b", 0x0100, 0x0100, CRC(efd11d4b) SHA1(7c7c356063ab35e4ffb8d65cd20c27c2a4b36537) ) /* chars palette high 4 bits */
+ ROM_LOAD( "ta-b-1b", 0x0200, 0x0020, CRC(f94911ea) SHA1(ad61a323476a97156a255a72048a28477b421284) ) /* sprites palette */
+ ROM_LOAD( "ta-b-3d", 0x0220, 0x0100, CRC(ed3e2aa4) SHA1(cfdfc151803080d1ecdd04af1bfea3dbdce8dca0) ) /* sprites lookup table */
+ROM_END
+
+
+
+GAME( 1983, troangel, 0, troangel, troangel, 0, ROT0, "Irem", "Tropical Angel", 0 )
+GAME( 1983, newtangl, troangel, troangel, troangel, 0, ROT0, "Irem", "New Tropical Angel", 0 )