diff --git a/src/mame/drivers/undrfire.c b/src/mame/drivers/undrfire.c index c417e322b07..fbc4806c90f 100644 --- a/src/mame/drivers/undrfire.c +++ b/src/mame/drivers/undrfire.c @@ -1,10 +1,11 @@ /*************************************************************************** Underfire (c) 1993 Taito + Chase Bombers (c) 1994 Taito Driver by Bryan McPhail & David Graves. - Board Info: + Board Info (Underfire): TC0470LIN : ? TC0480SCP : known tilemap chip @@ -115,6 +116,74 @@ calculations when it needs to, so to provide an artificial target we need to reproduce the $18141a calculations. +Info (Chase Bombers) + +Chase Bombers +Taito, 1994 + +Runs on hardware similar to Ground Effects + + +PCB Layout +---------- + +MAIN PCB-D +K1100809A +J1100342A +|----------------------------------------------------------------------------------------------| +| C5 C6 SMC_COM20020 LANOUT| +| 68EC020 61256 68EC000 61256 68EC000 61256 MB8421 | +| 61256 61256 61256 LANIN | +| 61256 61256 PAL | +| 61256 PAL 61256 PAL | +| PAL PAL MB8421 | +| 40MHz | +| MC68681 | +| TC511664-80 MB3771 | +| P1| +| MACH120 MACH120 | +| ENSONIC 30.4761MHz 16MHz ADC0809 | +| ESP-R6 | +| ENSONIC | +| ENSONIC 5701 DSW1(8) TC0510NIO | +| OTIS-R2 Z| +| 93C46 | +| C3 C4 | +| | +| 61256 |-| +| 61256 | +| |-| +| TC0480SCP TC0620SCC TC0360PRI | +| | +| TC0650FDA | +| 2018 61256 | +| 61256 | +| 2018 2088 61256 61256 G| +| 61256 TC0580PIV | +| 2018 2088 | +| | +| 2018 TL074 TL074 TDA1543 | +| TC0570SPC TC0470LIN 514256 514256 | +| 2018 514256 514256 TA8221 TD62064 |-| +| 514256 514256 TD62064 | +| 2018 MB87078 TD62064 |-| +| C1 C2 | +|----------------------------------------------------------------------------------------------| +Notes: + ROM board plugs into C* connectors + No clocks for now, PCB has light corrosion and will need extensive cleaning before it can be powered up. + +ROM Board +--------- + +PCB Numbers - ROM.PCB + K9100508A + J9100367A + +Board contains only 29 ROMs and not much else. + + + ***************************************************************************/ #include "driver.h" @@ -129,6 +198,7 @@ need to reproduce the $18141a calculations. VIDEO_START( undrfire ); VIDEO_UPDATE( undrfire ); +VIDEO_UPDATE( cbombers ); static UINT16 coin_word; static UINT16 port_sel = 0; @@ -136,7 +206,7 @@ extern UINT16 undrfire_rotate_ctrl[8]; static int frame_counter=0; static UINT32 *undrfire_ram; /* will be read in video for gun target calcs */ - +static UINT32 *shared_ram; /*********************************************************** COLOR RAM @@ -272,6 +342,29 @@ static WRITE32_HANDLER( undrfire_input_w ) } +static READ16_HANDLER( shared_ram_r ) +{ + if ((offset&1)==0) return (shared_ram[offset/2]&0xffff0000)>>16; + return (shared_ram[offset/2]&0x0000ffff); +} + +static WRITE16_HANDLER( shared_ram_w ) +{ + if ((offset&1)==0) { + if (ACCESSING_BYTE_1) + shared_ram[offset/2]=(shared_ram[offset/2]&0x00ffffff)|((data&0xff00)<<16); + if (ACCESSING_BYTE_0) + shared_ram[offset/2]=(shared_ram[offset/2]&0xff00ffff)|((data&0x00ff)<<16); + } else { + if (ACCESSING_BYTE_1) + shared_ram[offset/2]=(shared_ram[offset/2]&0xffff00ff)|((data&0xff00)<< 0); + if (ACCESSING_BYTE_0) + shared_ram[offset/2]=(shared_ram[offset/2]&0xffffff00)|((data&0x00ff)<< 0); + } +} + + + /* Some unknown hardware byte mapped at $600002-5 */ static READ32_HANDLER( unknown_hardware_r ) @@ -367,6 +460,10 @@ static WRITE32_HANDLER( motor_control_w ) */ } +static WRITE32_HANDLER( cbombers_cpua_ctrl_w ) +{ + cpunum_set_input_line(machine, 2, INPUT_LINE_RESET, (data &0x1000) ? CLEAR_LINE : ASSERT_LINE); +} /*********************************************************** MEMORY STRUCTURES @@ -410,6 +507,70 @@ static ADDRESS_MAP_START( undrfire_writemem, ADDRESS_SPACE_PROGRAM, 32 ) ADDRESS_MAP_END + +static ADDRESS_MAP_START( cbombers_readmem, ADDRESS_SPACE_PROGRAM, 32 ) + AM_RANGE(0x000000, 0x1fffff) AM_READ(SMH_ROM) + AM_RANGE(0x200000, 0x21ffff) AM_READ(SMH_RAM) /* main CPUA ram */ + AM_RANGE(0x300000, 0x303fff) AM_READ(SMH_RAM) /* Sprite ram */ + AM_RANGE(0x800000, 0x80ffff) AM_READ(TC0480SCP_long_r) + AM_RANGE(0x830000, 0x83002f) AM_READ(TC0480SCP_ctrl_long_r) +// AM_RANGE(0x340000, 0x340003) AM_READ(superchs_stick_r) /* stick coord read */ + + AM_RANGE(0x500000, 0x500007) AM_READ(undrfire_input_r) + AM_RANGE(0xc00000, 0xc00007) AM_READ(undrfire_input_r) + + AM_RANGE(0x700000, 0x7007ff) AM_READ(SMH_RAM) /* Sound shared ram */ + + AM_RANGE(0x900000, 0x90ffff) AM_READ(SMH_RAM) + AM_RANGE(0xa00000, 0xa0ffff) AM_READ(SMH_RAM) /* Palette ram */ + AM_RANGE(0xe00000, 0xe0ffff) AM_READ(SMH_RAM) /* Shared ram */ + +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cbombers_writemem, ADDRESS_SPACE_PROGRAM, 32 ) + AM_RANGE(0x000000, 0x1fffff) AM_WRITE(SMH_ROM) + AM_RANGE(0x200000, 0x21ffff) AM_WRITE(SMH_RAM)// AM_BASE(&superchs_ram) + AM_RANGE(0x300000, 0x303fff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram32) AM_SIZE(&spriteram_size) + AM_RANGE(0x800000, 0x80ffff) AM_WRITE(TC0480SCP_long_w) + AM_RANGE(0x830000, 0x83002f) AM_WRITE(TC0480SCP_ctrl_long_w) + + AM_RANGE(0x900000, 0x90ffff) AM_WRITE(TC0100SCN_long_w) /* piv tilemaps */ + AM_RANGE(0x920000, 0x92000f) AM_WRITE(TC0100SCN_ctrl_long_w) + + AM_RANGE(0x400000, 0x400003) AM_WRITE(cbombers_cpua_ctrl_w) + AM_RANGE(0x2c0000, 0x2c07ff) AM_WRITE(SMH_RAM) AM_BASE(&f3_shared_ram) +// AM_RANGE(0x340000, 0x340003) AM_WRITE(superchs_stick_w) /* stick int request */ + +// AM_RANGE(0x500000, 0x500003) AM_WRITE(MWA32_NOP) + AM_RANGE(0x500000, 0x500007) AM_WRITE(undrfire_input_w) /* eerom etc. */ + +// AM_RANGE(0x600000, 0x600007) AM_WRITE(unknown_int_req_w) /* int request for unknown hardware */ + + AM_RANGE(0x700000, 0x7007ff) AM_WRITE(SMH_RAM) AM_BASE(&f3_shared_ram) + + AM_RANGE(0x900000, 0x90ffff) AM_WRITE(SMH_RAM) + AM_RANGE(0xa00000, 0xa0ffff) AM_WRITE(color_ram_w) AM_BASE(&paletteram32) + AM_RANGE(0xe00000, 0xe0ffff) AM_WRITE(SMH_RAM) AM_BASE(&shared_ram) + +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cbombers_cpub_readmem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x03ffff) AM_READ(SMH_ROM) + AM_RANGE(0x400000, 0x40ffff) AM_READ(SMH_RAM) /* local ram */ + AM_RANGE(0x800000, 0x80ffff) AM_READ(shared_ram_r) +// AM_RANGE(0xa00000, 0xa001ff) AM_READ(SMH_RAM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cbombers_cpub_writemem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x03ffff) AM_WRITE(SMH_ROM) + AM_RANGE(0x400000, 0x40ffff) AM_WRITE(SMH_RAM) +// AM_RANGE(0x600000, 0x60ffff) AM_WRITE(TC0480SCP_word_w) /* Only written upon errors */ + AM_RANGE(0x800000, 0x80ffff) AM_WRITE(shared_ram_w) +// AM_RANGE(0xa00000, 0xa001ff) AM_WRITE(SMH_RAM) /* Extra road control?? */ +ADDRESS_MAP_END + + + /*********************************************************** INPUT PORTS (dips in eprom) ***********************************************************/ @@ -483,6 +644,74 @@ INPUT_PORTS_END +static INPUT_PORTS_START( cbombers ) + PORT_START_TAG("IN0") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) /* ? where is freeze input */ + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) // Nitro + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) // Shift + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // Accel + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // Brake + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* Frame counter */ + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* reserved for EEROM */ + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN2") + PORT_SERVICE_NO_TOGGLE(0x01, IP_ACTIVE_LOW) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + /* Gun inputs (real range is 0-0xffff: we use standard 0-255 and shift later) */ + + PORT_START_TAG("IN3") /* IN 3, P1X */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, -1.0, 0.0, 0) PORT_SENSITIVITY(20) PORT_KEYDELTA(25) PORT_REVERSE PORT_PLAYER(1) + + PORT_START_TAG("IN4") /* IN 4, P1Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(20) PORT_KEYDELTA(25) PORT_PLAYER(1) + + PORT_START_TAG("IN5") /* IN 5, P2X */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, -1.0, 0.0, 0) PORT_SENSITIVITY(20) PORT_KEYDELTA(25) PORT_REVERSE PORT_PLAYER(2) + + PORT_START_TAG("IN6") /* IN 6, P2Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(20) PORT_KEYDELTA(25) PORT_PLAYER(2) + + PORT_START_TAG("FAKE") + PORT_BIT( 0x01, 0x00, IPT_DIPSWITCH_NAME ) PORT_NAME("Show gun target") PORT_CODE(KEYCODE_F1) PORT_TOGGLE + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) +INPUT_PORTS_END + + /********************************************************** GFX DECODING **********************************************************/ @@ -527,6 +756,11 @@ static GFXDECODE_START( undrfire ) GFXDECODE_ENTRY( REGION_GFX3, 0x0, pivlayout, 0, 512 ) GFXDECODE_END +static GFXDECODE_START( cbombers ) + GFXDECODE_ENTRY( REGION_GFX2, 0x0, tile16x16_layout, 0, 512 ) + GFXDECODE_ENTRY( REGION_GFX1, 0x0, charlayout, 0x1000, 512 ) + GFXDECODE_ENTRY( REGION_GFX3, 0x0, pivlayout, 0, 512 ) +GFXDECODE_END /*********************************************************** MACHINE DRIVERS @@ -577,6 +811,43 @@ static MACHINE_DRIVER_START( undrfire ) MACHINE_DRIVER_END +static MACHINE_DRIVER_START( cbombers ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68EC020, 16000000) /* 16 MHz */ + MDRV_CPU_PROGRAM_MAP(cbombers_readmem, cbombers_writemem) + MDRV_CPU_VBLANK_INT("main", irq4_line_hold) + + TAITO_F3_SOUND_SYSTEM_CPU(16000000) + + MDRV_CPU_ADD(M68000, 16000000) /* 16 MHz */ + MDRV_CPU_PROGRAM_MAP(cbombers_cpub_readmem, cbombers_cpub_writemem) + MDRV_CPU_VBLANK_INT("main", irq4_line_hold) + + MDRV_INTERLEAVE(8) /* CPU slices - Need to interleave Cpu's 1 & 3 */ + + MDRV_MACHINE_RESET(undrfire) + MDRV_NVRAM_HANDLER(undrfire) + + /* video hardware */ + MDRV_SCREEN_ADD("main", RASTER) + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(40*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1) + + + MDRV_GFXDECODE(cbombers) + MDRV_PALETTE_LENGTH(16384) + + MDRV_VIDEO_START(undrfire) + MDRV_VIDEO_UPDATE(cbombers) + + /* sound hardware */ + TAITO_F3_SOUND_SYSTEM_ES5505(13343000) +MACHINE_DRIVER_END + /*************************************************************************** DRIVERS @@ -691,6 +962,58 @@ ROM_START( undrfirj ) ROM_LOAD16_BYTE( "d67-02", 0xc00000, 0x200000, CRC(fceb715e) SHA1(9326513acb0696669d4f2345649ab37c8c6ed171) ) ROM_END +ROM_START( cbombers ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) /* 2048K for 68020 code (CPU A) */ + ROM_LOAD32_BYTE( "d83_39.ic17", 0x00000, 0x80000, CRC(b9f48284) SHA1(acc5d412e8900dda483a89a1ac1febd6d5735f3c) ) + ROM_LOAD32_BYTE( "d83_41.ic4", 0x00001, 0x80000, CRC(a2f4c8be) SHA1(0f8f3b5ecff34d8c35af1ab11bb5528b52e30109) ) + ROM_LOAD32_BYTE( "d83_40.ic3", 0x00002, 0x80000, CRC(b05f59ea) SHA1(e46a31737f44be2a3d478b8010fe0d6383290e03) ) + ROM_LOAD32_BYTE( "d83_38.ic16", 0x00003, 0x80000, CRC(0a10616c) SHA1(c9cfc8c870f8a989f004d2db4f6fb76e5b7b7f9b) ) + + ROM_REGION( 0x140000, REGION_CPU2, 0 ) /* Sound cpu */ + ROM_LOAD16_BYTE( "d83_26.ic37", 0x100000, 0x20000, CRC(4f49b484) SHA1(96daa3cb7fa4aae3aedc91ec27d85945311dfcc9) ) + ROM_LOAD16_BYTE( "d83_27.ic38", 0x100001, 0x20000, CRC(2aa1a237) SHA1(b809f75bbbbb4eb5d0df725aaa31aae8a6fba552) ) + + ROM_REGION( 0x40000, REGION_CPU3, 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "d83_28.ic26", 0x00001, 0x20000, CRC(06328ef7) SHA1(90a14649e56221e47b87958896f6eae4556265c2) ) + ROM_LOAD16_BYTE( "d83_29.ic27", 0x00000, 0x20000, CRC(771b4080) SHA1(a47c3a6abc07a6a61b694d32baa0ad4c25045841) ) + + ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d83_04.ic8", 0x000000, 0x200000, CRC(79f36cce) SHA1(2c8dc4cd5c4aa335c1e45888f5947acf94fa628a) ) + ROM_LOAD16_BYTE( "d83_05.ic7", 0x000001, 0x200000, CRC(7787e495) SHA1(1758de5fdd1d12727368d08d7d4752c3756fc23e) ) + + ROM_REGION( 0x1800000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD32_BYTE( "d83_06.ic28", 0x000003, 0x200000, CRC(4b71944e) SHA1(e8ed190280c7378fb4edcb192cef0d4d62582ad5) ) + ROM_LOAD32_BYTE( "d83_07.ic30", 0x000002, 0x200000, CRC(29861b61) SHA1(76562b0243c1bc38623c0ef9d20de7572a979e37) ) + ROM_LOAD32_BYTE( "d83_08.ic32", 0x000001, 0x200000, CRC(a0e81e01) SHA1(96ad8cfc849caaf85350cfc7cf23ad23635a3813) ) + ROM_LOAD32_BYTE( "d83_09.ic45", 0x000000, 0x200000, CRC(7e4dec50) SHA1(4d8c1be739d425d8ded07774094b775f35a915bf) ) + ROM_LOAD32_BYTE( "d83_11.ic41", 0x800003, 0x100000, CRC(a790e490) SHA1(9c57405ef2ef3368eb0958a3e43601110c1cc90d) ) + ROM_LOAD32_BYTE( "d83_12.ic29", 0x800002, 0x100000, CRC(2f237b0d) SHA1(2ecb947671d263a77510bfebda03f883b55b8df4) ) + ROM_LOAD32_BYTE( "d83_13.ic31", 0x800001, 0x100000, CRC(c2cceeb6) SHA1(3ec932655326caed13a40394bbf8e8baf836de2a) ) + ROM_LOAD32_BYTE( "d83_14.ic44", 0x800000, 0x100000, CRC(8b6f4f12) SHA1(6a28004d287f00627622376aa3d6704f2684a6f3) ) + ROM_LOAD32_BYTE( "d83_10.ic43", 0xc00000, 0x200000, CRC(36c440a0) SHA1(31685d3cdf4e39e1365df7e6a588c28f95d7e0a8) ) + ROM_LOAD32_BYTE( "d83_15.ic42", 0x1400000, 0x100000, CRC(1b71175e) SHA1(60ad38ce97fd7995ff2f29d6b1a3b873dc2f0eb3) ) + + ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d83_16.ic19", 0x000000, 0x100000, CRC(d364cf1e) SHA1(ee43f50edf50ec840acfb98b1314140ee9693839) ) + ROM_LOAD16_BYTE( "d83_17.ic5", 0x000001, 0x100000, CRC(0ffe737c) SHA1(5923a4edf9d0c8339f793840c2bdc691e2c651e6) ) + ROM_LOAD ( "d83_18.ic6", 0x300000, 0x100000, CRC(87979155) SHA1(0ffafa970f9f9c98f8938104b97e63d2b5757804) ) + ROM_FILL ( 0x200000, 0x100000, 0 ) + + ROM_REGION16_LE( 0x80000, REGION_USER1, 0 ) + ROM_LOAD16_BYTE( "d83_31.ic10", 0x000001, 0x40000, CRC(85c37961) SHA1(15ea5c4904d910575e984e146c8941dff913d45f) ) + ROM_LOAD16_BYTE( "d83_32.ic11", 0x000000, 0x40000, CRC(b0db2559) SHA1(2bfae2dbe164b42e95d0a93fab82b7040c3fbc56) ) + + ROM_REGION( 0x40000, REGION_USER2, 0 ) + ROM_LOAD( "d83_30.ic9", 0x00000, 0x40000, CRC(eb86dc67) SHA1(31c7b6f30ff912fafed4b87ce8bf603ee17d1664) ) + + ROM_REGION16_BE( 0x1000000, REGION_SOUND1 , ROMREGION_ERASE00 ) + ROM_LOAD16_BYTE( "d83_01.ic40", 0xc00000, 0x200000, CRC(912799f4) SHA1(22f69e61519d2cddcfc4e4c9601e78a9d5265d5b) ) + ROM_LOAD16_BYTE( "d83_02.ic39", 0x000000, 0x200000, CRC(2abca020) SHA1(3491a95651ca89b7fe6d040b8576fa7646bfe84b) ) + ROM_RELOAD ( 0x400000, 0x200000 ) + ROM_LOAD16_BYTE( "d83_03.ic18", 0x800000, 0x200000, CRC(1b2d9ec3) SHA1(ead6b5542ad3987ef0f9ea01ce7f960abc9119b3) ) +ROM_END + + static READ32_HANDLER( main_cycle_r ) { @@ -737,6 +1060,38 @@ static DRIVER_INIT( undrfire ) } +static DRIVER_INIT( cbombers ) +{ + UINT32 offset,i; + UINT8 *gfx = memory_region(REGION_GFX3); + int size=memory_region_length(REGION_GFX3); + int data; + + + /* make piv tile GFX format suitable for gfxdecode */ + offset = size/2; + for (i = size/2+size/4; i>0) & 3; + d2 = (data>>2) & 3; + d3 = (data>>4) & 3; + d4 = (data>>6) & 3; + + gfx[offset] = (d1<<2) | (d2<<6); + offset++; + + gfx[offset] = (d3<<2) | (d4<<6); + offset++; + } +} + + + GAME( 1993, undrfire, 0, undrfire, undrfire, undrfire, ROT0, "Taito Corporation Japan", "Under Fire (World)", 0 ) GAME( 1993, undrfiru, undrfire, undrfire, undrfire, undrfire, ROT0, "Taito America Corporation", "Under Fire (US)", 0 ) GAME( 1993, undrfirj, undrfire, undrfire, undrfire, undrfire, ROT0, "Taito Corporation", "Under Fire (Japan)", 0 ) +GAME( 1994, cbombers, 0, cbombers, cbombers, cbombers, ROT0, "Taito Corporation", "Chase Bombers", GAME_NOT_WORKING ) diff --git a/src/mame/mamedriv.c b/src/mame/mamedriv.c index 344b34d4072..02c5a66c478 100644 --- a/src/mame/mamedriv.c +++ b/src/mame/mamedriv.c @@ -1855,6 +1855,7 @@ const game_driver * const drivers[] = DRIVER( undrfire ) /* D67 (c) 1993 Taito Coporation Japan (World) */ DRIVER( undrfiru ) /* D67 (c) 1993 Taito America Corporation (US) */ DRIVER( undrfirj ) /* D67 (c) 1993 Taito Coporation (Japan) */ + DRIVER( cbombers ) /* Taito F2 games */ DRIVER( finalb ) /* B82 (c) 1988 Taito Corporation Japan (World) */ diff --git a/src/mame/video/undrfire.c b/src/mame/video/undrfire.c index 26a7914e512..aeeba27116e 100644 --- a/src/mame/video/undrfire.c +++ b/src/mame/video/undrfire.c @@ -223,6 +223,152 @@ logerror("Sprite number %04x had %02x invalid chunks\n",tilenum,bad_chunks); } } + +static void draw_sprites_cbombers(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect,const int *primasks,int x_offs,int y_offs) +{ + UINT16 *spritemap = (UINT16 *)memory_region(REGION_USER1); + UINT8 *spritemapHibit = (UINT8 *)memory_region(REGION_USER2); + + int offs, data, tilenum, color, flipx, flipy; + int x, y, priority, dblsize, curx, cury; + int sprites_flipscreen = 0; + int zoomx, zoomy, zx, zy; + int sprite_chunk,map_offset,code,j,k,px,py; + int dimension,total_chunks; + + /* pdrawgfx() needs us to draw sprites front to back, so we have to build a list + while processing sprite ram and then draw them all at the end */ + struct tempsprite *sprite_ptr = spritelist; + + for (offs = (spriteram_size/4-4);offs >= 0;offs -= 4) + { + data = spriteram32[offs+0]; + flipx = (data & 0x00800000) >> 23; + zoomx = (data & 0x007f0000) >> 16; + tilenum = (data & 0x00007fff); + + data = spriteram32[offs+2]; + priority = (data & 0x000c0000) >> 18; + color = (data & 0x0003fc00) >> 10; + x = (data & 0x000003ff); + + data = spriteram32[offs+3]; + dblsize = (data & 0x00040000) >> 18; + flipy = (data & 0x00020000) >> 17; + zoomy = (data & 0x0001fc00) >> 10; + y = (data & 0x000003ff); + + color |= (/*0x100 +*/ (priority << 6)); /* priority bits select color bank */ + + color /= 2; /* as sprites are 5bpp */ + flipy = !flipy; +// y = (-y &0x3ff); + + if (!tilenum) continue; + +// flipy = !flipy; + zoomx += 1; + zoomy += 1; + + y += y_offs; + + /* treat coords as signed */ + if (x>0x340) x -= 0x400; + if (y>0x340) y -= 0x400; + + x -= x_offs; + + dimension = ((dblsize*2) + 2); // 2 or 4 + total_chunks = ((dblsize*3) + 1) << 2; // 4 or 16 + map_offset = tilenum << 2; + + { + for (sprite_chunk=0;sprite_chunkgfx = 0; + sprite_ptr->code = code; + sprite_ptr->color = color; + sprite_ptr->flipx = !flipx; + sprite_ptr->flipy = flipy; + sprite_ptr->x = curx; + sprite_ptr->y = cury; + sprite_ptr->zoomx = zx << 12; + sprite_ptr->zoomy = zy << 12; + + if (primasks) + { + sprite_ptr->primask = primasks[priority]; + + sprite_ptr++; + } + else + { + drawgfxzoom(bitmap,machine->gfx[sprite_ptr->gfx], + sprite_ptr->code, + sprite_ptr->color, + sprite_ptr->flipx,sprite_ptr->flipy, + sprite_ptr->x,sprite_ptr->y, + cliprect,TRANSPARENCY_PEN,0, + sprite_ptr->zoomx,sprite_ptr->zoomy); + } + } + } + } + + /* this happens only if primsks != NULL */ + while (sprite_ptr != spritelist) + { + sprite_ptr--; + + pdrawgfxzoom(bitmap,machine->gfx[sprite_ptr->gfx], + sprite_ptr->code, + sprite_ptr->color, + sprite_ptr->flipx,sprite_ptr->flipy, + sprite_ptr->x,sprite_ptr->y, + cliprect,TRANSPARENCY_PEN,0, + sprite_ptr->zoomx,sprite_ptr->zoomy, + sprite_ptr->primask); + } +} + + /************************************************************** SCREEN REFRESH **************************************************************/ @@ -369,3 +515,147 @@ VIDEO_UPDATE( undrfire ) #endif return 0; } + + +VIDEO_UPDATE( cbombers ) +{ + UINT8 layer[5]; + UINT8 pivlayer[3]; + UINT16 priority; + +#ifdef MAME_DEBUG + static UINT8 dislayer[6]; /* Layer toggles to help get layers correct */ +#endif + +#ifdef MAME_DEBUG + if (input_code_pressed_once (KEYCODE_X)) + { + dislayer[5] ^= 1; + popmessage("piv text: %01x",dislayer[5]); + } + if (input_code_pressed_once (KEYCODE_C)) + { + dislayer[0] ^= 1; + popmessage("bg0: %01x",dislayer[0]); + } + + if (input_code_pressed_once (KEYCODE_V)) + { + dislayer[1] ^= 1; + popmessage("bg1: %01x",dislayer[1]); + } + + if (input_code_pressed_once (KEYCODE_B)) + { + dislayer[2] ^= 1; + popmessage("bg2: %01x",dislayer[2]); + } + + if (input_code_pressed_once (KEYCODE_N)) + { + dislayer[3] ^= 1; + popmessage("bg3: %01x",dislayer[3]); + } + + if (input_code_pressed_once (KEYCODE_M)) + { + dislayer[4] ^= 1; + popmessage("sprites: %01x",dislayer[4]); + } +#endif + + TC0100SCN_tilemap_update(screen->machine); + TC0480SCP_tilemap_update(screen->machine); + + priority = TC0480SCP_get_bg_priority(); + + layer[0] = (priority &0xf000) >> 12; /* tells us which bg layer is bottom */ + layer[1] = (priority &0x0f00) >> 8; + layer[2] = (priority &0x00f0) >> 4; + layer[3] = (priority &0x000f) >> 0; /* tells us which is top */ + layer[4] = 4; /* text layer always over bg layers */ + + pivlayer[0] = TC0100SCN_bottomlayer(0); + pivlayer[1] = pivlayer[0]^1; + pivlayer[2] = 2; + + fillbitmap(priority_bitmap,0,cliprect); + fillbitmap(bitmap,0,cliprect); /* wrong color? */ + + +/* The "PIV" chip seems to be a renamed TC0100SCN. It has a + bottom layer usually full of bright garish colors that + vaguely mimic the structure of the layers on top. Seems + pointless - it's always hidden by other layers. Does it + serve some blending pupose ? */ + + TC0100SCN_tilemap_draw(screen->machine,bitmap,cliprect,0,pivlayer[0],TILEMAP_DRAW_OPAQUE,0); + TC0100SCN_tilemap_draw(screen->machine,bitmap,cliprect,0,pivlayer[1],0,0); + +#ifdef MAME_DEBUG + if (dislayer[layer[0]]==0) +#endif + TC0480SCP_tilemap_draw(bitmap,cliprect,layer[0],0,1); + +#ifdef MAME_DEBUG + if (dislayer[layer[1]]==0) +#endif + TC0480SCP_tilemap_draw(bitmap,cliprect,layer[1],0,2); + +#ifdef MAME_DEBUG + if (dislayer[layer[2]]==0) +#endif + TC0480SCP_tilemap_draw(bitmap,cliprect,layer[2],0,4); + +#ifdef MAME_DEBUG + if (dislayer[layer[3]]==0) +#endif + TC0480SCP_tilemap_draw(bitmap,cliprect,layer[3],0,8); + +#ifdef MAME_DEBUG + if (dislayer[4]==0) +#endif + /* Sprites have variable priority (we kludge this on road levels) */ + { + if ((TC0480SCP_pri_reg &0x3) == 3) /* on road levels kludge sprites up 1 priority */ + { + static const int primasks[4] = {0xfff0, 0xff00, 0x0, 0x0}; + draw_sprites_cbombers(screen->machine, bitmap,cliprect,primasks,80,-208); + } + else + { + static const int primasks[4] = {0xfffc, 0xfff0, 0xff00, 0x0}; + draw_sprites_cbombers(screen->machine, bitmap,cliprect,primasks,80,-208); + } + } + +#ifdef MAME_DEBUG + if (dislayer[5]==0) +#endif + TC0100SCN_tilemap_draw(screen->machine,bitmap,cliprect,0,pivlayer[2],0,0); /* piv text layer */ + + TC0480SCP_tilemap_draw(bitmap,cliprect,layer[4],0,0); /* TC0480SCP text layer */ + + /* See if we should draw artificial gun targets */ + /* (not yet implemented...) */ + + if (input_port_7_word_r(screen->machine,0,0) & 0x1) /* Fake DSW */ + { + popmessage("Gunsights on"); + } + +/* Enable this to see rotation (?) control words */ +#if 0 + { + char buf[80]; + int i; + + for (i = 0; i < 8; i += 1) + { + sprintf (buf, "%02x: %04x", i, undrfire_rotate_ctrl[i]); + ui_draw_text (buf, 0, i*8); + } + } +#endif + return 0; +}