diff options
Diffstat (limited to 'src/mame/drivers/btime.c')
-rw-r--r-- | src/mame/drivers/btime.c | 1884 |
1 files changed, 1884 insertions, 0 deletions
diff --git a/src/mame/drivers/btime.c b/src/mame/drivers/btime.c new file mode 100644 index 00000000000..c259d348316 --- /dev/null +++ b/src/mame/drivers/btime.c @@ -0,0 +1,1884 @@ +/*************************************************************************** + +Burger Time + +driver by Zsolt Vasvari + +hardware description: + +Actually Lock'n'Chase is (C)1981 while Burger Time is (C)1982, so it might +be more accurate to say 'Lock'n'Chase hardware'. + +The bootleg called Cook Race runs on hardware similar but different. The fact +that it addresses the program ROMs in the range 0500-3fff instead of the usual +c000-ffff makes me suspect that it is a bootleg of the *tape system* version. +Little is known about that system, but it is quite likely that it would have +RAM in the range 0000-3fff and load the program there from tape. + + +This hardware is pretty straightforward, but has a couple of interesting +twists. There are two ports to the video and color RAMs, one normal access, +and one with X and Y coordinates swapped. The sprite RAM occupies the +first row of the swapped area, so it appears in the regular video RAM as +the first column of on the left side. + +These games don't have VBLANK interrupts, but instead an IRQ or NMI +(depending on the particular board) is generated when a coin is inserted. + +Some of the games also have a background playfield which, in the +case of Bump 'n' Jump and Zoar, can be scrolled vertically. + +These boards use two 8910's for sound, controlled by a dedicated 6502. The +main processor triggers an IRQ request when writing a command to the sound +CPU. + +Main clock: XTAL = 12 MHz +Horizontal video frequency: HSYNC = XTAL/768?? = 15.625 kHz ?? +Video frequency: VSYNC = HSYNC/272 = 57.44 Hz ? +VBlank duration: 1/VSYNC * (24/272) = 1536 us ? + + +Note on Lock'n'Chase: + +The watchdog test prints "WATCHDOG TEST ER". Just by looking at the code, +I can't see how it could print anything else, there is only one path it +can take. Should the game reset???? + +***************************************************************************/ + +#include "driver.h" +#include "cpu/m6502/m6502.h" +#include "sound/ay8910.h" + + +extern UINT8 *btime_videoram; +extern size_t btime_videoram_size; +extern UINT8 *btime_colorram; +extern UINT8 *lnc_charbank; +extern UINT8 *bnj_backgroundram; +extern size_t bnj_backgroundram_size; +extern UINT8 *zoar_scrollram; +extern UINT8 *deco_charram; + +PALETTE_INIT( btime ); +PALETTE_INIT( lnc ); + +MACHINE_RESET( lnc ); + +VIDEO_START( btime ); +VIDEO_START( bnj ); + + +VIDEO_UPDATE( btime ); +VIDEO_UPDATE( cookrace ); +VIDEO_UPDATE( bnj ); +VIDEO_UPDATE( lnc ); +VIDEO_UPDATE( zoar ); +VIDEO_UPDATE( disco ); +VIDEO_UPDATE( eggs ); + +WRITE8_HANDLER( btime_paletteram_w ); +WRITE8_HANDLER( bnj_background_w ); +WRITE8_HANDLER( bnj_scroll1_w ); +WRITE8_HANDLER( bnj_scroll2_w ); +READ8_HANDLER( btime_mirrorvideoram_r ); +WRITE8_HANDLER( btime_mirrorvideoram_w ); +READ8_HANDLER( btime_mirrorcolorram_r ); +WRITE8_HANDLER( btime_mirrorcolorram_w ); +WRITE8_HANDLER( lnc_videoram_w ); +WRITE8_HANDLER( lnc_mirrorvideoram_w ); +WRITE8_HANDLER( deco_charram_w ); + +WRITE8_HANDLER( zoar_video_control_w ); +WRITE8_HANDLER( btime_video_control_w ); +WRITE8_HANDLER( bnj_video_control_w ); +WRITE8_HANDLER( lnc_video_control_w ); +WRITE8_HANDLER( disco_video_control_w ); + +INTERRUPT_GEN( lnc_sound_interrupt ); + +static WRITE8_HANDLER( sound_command_w ); + +READ8_HANDLER( mmonkey_protection_r ); +WRITE8_HANDLER( mmonkey_protection_w ); + + +static UINT8 *decrypted; +static UINT8 *rambase; +static UINT8 *sound_rambase; + + + +INLINE UINT8 swap_bits_5_6(UINT8 data) +{ + return BITSWAP8(data,7,5,6,4,3,2,1,0); +} + + +static void btime_decrypt(void) +{ + UINT8 *src, *src1; + int addr, addr1; + + + /* the encryption is a simple bit rotation: 76543210 -> 65342710, but */ + /* with a catch: it is only applied if the previous instruction did a */ + /* memory write. Also, only opcodes at addresses with this bit pattern: */ + /* xxxx xxx1 xxxx x1xx are encrypted. */ + + /* get the address of the next opcode */ + addr = activecpu_get_pc(); + + /* however if the previous instruction was JSR (which caused a write to */ + /* the stack), fetch the address of the next instruction. */ + addr1 = activecpu_get_previouspc(); + src1 = (addr1 < 0x9000) ? rambase : memory_region(REGION_CPU1); + if (decrypted[addr1] == 0x20) /* JSR $xxxx */ + addr = src1[addr1+1] + 256 * src1[addr1+2]; + + /* If the address of the next instruction is xxxx xxx1 xxxx x1xx, decode it. */ + src = (addr < 0x9000) ? rambase : memory_region(REGION_CPU1); + if ((addr & 0x0104) == 0x0104) + { + /* 76543210 -> 65342710 bit rotation */ + decrypted[addr] = BITSWAP8(src[addr],6,5,3,4,2,7,1,0); + } +} + +static WRITE8_HANDLER( lnc_w ) +{ + if (offset <= 0x3bff) ; + else if (offset >= 0x3c00 && offset <= 0x3fff) { lnc_videoram_w(offset - 0x3c00,data); return; } + else if (offset >= 0x7c00 && offset <= 0x7fff) { lnc_mirrorvideoram_w(offset - 0x7c00,data); return; } + else if (offset == 0x8000) { return; } /* MWA8_NOP */ + else if (offset == 0x8001) { lnc_video_control_w(0,data); return; } + else if (offset == 0x8003) ; + else if (offset == 0x9000) { return; } /* MWA8_NOP */ + else if (offset == 0x9002) { sound_command_w(0,data); return; } + else if (offset >= 0xb000 && offset <= 0xb1ff) ; + else logerror("CPU #%d PC %04x: warning - write %02x to unmapped memory address %04x\n",cpu_getactivecpu(),activecpu_get_pc(),data,offset); + + rambase[offset] = data; + + /* Swap bits 5 & 6 for opcodes */ + decrypted[offset] = swap_bits_5_6(data); +} + +static WRITE8_HANDLER( mmonkey_w ) +{ + if (offset <= 0x3bff) ; + else if (offset >= 0x3c00 && offset <= 0x3fff) { lnc_videoram_w(offset - 0x3c00,data); return; } + else if (offset >= 0x7c00 && offset <= 0x7fff) { lnc_mirrorvideoram_w(offset - 0x7c00,data); return; } + else if (offset == 0x8001) { lnc_video_control_w(0,data); return; } + else if (offset == 0x8003) ; + else if (offset == 0x9000) { return; } /* MWA8_NOP */ + else if (offset == 0x9002) { sound_command_w(0,data); return; } + else if (offset >= 0xb000 && offset <= 0xbfff) { mmonkey_protection_w(offset - 0xb000, data); return; } + else logerror("CPU #%d PC %04x: warning - write %02x to unmapped memory address %04x\n",cpu_getactivecpu(),activecpu_get_pc(),data,offset); + + rambase[offset] = data; + + /* Swap bits 5 & 6 for opcodes */ + decrypted[offset] = swap_bits_5_6(data); +} + +static WRITE8_HANDLER( btime_w ) +{ + if (offset <= 0x07ff) ; + else if (offset >= 0x0c00 && offset <= 0x0c0f) btime_paletteram_w(offset - 0x0c00,data); + else if (offset >= 0x1000 && offset <= 0x17ff) ; + else if (offset >= 0x1800 && offset <= 0x1bff) btime_mirrorvideoram_w(offset - 0x1800,data); + else if (offset >= 0x1c00 && offset <= 0x1fff) btime_mirrorcolorram_w(offset - 0x1c00,data); + else if (offset == 0x4002) btime_video_control_w(0,data); + else if (offset == 0x4003) sound_command_w(0,data); + else if (offset == 0x4004) bnj_scroll1_w(0,data); + else logerror("CPU #%d PC %04x: warning - write %02x to unmapped memory address %04x\n",cpu_getactivecpu(),activecpu_get_pc(),data,offset); + + rambase[offset] = data; + + btime_decrypt(); +} + +static WRITE8_HANDLER( zoar_w ) +{ + if (offset <= 0x07ff) ; + else if (offset >= 0x8000 && offset <= 0x87ff) ; + else if (offset >= 0x8800 && offset <= 0x8bff) btime_mirrorvideoram_w(offset - 0x8800,data); + else if (offset >= 0x8c00 && offset <= 0x8fff) btime_mirrorcolorram_w(offset - 0x8c00,data); + else if (offset == 0x9000) zoar_video_control_w(0, data); + else if (offset >= 0x9800 && offset <= 0x9803) ; + else if (offset == 0x9804) bnj_scroll2_w(0,data); + else if (offset == 0x9805) bnj_scroll1_w(0,data); + else if (offset == 0x9806) sound_command_w(0,data); + else logerror("CPU #%d PC %04x: warning - write %02x to unmapped memory address %04x\n",cpu_getactivecpu(),activecpu_get_pc(),data,offset); + + rambase[offset] = data; + + btime_decrypt(); +} + +static WRITE8_HANDLER( disco_w ) +{ + if (offset <= 0x04ff) ; + else if (offset >= 0x2000 && offset <= 0x7fff) deco_charram_w(offset - 0x2000,data); + else if (offset >= 0x8000 && offset <= 0x881f) ; + else if (offset == 0x9a00) sound_command_w(0,data); + else if (offset == 0x9c00) disco_video_control_w(0,data); + else logerror("CPU #%d PC %04x: warning - write %02x to unmapped memory address %04x\n",cpu_getactivecpu(),activecpu_get_pc(),data,offset); + + rambase[offset] = data; + + btime_decrypt(); +} + + +static ADDRESS_MAP_START( btime_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_READ(MRA8_RAM) + AM_RANGE(0x1000, 0x17ff) AM_READ(MRA8_RAM) + AM_RANGE(0x1800, 0x1bff) AM_READ(btime_mirrorvideoram_r) + AM_RANGE(0x1c00, 0x1fff) AM_READ(btime_mirrorcolorram_r) + AM_RANGE(0x4000, 0x4000) AM_READ(input_port_0_r) /* IN0 */ + AM_RANGE(0x4001, 0x4001) AM_READ(input_port_1_r) /* IN1 */ + AM_RANGE(0x4002, 0x4002) AM_READ(input_port_2_r) /* coin */ + AM_RANGE(0x4003, 0x4003) AM_READ(input_port_3_r) /* DSW1 */ + AM_RANGE(0x4004, 0x4004) AM_READ(input_port_4_r) /* DSW2 */ + AM_RANGE(0xb000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( btime_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xffff) AM_WRITE(btime_w) /* override the following entries to */ + /* support ROM decryption */ + AM_RANGE(0x0000, 0x07ff) AM_WRITE(MWA8_RAM) AM_BASE(&rambase) + AM_RANGE(0x0c00, 0x0c0f) AM_WRITE(btime_paletteram_w) AM_BASE(&paletteram) + AM_RANGE(0x1000, 0x13ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size) + AM_RANGE(0x1400, 0x17ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_colorram) + AM_RANGE(0x1800, 0x1bff) AM_WRITE(btime_mirrorvideoram_w) + AM_RANGE(0x1c00, 0x1fff) AM_WRITE(btime_mirrorcolorram_w) + AM_RANGE(0x4000, 0x4000) AM_WRITE(MWA8_NOP) + AM_RANGE(0x4002, 0x4002) AM_WRITE(btime_video_control_w) + AM_RANGE(0x4003, 0x4003) AM_WRITE(sound_command_w) + AM_RANGE(0x4004, 0x4004) AM_WRITE(bnj_scroll1_w) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cookrace_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x03ff) AM_READ(MRA8_RAM) + AM_RANGE(0x0500, 0x3fff) AM_READ(MRA8_ROM) + AM_RANGE(0xc000, 0xc7ff) AM_READ(MRA8_RAM) + AM_RANGE(0xc800, 0xcbff) AM_READ(btime_mirrorvideoram_r) + AM_RANGE(0xcc00, 0xcfff) AM_READ(btime_mirrorcolorram_r) + AM_RANGE(0xd000, 0xd0ff) AM_READ(MRA8_RAM) /* background */ + AM_RANGE(0xd100, 0xd3ff) AM_READ(MRA8_RAM) /* ? */ + AM_RANGE(0xd400, 0xd7ff) AM_READ(MRA8_RAM) /* background? */ + AM_RANGE(0xe000, 0xe000) AM_READ(input_port_3_r) /* DSW1 */ + AM_RANGE(0xe300, 0xe300) AM_READ(input_port_3_r) /* mirror address used on high score name enter */ + /* screen */ + AM_RANGE(0xe001, 0xe001) AM_READ(input_port_4_r) /* DSW2 */ + AM_RANGE(0xe002, 0xe002) AM_READ(input_port_0_r) /* IN0 */ + AM_RANGE(0xe003, 0xe003) AM_READ(input_port_1_r) /* IN1 */ + AM_RANGE(0xe004, 0xe004) AM_READ(input_port_2_r) /* coin */ + AM_RANGE(0xfff9, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cookrace_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x03ff) AM_WRITE(MWA8_RAM) AM_BASE(&rambase) + AM_RANGE(0x0500, 0x3fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0xc000, 0xc3ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size) + AM_RANGE(0xc400, 0xc7ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_colorram) + AM_RANGE(0xc800, 0xcbff) AM_WRITE(btime_mirrorvideoram_w) + AM_RANGE(0xcc00, 0xcfff) AM_WRITE(btime_mirrorcolorram_w) + AM_RANGE(0xd000, 0xd0ff) AM_WRITE(MWA8_RAM) /* background? */ + AM_RANGE(0xd100, 0xd3ff) AM_WRITE(MWA8_RAM) /* ? */ + AM_RANGE(0xd400, 0xd7ff) AM_WRITE(MWA8_RAM) AM_BASE(&bnj_backgroundram) AM_SIZE(&bnj_backgroundram_size) + AM_RANGE(0xe000, 0xe000) AM_WRITE(bnj_video_control_w) + AM_RANGE(0xe001, 0xe001) AM_WRITE(sound_command_w) +#if 0 + AM_RANGE(0x4004, 0x4004) AM_WRITE(bnj_scroll1_w) +#endif + AM_RANGE(0xfff9, 0xffff) AM_WRITE(MWA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( zoar_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_READ(MRA8_RAM) + AM_RANGE(0x9800, 0x9800) AM_READ(input_port_3_r) /* DSW 1 */ + AM_RANGE(0x9801, 0x9801) AM_READ(input_port_4_r) /* DSW 2 */ + AM_RANGE(0x9802, 0x9802) AM_READ(input_port_0_r) /* IN 0 */ + AM_RANGE(0x9803, 0x9803) AM_READ(input_port_1_r) /* IN 1 */ + AM_RANGE(0x9804, 0x9804) AM_READ(input_port_2_r) /* coin */ + AM_RANGE(0xd000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( zoar_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xffff) AM_WRITE(zoar_w) /* override the following entries to */ + /* support ROM decryption */ + AM_RANGE(0x0000, 0x07ff) AM_WRITE(MWA8_RAM) AM_BASE(&rambase) + AM_RANGE(0x8000, 0x83ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size) + AM_RANGE(0x8400, 0x87ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_colorram) + AM_RANGE(0x8800, 0x8bff) AM_WRITE(btime_mirrorvideoram_w) + AM_RANGE(0x8c00, 0x8fff) AM_WRITE(btime_mirrorcolorram_w) + AM_RANGE(0x9000, 0x9000) AM_WRITE(zoar_video_control_w) + AM_RANGE(0x9800, 0x9803) AM_WRITE(MWA8_RAM) AM_BASE(&zoar_scrollram) + AM_RANGE(0x9805, 0x9805) AM_WRITE(bnj_scroll2_w) + AM_RANGE(0x9805, 0x9805) AM_WRITE(bnj_scroll1_w) + AM_RANGE(0x9806, 0x9806) AM_WRITE(sound_command_w) + /*AM_RANGE(0x9807, 0x9807) AM_WRITE(MWA8_RAM) */ /* Marked as ACK on schematics (Board 2 Pg 5) */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( lnc_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_RAM) + AM_RANGE(0x7c00, 0x7fff) AM_READ(btime_mirrorvideoram_r) + AM_RANGE(0x8000, 0x8000) AM_READ(input_port_3_r) /* DSW1 */ + AM_RANGE(0x8001, 0x8001) AM_READ(input_port_4_r) /* DSW2 */ + AM_RANGE(0x9000, 0x9000) AM_READ(input_port_0_r) /* IN0 */ + AM_RANGE(0x9001, 0x9001) AM_READ(input_port_1_r) /* IN1 */ + AM_RANGE(0x9002, 0x9002) AM_READ(input_port_2_r) /* coin */ + AM_RANGE(0xb000, 0xb1ff) AM_READ(MRA8_RAM) + AM_RANGE(0xc000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( lnc_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xffff) AM_WRITE(lnc_w) /* override the following entries to */ + /* support ROM decryption */ + AM_RANGE(0x0000, 0x3bff) AM_WRITE(MWA8_RAM) AM_BASE(&rambase) + AM_RANGE(0x3c00, 0x3fff) AM_WRITE(lnc_videoram_w) AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size) + AM_RANGE(0x7800, 0x7bff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_colorram) /* this is just here to initialize the pointer */ + AM_RANGE(0x7c00, 0x7fff) AM_WRITE(lnc_mirrorvideoram_w) + AM_RANGE(0x8000, 0x8000) AM_WRITE(MWA8_NOP) /* ??? */ + AM_RANGE(0x8001, 0x8001) AM_WRITE(lnc_video_control_w) + AM_RANGE(0x8003, 0x8003) AM_WRITE(MWA8_RAM) AM_BASE(&lnc_charbank) + AM_RANGE(0x9000, 0x9000) AM_WRITE(MWA8_NOP) /* IRQ ACK ??? */ + AM_RANGE(0x9002, 0x9002) AM_WRITE(sound_command_w) + AM_RANGE(0xb000, 0xb1ff) AM_WRITE(MWA8_RAM) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( mmonkey_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_RAM) + AM_RANGE(0x7c00, 0x7fff) AM_READ(btime_mirrorvideoram_r) + AM_RANGE(0x8000, 0x8000) AM_READ(input_port_3_r) /* DSW1 */ + AM_RANGE(0x8001, 0x8001) AM_READ(input_port_4_r) /* DSW2 */ + AM_RANGE(0x9000, 0x9000) AM_READ(input_port_0_r) /* IN0 */ + AM_RANGE(0x9001, 0x9001) AM_READ(input_port_1_r) /* IN1 */ + AM_RANGE(0x9002, 0x9002) AM_READ(input_port_2_r) /* coin */ + AM_RANGE(0xb000, 0xbfff) AM_READ(mmonkey_protection_r) + AM_RANGE(0xc000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( mmonkey_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xffff) AM_WRITE(mmonkey_w) /* override the following entries to */ + /* support ROM decryption */ + AM_RANGE(0x0000, 0x3bff) AM_WRITE(MWA8_RAM) AM_BASE(&rambase) + AM_RANGE(0x3c00, 0x3fff) AM_WRITE(lnc_videoram_w) AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size) + AM_RANGE(0x7800, 0x7bff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_colorram) /* this is just here to initialize the pointer */ + AM_RANGE(0x7c00, 0x7fff) AM_WRITE(lnc_mirrorvideoram_w) + AM_RANGE(0x8001, 0x8001) AM_WRITE(lnc_video_control_w) + AM_RANGE(0x8003, 0x8003) AM_WRITE(MWA8_RAM) AM_BASE(&lnc_charbank) + AM_RANGE(0x9000, 0x9000) AM_WRITE(MWA8_NOP) /* IRQ ACK ??? */ + AM_RANGE(0x9002, 0x9002) AM_WRITE(sound_command_w) + AM_RANGE(0xb000, 0xbfff) AM_WRITE(mmonkey_protection_w) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( bnj_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_READ(MRA8_RAM) + AM_RANGE(0x1000, 0x1000) AM_READ(input_port_3_r) /* DSW1 */ + AM_RANGE(0x1001, 0x1001) AM_READ(input_port_4_r) /* DSW2 */ + AM_RANGE(0x1002, 0x1002) AM_READ(input_port_0_r) /* IN0 */ + AM_RANGE(0x1003, 0x1003) AM_READ(input_port_1_r) /* IN1 */ + AM_RANGE(0x1004, 0x1004) AM_READ(input_port_2_r) /* coin */ + AM_RANGE(0x4000, 0x47ff) AM_READ(MRA8_RAM) + AM_RANGE(0x4800, 0x4bff) AM_READ(btime_mirrorvideoram_r) + AM_RANGE(0x4c00, 0x4fff) AM_READ(btime_mirrorcolorram_r) + AM_RANGE(0xa000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( bnj_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_WRITE(MWA8_RAM) AM_BASE(&rambase) + AM_RANGE(0x1001, 0x1001) AM_WRITE(bnj_video_control_w) + AM_RANGE(0x1002, 0x1002) AM_WRITE(sound_command_w) + AM_RANGE(0x4000, 0x43ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size) + AM_RANGE(0x4400, 0x47ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_colorram) + AM_RANGE(0x4800, 0x4bff) AM_WRITE(btime_mirrorvideoram_w) + AM_RANGE(0x4c00, 0x4fff) AM_WRITE(btime_mirrorcolorram_w) + AM_RANGE(0x5000, 0x51ff) AM_WRITE(bnj_background_w) AM_BASE(&bnj_backgroundram) AM_SIZE(&bnj_backgroundram_size) + AM_RANGE(0x5400, 0x5400) AM_WRITE(bnj_scroll1_w) + AM_RANGE(0x5800, 0x5800) AM_WRITE(bnj_scroll2_w) + AM_RANGE(0x5c00, 0x5c0f) AM_WRITE(btime_paletteram_w) AM_BASE(&paletteram) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( disco_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x04ff) AM_READ(MRA8_RAM) + AM_RANGE(0x2000, 0x881f) AM_READ(MRA8_RAM) + AM_RANGE(0x9000, 0x9000) AM_READ(input_port_2_r) /* coin */ + AM_RANGE(0x9200, 0x9200) AM_READ(input_port_0_r) /* IN0 */ + AM_RANGE(0x9400, 0x9400) AM_READ(input_port_1_r) /* IN1 */ + AM_RANGE(0x9800, 0x9800) AM_READ(input_port_3_r) /* DSW1 */ + AM_RANGE(0x9a00, 0x9a00) AM_READ(input_port_4_r) /* DSW2 */ + AM_RANGE(0x9c00, 0x9c00) AM_READ(input_port_5_r) /* VBLANK */ + AM_RANGE(0xa000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( disco_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xffff) AM_WRITE(disco_w) /* override the following entries to */ + /* support ROM decryption */ + AM_RANGE(0x0000, 0x04ff) AM_WRITE(MWA8_RAM) AM_BASE(&rambase) + AM_RANGE(0x2000, 0x7fff) AM_WRITE(deco_charram_w) AM_BASE(&deco_charram) + AM_RANGE(0x8000, 0x83ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size) + AM_RANGE(0x8400, 0x87ff) AM_WRITE(MWA8_RAM) AM_BASE(&btime_colorram) + AM_RANGE(0x8800, 0x881f) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) + AM_RANGE(0x9a00, 0x9a00) AM_WRITE(sound_command_w) + AM_RANGE(0x9c00, 0x9c00) AM_WRITE(disco_video_control_w) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x03ff) AM_RAM AM_BASE(&sound_rambase) + AM_RANGE(0x0400, 0x0fff) AM_ROM AM_REGION(REGION_CPU2, 0xf400) + AM_RANGE(0x2000, 0x2fff) AM_WRITE(AY8910_write_port_0_w) + AM_RANGE(0x4000, 0x4fff) AM_WRITE(AY8910_control_port_0_w) + AM_RANGE(0x6000, 0x6fff) AM_WRITE(AY8910_write_port_1_w) + AM_RANGE(0x8000, 0x8fff) AM_WRITE(AY8910_control_port_1_w) + AM_RANGE(0xa000, 0xafff) AM_READ(soundlatch_r) + AM_RANGE(0xc000, 0xcfff) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xf000, 0xffff) AM_ROM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( disco_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x03ff) AM_READ(MRA8_RAM) + AM_RANGE(0x8000, 0x8fff) AM_READ(soundlatch_r) + AM_RANGE(0xf000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( disco_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x03ff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x4000, 0x4fff) AM_WRITE(AY8910_write_port_0_w) + AM_RANGE(0x5000, 0x5fff) AM_WRITE(AY8910_control_port_0_w) + AM_RANGE(0x6000, 0x6fff) AM_WRITE(AY8910_write_port_1_w) + AM_RANGE(0x7000, 0x7fff) AM_WRITE(AY8910_control_port_1_w) + AM_RANGE(0x8000, 0x8fff) AM_WRITE(MWA8_NOP) /* ACK ? */ + AM_RANGE(0xf000, 0xffff) AM_WRITE(MWA8_ROM) +ADDRESS_MAP_END + + +/*************************************************************************** + +These games don't have VBlank interrupts. +Interrupts are still used by the game, coin insertion generates an IRQ. + +***************************************************************************/ +static void btime_interrupt(int generated_interrupt, int active_high) +{ + static int coin; + int port; + + port = readinputport(2) & 0xc0; + if (active_high) port ^= 0xc0; + + if (port != 0xc0) /* Coin */ + { + if (coin == 0) + { + coin = 1; + cpunum_set_input_line(0, generated_interrupt, (generated_interrupt == INPUT_LINE_NMI) ? PULSE_LINE : HOLD_LINE); + } + } + else coin = 0; +} + +static INTERRUPT_GEN( btime_irq_interrupt ) +{ + btime_interrupt(0, 1); +} + +static INTERRUPT_GEN( zoar_irq_interrupt ) +{ + btime_interrupt(0, 0); +} + +static INTERRUPT_GEN( btime_nmi_interrupt ) +{ + btime_interrupt(INPUT_LINE_NMI, 0); +} + +static WRITE8_HANDLER( sound_command_w ) +{ + soundlatch_w(offset,data); + cpunum_set_input_line(1, 0, HOLD_LINE); +} + +#define COMMON_INPUTS\ + PORT_START_TAG("IN0")\ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY\ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY\ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY\ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY\ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )\ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )\ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )\ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )\ + PORT_START_TAG("IN1")\ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL\ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL\ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL\ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL\ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL\ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )\ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )\ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )\ + +static INPUT_PORTS_START( btime ) + COMMON_INPUTS + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH,IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH,IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_SERVICE( 0x10, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x20, 0x20, "Cross Hatch Pattern" ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x06, "10000" ) + PORT_DIPSETTING( 0x04, "15000" ) + PORT_DIPSETTING( 0x02, "20000" ) + PORT_DIPSETTING( 0x00, "30000" ) + PORT_DIPNAME( 0x08, 0x08, "Enemies" ) + PORT_DIPSETTING( 0x08, "4" ) + PORT_DIPSETTING( 0x00, "6" ) + PORT_DIPNAME( 0x10, 0x10, "End of Level Pepper" ) + PORT_DIPSETTING( 0x10, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( cookrace ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH,IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH,IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH,IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH,IPT_START1 ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH,IPT_START2 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH,IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x06, "20000" ) + PORT_DIPSETTING( 0x04, "30000" ) + PORT_DIPSETTING( 0x02, "40000" ) + PORT_DIPSETTING( 0x00, "50000" ) + PORT_DIPNAME( 0x08, 0x08, "Enemies" ) + PORT_DIPSETTING( 0x08, "4" ) + PORT_DIPSETTING( 0x00, "6" ) + PORT_DIPNAME( 0x10, 0x10, "End of Level Pepper" ) + PORT_DIPSETTING( 0x10, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( zoar ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) /* almost certainly unused */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + /* Service mode doesn't work because of missing ROMs */ + PORT_SERVICE( 0x20, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x06, "5000" ) + PORT_DIPSETTING( 0x04, "10000" ) + PORT_DIPSETTING( 0x02, "15000" ) + PORT_DIPSETTING( 0x00, "20000" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME( 0x10, 0x00, "Weapon Select" ) + PORT_DIPSETTING( 0x00, "Manual" ) + PORT_DIPSETTING( 0x10, "Auto" ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) /* These 3 switches */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) /* have to do with */ + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) /* coinage. */ + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) /* See code at $d234. */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) /* Feel free to figure */ + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) /* them out. */ + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( lnc ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x30, 0x30, "Test Mode" ) + PORT_DIPSETTING( 0x30, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, "RAM Test Only" ) + PORT_DIPSETTING( 0x20, "Watchdog Test Only" ) + PORT_DIPSETTING( 0x10, "All Tests" ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x06, "15000" ) + PORT_DIPSETTING( 0x04, "20000" ) + PORT_DIPSETTING( 0x02, "30000" ) + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) + PORT_DIPNAME( 0x08, 0x08, "Game Speed" ) + PORT_DIPSETTING( 0x08, "Slow" ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( wtennis ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "2" ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x06, "10000" ) + PORT_DIPSETTING( 0x04, "20000" ) + PORT_DIPSETTING( 0x02, "30000" ) + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) /* definitely used */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) /* These 3 switches */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) /* have to do with */ + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) /* coinage. */ + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( mmonkey ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Free_Play ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) ) /* almost certainly unused */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x06, 0x00, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x02, "Every 15000" ) + PORT_DIPSETTING( 0x04, "Every 30000" ) + PORT_DIPSETTING( 0x00, "20000" ) + PORT_DIPSETTING( 0x06, DEF_STR( None ) ) + PORT_DIPNAME( 0x18, 0x08, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x18, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Medium ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, "Level Skip Mode (Cheat)") + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) ) /* almost certainly unused */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) ) /* almost certainly unused */ + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) +INPUT_PORTS_END + +static INPUT_PORTS_START( bnj ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_SERVICE( 0x10, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x06, "Every 30000" ) + PORT_DIPSETTING( 0x04, "Every 70000" ) + PORT_DIPSETTING( 0x02, "20000 Only" ) + PORT_DIPSETTING( 0x00, "30000 Only" ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Allow_Continue ) ) + PORT_DIPSETTING( 0x08, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( disco ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x60, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x60, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH,IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH,IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x01, "5" ) + PORT_DIPNAME( 0x06, 0x00, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x00, "10000" ) + PORT_DIPSETTING( 0x02, "20000" ) + PORT_DIPSETTING( 0x04, "30000" ) + PORT_DIPSETTING( 0x06, DEF_STR( None ) ) + PORT_DIPNAME( 0x08, 0x00, "Music Weapons" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPSETTING( 0x08, "8" ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START_TAG("VBLANK") + PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) +INPUT_PORTS_END + +static INPUT_PORTS_START( sdtennis ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_SERVICE( 0x10, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) + + PORT_START_TAG("DSW2") + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x01, "2" ) + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x06, "1 Set won" ) + PORT_DIPSETTING( 0x04, "2 Sets won" ) + PORT_DIPSETTING( 0x02, "3 Sets won" ) + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // Check code at 0xc55b + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) // Check code at 0xc5af + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xe0, 0xe0, "Copyright" ) + PORT_DIPSETTING( 0xe0, "Data East Corporation" ) + PORT_DIPSETTING( 0xc0, "Data East USA" ) + /* Other values are the same as 0xe0 */ + /* 0x60 also gives a special coinage : COIN1 gives 3 credits and COIN2 gives 8 credits + whatever the coinage Dip Switch are (they are not read in this case) */ +INPUT_PORTS_END + +static const gfx_layout charlayout = +{ + 8,8, /* 8*8 characters */ + 1024, /* 1024 characters */ + 3, /* 3 bits per pixel */ + { 2*1024*8*8, 1024*8*8, 0 }, /* the bitplanes are separated */ + { 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 /* every char takes 8 consecutive bytes */ +}; + +static const gfx_layout spritelayout = +{ + 16,16, /* 16*16 sprites */ + 256, /* 256 sprites */ + 3, /* 3 bits per pixel */ + { 2*256*16*16, 256*16*16, 0 }, /* the bitplanes are separated */ + { 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, 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, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, + 32*8 /* every sprite takes 32 consecutive bytes */ +}; + +static const gfx_layout zoar_spritelayout = +{ + 16,16, /* 16*16 sprites */ + 128, /* 256 sprites */ + 3, /* 3 bits per pixel */ + { 2*128*16*16, 128*16*16, 0 }, /* the bitplanes are separated */ + { 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, 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, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, + 32*8 /* every sprite takes 32 consecutive bytes */ +}; + +static const gfx_layout btime_tilelayout = +{ + 16,16, /* 16*16 characters */ + 64, /* 64 characters */ + 3, /* 3 bits per pixel */ + { 2*64*16*16, 64*16*16, 0 }, /* the bitplanes are separated */ + { 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, 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, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, + 32*8 /* every tile takes 32 consecutive bytes */ +}; + +static const gfx_layout cookrace_tilelayout = +{ + 8,8, /* 8*8 characters */ + 256, /* 256 characters */ + 3, /* 3 bits per pixel */ + { 2*256*8*8, 256*8*8, 0 }, /* the bitplanes are separated */ + { 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 /* every tile takes 8 consecutive bytes */ +}; + +static const gfx_layout bnj_tilelayout = +{ + 16,16, /* 16*16 characters */ + 64, /* 64 characters */ + 3, /* 3 bits per pixel */ + { 2*64*16*16+4, 0, 4 }, + { 3*16*8+0, 3*16*8+1, 3*16*8+2, 3*16*8+3, 2*16*8+0, 2*16*8+1, 2*16*8+2, 2*16*8+3, + 16*8+0, 16*8+1, 16*8+2, 16*8+3, 0, 1, 2, 3 }, + { 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 }, + 64*8 /* every tile takes 64 consecutive bytes */ +}; + +static GFXDECODE_START( btime ) + GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 1 ) /* char set #1 */ + GFXDECODE_ENTRY( REGION_GFX1, 0, spritelayout, 0, 1 ) /* sprites */ + GFXDECODE_ENTRY( REGION_GFX2, 0, btime_tilelayout, 8, 1 ) /* background tiles */ +GFXDECODE_END + +static GFXDECODE_START( cookrace ) + GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 1 ) /* char set #1 */ + GFXDECODE_ENTRY( REGION_GFX1, 0, spritelayout, 0, 1 ) /* sprites */ + GFXDECODE_ENTRY( REGION_GFX2, 0, cookrace_tilelayout, 8, 1 ) /* background tiles */ +GFXDECODE_END + +static GFXDECODE_START( lnc ) + GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 1 ) /* char set #1 */ + GFXDECODE_ENTRY( REGION_GFX1, 0, spritelayout, 0, 1 ) /* sprites */ +GFXDECODE_END + +static GFXDECODE_START( bnj ) + GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 1 ) /* char set #1 */ + GFXDECODE_ENTRY( REGION_GFX1, 0, spritelayout, 0, 1 ) /* sprites */ + GFXDECODE_ENTRY( REGION_GFX2, 0, bnj_tilelayout, 8, 1 ) /* background tiles */ +GFXDECODE_END + +static GFXDECODE_START( zoar ) + GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 8 ) /* char set #1 */ + GFXDECODE_ENTRY( REGION_GFX4, 0, zoar_spritelayout, 0, 8 ) /* sprites */ + GFXDECODE_ENTRY( REGION_GFX2, 0, btime_tilelayout, 0, 8 ) /* background tiles */ +GFXDECODE_END + +static GFXDECODE_START( disco ) + GFXDECODE_ENTRY( 0, 0x2000, charlayout, 0, 4 ) /* char set #1 */ + GFXDECODE_ENTRY( 0, 0x2000, spritelayout, 0, 4 ) /* sprites */ +GFXDECODE_END + + + +static MACHINE_DRIVER_START( btime ) + + /* basic machine hardware */ + MDRV_CPU_ADD_TAG("main", M6502, 1500000) + MDRV_CPU_PROGRAM_MAP(btime_readmem,btime_writemem) + MDRV_CPU_VBLANK_INT(btime_irq_interrupt,1) + + MDRV_CPU_ADD_TAG("sound", M6502, 500000) + /* audio CPU */ + MDRV_CPU_PROGRAM_MAP(sound_map,0) + MDRV_CPU_VBLANK_INT(nmi_line_pulse,16) + + MDRV_SCREEN_REFRESH_RATE(57) + MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072)) + + /* 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, 1*8, 31*8-1) + MDRV_GFXDECODE(btime) + MDRV_PALETTE_LENGTH(16) + + MDRV_PALETTE_INIT(btime) + MDRV_VIDEO_START(btime) + MDRV_VIDEO_UPDATE(btime) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 1500000) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23) + + MDRV_SOUND_ADD(AY8910, 1500000) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( cookrace ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(btime) + MDRV_CPU_MODIFY("main") + MDRV_CPU_PROGRAM_MAP(cookrace_readmem,cookrace_writemem) + MDRV_CPU_VBLANK_INT(btime_nmi_interrupt,1) + + MDRV_CPU_MODIFY("sound") + MDRV_CPU_PROGRAM_MAP(sound_map,0) + + /* video hardware */ + MDRV_GFXDECODE(cookrace) + MDRV_PALETTE_LENGTH(16) + + MDRV_VIDEO_UPDATE(cookrace) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( lnc ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(btime) + MDRV_CPU_MODIFY("main") + MDRV_CPU_PROGRAM_MAP(lnc_readmem,lnc_writemem) + MDRV_CPU_VBLANK_INT(btime_nmi_interrupt,1) + + MDRV_CPU_MODIFY("sound") + MDRV_CPU_VBLANK_INT(lnc_sound_interrupt,16) + + MDRV_MACHINE_RESET(lnc) + + /* video hardware */ + MDRV_GFXDECODE(lnc) + MDRV_PALETTE_LENGTH(8) + + MDRV_PALETTE_INIT(lnc) + MDRV_VIDEO_UPDATE(lnc) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( wtennis ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(lnc) + MDRV_CPU_MODIFY("sound") + MDRV_CPU_VBLANK_INT(nmi_line_pulse,16) + + /* video hardware */ + MDRV_VIDEO_UPDATE(eggs) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( mmonkey ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(wtennis) + MDRV_CPU_MODIFY("main") + MDRV_CPU_PROGRAM_MAP(mmonkey_readmem,mmonkey_writemem) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( bnj ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(btime) + MDRV_CPU_REPLACE("main", M6502, 750000) + MDRV_CPU_PROGRAM_MAP(bnj_readmem,bnj_writemem) + MDRV_CPU_VBLANK_INT(btime_nmi_interrupt,1) + + /* video hardware */ + MDRV_GFXDECODE(bnj) + MDRV_PALETTE_LENGTH(16) + + MDRV_VIDEO_START(bnj) + MDRV_VIDEO_UPDATE(bnj) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( zoar ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(btime) + MDRV_CPU_MODIFY("main") + MDRV_CPU_PROGRAM_MAP(zoar_readmem,zoar_writemem) + MDRV_CPU_VBLANK_INT(zoar_irq_interrupt,1) + + /* video hardware */ + MDRV_GFXDECODE(zoar) + MDRV_PALETTE_LENGTH(64) + + MDRV_VIDEO_UPDATE(zoar) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( disco ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(btime) + MDRV_CPU_REPLACE("main", M6502, 750000) + MDRV_CPU_PROGRAM_MAP(disco_readmem,disco_writemem) + + MDRV_CPU_MODIFY("sound") + MDRV_CPU_PROGRAM_MAP(disco_sound_readmem,disco_sound_writemem) + + /* video hardware */ + MDRV_GFXDECODE(disco) + MDRV_PALETTE_LENGTH(32) + + MDRV_VIDEO_UPDATE(disco) +MACHINE_DRIVER_END + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( btime ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "aa04.9b", 0xc000, 0x1000, CRC(368a25b5) SHA1(ed3f3712423979dcb351941fa85dce6a0a7bb16b) ) + ROM_LOAD( "aa06.13b", 0xd000, 0x1000, CRC(b4ba400d) SHA1(8c77397e934907bc47a739f263196a0f2f81ba3d) ) + ROM_LOAD( "aa05.10b", 0xe000, 0x1000, CRC(8005bffa) SHA1(d0da4e360039f6a8d8142a4e8e05c1f90c0af68a) ) + ROM_LOAD( "aa07.15b", 0xf000, 0x1000, CRC(086440ad) SHA1(4a32bc92f8ff5fbe112f56e62d2c03da8851a7b9) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "ab14.12h", 0xf000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "aa12.7k", 0x0000, 0x1000, CRC(c4617243) SHA1(24204d591aa2c264a852ee9ba8c4be63efd97728) ) /* charset #1 */ + ROM_LOAD( "ab13.9k", 0x1000, 0x1000, CRC(ac01042f) SHA1(e64b6381a9298eaf74e79fa5f1ea8e9596c58a49) ) + ROM_LOAD( "ab10.10k", 0x2000, 0x1000, CRC(854a872a) SHA1(3d2ecfd54a5a9d68b53cf4b4ee1f2daa6aef2123) ) + ROM_LOAD( "ab11.12k", 0x3000, 0x1000, CRC(d4848014) SHA1(0a55b091cd4e7f317c35defe13d5051b26042eee) ) + ROM_LOAD( "aa8.13k", 0x4000, 0x1000, CRC(8650c788) SHA1(d9b1ee2d1f2fd66705d497c80252861b49aa9254) ) + ROM_LOAD( "ab9.15k", 0x5000, 0x1000, CRC(8dec15e6) SHA1(b72633de6268ce16742bba4dcba835df860d6c2f) ) + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "ab00.1b", 0x0000, 0x0800, CRC(c7a14485) SHA1(6a0a8e6b7860859f22daa33634e34fbf91387659) ) /* charset #2 */ + ROM_LOAD( "ab01.3b", 0x0800, 0x0800, CRC(25b49078) SHA1(4abdcbd4f3362c3e4463a1274731289f1a72d2e6) ) + ROM_LOAD( "ab02.4b", 0x1000, 0x0800, CRC(b8ef56c3) SHA1(4a03bf011dc1fb2902f42587b1174b880cf06df1) ) + + ROM_REGION( 0x0800, REGION_GFX3, 0 ) /* background tilemaps */ + ROM_LOAD( "ab03.6b", 0x0000, 0x0800, CRC(d26bc1f3) SHA1(737af6e264183a1f151f277a07cf250d6abb3fd8) ) +ROM_END + +ROM_START( btime2 ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "aa04.9b2", 0xc000, 0x1000, CRC(a041e25b) SHA1(caaab3ae46619d0a87a8985d316411f23be0b696) ) + ROM_LOAD( "aa06.13b", 0xd000, 0x1000, CRC(b4ba400d) SHA1(8c77397e934907bc47a739f263196a0f2f81ba3d) ) + ROM_LOAD( "aa05.10b", 0xe000, 0x1000, CRC(8005bffa) SHA1(d0da4e360039f6a8d8142a4e8e05c1f90c0af68a) ) + ROM_LOAD( "aa07.15b", 0xf000, 0x1000, CRC(086440ad) SHA1(4a32bc92f8ff5fbe112f56e62d2c03da8851a7b9) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "ab14.12h", 0xf000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "aa12.7k", 0x0000, 0x1000, CRC(c4617243) SHA1(24204d591aa2c264a852ee9ba8c4be63efd97728) ) /* charset #1 */ + ROM_LOAD( "ab13.9k", 0x1000, 0x1000, CRC(ac01042f) SHA1(e64b6381a9298eaf74e79fa5f1ea8e9596c58a49) ) + ROM_LOAD( "ab10.10k", 0x2000, 0x1000, CRC(854a872a) SHA1(3d2ecfd54a5a9d68b53cf4b4ee1f2daa6aef2123) ) + ROM_LOAD( "ab11.12k", 0x3000, 0x1000, CRC(d4848014) SHA1(0a55b091cd4e7f317c35defe13d5051b26042eee) ) + ROM_LOAD( "aa8.13k", 0x4000, 0x1000, CRC(8650c788) SHA1(d9b1ee2d1f2fd66705d497c80252861b49aa9254) ) + ROM_LOAD( "ab9.15k", 0x5000, 0x1000, CRC(8dec15e6) SHA1(b72633de6268ce16742bba4dcba835df860d6c2f) ) + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "ab00.1b", 0x0000, 0x0800, CRC(c7a14485) SHA1(6a0a8e6b7860859f22daa33634e34fbf91387659) ) /* charset #2 */ + ROM_LOAD( "ab01.3b", 0x0800, 0x0800, CRC(25b49078) SHA1(4abdcbd4f3362c3e4463a1274731289f1a72d2e6) ) + ROM_LOAD( "ab02.4b", 0x1000, 0x0800, CRC(b8ef56c3) SHA1(4a03bf011dc1fb2902f42587b1174b880cf06df1) ) + + ROM_REGION( 0x0800, REGION_GFX3, 0 ) /* background tilemaps */ + ROM_LOAD( "ab03.6b", 0x0000, 0x0800, CRC(d26bc1f3) SHA1(737af6e264183a1f151f277a07cf250d6abb3fd8) ) +ROM_END + +ROM_START( btimem ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "ab05a1.12b", 0xb000, 0x1000, CRC(0a98b230) SHA1(aeee4f6f0aaa27575b80261d03c5453cc6ebd646) ) + ROM_LOAD( "ab04.9b", 0xc000, 0x1000, CRC(797e5f75) SHA1(35ea5fa4b8f3494adf7774b3946ed2540ac826ff) ) + ROM_LOAD( "ab06.13b", 0xd000, 0x1000, CRC(c77f3f64) SHA1(f283087fad0a102fe92be7ce80ed18e64dc93b67) ) + ROM_LOAD( "ab05.10b", 0xe000, 0x1000, CRC(b0d3640f) SHA1(6ba28971714ece6f1c04fa2dbf1f9f216ded7cfa) ) + ROM_LOAD( "ab07.15b", 0xf000, 0x1000, CRC(a142f862) SHA1(39d7ef172d18874885f1b1542e885cc4287dc344) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "ab14.12h", 0xf000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "ab12.7k", 0x0000, 0x1000, CRC(6c79f79f) SHA1(338009199b5889621693833d88c35abb8e9e38a2) ) /* charset #1 */ + ROM_LOAD( "ab13.9k", 0x1000, 0x1000, CRC(ac01042f) SHA1(e64b6381a9298eaf74e79fa5f1ea8e9596c58a49) ) + ROM_LOAD( "ab10.10k", 0x2000, 0x1000, CRC(854a872a) SHA1(3d2ecfd54a5a9d68b53cf4b4ee1f2daa6aef2123) ) + ROM_LOAD( "ab11.12k", 0x3000, 0x1000, CRC(d4848014) SHA1(0a55b091cd4e7f317c35defe13d5051b26042eee) ) + ROM_LOAD( "ab8.13k", 0x4000, 0x1000, CRC(70b35bbe) SHA1(ee8d70d6792ac4b8fe3de90c665457fedb94a7ba) ) + ROM_LOAD( "ab9.15k", 0x5000, 0x1000, CRC(8dec15e6) SHA1(b72633de6268ce16742bba4dcba835df860d6c2f) ) + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "ab00.1b", 0x0000, 0x0800, CRC(c7a14485) SHA1(6a0a8e6b7860859f22daa33634e34fbf91387659) ) /* charset #2 */ + ROM_LOAD( "ab01.3b", 0x0800, 0x0800, CRC(25b49078) SHA1(4abdcbd4f3362c3e4463a1274731289f1a72d2e6) ) + ROM_LOAD( "ab02.4b", 0x1000, 0x0800, CRC(b8ef56c3) SHA1(4a03bf011dc1fb2902f42587b1174b880cf06df1) ) + + ROM_REGION( 0x0800, REGION_GFX3, 0 ) /* background tilemaps */ + ROM_LOAD( "ab03.6b", 0x0000, 0x0800, CRC(d26bc1f3) SHA1(737af6e264183a1f151f277a07cf250d6abb3fd8) ) +ROM_END + +ROM_START( cookrace ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + /* code is in the range 0500-3fff, encrypted */ + ROM_LOAD( "1f.1", 0x0000, 0x2000, CRC(68759d32) SHA1(2112a6f17b871aefdb39739e47d4a9f368a2eb3c) ) + ROM_LOAD( "2f.2", 0x2000, 0x2000, CRC(be7d72d1) SHA1(232d108098cb490e7c828aa4524ad09d3866ae18) ) + ROM_LOAD( "2k", 0xffe0, 0x0020, CRC(e2553b3d) SHA1(0a38929cdb3f37c6e4bacc5c3f94c049b4352858) ) /* reset/interrupt vectors */ + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "6f.6", 0xf000, 0x1000, CRC(6b8e0272) SHA1(372a891b7b357aea0297ba9bcae752c3c9d8c1be) ) /* starts at 0000, not f000; 0000-01ff is RAM */ + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "m8.7", 0x0000, 0x2000, CRC(a1a0d5a6) SHA1(e9583320e9c303407abfe02988b95403e5209c52) ) /* charset #1 */ + ROM_LOAD( "m7.8", 0x2000, 0x2000, CRC(1104f497) SHA1(60abd05c2549fe014660c169011480beb191f36d) ) + ROM_LOAD( "m6.9", 0x4000, 0x2000, CRC(d0d94477) SHA1(74ca9134a52cabe5769d714855b38a49632b9e40) ) + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "2f.3", 0x0000, 0x0800, CRC(28609a75) SHA1(ab5d02bc0a771227db820a79b16aa662fb2140cf) ) /* garbage?? */ + ROM_CONTINUE( 0x0000, 0x0800 ) /* charset #2 */ + ROM_LOAD( "4f.4", 0x0800, 0x0800, CRC(7742e771) SHA1(c938c5714273bd4f2a1beb23d781ecbe7b023e6d) ) /* garbage?? */ + ROM_CONTINUE( 0x0800, 0x0800 ) + ROM_LOAD( "5f.5", 0x1000, 0x0800, CRC(611c686f) SHA1(e2c45061597d3d1a855a625a906b5a17a87deb2c) ) /* garbage?? */ + ROM_CONTINUE( 0x1000, 0x0800 ) + + ROM_REGION( 0x0040, REGION_PROMS, 0 ) + ROM_LOAD( "f9.clr", 0x0000, 0x0020, CRC(c2348c1d) SHA1(a7cc4b499b6c89c5966711f8bb922026c2978e1a) ) /* palette */ + ROM_LOAD( "b7", 0x0020, 0x0020, CRC(e4268fa6) SHA1(93f74e633c3a19755e78e0e2883109cd8ccde9a8) ) /* unknown */ +ROM_END + +/* There is a flyer with a screen shot for Lock'n'Chase at: + http://www.gamearchive.com/flyers/video/taito/locknchase_f.jpg */ + +ROM_START( lnc ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "s3-3d", 0xc000, 0x1000, CRC(1ab4f2c2) SHA1(c5890b768172cd2e3912b84db5f71546969ad7e2) ) + ROM_LOAD( "s2-3c", 0xd000, 0x1000, CRC(5e46b789) SHA1(00b2510e07eb565cb373db798dd537191b0b7cc8) ) + ROM_LOAD( "s1-3b", 0xe000, 0x1000, CRC(1308a32e) SHA1(da64fe7b76f5ac8ac35460e6c789ab1e986c78ef) ) + ROM_LOAD( "s0-3a", 0xf000, 0x1000, CRC(beb4b1fc) SHA1(166a96b5757946231f3619844366218065412935) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "sa-1h", 0xf000, 0x1000, CRC(379387ec) SHA1(29d37f04c64ed53a2573962dfa9c0623b89e0045) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "s4-11l", 0x0000, 0x1000, CRC(a2162a9e) SHA1(2729cef805c8e863af540424faa1aca82d3525e2) ) + ROM_LOAD( "s5-11m", 0x1000, 0x1000, CRC(12f1c2db) SHA1(004e25a53ffa197e1238dfa53c530f128cf40516) ) + ROM_LOAD( "s6-13l", 0x2000, 0x1000, CRC(d21e2a57) SHA1(0462cd3a5be87da97ed1bd8b79f8822cd5a33cf1) ) + ROM_LOAD( "s7-13m", 0x3000, 0x1000, CRC(c4f247cd) SHA1(2c86bf479169981daf0378eb0b3e1a600937aaf2) ) + ROM_LOAD( "s8-15l", 0x4000, 0x1000, CRC(672a92d0) SHA1(1bc89f6a76873504aa0fcfa0c6a43e8546edde27) ) + ROM_LOAD( "s9-15m", 0x5000, 0x1000, CRC(87c8ee9a) SHA1(158019b18bc3e5104bebeb241c077a706bf72ff2) ) + + ROM_REGION( 0x0040, REGION_PROMS, 0 ) + ROM_LOAD( "sc-5m", 0x0000, 0x0020, CRC(2a976ebe) SHA1(f3c1b0d98f431f9cd0d5fa009fafa1115aabe6e5) ) /* palette */ + ROM_LOAD( "sb-4c", 0x0020, 0x0020, CRC(a29b4204) SHA1(7f15cae5c4aaa29638fb45029782dafd2b3d1484) ) /* RAS/CAS logic - not used */ +ROM_END + +ROM_START( wtennis ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "tx", 0xc000, 0x0800, CRC(fd343474) SHA1(1e1fd3f20ce1c7533767344f924029c8c62139a1) ) + ROM_LOAD( "t4", 0xd000, 0x1000, CRC(e465d82c) SHA1(c357dcf17539150425574985afa559db2e6ab834) ) + ROM_LOAD( "t3", 0xe000, 0x1000, CRC(8f090eab) SHA1(baeef8ee05010bf44cf8865a22911f3d458df1b0) ) + ROM_LOAD( "t2", 0xf000, 0x1000, CRC(d2f9dd30) SHA1(1faa088806e8627b5e561d8b99054d295045dcfb) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "t1", 0xf000, 0x1000, CRC(40737ea7) SHA1(27e8474028385574035d3982f9c576bb9bb3facd) ) /* starts at 0000, not f000; 0000-01ff is RAM */ + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "t7", 0x0000, 0x1000, CRC(aa935169) SHA1(965f41a9fcf35ac7c899e79acd0a85ab588d5831) ) + ROM_LOAD( "t10", 0x1000, 0x1000, CRC(746be927) SHA1(a3361384437ac7c494fde92953c5aa5e3c104644) ) + ROM_LOAD( "t6", 0x2000, 0x1000, CRC(4fb8565d) SHA1(6de865e41dcba45190af0753baebf5ab66e4eeb4) ) + ROM_LOAD( "t9", 0x3000, 0x1000, CRC(4893286d) SHA1(f2c330286272b8d334b887bc4dd9608158249fc3) ) + ROM_LOAD( "t5", 0x4000, 0x1000, CRC(ea1efa5d) SHA1(dd8ef1991d74778e6844a669e6de649e1130ec79) ) + ROM_LOAD( "t8", 0x5000, 0x1000, CRC(542ace7b) SHA1(b1423d39302ad7d98c9223d8b1d6d062b7676dd9) ) + + ROM_REGION( 0x0040, REGION_PROMS, 0 ) + ROM_LOAD( "mb7051.m5", 0x0000, 0x0020, CRC(f051cb28) SHA1(6aebccd38ba7887caff248c8acddb8e14526f1e7) ) /* palette */ + ROM_LOAD( "sb-4c", 0x0020, 0x0020, CRC(a29b4204) SHA1(7f15cae5c4aaa29638fb45029782dafd2b3d1484) ) /* RAS/CAS logic - not used */ +ROM_END + +ROM_START( mmonkey ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "mmonkey.e4", 0xc000, 0x1000, CRC(8d31bf6a) SHA1(77b44d8e2b4db148727e7bfc5162c7e9e9cfc662) ) + ROM_LOAD( "mmonkey.d4", 0xd000, 0x1000, CRC(e54f584a) SHA1(a03fef09f6a0bb6802b33b28c45548efb85cda5c) ) + ROM_LOAD( "mmonkey.b4", 0xe000, 0x1000, CRC(399a161e) SHA1(0eb3c5031a7d8c7b14019e215b18dac24a9e70dd) ) + ROM_LOAD( "mmonkey.a4", 0xf000, 0x1000, CRC(f7d3d1e3) SHA1(ff650a833e5e8975fe5b4a644ce6c35de5e04740) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "mmonkey.h1", 0xf000, 0x1000, CRC(5bcb2e81) SHA1(60fb8fd83c83b278e3aaf96f0b6dbefbc1eef0f7) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "mmonkey.l11", 0x0000, 0x1000, CRC(b6aa8566) SHA1(bc90d4cfa9a221477d1989fea532621ce3e76439) ) + ROM_LOAD( "mmonkey.m11", 0x1000, 0x1000, CRC(6cc4d0c4) SHA1(f43450e97dd0c6d0a269c06e4c4253d0814590e9) ) + ROM_LOAD( "mmonkey.l13", 0x2000, 0x1000, CRC(2a343b7e) SHA1(1dba32a83db933096b9a9fbcfd8e0290aba76483) ) + ROM_LOAD( "mmonkey.m13", 0x3000, 0x1000, CRC(0230b50d) SHA1(d62b5d1be35c8bf29483fb616cd7e3949a422e76) ) + ROM_LOAD( "mmonkey.l14", 0x4000, 0x1000, CRC(922bb3e1) SHA1(72d2017e80bea7700a3a61a06882839ecffcabe8) ) + ROM_LOAD( "mmonkey.m14", 0x5000, 0x1000, CRC(f943e28c) SHA1(6ff536a21f34cbb958f6d0f84791102938966ff3) ) + + ROM_REGION( 0x0040, REGION_PROMS, 0 ) + ROM_LOAD( "mmi6331.m5", 0x0000, 0x0020, CRC(55e28b32) SHA1(b73f85224738252dc8dbb38a54250dcfe1fc3ae3) ) /* palette */ + ROM_LOAD( "sb-4c", 0x0020, 0x0020, CRC(a29b4204) SHA1(7f15cae5c4aaa29638fb45029782dafd2b3d1484) ) /* RAS/CAS logic - not used */ +ROM_END + +ROM_START( brubber ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + /* a000-bfff space for the service ROM */ + ROM_LOAD( "brubber.12c", 0xc000, 0x2000, CRC(b5279c70) SHA1(5fb1c50040dc4e9444aed440e2c3cf4c79b72311) ) + ROM_LOAD( "brubber.12d", 0xe000, 0x2000, CRC(b2ce51f5) SHA1(5e38ea24bcafef1faba023def96532abd6f97d38) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "bnj6c.bin", 0xf000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "bnj4e.bin", 0x0000, 0x2000, CRC(b864d082) SHA1(cacf71fa6c0f7121d077381a0ff6222f534295ab) ) + ROM_LOAD( "bnj4f.bin", 0x2000, 0x2000, CRC(6c31d77a) SHA1(5e52554f594f569527af4768d244cc40a7b4460a) ) + ROM_LOAD( "bnj4h.bin", 0x4000, 0x2000, CRC(5824e6fb) SHA1(e98f0eb476b8f033f5cc70a6e503afc4e651fd45) ) + + ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "bnj10e.bin", 0x0000, 0x1000, CRC(f4e9eb49) SHA1(b356512d2ebd4e2005e76496b434e5ecebadb251) ) + ROM_LOAD( "bnj10f.bin", 0x1000, 0x1000, CRC(a9ffacb4) SHA1(49d5f9c0b695f474197fbb761bacc065b6b5808a) ) +ROM_END + +ROM_START( bnj ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "bnj12b.bin", 0xa000, 0x2000, CRC(ba3e3801) SHA1(56284076d938c33c1492a07281b936681eb09808) ) + ROM_LOAD( "bnj12c.bin", 0xc000, 0x2000, CRC(fb3a2cdd) SHA1(4a964389cc8035b9264d4cb133eb6d3826e74b95) ) + ROM_LOAD( "bnj12d.bin", 0xe000, 0x2000, CRC(b88bc99e) SHA1(08a4ddea4037f9e14d0d9f4262a1746b0a3a140c) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "bnj6c.bin", 0xf000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "bnj4e.bin", 0x0000, 0x2000, CRC(b864d082) SHA1(cacf71fa6c0f7121d077381a0ff6222f534295ab) ) + ROM_LOAD( "bnj4f.bin", 0x2000, 0x2000, CRC(6c31d77a) SHA1(5e52554f594f569527af4768d244cc40a7b4460a) ) + ROM_LOAD( "bnj4h.bin", 0x4000, 0x2000, CRC(5824e6fb) SHA1(e98f0eb476b8f033f5cc70a6e503afc4e651fd45) ) + + ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "bnj10e.bin", 0x0000, 0x1000, CRC(f4e9eb49) SHA1(b356512d2ebd4e2005e76496b434e5ecebadb251) ) + ROM_LOAD( "bnj10f.bin", 0x1000, 0x1000, CRC(a9ffacb4) SHA1(49d5f9c0b695f474197fbb761bacc065b6b5808a) ) +ROM_END + +ROM_START( caractn ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + /* a000-bfff space for the service ROM */ + ROM_LOAD( "c7.12c", 0xc000, 0x2000, CRC(b5279c70) SHA1(5fb1c50040dc4e9444aed440e2c3cf4c79b72311) ) + ROM_LOAD( "c6.12d", 0xe000, 0x2000, CRC(1d6957c4) SHA1(bd30f00187e56eef9adcc167dd752a3bb616454c) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "c5.6c", 0xf000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "c0.4e", 0x0000, 0x2000, CRC(bf3ea732) SHA1(d98970b2dda8c3435506656909e5e3aa70d45652) ) + ROM_LOAD( "c1.4f", 0x2000, 0x2000, CRC(9789f639) SHA1(77a4d494698718c052fa1967242a0e4fa263b6ad) ) + ROM_LOAD( "c2.4h", 0x4000, 0x2000, CRC(51dcc111) SHA1(9753d682ba2f4fb4d3b14783ac35ad214bf788b5) ) + + ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "c3.10e", 0x0000, 0x1000, CRC(f4e9eb49) SHA1(b356512d2ebd4e2005e76496b434e5ecebadb251) ) + ROM_LOAD( "c4.10f", 0x1000, 0x1000, CRC(a9ffacb4) SHA1(49d5f9c0b695f474197fbb761bacc065b6b5808a) ) + + ROM_REGION( 0x0040, REGION_PROMS, 0 ) + ROM_LOAD( "tbp18s030.11a", 0x0000, 0x020, CRC(318d25b9) SHA1(9a82619c94f5911d01ddf6b85f7e30cdc6f1d0a3) ) /* palette */ + ROM_LOAD( "tbp18s030.cpu", 0x0020, 0x020, CRC(6b0c2942) SHA1(7d25acc753923b265792fc78f8fc70175c0e0ec2) ) /* RAS/CAS logic - not used */ + + ROM_REGION( 0x0140, REGION_PLDS, 0 ) + ROM_LOAD( "pal10l8.10k", 0x0000, 0x002c, CRC(dc72a65f) SHA1(d61c149d4df93a2074debf7c5e46557c6b06d10d) ) + ROM_LOAD( "pal16r4a.2d", 0x0030, 0x0104, CRC(fd1f3aa2) SHA1(67f1e74fcfc0e2301204ed58b8c6e35d4866a344) ) +ROM_END + +ROM_START( zoar ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "zoar15", 0xd000, 0x1000, BAD_DUMP CRC(1f0cfdb7) SHA1(ce7e871f17c52b6eaf99cfb721e702e4f0e6bb25) ) + ROM_LOAD( "zoar16", 0xe000, 0x1000, CRC(7685999c) SHA1(fabe38d71e797ae0b04b5d3aba228b4c85d96185) ) + ROM_LOAD( "zoar17", 0xf000, 0x1000, CRC(619ea867) SHA1(0a3735384f03a1052d54ab799b5e37038d8ece2a) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "zoar09", 0xf000, 0x1000, CRC(18d96ff1) SHA1(671d934a451e0b042450ea86d24c3751a39b38f8) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "zoar00", 0x0000, 0x1000, CRC(fd2dcb64) SHA1(1a49a6ec6ffd354d872b1af83d55ec96e8215b2b) ) + ROM_LOAD( "zoar01", 0x1000, 0x1000, CRC(74d3ca48) SHA1(2c75ea246f86a057467deb35ef6a6e72f667dd84) ) + ROM_LOAD( "zoar03", 0x2000, 0x1000, CRC(77b7df14) SHA1(a1cbc214fc849b7e3417b1156d1e4440ab67f631) ) + ROM_LOAD( "zoar04", 0x3000, 0x1000, CRC(9be786de) SHA1(480733a1438dffa4b0fac6f76bf84a0deec5d1fa) ) + ROM_LOAD( "zoar06", 0x4000, 0x1000, CRC(07638c71) SHA1(1a7fc49657ac7ac0033bd60c86663bd615079230) ) + ROM_LOAD( "zoar07", 0x5000, 0x1000, CRC(f4710f25) SHA1(08b4cc4252f83a689cded38d9a5a50f55ee6beee) ) + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "zoar10", 0x0000, 0x0800, CRC(aa8bcab8) SHA1(81f1a9fd754fd6f8030ff6b5aa80c7670be9d02e) ) + ROM_LOAD( "zoar11", 0x0800, 0x0800, CRC(dcdad357) SHA1(d1569e1d38f14f5f457547e24df4f80f726c6157) ) + ROM_LOAD( "zoar12", 0x1000, 0x0800, CRC(ed317e40) SHA1(db70889af5f233ca71acf734abfbdb74b6a393c0) ) + + ROM_REGION( 0x1000, REGION_GFX3, 0 ) /* background tilemaps */ + ROM_LOAD( "zoar13", 0x0000, 0x1000, CRC(8fefa960) SHA1(614026aa71703dd3898e470f45730e5c6934b31b) ) + + ROM_REGION( 0x3000, REGION_GFX4, ROMREGION_DISPOSE ) + ROM_LOAD( "zoar02", 0x0000, 0x1000, CRC(d8c3c122) SHA1(841006cc84622e851df462a64696b64bb8cb62a1) ) + ROM_LOAD( "zoar05", 0x1000, 0x1000, CRC(05dc6b09) SHA1(197c720544a090e12980513b441a2b9cf04e212f) ) + ROM_LOAD( "zoar08", 0x2000, 0x1000, CRC(9a148551) SHA1(db92dd7552c6f76a062910f37a3fe3524fdffd38) ) + + ROM_REGION( 0x0040, REGION_PROMS, 0 ) + ROM_LOAD( "z20-1l", 0x0000, 0x0020, CRC(a63f0a07) SHA1(16532d3ac0536ad4b712005fd722ee8c14d02e9b) ) + ROM_LOAD( "z21-1l", 0x0020, 0x0020, CRC(5e1e5788) SHA1(56068b209cc7c734bbcbb9858f40faa6474c8095) ) +ROM_END + +ROM_START( disco ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "disco.w5", 0xa000, 0x1000, CRC(b2c87b78) SHA1(4095f0052ff0ac35ecd2ec1c1e99d21283d336e1) ) + ROM_LOAD( "disco.w4", 0xb000, 0x1000, CRC(ad7040ee) SHA1(287a4ff06edda4c66e2351e49a94212728aacb4e) ) + ROM_LOAD( "disco.w3", 0xc000, 0x1000, CRC(12fb4f08) SHA1(d6095f20d8676df89b1459134b5521ac311ddded) ) + ROM_LOAD( "disco.w2", 0xd000, 0x1000, CRC(73f6fb2f) SHA1(7b75b825d9bf7e512e054762500f79c18a276e1f) ) + ROM_LOAD( "disco.w1", 0xe000, 0x1000, CRC(ee7b536b) SHA1(b2de5da15cee1d80391eafd0a08361803f859c89) ) + ROM_LOAD( "disco.w0", 0xf000, 0x1000, CRC(7c26e76b) SHA1(952e91c4acc18d01b0e2c3efd764da8768f583da) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "disco.w6", 0xf000, 0x1000, CRC(d81e781e) SHA1(bde510bfed06a13bd56bf7ddbf220e7cf82f79b6) ) + + /* no gfx1 */ + + ROM_REGION( 0x0020, REGION_PROMS, 0 ) + ROM_LOAD( "disco.clr", 0x0000, 0x0020, CRC(a393f913) SHA1(42dce159283427064b3f5ce3a6e2189744ecd943) ) +ROM_END + +ROM_START( discof ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "w5-f", 0xa000, 0x1000, CRC(9d53c71c) SHA1(53c410cfa4fbbfd08e1c3cf7aeba1c9627171a71) ) + ROM_LOAD( "w4-f", 0xb000, 0x1000, CRC(c1f8d747) SHA1(33f5fe73d1851ef4da670075d1aec1550e0417ce) ) + ROM_LOAD( "w3-f", 0xc000, 0x1000, CRC(9aadd252) SHA1(c6da7ef46333d525e676c59f03ccc908108b41ba) ) + ROM_LOAD( "w2-f", 0xd000, 0x1000, CRC(f131a5bb) SHA1(84b7dea112dce12e5cb235a13f6dc4edcfb18c06) ) + ROM_LOAD( "w1-f", 0xe000, 0x1000, CRC(c8ec57c5) SHA1(904a9ed0a7f1230c611bf473b9bc52e63eb56dbe) ) + ROM_LOAD( "w0-f", 0xf000, 0x1000, CRC(b3787a92) SHA1(7f40621dc739c1108a5df43142ab04709a380219) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "disco.w6", 0xf000, 0x1000, CRC(d81e781e) SHA1(bde510bfed06a13bd56bf7ddbf220e7cf82f79b6) ) + + /* no gfx1 */ + + ROM_REGION( 0x0020, REGION_PROMS, 0 ) + ROM_LOAD( "disco.clr", 0x0000, 0x0020, CRC(a393f913) SHA1(42dce159283427064b3f5ce3a6e2189744ecd943) ) +ROM_END + +ROM_START( sdtennis ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "ao_08.12b", 0xa000, 0x2000, CRC(6193724c) SHA1(97239c5aa8c8cd1812fba1b15be4d9a48eb0651a) ) + ROM_LOAD( "ao_07.12c", 0xc000, 0x2000, CRC(064888db) SHA1(f7bb728ab3408bb553191d9e131a441db1b39666) ) + ROM_LOAD( "ao_06.12d", 0xe000, 0x2000, CRC(413c984c) SHA1(1431df4db52d621ba39fd47dbd49da103b5c0bcf) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "ao_05.6c", 0xf000, 0x1000, CRC(46833e38) SHA1(420831149a566199d6a3c74ef3df0687b4ddcbe4) ) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "ao_00.4e", 0x0000, 0x2000, CRC(f4e0cbd6) SHA1(a2ede0ce4a26957a5d3b62872a42b8979f5000aa) ) + ROM_LOAD( "ao_01.4f", 0x2000, 0x2000, CRC(f99029da) SHA1(45bc56ff6284d02371d5e1cd5239be665f9e56c7) ) + ROM_LOAD( "ao_02.4h", 0x4000, 0x2000, CRC(c3077555) SHA1(addfc67735dc22dfed9c4c4ec8d9dcf590c76737) ) + + ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "ao_03.10e", 0x0000, 0x1000, CRC(1977db9b) SHA1(d175974967fdeb608df668089fa2a14b2d1609e6) ) + ROM_LOAD( "ao_04.10f", 0x1000, 0x1000, CRC(921952af) SHA1(4e9248f3493a5f4651278f27c11f507571242317) ) +ROM_END + +static void decrypt_C10707_cpu(int cpu, int region) +{ + UINT8 *decrypt = auto_malloc(0x10000); + UINT8 *rom = memory_region(region); + offs_t addr; + + memory_set_decrypted_region(cpu, 0x0000, 0xffff, decrypt); + + /* Swap bits 5 & 6 for opcodes */ + for (addr = 0; addr < 0x10000; addr++) + decrypt[addr] = swap_bits_5_6(rom[addr]); + + if (cpu == 0) + decrypted = decrypt; +} + +static READ8_HANDLER( wtennis_reset_hack_r ) +{ + UINT8 *RAM = memory_region(REGION_CPU1); + + /* Otherwise the game goes into test mode and there is no way out that I + can see. I'm not sure how it can work, it probably somehow has to do + with the tape system */ + + RAM[0xfc30] = 0; + + return RAM[0xc15f]; +} + +static void init_rom1(void) +{ + UINT8 *rom = memory_region(REGION_CPU1); + + decrypted = auto_malloc(0x10000); + memory_set_decrypted_region(0, 0x0000, 0xffff, decrypted); + + /* For now, just copy the RAM array over to ROM. Decryption will happen */ + /* at run time, since the CPU applies the decryption only if the previous */ + /* instruction did a memory write. */ + memcpy(decrypted,rom,0x10000); +} + +static DRIVER_INIT( btime ) +{ + init_rom1(); +} + +static DRIVER_INIT( zoar ) +{ + UINT8 *rom = memory_region(REGION_CPU1); + + /* At location 0xD50A is what looks like an undocumented opcode. I tried + implementing it given what opcode 0x23 should do, but it still didn't + work in demo mode. So this could be another protection or a bad ROM read. + I'm NOPing it out for now. */ + memset(&rom[0xd50a],0xea,8); + + init_rom1(); +} + +static DRIVER_INIT( lnc ) +{ + decrypt_C10707_cpu(0, REGION_CPU1); +} + +static DRIVER_INIT( cookrace ) +{ + memcpy(&sound_rambase[0x200], memory_region(REGION_CPU2) + 0xf200, 0x200); + decrypt_C10707_cpu(0, REGION_CPU1); +} + +static DRIVER_INIT( wtennis ) +{ + memcpy(&sound_rambase[0x200], memory_region(REGION_CPU2) + 0xf200, 0x200); + memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xc15f, 0xc15f, 0, 0, wtennis_reset_hack_r); + decrypt_C10707_cpu(0, REGION_CPU1); +} + +static DRIVER_INIT( sdtennis ) +{ + decrypt_C10707_cpu(0, REGION_CPU1); + decrypt_C10707_cpu(1, REGION_CPU2); +} + + +GAME( 1982, btime, 0, btime, btime, btime, ROT270, "Data East Corporation", "Burger Time (Data East set 1)", 0 ) +GAME( 1982, btime2, btime, btime, btime, btime, ROT270, "Data East Corporation", "Burger Time (Data East set 2)", 0 ) +GAME( 1982, btimem, btime, btime, btime, btime, ROT270, "Data East (Bally Midway license)", "Burger Time (Midway)", 0 ) +GAME( 1982, cookrace, btime, cookrace, cookrace, cookrace,ROT270, "bootleg", "Cook Race", 0 ) +GAME( 1981, lnc, 0, lnc, lnc, lnc, ROT270, "Data East Corporation", "Lock'n'Chase", 0 ) +GAME( 1982, wtennis, 0, wtennis, wtennis, wtennis, ROT270, "bootleg", "World Tennis", 0 ) +GAME( 1982, mmonkey, 0, mmonkey, mmonkey, lnc, ROT270, "Technos + Roller Tron", "Minky Monkey", 0 ) +GAME( 1982, brubber, 0, bnj, bnj, lnc, ROT270, "Data East", "Burnin' Rubber", 0 ) +GAME( 1982, bnj, brubber, bnj, bnj, lnc, ROT270, "Data East USA (Bally Midway license)", "Bump 'n' Jump", 0 ) +GAME( 1982, caractn, brubber, bnj, bnj, lnc, ROT270, "bootleg", "Car Action", 0 ) +GAME( 1982, zoar, 0, zoar, zoar, zoar, ROT270, "Data East USA", "Zoar", 0 ) +GAME( 1982, disco, 0, disco, disco, btime, ROT270, "Data East", "Disco No.1", 0 ) +GAME( 1982, discof, disco, disco, disco, btime, ROT270, "Data East", "Disco No.1 (Rev.F)", 0 ) +GAME( 1983, sdtennis, 0, bnj, sdtennis, sdtennis,ROT270, "Data East Corporation", "Super Doubles Tennis", 0 ) |