From ed5d851b109b155c4e58bd60cb153ea1f1ab77b5 Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 13 Apr 2017 23:46:26 +0200 Subject: [PATCH] viper.cpp: input cleanups (nw) --- src/mame/drivers/viper.cpp | 197 ++++++++++++++++++++++++++++--------- 1 file changed, 149 insertions(+), 48 deletions(-) diff --git a/src/mame/drivers/viper.cpp b/src/mame/drivers/viper.cpp index 99cb6c7ac01..24708c6dfee 100644 --- a/src/mame/drivers/viper.cpp +++ b/src/mame/drivers/viper.cpp @@ -380,13 +380,13 @@ public: m_maincpu(*this, "maincpu"), m_ata(*this, "ata"), m_voodoo(*this, "voodoo"), - m_workram(*this, "workram") + m_workram(*this, "workram"), + m_io_ports(*this, {"IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7"}) { } uint32_t m_epic_iack; int m_cf_card_ide; - int m_unk1_bit; uint32_t m_voodoo3_pci_reg[0x100]; int m_unk_serial_bit_w; uint16_t m_unk_serial_cmd; @@ -403,7 +403,7 @@ public: DECLARE_WRITE64_MEMBER(voodoo3_w); DECLARE_READ64_MEMBER(voodoo3_lfb_r); DECLARE_WRITE64_MEMBER(voodoo3_lfb_w); - DECLARE_READ64_MEMBER(unk1_r); + DECLARE_READ8_MEMBER(input_r); DECLARE_READ64_MEMBER(e70000_r); DECLARE_WRITE64_MEMBER(e70000_w); DECLARE_WRITE64_MEMBER(unk1a_w); @@ -446,6 +446,9 @@ public: required_device m_ata; required_device m_voodoo; required_shared_ptr m_workram; + required_ioport_array<8> m_io_ports; + uint8_t m_ds2430_unk_status; + DECLARE_CUSTOM_INPUT_MEMBER(ds2430_unk_r); }; uint32_t viper_state::screen_update_viper(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -1729,7 +1732,6 @@ WRITE64_MEMBER(viper_state::voodoo3_lfb_w) #define DS2430_STATE_READ_MEM 5 #define DS2430_STATE_READ_MEM_ADDRESS 6 -static int unk1_bit = 1; static uint8_t ds2430_data; static int ds2430_data_count = 0; static int ds2430_reset = 0; @@ -1745,18 +1747,19 @@ TIMER_CALLBACK_MEMBER(viper_state::ds2430_timer_callback) if (param == 1) { - unk1_bit = 0; + m_ds2430_unk_status = 0; ds2430_timer->adjust(attotime::from_usec(150), 2); } else if (param == 2) { - unk1_bit = 1; + m_ds2430_unk_status = 1; ds2430_reset = 1; ds2430_state = DS2430_STATE_ROM_COMMAND; } } -READ64_MEMBER(viper_state::unk1_r) +#ifdef UNUSED_FUNCTION +READ64_MEMBER(viper_state::input_r) { uint64_t r = 0; //return 0;//0x0000400000000000U; @@ -1766,14 +1769,14 @@ READ64_MEMBER(viper_state::unk1_r) if (ACCESSING_BITS_40_47) { uint64_t reg = 0; - reg |= (unk1_bit << 5); + reg |= (m_ds2430_unk_status << 5); reg |= 0x40; // if this bit is 0, loads a disk copier instead //r |= 0x04; // screen flip reg |= 0x08; // memory card check (1 = enable) r |= reg << 40; - //r |= (uint64_t)(unk1_bit << 5) << 40; + //r |= (uint64_t)(m_ds2430_unk_status << 5) << 40; //r |= 0x0000400000000000U; //r |= 0x0000040000000000U; // screen flip @@ -1801,6 +1804,12 @@ READ64_MEMBER(viper_state::unk1_r) return r; } +#endif + +READ8_MEMBER(viper_state::input_r) +{ + return (m_io_ports[offset & 7])->read(); +} int viper_state::ds2430_insert_cmd_bit(int bit) @@ -1865,9 +1874,9 @@ void viper_state::DS2430_w(int bit) case DS2430_STATE_READ_MEM: { - unk1_bit = (ds2430_rom[(ds2430_data_count/8)] >> (ds2430_data_count%8)) & 1; + m_ds2430_unk_status = (ds2430_rom[(ds2430_data_count/8)] >> (ds2430_data_count%8)) & 1; ds2430_data_count++; - printf("DS2430_w: read mem %d, bit = %d\n", ds2430_data_count, unk1_bit); + printf("DS2430_w: read mem %d, bit = %d\n", ds2430_data_count, m_ds2430_unk_status); if (ds2430_data_count >= 256) { @@ -1884,7 +1893,7 @@ void viper_state::DS2430_w(int bit) ds2430_data_count++; printf("DS2430_w: read rom %d, bit = %d\n", ds2430_data_count, rombit); - unk1_bit = rombit; + m_ds2430_unk_status = rombit; if (ds2430_data_count >= 64) { @@ -1925,7 +1934,7 @@ WRITE64_MEMBER(viper_state::e70000_w) { ds2430_timer->adjust(attotime::from_usec(40), 1); // presence pulse for 240 microsecs - unk1_bit = 1; + m_ds2430_unk_status = 1; // printf("e70000_w: %08X%08X, %08X (mask %08X%08X) at %08X\n", (uint32_t)(data >> 32), (uint32_t)data, offset, (uint32_t)(mem_mask >> 32), (uint32_t)mem_mask, space.device().safe_pc()); } else @@ -1959,7 +1968,7 @@ WRITE64_MEMBER(viper_state::unk1b_w) { if (ACCESSING_BITS_56_63) { - unk1_bit = 0; + m_ds2430_unk_status = 0; // printf("unk1b_w: %08X%08X, %08X (mask %08X%08X) at %08X\n", (uint32_t)(data >> 32), (uint32_t)data, offset, (uint32_t)(mem_mask >> 32), (uint32_t)mem_mask, cpu->safe_pc()); } } @@ -2053,8 +2062,6 @@ WRITE64_MEMBER(viper_state::unk_serial_w) } } - - /*****************************************************************************/ static ADDRESS_MAP_START(viper_map, AS_PROGRAM, 64, viper_state ) @@ -2070,42 +2077,99 @@ static ADDRESS_MAP_START(viper_map, AS_PROGRAM, 64, viper_state ) // 0xff300000, 0xff300fff - ata_r/w (installed in DRIVER_INIT(viperhd)) AM_RANGE(0xffe00000, 0xffe00007) AM_READ(e00000_r) AM_RANGE(0xffe00008, 0xffe0000f) AM_READWRITE(e00008_r, e00008_w) - AM_RANGE(0xffe10000, 0xffe10007) AM_READ(unk1_r) + AM_RANGE(0xffe08000, 0xffe08007) AM_NOP + AM_RANGE(0xffe10000, 0xffe10007) AM_READ8(input_r, 0xffffffffffffffffU) AM_RANGE(0xffe30000, 0xffe31fff) AM_DEVREADWRITE8("m48t58", timekeeper_device, read, write, 0xffffffffffffffffU) AM_RANGE(0xffe40000, 0xffe4000f) AM_NOP AM_RANGE(0xffe50000, 0xffe50007) AM_WRITE(unk2_w) + AM_RANGE(0xffe60000, 0xffe60007) AM_NOP AM_RANGE(0xffe70000, 0xffe7000f) AM_READWRITE(e70000_r, e70000_w) AM_RANGE(0xffe80000, 0xffe80007) AM_WRITE(unk1a_w) AM_RANGE(0xffe88000, 0xffe88007) AM_WRITE(unk1b_w) + AM_RANGE(0xffe98000, 0xffe98007) AM_NOP AM_RANGE(0xffe9a000, 0xffe9bfff) AM_RAM // World Combat uses this AM_RANGE(0xfff00000, 0xfff3ffff) AM_ROM AM_REGION("user1", 0) // Boot ROM ADDRESS_MAP_END /*****************************************************************************/ +CUSTOM_INPUT_MEMBER(viper_state::ds2430_unk_r) +{ + return m_ds2430_unk_status; +} + + static INPUT_PORTS_START( viper ) PORT_START("IN0") - - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // Shift down - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW) /* Test Button */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_7) - - + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("IN1") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // Shift up - + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("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_LOW, IPT_UNKNOWN ) // memory card check (1 = enable) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, viper_state, ds2430_unk_r, nullptr) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // if this bit is 0, loads a disk copier instead + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START("IN3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) /* Test Button */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) + PORT_DIPNAME( 0x20, 0x20, "3" ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "3-3" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + // controls screen mux in Mocap Golf? + PORT_START("IN4") + PORT_DIPNAME( 0x01, 0x01, "4" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "4" ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("IN5") + PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START("IN6") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN7") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("DSW") PORT_DIPNAME( 0x80, 0x80, "DIP1" ) PORT_DIPLOCATION("SW:1") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) @@ -2133,6 +2197,41 @@ static INPUT_PORTS_START( viper ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +INPUT_PORTS_START( thrild2 ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN3") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Shift Down") + + PORT_MODIFY("IN4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Shift Up") + + // TODO: analog channels +INPUT_PORTS_END + +INPUT_PORTS_START( gticlub2 ) + PORT_INCLUDE( thrild2 ) + + // TODO: specific analog channel for hand brake +INPUT_PORTS_END + +INPUT_PORTS_START( boxingm ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN5") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // memory card check for boxingm (actually comms enable?) +INPUT_PORTS_END + +INPUT_PORTS_START( tsurugi ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN4") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Shot") + + PORT_MODIFY("IN5") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // memory card check for tsurugi (actually comms enable?) +INPUT_PORTS_END + /*****************************************************************************/ @@ -2172,6 +2271,8 @@ void viper_state::machine_reset() // Viper expects these settings or the BIOS fails identify_device[51] = 0x0200; /* 51: PIO data transfer cycle timing mode */ identify_device[67] = 0x00f0; /* 67: minimum PIO transfer cycle time without flow control */ + + m_ds2430_unk_status = 1; } static MACHINE_CONFIG_START( viper, viper_state ) @@ -2815,11 +2916,11 @@ GAME(1999, kviper, 0, viper, viper, viper_state, viper, ROT0, "Ko GAME(2001, ppp2nd, kviper, viper, viper, viper_state, viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, boxingm, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Boxing Mania (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, boxingm, kviper, viper, boxingm, viper_state, vipercf, ROT0, "Konami", "Boxing Mania: Ashita no Joe (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2000, code1d, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Code One Dispatch (ver D)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2000, code1db, code1d, viper, viper, viper_state, vipercf, ROT0, "Konami", "Code One Dispatch (ver B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, gticlub2, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver JAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, gticlub2ea,gticlub2, viper, viper, viper_state, vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, gticlub2, kviper, viper, gticlub2, viper_state, vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver JAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, gticlub2ea,gticlub2, viper, gticlub2, viper_state, vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2001, jpark3, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Jurassic Park 3 (ver EBC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2001, jpark3u, jpark3, viper, viper, viper_state, vipercf, ROT0, "Konami", "Jurassic Park 3 (ver UA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2001, mocapglf, kviper, viper, viper, viper_state, vipercf, ROT90, "Konami", "Mocap Golf (ver UAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) @@ -2836,14 +2937,14 @@ GAME(2003, popn9, kviper, viper, viper, viper_state, vipercf, ROT0, "Ko GAME(2001, sscopex, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Silent Scope EX (ver UAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2001, sogeki, sscopex, viper, viper, viper_state, vipercf, ROT0, "Konami", "Sogeki (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2002, sscopefh, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Silent Scope Fortune Hunter", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EBB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2a, thrild2, viper, viper, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2ab, thrild2, viper, viper, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2ac, thrild2, viper, viper, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt 2)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2c, thrild2, viper, viper, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, tsurugi, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "Tsurugi (ver EAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, tsurugie, tsurugi, viper, viper, viper_state, vipercf, ROT0, "Konami", "Tsurugi (ver EAB, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, tsurugij, tsurugi, viper, viper, viper_state, vipercf, ROT0, "Konami", "Tsurugi (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, thrild2, kviper, viper, thrild2, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EBB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, thrild2a, thrild2, viper, thrild2, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, thrild2ab, thrild2, viper, thrild2, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, thrild2ac, thrild2, viper, thrild2, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt 2)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, thrild2c, thrild2, viper, thrild2, viper_state, vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2002, tsurugi, kviper, viper, tsurugi, viper_state, vipercf, ROT0, "Konami", "Tsurugi (ver EAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2002, tsurugie, tsurugi, viper, tsurugi, viper_state, vipercf, ROT0, "Konami", "Tsurugi (ver EAB, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2002, tsurugij, tsurugi, viper, tsurugi, viper_state, vipercf, ROT0, "Konami", "Tsurugi (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2002, wcombat, kviper, viper, viper, viper_state, vipercf, ROT0, "Konami", "World Combat (ver AAD:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2002, wcombatb, wcombat, viper, viper, viper_state, vipercf, ROT0, "Konami", "World Combat (ver AAD:B, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) GAME(2002, wcombatk, wcombat, viper, viper, viper_state, vipercf, ROT0, "Konami", "World Combat (ver KBC:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND)