From f0e85a6e54f8c049509c2d5d9e7652564456c4a2 Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Tue, 17 Aug 2021 01:36:25 +0900 Subject: viper.cpp: Added audio support, updated inputs, and improved default NVRAM contents. (#8434) * Updated compatibility lists, added NVRAMs, added more inputs and per-game DIP switches. * Fixed port DIP location values. * Added comment about boxingm's pad controller. --- src/devices/sound/dmadac.cpp | 77 +------- src/devices/sound/dmadac.h | 33 +++- src/mame/drivers/viper.cpp | 426 ++++++++++++++++++++++++++++++++++--------- src/mame/mame.lst | 6 +- 4 files changed, 386 insertions(+), 156 deletions(-) diff --git a/src/devices/sound/dmadac.cpp b/src/devices/sound/dmadac.cpp index 384449fca9b..ae2ebce61ad 100644 --- a/src/devices/sound/dmadac.cpp +++ b/src/devices/sound/dmadac.cpp @@ -23,8 +23,6 @@ #define DEFAULT_SAMPLE_RATE (48000) -#define BUFFER_SIZE 32768 - /************************************* * @@ -38,8 +36,7 @@ void dmadac_sound_device::device_start() { - /* reset the state */ - m_volume = 1.0; + initialize_state(); /* allocate a stream channel */ m_channel = stream_alloc(0, 1, DEFAULT_SAMPLE_RATE); @@ -49,11 +46,18 @@ void dmadac_sound_device::device_start() save_item(NAME(m_bufout)); save_item(NAME(m_volume)); save_item(NAME(m_enabled)); - save_item(NAME(m_frequency)); save_item(NAME(m_buffer)); } +void dmadac_sound_device::initialize_state() +{ + /* reset the state */ + m_volume = 1.0; + m_bufin = m_bufout = 0; + m_enabled = 0; + std::fill_n(m_buffer.begin(), BUFFER_SIZE, 0); +} /************************************* * @@ -83,66 +87,6 @@ void dmadac_sound_device::flush() m_channel->update(); } -void dmadac_sound_device::transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, int16_t *data) -{ - int j; - - /* loop over all channels and accumulate the data */ - constexpr stream_buffer::sample_t sample_scale = 1.0 / 32768.0; - if (m_enabled) - { - int maxin = (m_bufout + BUFFER_SIZE - 1) % BUFFER_SIZE; - int16_t *src = data + channel * channel_spacing; - int curin = m_bufin; - - /* copy the data */ - for (j = 0; j < total_frames && curin != maxin; j++) - { - m_buffer[curin] = stream_buffer::sample_t(*src) * sample_scale; - curin = (curin + 1) % BUFFER_SIZE; - src += frame_spacing; - } - m_bufin = curin; - - /* log overruns */ - if (j != total_frames) - logerror("dmadac_transfer: buffer overrun (short %d frames)\n", total_frames - j); - } - - // FIXME: this line has rotted and can no longer compile - it should be fixed and uncommented or removed - //LOG("dmadac_transfer - %d samples, %d effective, %d in buffer\n", total_frames, int(total_frames * double(DEFAULT_SAMPLE_RATE) / dmadac[first_channel].frequency), dmadac[first_channel].curinpos - dmadac[first_channel].curoutpos); -} - -void dmadac_sound_device::transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, stream_buffer::sample_t *data) -{ - int j; - - /* loop over all channels and accumulate the data */ - if (m_enabled) - { - int maxin = (m_bufout + BUFFER_SIZE - 1) % BUFFER_SIZE; - stream_buffer::sample_t *src = data + channel * channel_spacing; - int curin = m_bufin; - - /* copy the data */ - for (j = 0; j < total_frames && curin != maxin; j++) - { - m_buffer[curin] = *src; - curin = (curin + 1) % BUFFER_SIZE; - src += frame_spacing; - } - m_bufin = curin; - - /* log overruns */ - if (j != total_frames) - logerror("dmadac_transfer: buffer overrun (short %d frames)\n", total_frames - j); - } - - // FIXME: this line has rotted and can no longer compile - it should be fixed and uncommented or removed - //LOG("dmadac_transfer - %d samples, %d effective, %d in buffer\n", total_frames, int(total_frames * double(DEFAULT_SAMPLE_RATE) / dmadac[first_channel].frequency), dmadac[first_channel].curinpos - dmadac[first_channel].curoutpos); -} - - /************************************* * @@ -226,8 +170,7 @@ dmadac_sound_device::dmadac_sound_device(const machine_config &mconfig, const ch m_bufin(0), m_bufout(0), m_volume(0), - m_enabled(0), - m_frequency(0) + m_enabled(0) { } diff --git a/src/devices/sound/dmadac.h b/src/devices/sound/dmadac.h index eb73d338eb9..6cbe8312231 100644 --- a/src/devices/sound/dmadac.h +++ b/src/devices/sound/dmadac.h @@ -18,9 +18,35 @@ class dmadac_sound_device : public device_t, public device_sound_interface public: dmadac_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + void initialize_state(); void flush(); - void transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, int16_t *data); - void transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, stream_buffer::sample_t *data); + + template void transfer(int channel, offs_t channel_spacing, offs_t frame_spacing, offs_t total_frames, T* data) { + int j; + + constexpr stream_buffer::sample_t sample_scale = 1.0 / double(std::numeric_limits::max()); + + if (m_enabled) + { + int maxin = (m_bufout + BUFFER_SIZE - 1) % BUFFER_SIZE; + T* src = data + channel * channel_spacing; + int curin = m_bufin; + + /* copy the data */ + for (j = 0; j < total_frames && curin != maxin; j++) + { + m_buffer[curin] = stream_buffer::sample_t(*src) * sample_scale; + curin = (curin + 1) % BUFFER_SIZE; + src += frame_spacing; + } + m_bufin = curin; + + /* log overruns */ + if (j != total_frames) + logerror("dmadac_transfer: buffer overrun (short %d frames)\n", total_frames - j); + } + } + void enable(uint8_t enable); void set_frequency(double frequency); void set_volume(uint16_t volume); @@ -43,7 +69,8 @@ private: /* per-channel parameters */ stream_buffer::sample_t m_volume; uint8_t m_enabled; - double m_frequency; + + static constexpr int BUFFER_SIZE = 32768; }; DECLARE_DEVICE_TYPE(DMADAC, dmadac_sound_device) diff --git a/src/mame/drivers/viper.cpp b/src/mame/drivers/viper.cpp index fc743fcf438..3a8e9e5448a 100644 --- a/src/mame/drivers/viper.cpp +++ b/src/mame/drivers/viper.cpp @@ -16,7 +16,7 @@ IRQ0: ??? (Task 4) IRQ1: unused IRQ2: ??? Possibly UART? Accesses registers at 0xffe00008...f - IRQ3: ??? (Task 5, sound?) + IRQ3: Sound (Task 5) IRQ4: Voodoo3 Currently only for User Interrupt Command, maybe a more extensive handler gets installed later? I2C: ??? (no task switch) what drives this? network? U13 (ADC838) test fails if I2C doesn't work @@ -37,6 +37,13 @@ 0x08: unknown mem pointer, task stack pointer? 0x0c: pointer to task PC (also top of stack?) + Sound: + 0x00001320: A flag that's used when sound effects(?) are being played + 0x00001324: Pointer to the data cache buffer to be used for loading and mixing BGM/SE. + Each buffer is 0x800 bytes in size and the game will switch between the two every IRQ3(?). + The original audio typically seems to be ADPCM which is then decoded and mixed in software. + 0x00001330: L/R channel PCM data when a sound effect is played? Seems to be the last result when mixing down buffers. + 0x00000310: Global timer 0 IRQ handler 0x00000320: Global timer 1 IRQ handler @@ -75,27 +82,45 @@ TODO: - needs a proper way to dump security dongles, anything but p9112 has placeholder ROM for ds2430. + - figure out why games randomly crash (IRQ related?) + + Other notes: + - "Distribution error" means there's a region mismatch. + - Games that hang randomly seem to hang on IRQ16 possibly? You can see "IRQ16 taken" but it hangs before you see "IRQ16 cleared". + - Hold TEST while booting (from the very start) to initialize the RTC for most games. + - It seems that p911 has 3 unique regional images: U/E, K/A, and J. If you try booting, for example, U region on a K/A image, it won't find some files and will error out with "distribution error". Game status: - ppp2nd Boots in-game, no sound or DVD support, crashes when going into song selection screen - boxingm Goes to attract mode when ran with memory card check. Coins up. - code1d,b RTC self check bad - gticlub2,ea Attract mode works. Coins up. Hangs in car selection. - jpark3 POST?: Shows "Now loading..." then black screen (sets global timer 1 on EPIC) - with IRQ3 crashes at first 3d frame - mocapglf Sensor I/O error - mocapb,j Crash after self checks - p911 "Distribution error" - p911e,j,uc,kc Hangs at POST, with IRQ3 it crashes at first 3d frame - p9112 RTC self check bad + boxingm Goes in-game. Controllers are not emulated. Various graphical glitches. + jpark3 Goes in-game. Controllers are not emulated. Various graphical glitches. + mocapb,j Goes in-game. Controllers are not emulated. Various graphical glitches. Random crashes. + ppp2nd,a Fully playable with graphical glitches. No network or DVD support. Crashes when returning to game mode from test menu. + p911(all) Goes in-game. Controllers are not emulated. Various graphical glitches. + tsurugi,j Goes in-game. Controllers are not emulated. Various graphical glitches. + + gticlub2,ea Attract mode works. Coins up. Hangs in various places. Will crash with "network error" after stage is selected. + thrild2,a Attract mode with partial graphics. Coins up. Hangs in various places. + + sscopefh Graphics heavily glitched. Gun controller is not emulated. Sensor error and hopper error stop it from working. + + mfightc,c Requires touch panel emulation. Gets stuck at "Waiting for central monitor, checking serial...". + xtrial Hangs at "Please set the time for the bookkeeping" message. + + p9112 RTC self check bad. + The game checks the checksum of 0x157d4d0-0x157d4ee against the checksum that should be at 0x157d4ee-0x157d4ef, + but this part of memory is never written to after its initial clearing on boot. + If 0xffff is placed at 0x157d4ee then the game will pass the RTC check. + The game will later complain about "Hardware Error: Security Key Error" if you try starting the game. + code1d,b Can boot but crashes randomly and quickly so it's hard to do anything. + + mocapglf Security code error sscopex/sogeki Security code error - sscopefh Needs gun inputs. - thrild2,a Attract mode with partial graphics. Coins up. Hangs in car selection screen. - thrild2c Inf loop on blue screen - tsurugi Goes to attract mode when ran with memory card check. Coins up. - tsurugij No NVRAM - wcombat Stuck on network check - xtrial Attract mode. Hangs. - mfightc,c Passes POST. Waits for network connection from main unit? Spams writes to 0xffe08000 (8-bit) + + wcombat Can boot into a test menu by using a combination of dipswitches, but it says "serial check bad". Can't boot normally. + wcombatu Bootable when dipsw 4 is set to on. Controls not implemented so it's not possible to pass nickname selection screen. Freezes when test button is pressed. + thrild2c,ac Inf loop on blue screen + + =========================================================================================================================== @@ -286,6 +311,16 @@ Player 2 gun connects to the same pin numbers on the solder side. Jurassic Park III also uses 2 additional buttons for escaping left and right. These are wired to buttons on the Jamma connector. +Additionally on the 28-WAY connector is... +Pin 7 parts side - Serial TX +Pin 7 solder side - Serial RX +Pin 8 solder side - GND (used by serial) + +Pin 9 parts side - SP_LP (outputs to SP-F, front speaker) +Pin 9 solder side - SP_LN +Pin 9 parts side - SP_RP (output splits into SP-BL and SP-BR, rear speaker(s)) +Pin 9 solder side - SP_RN + Measurements ------------ @@ -355,6 +390,7 @@ some other components. It will be documented at a later date. #include "machine/lpci.h" #include "machine/timekpr.h" #include "machine/timer.h" +#include "sound/dmadac.h" #include "video/voodoo_banshee.h" #include "emupal.h" #include "screen.h" @@ -385,7 +421,8 @@ public: m_workram(*this, "workram"), m_ds2430_rom(*this, "ds2430"), m_io_ports(*this, "IN%u", 0U), - m_io_ppp_sensors(*this, "SENSOR%u", 1U) + m_io_ppp_sensors(*this, "SENSOR%u", 1U), + m_dmadac(*this, { "dacr", "dacl" }) { } @@ -395,7 +432,6 @@ public: void init_viper(); void init_vipercf(); void init_viperhd(); - void init_viperppp(); DECLARE_READ_LINE_MEMBER(ds2430_unk_r); @@ -458,6 +494,10 @@ private: uint16_t m_unk_serial_data_r; uint8_t m_unk_serial_regs[0x80]; uint64_t m_e00008_data; + uint32_t m_sound_buffer_offset; + bool m_sound_irq_enabled; + + TIMER_DEVICE_CALLBACK_MEMBER(sound_timer_callback); // MPC8240 EPIC, to be device-ified enum @@ -574,6 +614,7 @@ private: required_region_ptr m_ds2430_rom; required_ioport_array<8> m_io_ports; optional_ioport_array<4> m_io_ppp_sensors; + required_device_array m_dmadac; uint32_t mpc8240_pci_r(int function, int reg, uint32_t mem_mask); void mpc8240_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); @@ -2074,7 +2115,8 @@ void viper_state::viper_map(address_map &map) map(0xffe00008, 0xffe0000f).rw(FUNC(viper_state::e00008_r), FUNC(viper_state::e00008_w)); map(0xffe08000, 0xffe08007).noprw(); map(0xffe10000, 0xffe10007).r(FUNC(viper_state::input_r)); - map(0xffe28000, 0xffe28007).nopw(); // ppp2nd lamps + map(0xffe28000, 0xffe28007).nopw(); // ppp2nd leds + map(0xffe28008, 0xffe2801f).nopw(); // boxingm reads and writes here to read the pad sensor values map(0xffe30000, 0xffe31fff).rw("m48t58", FUNC(timekeeper_device::read), FUNC(timekeeper_device::write)); map(0xffe40000, 0xffe4000f).noprw(); map(0xffe50000, 0xffe50007).w(FUNC(viper_state::unk2_w)); @@ -2084,12 +2126,14 @@ void viper_state::viper_map(address_map &map) map(0xffe88000, 0xffe88007).w(FUNC(viper_state::unk1b_w)); map(0xffe98000, 0xffe98007).noprw(); map(0xffe9a000, 0xffe9bfff).ram(); // World Combat uses this + map(0xffea0000, 0xffea0007).noprw(); // Gun sensor? Read heavily by p9112 map(0xfff00000, 0xfff3ffff).rom().region("user1", 0); // Boot ROM } void viper_state::viper_ppp_map(address_map &map) { viper_map(map); + map(0xff400108, 0xff40012f).nopw(); // ppp2nd lamps map(0xff400200, 0xff40023f).r(FUNC(viper_state::ppp_sensor_r)); } @@ -2114,10 +2158,10 @@ static INPUT_PORTS_START( viper ) PORT_DIPNAME( 0x02, 0x02, "DIP3" ) PORT_DIPLOCATION("SW:3") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2") - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPNAME( 0x08, 0x00, "DIP1" ) PORT_DIPLOCATION("SW:1") + PORT_DIPNAME( 0x04, 0x04, "DIP2" ) PORT_DIPLOCATION("SW:2") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "DIP1" ) PORT_DIPLOCATION("SW:1") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) @@ -2127,7 +2171,7 @@ static INPUT_PORTS_START( viper ) PORT_START("IN3") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) /* Test Button */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("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 ) @@ -2229,6 +2273,14 @@ INPUT_PORTS_END INPUT_PORTS_START( thrild2 ) PORT_INCLUDE( viper ) + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x04, 0x00, "Calibrate Controls On Boot" ) PORT_DIPLOCATION("SW:2") // Game crashes during boot when this is on + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_MODIFY("IN3") PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Shift Down") @@ -2256,10 +2308,15 @@ INPUT_PORTS_END INPUT_PORTS_START( boxingm ) PORT_INCLUDE( viper ) + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x04, 0x04, "Calibrate Pads On Boot" ) PORT_DIPLOCATION("SW:2") + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_MODIFY("IN4") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("BodyPad L") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Select R") PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Select L") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Select R") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("BodyPad L") PORT_MODIFY("IN5") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("BodyPad R") @@ -2283,15 +2340,88 @@ INPUT_PORTS_END INPUT_PORTS_START( p911 ) PORT_INCLUDE( viper ) + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2") + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x04, DEF_STR( No ) ) + PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_MODIFY("IN4") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Gun Trigger") PORT_MODIFY("IN5") - // one of these is P2 SHT2 (checks and fails serial if pressed) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // P2 SHT2 (checks and fails serial if pressed) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END +INPUT_PORTS_START( mfightc ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2") + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x01, DEF_STR( No ) ) + + PORT_MODIFY("IN4") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // If off, will get stuck after RTC OK + + PORT_MODIFY("IN5") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // if off tries to check UART +INPUT_PORTS_END + +INPUT_PORTS_START( mocapglf ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN4") + PORT_DIPNAME( 0x40, 0x40, "Show Diagnostics On Boot" ) // Shows UART status, lamp status, and accelerometer values + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x40, DEF_STR( No ) ) + +INPUT_PORTS_END + +INPUT_PORTS_START( mocapb ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + + PORT_MODIFY("IN4") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Button") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Button") + + PORT_MODIFY("IN5") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // P2 SHT2 (checks and fails serial if pressed) +INPUT_PORTS_END + +INPUT_PORTS_START( sscopefh ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x04, 0x00, "DIP2" ) PORT_DIPLOCATION("SW:2") // Without this switched on, the screen will be static + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + + PORT_MODIFY("IN3") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Refill Key") + + PORT_MODIFY("IN4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("Credit 2 Pounds") // Currency probably changes between regions + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_NAME("Credit 1 Pound") // Can be used in refill mode to insert coins into the hopper + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN5 ) PORT_NAME("Credit 0.50 Pounds") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Gun Trigger") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN6 ) PORT_NAME("Credit 0.20 Pounds") + + PORT_MODIFY("IN5") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // P2 SHT2 (checks and fails serial if pressed) +INPUT_PORTS_END + INPUT_PORTS_START( tsurugi ) PORT_INCLUDE( viper ) @@ -2304,6 +2434,58 @@ INPUT_PORTS_START( tsurugi ) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // sensor grip (1) horizontal (0) vertical INPUT_PORTS_END +INPUT_PORTS_START( wcombat ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x01, 0x00, "DIP4" ) PORT_DIPLOCATION("SW:4") // Skip device check? wcombatu is playable when this is set + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:2") + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x04, DEF_STR( No ) ) + PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + + PORT_MODIFY("IN3") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_MODIFY("IN4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // X flip screen +INPUT_PORTS_END + +INPUT_PORTS_START( xtrial ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x04, 0x00, "Calibrate Controls On Boot" ) PORT_DIPLOCATION("SW:2") // Game crashes during boot when this is on + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") // Crashes at 45% when card checks are enabled + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) +INPUT_PORTS_END + +INPUT_PORTS_START( code1d ) + PORT_INCLUDE( viper ) + + PORT_MODIFY("IN2") + PORT_DIPNAME( 0x01, 0x00, "DIP4" ) PORT_DIPLOCATION("SW:4") // Unknown, but without this set the game won't display anything besides a blue screen + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "Calibrate Controls On Boot" ) PORT_DIPLOCATION("SW:2") // Game crashes during boot when this is on + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPNAME( 0x08, 0x00, "Memory Card Check On Boot" ) PORT_DIPLOCATION("SW:1") + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + + PORT_MODIFY("IN4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Action Button") + +INPUT_PORTS_END + /*****************************************************************************/ INTERRUPT_GEN_MEMBER(viper_state::viper_vblank) @@ -2323,8 +2505,37 @@ WRITE_LINE_MEMBER(viper_state::voodoo_vblank) WRITE_LINE_MEMBER(viper_state::voodoo_pciint) { - if (state) + if (state) { + // This is a hack. + // There's no obvious (to me) trigger for when it's safe to start the audio interrupts, but after testing all of the games that can boot, it's safe to start audio interrupts once pciint is triggering. + m_sound_irq_enabled = true; + mpc8240_interrupt(MPC8240_IRQ4); + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(viper_state::sound_timer_callback) +{ + if (!m_sound_irq_enabled) { + // If IRQ3 is triggered too soon into the boot process then it'll freeze on the blue boot screen. + return; + } + + mpc8240_interrupt(MPC8240_IRQ3); + + // Get samples from memory + int32_t* samplePtr = (int32_t*)(m_workram + (m_sound_buffer_offset >> 3)); + for (int i = 0; i < 2; i++) { + m_dmadac[i]->transfer( + i, + 1, + 2, + 0x800 / 4 / 2, // Each buffer is 0x800 bytes in size, containing stereo 32-bit audio + samplePtr + ); + } + + m_sound_buffer_offset ^= 0x800; } void viper_state::machine_start() @@ -2346,6 +2557,8 @@ void viper_state::machine_start() save_item(NAME(m_unk_serial_data)); save_item(NAME(m_unk_serial_data_r)); save_item(NAME(m_unk_serial_regs)); + save_item(NAME(m_sound_buffer_offset)); + save_item(NAME(m_sound_irq_enabled)); save_item(NAME(m_ds2430_unk_status)); save_item(NAME(m_ds2430_data)); @@ -2398,6 +2611,15 @@ void viper_state::machine_reset() 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_sound_buffer_offset = 0xfff800; // The games swap between 0xfff800 and 0xfff000 every IRQ3 call + m_sound_irq_enabled = false; + + for (int i = 0; i < 2; i++) { + m_dmadac[i]->initialize_state(); + m_dmadac[i]->set_frequency(44100); + m_dmadac[i]->enable(1); + } + m_ds2430_unk_status = 1; } @@ -2439,8 +2661,16 @@ void viper_state::viper(machine_config &config) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); + DMADAC(config, "dacl").add_route(ALL_OUTPUTS, "lspeaker", 1.0); + DMADAC(config, "dacr").add_route(ALL_OUTPUTS, "rspeaker", 1.0); M48T58(config, "m48t58", 0); + + // Each IRQ3 will update the data buffers with 256 samples, and the playback rate is always 44100hz. + // The frequency is picked such that the DMADAC buffer should never overflow or underflow. + // Note that adjusting this value has gameplay consequences for ppp2nd: the gameplay's note and animation timings are tied directly to values updated using IRQ3, + // so having IRQ3 trigger too quickly or too slowly will mean that the gameplay will either be too fast or too slow. + TIMER(config, "sound_timer").configure_periodic(FUNC(viper_state::sound_timer_callback), attotime::from_hz(44100.0 / 256)); } void viper_state::viper_ppp(machine_config &config) @@ -2678,23 +2908,36 @@ ROM_START(p911) //* ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105)) ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */ - ROM_LOAD("a00uad_nvram.u39", 0x000000, 0x2000, CRC(cca056ca) SHA1(de1a00d84c1311d48bbe6d24f5b36e22ecf5e85a)) + ROM_LOAD("a00aae_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(9ecd75a3) SHA1(f9db35b91d4ef7fd61f21382fc62a6428d0b0c52)) DISK_REGION( "ata:0:hdd:image" ) - DISK_IMAGE( "a00uad02", 0, SHA1(6acb8dc41920e7025b87034a3a62b185ef0109d9) ) + DISK_IMAGE( "a00uad02", 0, SHA1(6acb8dc41920e7025b87034a3a62b185ef0109d9) ) // Actually is AAE/KAE ROM_END -ROM_START(p911uc) //* +ROM_START(p911k) //* VIPER_BIOS ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */ ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105)) ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */ - ROM_LOAD("a00uac_nvram.u39", 0x000000, 0x2000, NO_DUMP ) + ROM_LOAD("a00kae_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(157e0361) SHA1(a4e301f1c73d148b3c18c9c02b67692ffdd6a664)) DISK_REGION( "ata:0:hdd:image" ) - DISK_IMAGE( "a00uac02", 0, SHA1(b268789416dbf8886118a634b911f0ee254970de) ) + DISK_IMAGE( "a00uad02", 0, SHA1(6acb8dc41920e7025b87034a3a62b185ef0109d9) ) // Actually is AAE/KAE +ROM_END + +ROM_START(p911ac) //* + VIPER_BIOS + + ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */ + ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105)) + + ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */ + ROM_LOAD("a00aac_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(d65742ce) SHA1(20055c0b701c62b0f01cfe619d07bd9532cc3b45)) + + DISK_REGION( "ata:0:hdd:image" ) + DISK_IMAGE( "a00uac02", 0, SHA1(b268789416dbf8886118a634b911f0ee254970de) ) // a00uac02 and a00kac02 are the same image ROM_END ROM_START(p911kc) //* @@ -2710,17 +2953,30 @@ ROM_START(p911kc) //* DISK_IMAGE( "a00kac02", 0, SHA1(b268789416dbf8886118a634b911f0ee254970de) ) ROM_END -ROM_START(p911e) //* +ROM_START(p911ud) //* VIPER_BIOS ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */ ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105)) ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */ - ROM_LOAD("a00eaa_nvram.u39", 0x000000, 0x2000, CRC(4f3497b6) SHA1(3045c54f98dff92cdf3a1fc0cd4c76ba82d632d7) ) + ROM_LOAD("a00uad_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(c4f44a70) SHA1(d7946606bf72ca7a6f391c4832205ae6fb1ebd95) ) + + DISK_REGION( "ata:0:hdd:image" ) + DISK_IMAGE( "a00eaa02", 0, SHA1(81565a2dce2e2b0a7927078a784354948af1f87c) ) // Is actually UAD/EAD +ROM_END + +ROM_START(p911ed) //* + VIPER_BIOS + + ROM_REGION(0x28, "ds2430", ROMREGION_ERASE00) /* DS2430 */ + ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105)) + + ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */ + ROM_LOAD("a00ead_nvram.u39", 0x000000, 0x2000, BAD_DUMP CRC(0314fc96) SHA1(cbf421bb37f0a122944fbccf8f4c80380c89e094) ) DISK_REGION( "ata:0:hdd:image" ) - DISK_IMAGE( "a00eaa02", 0, SHA1(81565a2dce2e2b0a7927078a784354948af1f87c) ) + DISK_IMAGE( "a00eaa02", 0, SHA1(81565a2dce2e2b0a7927078a784354948af1f87c) ) // Is actually UAD/EAD ROM_END ROM_START(p911ea) @@ -2903,7 +3159,7 @@ ROM_START(tsurugij) //* ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105)) ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */ - ROM_LOAD("a30jac_nvram.u39", 0x00000, 0x2000, NO_DUMP ) + ROM_LOAD("a30jac_nvram.u39", 0x00000, 0x2000, BAD_DUMP CRC(0e2c0e61) SHA1(d77670e214f618652e67fa91e644750894a0c5c7)) DISK_REGION( "ata:0:hdd:image" ) DISK_IMAGE( "a30c02", 0, SHA1(533b5669b00884a800df9ba29651777a76559862) ) @@ -2919,7 +3175,7 @@ ROM_START(tsurugie) ROM_LOAD("nvram.u39", 0x000000, 0x2000, NO_DUMP ) DISK_REGION( "ata:0:hdd:image" ) - DISK_IMAGE( "a30eab02", 0, SHA1(fcc5b69f89e246f26ca4b8546cc409d3488bbdd9) ) + DISK_IMAGE( "a30eab02", 0, SHA1(fcc5b69f89e246f26ca4b8546cc409d3488bbdd9) ) // Incomplete dump? Is half the size of the other dumps ROM_END /* This CF card has sticker C22D02 */ @@ -3074,7 +3330,7 @@ ROM_START(mfightcc) //* ROM_LOAD("ds2430.u3", 0x00, 0x28, BAD_DUMP CRC(f1511505) SHA1(ed7cd9b2763b3e377df9663943160f9871f65105)) ROM_REGION(0x2000, "m48t58", ROMREGION_ERASE00) /* M48T58 Timekeeper NVRAM */ - ROM_LOAD("c09jac_nvram.u39", 0x00000, 0x2000, NO_DUMP ) + ROM_LOAD("c09jac_nvram.u39", 0x00000, 0x2000, BAD_DUMP CRC(2d100e2b) SHA1(209764130ec3279fe17fe98de6cd0780b80c148f)) DISK_REGION( "ata:0:hdd:image" ) DISK_IMAGE( "c09c04", 0, SHA1(bf5f7447d74399d34edd4eb6dfcca7f6fc2154f2) ) @@ -3089,44 +3345,46 @@ ROM_END /* Viper BIOS */ GAME(1999, kviper, 0, viper, viper, viper_state, init_viper, ROT0, "Konami", "Konami Viper BIOS", MACHINE_IS_BIOS_ROOT) -GAME(2001, ppp2nd, kviper, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, ppp2nda, ppp2nd, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) - -GAME(2001, boxingm, kviper, viper, boxingm, viper_state, init_vipercf, ROT0, "Konami", "Boxing Mania: Ashita no Joe (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2000, code1d, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch (ver D)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2000, code1db, code1d, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch (ver B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, gticlub2, kviper, viper, gticlub2, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver JAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, gticlub2ea,gticlub2, viper, gticlub2ea, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, jpark3, kviper, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver EBC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, jpark3u, jpark3, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver UA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, mocapglf, kviper, viper, viper, viper_state, init_vipercf, ROT90, "Konami", "Mocap Golf (ver UAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, mocapb, kviper, viper, viper, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, mocapbj, mocapb, viper, viper, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, p911, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver UAD)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, p911uc, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver UAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, p911kc, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver KAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, p911e, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, p911ea, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAA, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, p911j, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Keisatsukan Shinjuku 24ji (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, p9112, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 2 (VER. UAA:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, sscopex, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope EX (ver UAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, sogeki, sscopex, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Sogeki (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, sscopefh, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope Fortune Hunter", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2, kviper, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EBB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2j, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2a, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2ab, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2ac, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt 2)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2001, thrild2c, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, tsurugi, kviper, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, tsurugie, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, tsurugij, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, wcombat, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, wcombatb, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B, alt)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, wcombatk, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver KBC:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, wcombatu, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat / Warzaid (ver UCD:B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, wcombatj, wcombat, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver JAA)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, xtrial, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Xtrial Racing (ver JAB)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) - -GAME(2002, mfightc, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAD)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) -GAME(2002, mfightcc, mfightc, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAC)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND) +GAME(2001, ppp2nd, kviper, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (JAA)", MACHINE_NOT_WORKING) +GAME(2001, ppp2nda, ppp2nd, viper_ppp, ppp2nd, viper_state, init_viperhd, ROT0, "Konami", "ParaParaParadise 2nd Mix (AAA)", MACHINE_NOT_WORKING) + +GAME(2001, boxingm, kviper, viper, boxingm, viper_state, init_vipercf, ROT0, "Konami", "Boxing Mania: Ashita no Joe (ver JAA)", MACHINE_NOT_WORKING) +GAME(2000, code1d, kviper, viper, code1d, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch Ver 1.21 (ver UAD)", MACHINE_NOT_WORKING) +GAME(2000, code1db, code1d, viper, code1d, viper_state, init_vipercf, ROT0, "Konami", "Code One Dispatch Ver 1.16 (ver UAB)", MACHINE_NOT_WORKING) +GAME(2001, gticlub2, kviper, viper, gticlub2, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver JAB)", MACHINE_NOT_WORKING) +GAME(2001, gticlub2ea,gticlub2, viper, gticlub2ea, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver EAA)", MACHINE_NOT_WORKING) +GAME(2001, jpark3, kviper, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver EBC)", MACHINE_NOT_WORKING) +GAME(2001, jpark3u, jpark3, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver UBC)", MACHINE_NOT_WORKING) +GAME(2001, mocapglf, kviper, viper, mocapglf, viper_state, init_vipercf, ROT90, "Konami", "Mocap Golf (ver UAA)", MACHINE_NOT_WORKING) +GAME(2001, mocapb, kviper, viper, mocapb, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver AAB)", MACHINE_NOT_WORKING) +GAME(2001, mocapbj, mocapb, viper, mocapb, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver JAA)", MACHINE_NOT_WORKING) +GAME(2001, p911, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver AAE)", MACHINE_NOT_WORKING) +GAME(2001, p911k, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver KAE)", MACHINE_NOT_WORKING) +GAME(2001, p911ac, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver AAC)", MACHINE_NOT_WORKING) +GAME(2001, p911kc, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver KAC)", MACHINE_NOT_WORKING) +GAME(2001, p911ud, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver UAD)", MACHINE_NOT_WORKING) +GAME(2001, p911ed, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAD)", MACHINE_NOT_WORKING) +GAME(2001, p911ea, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 24/7 (ver EAD, alt)", MACHINE_NOT_WORKING) +GAME(2001, p911j, p911, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Keisatsukan Shinjuku 24ji (ver JAE)", MACHINE_NOT_WORKING) +GAME(2001, p9112, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 2 (VER. UAA:B)", MACHINE_NOT_WORKING) +GAME(2001, sscopex, kviper, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope EX (ver UAA)", MACHINE_NOT_WORKING) +GAME(2001, sogeki, sscopex, viper, viper, viper_state, init_vipercf, ROT0, "Konami", "Sogeki (ver JAA)", MACHINE_NOT_WORKING) +GAME(2002, sscopefh, kviper, viper, sscopefh, viper_state, init_vipercf, ROT0, "Konami", "Silent Scope Fortune Hunter (ver EAA)", MACHINE_NOT_WORKING) +GAME(2001, thrild2, kviper, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EBB)", MACHINE_NOT_WORKING) +GAME(2001, thrild2j, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver JAA)", MACHINE_NOT_WORKING) +GAME(2001, thrild2a, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA)", MACHINE_NOT_WORKING) +GAME(2001, thrild2ab, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt)", MACHINE_NOT_WORKING) +GAME(2001, thrild2ac, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver AAA, alt 2)", MACHINE_NOT_WORKING) +GAME(2001, thrild2c, thrild2, viper, thrild2, viper_state, init_vipercf, ROT0, "Konami", "Thrill Drive 2 (ver EAA)", MACHINE_NOT_WORKING) +GAME(2002, tsurugi, kviper, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB)", MACHINE_NOT_WORKING) +GAME(2002, tsurugie, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver EAB, alt)", MACHINE_NOT_WORKING) +GAME(2002, tsurugij, tsurugi, viper, tsurugi, viper_state, init_vipercf, ROT0, "Konami", "Tsurugi (ver JAC)", MACHINE_NOT_WORKING) +GAME(2002, wcombat, kviper, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B)", MACHINE_NOT_WORKING) +GAME(2002, wcombatb, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver AAD:B, alt)", MACHINE_NOT_WORKING) +GAME(2002, wcombatk, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver KBC:B)", MACHINE_NOT_WORKING) +GAME(2002, wcombatu, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat / Warzaid (ver UCD:B)", MACHINE_NOT_WORKING) +GAME(2002, wcombatj, wcombat, viper, wcombat, viper_state, init_vipercf, ROT0, "Konami", "World Combat (ver JAA)", MACHINE_NOT_WORKING) +GAME(2002, xtrial, kviper, viper, xtrial, viper_state, init_vipercf, ROT0, "Konami", "Xtrial Racing (ver JAB)", MACHINE_NOT_WORKING) + +GAME(2002, mfightc, kviper, viper, mfightc, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAD)", MACHINE_NOT_WORKING) +GAME(2002, mfightcc, mfightc, viper, mfightc, viper_state, init_vipercf, ROT0, "Konami", "Mahjong Fight Club (ver JAC)", MACHINE_NOT_WORKING) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 408b3c604b0..c4d08f85a37 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -42095,11 +42095,13 @@ mocapbj // 2001 mocapglf // 2001 p911 // 2001 p9112 // 2001 -p911e // 2001 +p911ac // 2001 p911ea // 2001 +p911ed // 2001 p911j // 2001 +p911k // 2001 p911kc // 2001 -p911uc // 2001 +p911ud // 2001 ppp2nd // 2001 ppp2nda // 2001 sogeki // 2001 -- cgit v1.2.3