diff options
Diffstat (limited to 'src/mame/drivers/opwolf.cpp')
-rw-r--r-- | src/mame/drivers/opwolf.cpp | 1247 |
1 files changed, 0 insertions, 1247 deletions
diff --git a/src/mame/drivers/opwolf.cpp b/src/mame/drivers/opwolf.cpp deleted file mode 100644 index 100e876394e..00000000000 --- a/src/mame/drivers/opwolf.cpp +++ /dev/null @@ -1,1247 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:David Graves, Jarek Burczynski,Stephane Humbert -// thanks-to:Richard Bush -/**************************************************************************** - -Operation Wolf (c) Taito 1987 -============== - -David Graves, Jarek Burczynski -C-Chip emulation by Bryan McPhail - -Sources: MAME Rastan driver - MAME Taito F2 driver - Raine source - many thanks to Richard Bush - and the Raine Team. - -Main CPU: MC68000 uses irq 5. -Sound : Z80 & YM2151 & MSM5205 - - -Operation Wolf uses similar hardware to Rainbow Islands and Rastan. -The screen layout and registers and sprites appear to be identical. - -Taito TC0030CMD chip labeled B20-18 (at least for the US boards) -Taito PC060HA looks like it might be a DIP28 Fujitsu MB884x chip -There are 4 socketed PALs (DIP20 type PAL16L8ACN) labeled B20-09 - through B20-12 (not read) - -OSC: Main board: 16MHz, 12MHz & 26.686MHz - Sound board: 8MHz (Next to Z80 & YM2151) -CPU: TS68000CP8 (Rated for 8MHz) - -Gun Travel ----------- - -Horizontal gun travel maybe could be widened to include more -of the status bar (you can shoot enemies underneath it). - -To keep the input span 0-255 a multiplier (300/256 ?) -would be used. - -Operation Wolf -Taito, 1987 - -PCB Layouts ------------ - -SOUND BOARD -J1100122A (J1100122B) \ <-- minor rev, but no difference on PCB -K1100268A (K1100268B) / -K1100268A OPERATION WOLF (sticker) -|-----------------------------------------| -|X S 8464 | -| VR1 PC060HA B20-07.10| -|N MB3735 YM2151 Z80 | -| SEIBU YM3012 8MHz| -| HB-41 | -| | -| VR2 | -| MB3735 | -| TL074 | -|T TC0060DCA | -| TC0060DCA | -| TL074 | -| | -| M5205 | -| 384kHz | -| M5205 B20-08.21| -|-----------------------------------------| -Notes: - Z80 - clock 4.000MHz [8/2] - YM2151 - clock 4.000MHz [8/2] - YM3012 - 2-channel serial input floating D/A converter - M5205 - clock 384kHz (via resonator) - HB-41 - Seibu HB-41 ceramic module (sound/filter related) - MB3735 - Audio power amp IC - TL074 - Op amp - 8464 - 8kx8 SRAM - PC060HA - Taito PC060HA CIU custom IC (DIP28). Manufactured by Fujitsu - B20-07.10 - 27C512 EPROM (DIP28) - B20-08.21 - 234000 mask ROM (DIP40) - VR1/2 - Volume pots - S - 30 pin flat cable joining to main board (for main board/sound board communication) - X - 5 pin connector for sound output (left+right speakers) - N - 10 pin connector for power inputs - T - 18-way edge connector (single sided, pins on solder side only) - - Pinouts - ------- - X Connector N Connector T Connector - ------------ ------------ ------------ - 1 Right Speaker (+) 1 GND 1 GND - 2 Right Speaker (-) 2 GND 2 GND - 3 Left Speaker (+) 3 not used 3 GND - 4 not used 4 +5 Volts 4 GND - 5 Left Speaker (-) 5 +5 Volts 5 Optical sensor input from gun - 6 not used 6 not used - 7 -5 Volts 7 not used - 8 +12 Volts 8 not used - 9 not used 9 not used - 10 not used 10 not used - 11 not used - 12 not used - 13 not used - 14 not used - 15 +5 Volts - 16 +5 Volts - 17 +5 Volts - 18 +5 Volts -MAIN PCB -J1100130A -K1100288A -M4300084F OPERATION WOLF (sticker) -K1100303A OPERATION WOLF (sticker) -|----------------------------------------------------| -| SWB SWA S M | -| 12MHz 16MHz | -|H 6116 26.686MHz| -| TC0070RGB 6116 B20-09.19 MB3771 | -| | -| |-------|B20-13.13| -| 2018 2018 |TAITO | | -|G PC050CM 2018 2018 |PC080SN| | -| |-------| |-------| | -| B20-18.73 |TAITO | DIP28| -| B20-14.72 |PC0900J| 43256 DIP28 | -| B20-12.92 |-------| 43256 | -| DIP28 B20-03-2.30 | -| 68000 DIP28 B20-19.29 8464 8464 | -| B20-11.85 B20-05-2.40 DIP28 | -| B20-10.84 B20-04.39 DIP28 | -|----------------------------------------------------| -Notes: - 68000 - clock 8.000MHz [16/2] - 6116 - 2k x8 SRAM (color RAM) - 43256 - 32k x8 SRAM (tile RAM) - 8464 - 8k x8 SRAM (work RAM) - 2018 - 2k x8 SRAM (sprite RAM) - PC080SN - Taito custom tilemap generator IC (connected to 43256 SRAM) - PC0900J - Taito custom sprite generator IC (connected to 2018 SRAM) - DIP28 - unpopulated DIP28 socket - B20-18.73 - Taito custom C-Chip marked 'TC0030CMD, with sticker 'B20-18'. Clock input 12.00MHz on pin 20 - TC0070RGB - Taito custom ceramic module RGB mixer IC - PC050CM - Taito custom ceramic module (input related functions) - MB3771 - Fujitsu MB3771 master reset IC - S - 30 pin flat cable connector joining to sound PCB - M - 4 pin connector for gun vibration motor power and grenade button - H - 12 pin connector for power input - G - 44-way edge connector - B20-13/14 - MN234000 mask ROM - B20-03.30 - \ - B20-19.29 - | - B20-04.39 - | 27C512 EPROM - B20-05.40 - _| - B20-09.19 - \ - B20-10.84 - | - B20-11.85 - | MMI PAL16L8ACN - B20-12.92 - _| - - Measurements - ------------ - XTAL1 - 26.68558MHz - XTAL2 - 15.99965MHz - XTAL3 - 11.9999MHz - VSync - 60.0551Hz - HSync - 15.6742kHz - - Pinouts - ------- - M Connector H Connector G Connector - ------------ ------------ ------------ - 1 BUTTON 2 (grenade) 1 GND Solder Parts - 2 not used 2 GND GND A 1 GND - 3 +12V (to motor in gun) 3 GND VIDEO GND B 2 RED - 4 -12V (to motor in gun) 4 GND BLUE C 3 GREEN - 5 +5 Volts not used D 4 SYNC - 6 +5 Volts not used E 5 not used - 7 +5 Volts not used F 6 not used - 8 -5 Volts not used H 7 not used - 9 +13 Volts* COIN B J 8 COIN A - 10 not used METER B K 9 METER A - 11 +12 Volts LOCKOUT B L 10 LOCKOUT A - 12 +12 Volts TILT M 11 SERVICE CREDIT - * leave unconnected! not used N 12 START - not used P 13 not used - not used R 14 not used - not used S 15 not used - not used T 16 not used - not used U 17 not used - not used V 18 not used - not used W 19 not used - not used X 20 not used - not used Y 21 BUTTON 1 (bullets) - not used Z 22 not used - - - -Gun board (inside gun) - -J9100095A -K9100122A -|-----------| -|CN1 | -| | -|-----------| -Notes: - PCB contains mostly caps/resistors and three small opto-related 8-pin ICs - CN1 - 4 pin connector joins to connector M on main board - - -Stephh's notes (based on the game M68000 code and some tests) : - -1) 'opwolf' and 'opwolfu' - - - Region stored at 0x03fffe.w - - Sets : - * 'opwolf' : region = 0x0003 - * 'opwolfu' : region = 0x0002 - - These 2 games are 100% the same, only region and gun offsets differ ! - - Coinage relies on the region (code at 0x00bea4) : - * 0x0001 (Japan) and 0x0002 (US) use TAITO_COINAGE_JAPAN_OLD - * 0x0003 (World) and 0x0004 (Japan, licensed to Taito America ?) use TAITO_COINAGE_WORLD - - Gun offsets are stored at 0x03ffaf.b (Y) and 0x03ffb1.b (X); - these values are checked via routine at 0x000b76 - - Notice screen only if region = 0x0001 - - When "Language" Dip Switch is set to Japanese, you can also select your starting level; - however, only the 4 first levels are available ! Correct behaviour ? - - There's code at 0x00e090 that tests contents of 0x03ffb2.w : - if it is 0x0000, the highscore isn't displayed, but value = 0x00ff - -2) 'opwolfa' - - - Region stored at 0x03fffe.w - - Sets : - * 'opwolfa' : region = 0x0003 - - There is only ONE byte of difference at 0x03fff5.b with 'opwolf' - it changes behaviour in the 'continue game' screen - -3) 'opwolfb' - - - Region stored at 0x03fffe.w - - Sets : - * 'opwolfb' : region = 0x0003 - - Comparison with 'opwolf' : - * gun offsets are the same (so why are they different in the INIT function ?) - * all reference to TAITO and "Operation Wolf" have been changed or "blanked" - * "(c) 1988 BEAR CORPORATION KOREA" / "ALL RIGHTS RESERVED" - * ROM check test "noped" (code at 0x00bb72) - - Notes on bootleg c-chip (similar to what is in machine/opwolf.cpp) : - * always Engish language (thus the Dip Switch change to "Unused") - * round 4 in "demo mode" instead of round 5 - * "service" button doesn't add credits (it works in the "test mode" though) - * if you die after round 6, difficulty isn't reset for the next game - - -TODO -==== - -There are a few unmapped writes for the sound Z80 in the log. - -Unknown writes to the MSM5205 control addresses (RUN/RES implementation is wrong) - -Sound volume filtering is imperfect. Notably the coin insert sound: -MSM1 rings it at volume 0xa8, MSM2 echos it at volume 0x84 but should be more muffled. - -Raine source has standard Asuka/Mofflot sprite/tile priority: -0x2000 in sprite_ctrl puts all sprites under top bg layer. But -Raine simply kludges in this value, failing to read it from a -register. So what is controlling priority. - - -***************************************************************************/ - -/* Define clocks based on actual OSC on the PCB */ - -#define CPU_CLOCK (XTAL(16'000'000) / 2) /* clock for 68000 */ -#define SOUND_CPU_CLOCK (XTAL(8'000'000) / 2) /* clock for Z80 sound CPU */ - -#include "emu.h" -#include "cpu/m68000/m68000.h" -#include "cpu/z80/z80.h" -#include "machine/timer.h" -#include "machine/taitocchip.h" -#include "sound/msm5205.h" -#include "sound/ym2151.h" -#include "includes/taitoipt.h" -#include "video/pc080sn.h" -#include "video/pc090oj.h" -#include "audio/taitosnd.h" -#include "emupal.h" -#include "screen.h" -#include "speaker.h" - - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -class opwolf_state : public driver_device -{ -public: - opwolf_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_cchip_ram(*this, "cchip_ram"), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_cchip(*this, "cchip"), - m_cchip_irq_clear(*this, "cchip_irq_clear"), - m_pc080sn(*this, "pc080sn"), - m_pc090oj(*this, "pc090oj"), - m_msm(*this, "msm%u", 0), - m_lspeaker(*this, "lspeaker"), - m_rspeaker(*this, "rspeaker") - { } - - void opwolf(machine_config &config); - void opwolfb(machine_config &config); - void opwolfp(machine_config &config); - - void init_opwolf(); - void init_opwolfb(); - void init_opwolfp(); - - DECLARE_CUSTOM_INPUT_MEMBER(opwolf_gun_x_r); - DECLARE_CUSTOM_INPUT_MEMBER(opwolf_gun_y_r); - -protected: - virtual void machine_start() override; - -private: - uint16_t cchip_r(offs_t offset); - void cchip_w(offs_t offset, uint16_t data); - void opwolf_adpcm_d_w(uint8_t data); - void opwolf_adpcm_e_w(uint8_t data); - void opwolf_spritectrl_w(offs_t offset, uint16_t data); - void sound_bankswitch_w(uint8_t data); - void opwolf_adpcm_b_w(offs_t offset, uint8_t data); - void opwolf_adpcm_c_w(offs_t offset, uint8_t data); - void counters_w(uint8_t data); - - INTERRUPT_GEN_MEMBER(interrupt); - TIMER_DEVICE_CALLBACK_MEMBER(cchip_irq_clear_cb); - - DECLARE_MACHINE_RESET(opwolf); - void opwolf_colpri_cb(u32 &sprite_colbank, u32 &pri_mask, u16 sprite_ctrl); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void opwolf_msm5205_vck(msm5205_device *device, int chip); - template<int N> DECLARE_WRITE_LINE_MEMBER(msm5205_vck_w); - - void opwolf_map(address_map &map); - void opwolf_sound_z80_map(address_map &map); - void opwolfb_map(address_map &map); - void opwolfb_sub_z80_map(address_map &map); - void opwolfp_map(address_map &map); - - /* memory pointers */ - optional_shared_ptr<uint8_t> m_cchip_ram; - - /* video-related */ - uint16_t m_sprite_ctrl; - uint16_t m_sprites_flipscreen; - - /* misc */ - uint8_t m_adpcm_b[0x08]; - uint8_t m_adpcm_c[0x08]; - uint32_t m_adpcm_pos[2]; - uint32_t m_adpcm_end[2]; - int m_adpcm_data[2]; - - int m_opwolf_gun_xoffs; - int m_opwolf_gun_yoffs; - - /* devices */ - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_audiocpu; - optional_device<taito_cchip_device> m_cchip; - optional_device<timer_device> m_cchip_irq_clear; - required_device<pc080sn_device> m_pc080sn; - required_device<pc090oj_device> m_pc090oj; - required_device_array<msm5205_device, 2> m_msm; - required_device<speaker_device> m_lspeaker; - required_device<speaker_device> m_rspeaker; -}; - - -//************************************************************************** -// ADDRESS MAPS -//************************************************************************** - -void opwolf_state::opwolf_map(address_map &map) -{ - map(0x000000, 0x03ffff).rom(); - map(0x0f0000, 0x0f07ff).mirror(0xf000).rw(m_cchip, FUNC(taito_cchip_device::mem68_r), FUNC(taito_cchip_device::mem68_w)).umask16(0x00ff); - map(0x0f0800, 0x0f0fff).mirror(0xf000).rw(m_cchip, FUNC(taito_cchip_device::asic_r), FUNC(taito_cchip_device::asic68_w)).umask16(0x00ff); - map(0x100000, 0x107fff).ram(); - map(0x200000, 0x200fff).ram().w("palette", FUNC(palette_device::write16)).share("palette"); - map(0x380000, 0x380001).portr("DSWA"); - map(0x380002, 0x380003).portr("DSWB"); - map(0x380000, 0x380003).w(FUNC(opwolf_state::opwolf_spritectrl_w)); // usually 0x4, changes when you fire - map(0x3a0000, 0x3a0001).portr("IN2"); /* lightgun, read at $11e0/6 */ - map(0x3a0002, 0x3a0003).portr("IN3"); - map(0x3c0000, 0x3c0001).nopw(); /* watchdog ?? */ - map(0x3e0000, 0x3e0001).nopr(); - map(0x3e0000, 0x3e0000).w("ciu", FUNC(pc060ha_device::master_port_w)); - map(0x3e0002, 0x3e0002).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w)); - map(0xc00000, 0xc0ffff).rw(m_pc080sn, FUNC(pc080sn_device::word_r), FUNC(pc080sn_device::word_w)); - map(0xc10000, 0xc1ffff).writeonly(); /* error in init code (?) */ - map(0xc20000, 0xc20003).w(m_pc080sn, FUNC(pc080sn_device::yscroll_word_w)); - map(0xc40000, 0xc40003).w(m_pc080sn, FUNC(pc080sn_device::xscroll_word_w)); - map(0xc50000, 0xc50003).w(m_pc080sn, FUNC(pc080sn_device::ctrl_word_w)); - map(0xd00000, 0xd03fff).rw(m_pc090oj, FUNC(pc090oj_device::word_r), FUNC(pc090oj_device::word_w)); /* sprite ram */ -} - -void opwolf_state::opwolfb_map(address_map &map) -{ - map(0x000000, 0x03ffff).rom(); - map(0x0f0000, 0x0f0fff).mirror(0xf000).rw(FUNC(opwolf_state::cchip_r), FUNC(opwolf_state::cchip_w)); - map(0x100000, 0x107fff).ram(); - map(0x200000, 0x200fff).ram().w("palette", FUNC(palette_device::write16)).share("palette"); - map(0x380000, 0x380001).portr("DSWA"); - map(0x380002, 0x380003).portr("DSWB"); - map(0x380000, 0x380003).w(FUNC(opwolf_state::opwolf_spritectrl_w)); // usually 0x4, changes when you fire - map(0x3a0000, 0x3a0001).portr("IN2"); /* lightgun, read at $11e0/6 */ - map(0x3a0002, 0x3a0003).portr("IN3"); - map(0x3c0000, 0x3c0001).nopw(); /* watchdog ?? */ - map(0x3e0000, 0x3e0001).nopr(); - map(0x3e0000, 0x3e0000).w("ciu", FUNC(pc060ha_device::master_port_w)); - map(0x3e0002, 0x3e0002).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w)); - map(0xc00000, 0xc0ffff).rw(m_pc080sn, FUNC(pc080sn_device::word_r), FUNC(pc080sn_device::word_w)); - map(0xc10000, 0xc1ffff).writeonly(); /* error in init code (?) */ - map(0xc20000, 0xc20003).w(m_pc080sn, FUNC(pc080sn_device::yscroll_word_w)); - map(0xc40000, 0xc40003).w(m_pc080sn, FUNC(pc080sn_device::xscroll_word_w)); - map(0xc50000, 0xc50003).w(m_pc080sn, FUNC(pc080sn_device::ctrl_word_w)); - map(0xd00000, 0xd03fff).rw(m_pc090oj, FUNC(pc090oj_device::word_r), FUNC(pc090oj_device::word_w)); /* sprite ram */ -} - -void opwolf_state::opwolfp_map(address_map &map) -{ - map(0x000000, 0x03ffff).rom(); - map(0x100000, 0x107fff).ram(); - map(0x200000, 0x200fff).ram().w("palette", FUNC(palette_device::write16)).share("palette"); - map(0x380000, 0x380001).portr("DSWA"); - map(0x380002, 0x380003).portr("DSWB"); - map(0x380000, 0x380003).w(FUNC(opwolf_state::opwolf_spritectrl_w)); // usually 0x4, changes when you fire - map(0x3a0000, 0x3a0001).portr("IN2"); /* lightgun, read at $11e0/6 (AND INPUTS) */ - map(0x3a0002, 0x3a0003).portr("IN3"); - map(0x3c0000, 0x3c0001).nopw(); /* watchdog ?? */ - map(0x3e0000, 0x3e0001).nopr(); - map(0x3e0000, 0x3e0000).w("ciu", FUNC(pc060ha_device::master_port_w)); - map(0x3e0002, 0x3e0002).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w)); - map(0xc00000, 0xc0ffff).rw(m_pc080sn, FUNC(pc080sn_device::word_r), FUNC(pc080sn_device::word_w)); - map(0xc10000, 0xc1ffff).writeonly(); /* error in init code (?) */ - map(0xc20000, 0xc20003).w(m_pc080sn, FUNC(pc080sn_device::yscroll_word_w)); - map(0xc40000, 0xc40003).w(m_pc080sn, FUNC(pc080sn_device::xscroll_word_w)); - map(0xc50000, 0xc50003).w(m_pc080sn, FUNC(pc080sn_device::ctrl_word_w)); - map(0xd00000, 0xd03fff).rw(m_pc090oj, FUNC(pc090oj_device::word_r), FUNC(pc090oj_device::word_w)); /* sprite ram */ -} - -void opwolf_state::opwolf_sound_z80_map(address_map &map) -{ - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x7fff).bankr("z80bank"); - map(0x8000, 0x8fff).ram(); - map(0x9000, 0x9001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); - map(0x9002, 0x9100).nopr(); - map(0xa000, 0xa000).w("ciu", FUNC(pc060ha_device::slave_port_w)); - map(0xa001, 0xa001).rw("ciu", FUNC(pc060ha_device::slave_comm_r), FUNC(pc060ha_device::slave_comm_w)); - map(0xb000, 0xb006).w(FUNC(opwolf_state::opwolf_adpcm_b_w)); - map(0xc000, 0xc006).w(FUNC(opwolf_state::opwolf_adpcm_c_w)); - map(0xd000, 0xd000).w(FUNC(opwolf_state::opwolf_adpcm_d_w)); - map(0xe000, 0xe000).w(FUNC(opwolf_state::opwolf_adpcm_e_w)); -} - -// this extra z80 substitutes for the c-chip in the bootleg -void opwolf_state::opwolfb_sub_z80_map(address_map &map) -{ - map(0x0000, 0x7fff).rom(); - map(0x8800, 0x8800).portr("IN1"); /* read at PC=$637: poked to $c004 */ - map(0x9000, 0x9000).nopw(); /* unknown write, 0 then 1 each interrupt */ - map(0x9800, 0x9800).portr("IN0"); /* read at PC=$631: poked to $c005 */ - map(0xa000, 0xa000).nopw(); /* IRQ acknowledge (unimplemented) */ - map(0xc000, 0xc7ff).ram().share("cchip_ram"); -} - - -//************************************************************************** -// INPUT PORT DEFINITIONS -//************************************************************************** - -#define P1X_PORT_TAG "P1X" -#define P1Y_PORT_TAG "P1Y" - -static INPUT_PORTS_START( opwolf ) - /* 0x380000 -> 0x0ff028 (-$fd8,A5) (C-chip) */ - PORT_START("DSWA") - PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW1:1" ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x02, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) PORT_DIPLOCATION("SW1:3") - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \ - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - TAITO_COINAGE_WORLD_LOC(SW1) - - /* 0x380002 -> 0x0ff02a (-$fd6,A5) (C-chip) */ - PORT_START("DSWB") - TAITO_DIFFICULTY_LOC(SW2) - PORT_DIPNAME( 0x0c, 0x0c, "Ammo Magazines at Start" ) PORT_DIPLOCATION("SW2:3,4") - PORT_DIPSETTING( 0x00, "4" ) - PORT_DIPSETTING( 0x04, "5" ) - PORT_DIPSETTING( 0x0c, "6" ) - PORT_DIPSETTING( 0x08, "7" ) - PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" ) - PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW2:6" ) - PORT_DIPNAME( 0x40, 0x00, "Discount When Continuing" ) PORT_DIPLOCATION("SW2:7") - PORT_DIPSETTING( 0x40, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:8") - PORT_DIPSETTING( 0x80, DEF_STR( Japanese ) ) - PORT_DIPSETTING( 0x00, DEF_STR( English ) ) - - PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN2") - PORT_BIT( 0x01ff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(opwolf_state, opwolf_gun_x_r) - PORT_BIT( 0xfe00, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN3") - PORT_BIT( 0x01ff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(opwolf_state, opwolf_gun_y_r) - PORT_BIT( 0xfe00, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START(P1X_PORT_TAG) /* P1X (span allows you to shoot enemies behind status bar) */ - PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) - - PORT_START(P1Y_PORT_TAG) /* P1Y (span allows you to be slightly offscreen) */ - PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) -INPUT_PORTS_END - -static INPUT_PORTS_START( opwolfp ) - PORT_INCLUDE( opwolf ) - - PORT_MODIFY("IN0") - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("IN1") - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_MODIFY("IN2") - /* 0x0000 - 0x01ff is GUNX */ - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_TILT ) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0xc000, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_MODIFY("IN3") - /* 0x0000 - 0x01ff is GUNY */ - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0xf800, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_MODIFY("DSWB") - PORT_DIPNAME( 0x10, 0x10, "Display Hit Percentage (Cheat)" ) PORT_DIPLOCATION("SW2:5") // probably a cheat / debug feature as it's not in the final game - PORT_DIPSETTING( 0x10, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x20, 0x20, "Infinite Health (Cheat)" ) PORT_DIPLOCATION("SW2:6") - PORT_DIPSETTING( 0x20, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x40, "Infinite Ammo (Cheat)" ) PORT_DIPLOCATION("SW2:7") // is 'Discount when Continuing' in final release - PORT_DIPSETTING( 0x40, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:8") - PORT_DIPSETTING( 0x80, DEF_STR( Japanese ) ) - PORT_DIPSETTING( 0x00, "English (invalid)" ) // game hangs on course screen (confirmed on hardware where it watchdog resets) -INPUT_PORTS_END - -static INPUT_PORTS_START( opwolfu ) - PORT_INCLUDE( opwolf ) - - PORT_MODIFY( "DSWA" ) - TAITO_COINAGE_JAPAN_OLD -INPUT_PORTS_END - -static INPUT_PORTS_START( opwolfb ) - PORT_INCLUDE( opwolf ) - - PORT_MODIFY( "DSWB" ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW ) /* see notes */ -INPUT_PORTS_END - - -//************************************************************************** -// INPUT PORT HANDLING -//************************************************************************** - -void opwolf_state::counters_w(uint8_t data) -{ - machine().bookkeeping().coin_lockout_w(1, data & 0x80); - machine().bookkeeping().coin_lockout_w(0, data & 0x40); - machine().bookkeeping().coin_counter_w(1, ~data & 0x20); - machine().bookkeeping().coin_counter_w(0, ~data & 0x10); -} - -CUSTOM_INPUT_MEMBER(opwolf_state::opwolf_gun_x_r ) -{ - /* P1X - Have to remap 8 bit input value, into 0-319 visible range */ - int scaled = (ioport(P1X_PORT_TAG)->read() * 320 ) / 256; - return (scaled + 0x15 + m_opwolf_gun_xoffs); -} - -CUSTOM_INPUT_MEMBER(opwolf_state::opwolf_gun_y_r ) -{ - return (ioport(P1Y_PORT_TAG)->read() - 0x24 + m_opwolf_gun_yoffs); -} - - -//************************************************************************** -// VIDEO -//************************************************************************** - -void opwolf_state::opwolf_spritectrl_w(offs_t offset, uint16_t data) -{ - // popmessage("opwolf_spritectrl_w ctrl = %4x", data); - if (offset == 0) - { - /* bit 0 -> MOTOR1 transistor */ - /* bit 1 -> MOTOR2 transistor */ - /* bit 2 -> Reset c-chip and coin custom PC050CM (active low) */ - /* bit 3 -> Not connected */ - /* bit 4 -> LATCH - used to signal light gun position can be latched to inputs on v-blank */ - /* bits 5-7 are the sprite palette bank */ - - m_pc090oj->sprite_ctrl_w(data); - - /* If data & 3, the Piston Motor is activated via M-1/M-2 connector */ - if (data & 3) - { - output().set_value("Player1_Recoil_Piston", 1); - } - else - { - output().set_value("Player1_Recoil_Piston", 0); - } - } -} - -void opwolf_state::opwolf_colpri_cb(u32 &sprite_colbank, u32 &pri_mask, u16 sprite_ctrl) -{ - sprite_colbank = (sprite_ctrl & 0xe0) >> 1; - pri_mask = 0xfc; /* sprites under top bg layer */ -} - -uint32_t opwolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int layer[2]; - - m_pc080sn->tilemap_update(); - - layer[0] = 0; - layer[1] = 1; - - screen.priority().fill(0, cliprect); - - // Sprite/tilemap priority is hardwired by the PAL16L8 at location 19 - - m_pc080sn->tilemap_draw(screen, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); - m_pc080sn->tilemap_draw(screen, bitmap, cliprect, layer[1], 0, 2); - - m_pc090oj->draw_sprites(screen, bitmap, cliprect); - -// if (ioport("P1X")->read()) -// popmessage("%d %d", machine(), "P1X"), ioport("P1Y")->read()); - - return 0; -} - - -//************************************************************************** -// DRAWGFX LAYOUTS -//************************************************************************** - -static GFXDECODE_START( gfx_opwolf ) - GFXDECODE_ENTRY( "pc080sn", 0, gfx_8x8x4_packed_msb, 0, 128 ) /* scr tiles */ -GFXDECODE_END - - -//************************************************************************** -// SOUND -//************************************************************************** - -void opwolf_state::sound_bankswitch_w(uint8_t data) -{ - membank("z80bank")->set_entry(data & 0x03); -} - -//0 - start ROM offset LSB -//1 - start ROM offset MSB -//2 - end ROM offset LSB -//3 - end ROM offset MSB -//start & end need to be multiplied by 16 to get a proper _byte_ address in adpcm ROM -//4 - RUN, always zero write (start trigger ?) -//5 - VOL, sample volume -//6 - RES -//7 - N/C - -template<int N> -WRITE_LINE_MEMBER(opwolf_state::msm5205_vck_w) -{ - if (m_adpcm_data[N] != -1) - { - m_msm[N]->data_w(m_adpcm_data[N] & 0x0f); - m_adpcm_data[N] = -1; - if (m_adpcm_pos[N] == m_adpcm_end[N]) - { - m_msm[N]->reset_w(1); - //logerror("reset device %d\n", chip); - } - } - else - { - m_adpcm_data[N] = memregion("adpcm")->base()[m_adpcm_pos[N]]; - m_adpcm_pos[N] = (m_adpcm_pos[N] + 1) & 0x7ffff; - m_msm[N]->data_w(m_adpcm_data[N] >> 4); - } -} - -void opwolf_state::opwolf_adpcm_b_w(offs_t offset, uint8_t data) -{ - int start; - int end; - - m_adpcm_b[offset] = data; - - if (offset == 0x04) //trigger ? - { - start = m_adpcm_b[0] + m_adpcm_b[1] * 256; - end = m_adpcm_b[2] + m_adpcm_b[3] * 256; - start *= 16; - end *= 16; - m_adpcm_pos[0] = start; - m_adpcm_end[0] = end; - m_msm[0]->reset_w(0); - m_msm[0]->set_output_gain(0, m_adpcm_b[5] / 255.0); - //logerror("TRIGGER MSM1\n"); - } - -// logerror("CPU #1 b00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); -} - -void opwolf_state::opwolf_adpcm_c_w(offs_t offset, uint8_t data) -{ - int start; - int end; - - m_adpcm_c[offset] = data; - - if (offset == 0x04) //trigger ? - { - start = m_adpcm_c[0] + m_adpcm_c[1] * 256; - end = m_adpcm_c[2] + m_adpcm_c[3] * 256; - start *= 16; - end *= 16; - m_adpcm_pos[1] = start; - m_adpcm_end[1] = end; - m_msm[1]->reset_w(0); - m_msm[1]->set_output_gain(0, m_adpcm_c[5] / 255.0); - //logerror("TRIGGER MSM2\n"); - } - -// logerror("CPU #1 c00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); -} - -void opwolf_state::opwolf_adpcm_d_w(uint8_t data) -{ - // total volume (speaker 1) - for (int i = 0; i <= 2; i++) - m_lspeaker->set_input_gain(i, data / 255.0); -} - -void opwolf_state::opwolf_adpcm_e_w(uint8_t data) -{ - // total volume (speaker 2) - for (int i = 0; i <= 2; i++) - m_rspeaker->set_input_gain(i, data / 255.0); -} - - -//************************************************************************** -// MACHINE EMULATION -//************************************************************************** - -void opwolf_state::init_opwolf() -{ - uint16_t* rom = (uint16_t*)memregion("maincpu")->base(); - - // World & US version have different gun offsets, presumably slightly different gun hardware - m_opwolf_gun_xoffs = 0xec - (rom[0x03ffb0 / 2] & 0xff); - m_opwolf_gun_yoffs = 0x1c - (rom[0x03ffae / 2] & 0xff); - - membank("z80bank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000); -} - -void opwolf_state::init_opwolfb() -{ - /* bootleg needs different range of raw gun coords */ - m_opwolf_gun_xoffs = -2; - m_opwolf_gun_yoffs = 17; - - membank("z80bank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000); -} - -void opwolf_state::init_opwolfp() -{ - m_opwolf_gun_xoffs = 5; - m_opwolf_gun_yoffs = 30; - - membank("z80bank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000); -} - -void opwolf_state::machine_start() -{ - save_item(NAME(m_sprite_ctrl)); - save_item(NAME(m_sprites_flipscreen)); - - save_item(NAME(m_adpcm_b)); - save_item(NAME(m_adpcm_c)); - save_item(NAME(m_adpcm_pos)); - save_item(NAME(m_adpcm_end)); -} - -MACHINE_RESET_MEMBER(opwolf_state,opwolf) -{ - m_adpcm_b[0] = m_adpcm_b[1] = 0; - m_adpcm_c[0] = m_adpcm_c[1] = 0; - m_adpcm_pos[0] = m_adpcm_pos[1] = 0; - m_adpcm_end[0] = m_adpcm_end[1] = 0; - m_adpcm_data[0] = m_adpcm_data[1] = -1; - - m_sprite_ctrl = 0; - m_sprites_flipscreen = 0; - - m_msm[0]->reset_w(1); - m_msm[1]->reset_w(1); -} - -uint16_t opwolf_state::cchip_r(offs_t offset) -{ - return m_cchip_ram[offset]; -} - -void opwolf_state::cchip_w(offs_t offset, uint16_t data) -{ - m_cchip_ram[offset] = data &0xff; -} - -INTERRUPT_GEN_MEMBER(opwolf_state::interrupt) -{ - m_maincpu->set_input_line(5, HOLD_LINE); - if (m_cchip) - m_cchip->ext_interrupt(ASSERT_LINE); - if (m_cchip_irq_clear) - m_cchip_irq_clear->adjust(attotime::zero); -} - -TIMER_DEVICE_CALLBACK_MEMBER(opwolf_state::cchip_irq_clear_cb) -{ - m_cchip->ext_interrupt(CLEAR_LINE); -} - - -//************************************************************************** -// MACHINE DEFINTIONS -//************************************************************************** - -void opwolf_state::opwolf(machine_config &config) -{ - /* basic machine hardware */ - M68000(config, m_maincpu, CPU_CLOCK); /* 8 MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolf_map); - m_maincpu->set_vblank_int("screen", FUNC(opwolf_state::interrupt)); - - Z80(config, m_audiocpu, SOUND_CPU_CLOCK); /* 4 MHz */ - m_audiocpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolf_sound_z80_map); - - TAITO_CCHIP(config, m_cchip, 12_MHz_XTAL); /* 12MHz measured on pin 20 */ - m_cchip->in_pb_callback().set_ioport("IN0"); - m_cchip->in_pc_callback().set_ioport("IN1"); - m_cchip->out_pb_callback().set(FUNC(opwolf_state::counters_w)); - - TIMER(config, "cchip_irq_clear").configure_generic(FUNC(opwolf_state::cchip_irq_clear_cb)); - - config.set_maximum_quantum(attotime::from_hz(600)); /* 10 CPU slices per frame - enough for the sound CPU to read all commands */ - - MCFG_MACHINE_RESET_OVERRIDE(opwolf_state,opwolf) - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(40*8, 32*8); - screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1); - screen.set_screen_update(FUNC(opwolf_state::screen_update)); - screen.set_palette("palette"); - - GFXDECODE(config, "gfxdecode", "palette", gfx_opwolf); - PALETTE(config, "palette").set_format(palette_device::xRGBRRRRGGGGBBBB_bit0, 2048); - - PC080SN(config, m_pc080sn, 0); - m_pc080sn->set_gfx_region(0); - m_pc080sn->set_gfxdecode_tag("gfxdecode"); - - PC090OJ(config, m_pc090oj, 0); - m_pc090oj->set_palette("palette"); - m_pc090oj->set_colpri_callback(FUNC(opwolf_state::opwolf_colpri_cb)); - - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - - ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CPU_CLOCK)); /* 4 MHz */ - ymsnd.irq_handler().set_inputline(m_audiocpu, 0); - ymsnd.port_write_handler().set(FUNC(opwolf_state::sound_bankswitch_w)); - ymsnd.add_route(0, "lspeaker", 1.0); - ymsnd.add_route(1, "rspeaker", 1.0); - - MSM5205(config, m_msm[0], 384000); - m_msm[0]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<0>)); - m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */ - m_msm[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_msm[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); - - MSM5205(config, m_msm[1], 384000); - m_msm[1]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<1>)); - m_msm[1]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */ - m_msm[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); - - pc060ha_device &ciu(PC060HA(config, "ciu", 0)); - ciu.set_master_tag(m_maincpu); - ciu.set_slave_tag(m_audiocpu); -} - -void opwolf_state::opwolfp(machine_config &config) -{ - opwolf(config); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolfp_map); - - config.device_remove("cchip"); - config.device_remove("cchip_irq_clear"); -} - -void opwolf_state::opwolfb(machine_config &config) /* OSC clocks unknown for the bootleg, but changed to match original sets */ -{ - /* basic machine hardware */ - M68000(config, m_maincpu, CPU_CLOCK); /* 8 MHz ??? */ - m_maincpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolfb_map); - m_maincpu->set_vblank_int("screen", FUNC(opwolf_state::irq5_line_hold)); - - Z80(config, m_audiocpu, SOUND_CPU_CLOCK); /* 4 MHz ??? */ - m_audiocpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolf_sound_z80_map); - - z80_device &sub(Z80(config, "sub", SOUND_CPU_CLOCK)); /* 4 MHz ??? */ - sub.set_addrmap(AS_PROGRAM, &opwolf_state::opwolfb_sub_z80_map); - sub.set_vblank_int("screen", FUNC(opwolf_state::irq0_line_hold)); - - config.set_maximum_quantum(attotime::from_hz(600)); /* 10 CPU slices per frame - enough for the sound CPU to read all commands */ - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(40*8, 32*8); - screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1); - screen.set_screen_update(FUNC(opwolf_state::screen_update)); - screen.set_palette("palette"); - - GFXDECODE(config, "gfxdecode", "palette", gfx_opwolf); - PALETTE(config, "palette").set_format(palette_device::xRGBRRRRGGGGBBBB_bit0, 2048); - - PC080SN(config, m_pc080sn, 0); - m_pc080sn->set_gfx_region(0); - m_pc080sn->set_gfxdecode_tag("gfxdecode"); - - PC090OJ(config, m_pc090oj, 0); - m_pc090oj->set_palette("palette"); - m_pc090oj->set_colpri_callback(FUNC(opwolf_state::opwolf_colpri_cb)); - - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - - ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CPU_CLOCK)); - ymsnd.irq_handler().set_inputline(m_audiocpu, 0); - ymsnd.port_write_handler().set(FUNC(opwolf_state::sound_bankswitch_w)); - ymsnd.add_route(0, "lspeaker", 1.0); - ymsnd.add_route(1, "rspeaker", 1.0); - - MSM5205(config, m_msm[0], 384000); - m_msm[0]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<0>)); - m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */ - m_msm[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_msm[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); - - MSM5205(config, m_msm[1], 384000); - m_msm[1]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<1>)); - m_msm[1]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */ - m_msm[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); - m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); - - pc060ha_device &ciu(PC060HA(config, "ciu", 0)); - ciu.set_master_tag(m_maincpu); - ciu.set_slave_tag(m_audiocpu); -} - - -//************************************************************************** -// ROM DEFINITIONS -//************************************************************************** - -ROM_START( opwolf ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "b20-05-02.40", 0x00000, 0x10000, CRC(3ffbfe3a) SHA1(e41257e6af18bab4e36267a0c25a6aaa742972d2) ) - ROM_LOAD16_BYTE( "b20-03-02.30", 0x00001, 0x10000, CRC(fdabd8a5) SHA1(866ec6168489024b8d157f2d5b1553d7f6e3d9b7) ) - ROM_LOAD16_BYTE( "b20-04.39", 0x20000, 0x10000, CRC(216b4838) SHA1(2851cae00bb3e32e20f35fdab8ed6f149e658363) ) - ROM_LOAD16_BYTE( "b20-20.29", 0x20001, 0x10000, CRC(d244431a) SHA1(cb6c1d330a526f05c205f68247328161b8d4a1ba) ) - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ - ROM_LOAD( "b20-07.10", 0x00000, 0x10000, CRC(45c7ace3) SHA1(06f7393f6b973b7735c27e8380cb4148650cfc16) ) - - ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b20-18.73", 0x0000, 0x2000, CRC(5987b4e9) SHA1(d4b3d1c35a6eac86c86bd4ea49f1f157a2c05b2a) ) - - ROM_REGION( 0x80000, "pc080sn", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-13.13", 0x00000, 0x80000, CRC(f6acdab1) SHA1(716b94ab3fa330ecf22df576f6a9f47a49c7554a) ) /* SCR tiles (8 x 8) */ - - ROM_REGION( 0x80000, "pc090oj", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-14.72", 0x00000, 0x80000, CRC(89f889e5) SHA1(1592f6ce4fbb75e33d6ab957e5b90242a7a7a8c4) ) /* Sprites (16 x 16) */ - - ROM_REGION( 0x80000, "adpcm", 0 ) /* ADPCM samples */ - ROM_LOAD( "b20-08.21", 0x00000, 0x80000, CRC(f3e19c64) SHA1(39d48645f776c9c2ade537d959ecc6f9dc6dfa1b) ) -ROM_END - -/* I don't know what this set changes. There is a single byte changed near the end of the roms, just after the - copyright strings, however, it is not the region byte. This set came from a 100% legitimate Taito PCB with - original labels. It would be easy just to write this off as a bad read / hacked rom but the bootleg version - has exactly the same change and the label is different (b20-17 instead of b20-20) so this seems unlikely */ - -ROM_START( opwolfa ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "b20-05-02.40", 0x00000, 0x10000, CRC(3ffbfe3a) SHA1(e41257e6af18bab4e36267a0c25a6aaa742972d2) ) - ROM_LOAD16_BYTE( "b20-03-02.30", 0x00001, 0x10000, CRC(fdabd8a5) SHA1(866ec6168489024b8d157f2d5b1553d7f6e3d9b7) ) - ROM_LOAD16_BYTE( "b20-04.39", 0x20000, 0x10000, CRC(216b4838) SHA1(2851cae00bb3e32e20f35fdab8ed6f149e658363) ) - ROM_LOAD16_BYTE( "b20-17.29", 0x20001, 0x10000, CRC(6043188e) SHA1(3a6f4836b1c19d37713f5714a947276baf1df50c) ) - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ - ROM_LOAD( "b20-07.10", 0x00000, 0x10000, CRC(45c7ace3) SHA1(06f7393f6b973b7735c27e8380cb4148650cfc16) ) - - ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b20-18.73", 0x0000, 0x2000, CRC(5987b4e9) SHA1(d4b3d1c35a6eac86c86bd4ea49f1f157a2c05b2a) ) - - ROM_REGION( 0x80000, "pc080sn", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-13.13", 0x00000, 0x80000, CRC(f6acdab1) SHA1(716b94ab3fa330ecf22df576f6a9f47a49c7554a) ) /* SCR tiles (8 x 8) */ - - ROM_REGION( 0x80000, "pc090oj", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-14.72", 0x00000, 0x80000, CRC(89f889e5) SHA1(1592f6ce4fbb75e33d6ab957e5b90242a7a7a8c4) ) /* Sprites (16 x 16) */ - - ROM_REGION( 0x80000, "adpcm", 0 ) /* ADPCM samples */ - ROM_LOAD( "b20-08.21", 0x00000, 0x80000, CRC(f3e19c64) SHA1(39d48645f776c9c2ade537d959ecc6f9dc6dfa1b) ) -ROM_END - -ROM_START( opwolfj ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "b20-05-02.40", 0x00000, 0x10000, CRC(3ffbfe3a) SHA1(e41257e6af18bab4e36267a0c25a6aaa742972d2) ) - ROM_LOAD16_BYTE( "b20-03-02.30", 0x00001, 0x10000, CRC(fdabd8a5) SHA1(866ec6168489024b8d157f2d5b1553d7f6e3d9b7) ) - ROM_LOAD16_BYTE( "b20-04.39", 0x20000, 0x10000, CRC(216b4838) SHA1(2851cae00bb3e32e20f35fdab8ed6f149e658363) ) - ROM_LOAD16_BYTE( "b20-18.29", 0x20001, 0x10000, CRC(fd202470) SHA1(3108c14953d2f50d861946e9f646813b7050b58a) ) // is this correct? clashes with c-chip part number - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ - ROM_LOAD( "b20-07.10", 0x00000, 0x10000, CRC(45c7ace3) SHA1(06f7393f6b973b7735c27e8380cb4148650cfc16) ) - - ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b20-18.73", 0x0000, 0x2000, CRC(5987b4e9) SHA1(d4b3d1c35a6eac86c86bd4ea49f1f157a2c05b2a) ) - - ROM_REGION( 0x80000, "pc080sn", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-13.13", 0x00000, 0x80000, CRC(f6acdab1) SHA1(716b94ab3fa330ecf22df576f6a9f47a49c7554a) ) /* SCR tiles (8 x 8) */ - - ROM_REGION( 0x80000, "pc090oj", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-14.72", 0x00000, 0x80000, CRC(89f889e5) SHA1(1592f6ce4fbb75e33d6ab957e5b90242a7a7a8c4) ) /* Sprites (16 x 16) */ - - ROM_REGION( 0x80000, "adpcm", 0 ) /* ADPCM samples */ - ROM_LOAD( "b20-08.21", 0x00000, 0x80000, CRC(f3e19c64) SHA1(39d48645f776c9c2ade537d959ecc6f9dc6dfa1b) ) -ROM_END - -ROM_START( opwolfjsc ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "b20_27.ic40.27512", 0x000000, 0x010000, CRC(6bd02046) SHA1(3d3047b7665635e890337f1f46351427e307bfe7) ) - ROM_LOAD16_BYTE( "b20_26.ic30.27512", 0x000001, 0x010000, CRC(644dd415) SHA1(0cdc1152cb16fb872387f8cab3d9ee4b6286b965) ) - ROM_LOAD16_BYTE( "b20-04.39", 0x20000, 0x10000, CRC(216b4838) SHA1(2851cae00bb3e32e20f35fdab8ed6f149e658363) ) - ROM_LOAD16_BYTE( "b20-18.29", 0x20001, 0x10000, CRC(fd202470) SHA1(3108c14953d2f50d861946e9f646813b7050b58a) ) // is this correct? clashes with c-chip part number - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ - ROM_LOAD( "b20-07.10", 0x00000, 0x10000, CRC(45c7ace3) SHA1(06f7393f6b973b7735c27e8380cb4148650cfc16) ) - - ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b20-18.73", 0x0000, 0x2000, CRC(5987b4e9) SHA1(d4b3d1c35a6eac86c86bd4ea49f1f157a2c05b2a) ) - - ROM_REGION( 0x80000, "pc080sn", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-13.13", 0x00000, 0x80000, CRC(f6acdab1) SHA1(716b94ab3fa330ecf22df576f6a9f47a49c7554a) ) /* SCR tiles (8 x 8) */ - - ROM_REGION( 0x80000, "pc090oj", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-14.72", 0x00000, 0x80000, CRC(89f889e5) SHA1(1592f6ce4fbb75e33d6ab957e5b90242a7a7a8c4) ) /* Sprites (16 x 16) */ - - ROM_REGION( 0x80000, "adpcm", 0 ) /* ADPCM samples */ - ROM_LOAD( "b20-08.21", 0x00000, 0x80000, CRC(f3e19c64) SHA1(39d48645f776c9c2ade537d959ecc6f9dc6dfa1b) ) -ROM_END - -ROM_START( opwolfu ) /* Taito TC0030 C-Chip labeled B20-18 (yes, it has a specific label on it) */ - ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "b20-05-02.40", 0x00000, 0x10000, CRC(3ffbfe3a) SHA1(e41257e6af18bab4e36267a0c25a6aaa742972d2) ) - ROM_LOAD16_BYTE( "b20-03-02.30", 0x00001, 0x10000, CRC(fdabd8a5) SHA1(866ec6168489024b8d157f2d5b1553d7f6e3d9b7) ) - ROM_LOAD16_BYTE( "b20-04.39", 0x20000, 0x10000, CRC(216b4838) SHA1(2851cae00bb3e32e20f35fdab8ed6f149e658363) ) - ROM_LOAD16_BYTE( "b20-19.29", 0x20001, 0x10000, CRC(b71bc44c) SHA1(5b404bd7630f01517ab98bda40ca43c11268035a) ) - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ - ROM_LOAD( "b20-07.10", 0x00000, 0x10000, CRC(45c7ace3) SHA1(06f7393f6b973b7735c27e8380cb4148650cfc16) ) - - ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b20-18.73", 0x0000, 0x2000, CRC(5987b4e9) SHA1(d4b3d1c35a6eac86c86bd4ea49f1f157a2c05b2a) ) - - ROM_REGION( 0x80000, "pc080sn", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-13.13", 0x00000, 0x80000, CRC(f6acdab1) SHA1(716b94ab3fa330ecf22df576f6a9f47a49c7554a) ) /* SCR tiles (8 x 8) */ - - ROM_REGION( 0x80000, "pc090oj", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-14.72", 0x00000, 0x80000, CRC(89f889e5) SHA1(1592f6ce4fbb75e33d6ab957e5b90242a7a7a8c4) ) /* Sprites (16 x 16) */ - - ROM_REGION( 0x80000, "adpcm", 0 ) /* ADPCM samples */ - ROM_LOAD( "b20-08.21", 0x00000, 0x80000, CRC(f3e19c64) SHA1(39d48645f776c9c2ade537d959ecc6f9dc6dfa1b) ) -ROM_END - -/* -Prototype board -There is no C-CHIP and TC0070RGB module is replaced by three PC040DA DAC, 68000 CPU is socketed as well as RAMs, the PGA customs and YM2151, YM3012 and PC060HA on sound board. -Labels on the 68k and Z80 roms are handwritten with checksums, GFX roms are the final MASK roms. -*/ - -ROM_START( opwolfp ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "ic40", 0x00000, 0x10000, CRC(81f56008) SHA1(8ff02c088ef325a1920b29651672bad2d2d2a7a2) ) - ROM_LOAD16_BYTE( "ic30", 0x00001, 0x10000, CRC(d90cebb2) SHA1(c36070c20dfad0e1c56c4ac016a115e9e9601ecb) ) - ROM_LOAD16_BYTE( "ic39", 0x20000, 0x10000, CRC(aeef5cfc) SHA1(3c75d1df80db6ae2d690fdf23b3c44b21056d24a) ) - ROM_LOAD16_BYTE( "ic29", 0x20001, 0x10000, CRC(5ce89249) SHA1(be22fd57e29114cde66cf4339c26740b3e0f830f) ) - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ - ROM_LOAD( "ic10", 0x00000, 0x10000, CRC(684b40dd) SHA1(0546e01cf2c76b9c60730a14835cdeaaec21d26f) ) - - ROM_REGION( 0x80000, "pc080sn", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-13.13", 0x00000, 0x80000, CRC(f6acdab1) SHA1(716b94ab3fa330ecf22df576f6a9f47a49c7554a) ) /* SCR tiles (8 x 8) */ - - ROM_REGION( 0x80000, "pc090oj", 0 ) - ROM_LOAD16_WORD_SWAP( "b20-06.ic72", 0x00000, 0x80000, CRC(89f889e5) SHA1(1592f6ce4fbb75e33d6ab957e5b90242a7a7a8c4) ) /* Sprites (16 x 16) */ // same content as b20-14.72 despite different label (confirmed) - - ROM_REGION( 0x80000, "adpcm", 0 ) /* ADPCM samples */ - ROM_LOAD( "b20-08.21", 0x00000, 0x80000, CRC(f3e19c64) SHA1(39d48645f776c9c2ade537d959ecc6f9dc6dfa1b) ) -ROM_END - -ROM_START( opwolfb ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "opwlfb.12", 0x00000, 0x10000, CRC(d87e4405) SHA1(de8a7763acd57293fbbff609e949ecd66c0f9234) ) - ROM_LOAD16_BYTE( "opwlfb.10", 0x00001, 0x10000, CRC(9ab6f75c) SHA1(85310258ca005ffb031e8d6b3f43c3d1fc29ef14) ) - ROM_LOAD16_BYTE( "opwlfb.13", 0x20000, 0x10000, CRC(61230c6e) SHA1(942764aec0c55ba00df8dbb54e127b73e24192ae) ) - ROM_LOAD16_BYTE( "opwlfb.11", 0x20001, 0x10000, CRC(342e318d) SHA1(a52918d16884ca42b2a3b910bc71bfd81b45f1ab) ) - - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ - ROM_LOAD( "opwlfb.30", 0x00000, 0x08000, CRC(0669b94c) SHA1(f10894a6fad8ed144a528db696436b58f62ddee4) ) - - ROM_REGION( 0x10000, "sub", 0 ) /* c-chip substitute Z80 */ - ROM_LOAD( "opwlfb.09", 0x00000, 0x08000, CRC(ab27a3dd) SHA1(cf589e7a9ccf3e86020b86f917fb91f3d8ba7512) ) - - ROM_REGION( 0x80000, "pc080sn", 0 ) - ROM_LOAD16_BYTE( "opwlfb.08", 0x00000, 0x10000, CRC(134d294e) SHA1(bd05169dbd761c2944f0ac51c1ec114577777452) ) /* SCR tiles (8 x 8) */ - ROM_LOAD16_BYTE( "opwlfb.06", 0x20000, 0x10000, CRC(317d0e66) SHA1(70298c0ef5243f481b18f904be9404527d1d99d5) ) - ROM_LOAD16_BYTE( "opwlfb.07", 0x40000, 0x10000, CRC(e1c4095e) SHA1(d5f1d26d6612e78001002f92de670e68e00c6f9e) ) - ROM_LOAD16_BYTE( "opwlfb.05", 0x60000, 0x10000, CRC(fd9e72c8) SHA1(7a76f57641c3f0198565cd163188b581253173b2) ) - ROM_LOAD16_BYTE( "opwlfb.04", 0x00001, 0x10000, CRC(de0ca98d) SHA1(066e89ec0c64da14bdcd2b337f95c0de5de33c11) ) - ROM_LOAD16_BYTE( "opwlfb.02", 0x20001, 0x10000, CRC(6231fdd0) SHA1(1c830c106cf3c94a8d06ed2fff030a5d516ab6d6) ) - ROM_LOAD16_BYTE( "opwlfb.03", 0x40001, 0x10000, CRC(ccf8ba80) SHA1(8366f5ef0de885e5241567d1a083d98a8a2875d9) ) - ROM_LOAD16_BYTE( "opwlfb.01", 0x60001, 0x10000, CRC(0a65f256) SHA1(4dfcd3cb138a87d002eb65a02f94e33f4d07676d) ) - - ROM_REGION( 0x80000, "pc090oj", 0 ) - ROM_LOAD16_BYTE( "opwlfb.14", 0x00000, 0x10000, CRC(663786eb) SHA1(a25710f6c16158e51d0934f184390a01ff0a614a) ) /* Sprites (16 x 16) */ - ROM_LOAD16_BYTE( "opwlfb.15", 0x20000, 0x10000, CRC(315b8aa9) SHA1(4a904e5532421d933e4c401c03c958eb32b15e03) ) - ROM_LOAD16_BYTE( "opwlfb.16", 0x40000, 0x10000, CRC(e01099e3) SHA1(4c5391d71978f72c57c140e58a767e138acdce12) ) - ROM_LOAD16_BYTE( "opwlfb.17", 0x60000, 0x10000, CRC(56fbe61d) SHA1(0e4dce8ee981bdd851e500fa9dca5d40908e142f) ) - ROM_LOAD16_BYTE( "opwlfb.18", 0x00001, 0x10000, CRC(de9ab08e) SHA1(ef674c965f35efaf747f1ddbf9e9164fcceb0c1c) ) - ROM_LOAD16_BYTE( "opwlfb.19", 0x20001, 0x10000, CRC(645cf85e) SHA1(91c244c2e238b61c8b2f39e5fa01cc23ebbfe2ce) ) - ROM_LOAD16_BYTE( "opwlfb.20", 0x40001, 0x10000, CRC(d80b9cc6) SHA1(b189f35eb206da1ab313620e251e6bb10edeee04) ) - ROM_LOAD16_BYTE( "opwlfb.21", 0x60001, 0x10000, CRC(97d25157) SHA1(cfb3f76ed860d90235dc0e32919a5ec3d3e683dd) ) - - ROM_REGION( 0x80000, "adpcm", 0 ) /* ADPCM samples (interleaved) */ - ROM_LOAD16_BYTE( "opwlfb.29", 0x00000, 0x10000, CRC(05a9eac0) SHA1(26eb1acc65aeb759920b35bcbcac6d6c2789584c) ) - ROM_LOAD16_BYTE( "opwlfb.28", 0x20000, 0x10000, CRC(281b2175) SHA1(3789e58da682041226f70eba87b31876cb206906) ) - ROM_LOAD16_BYTE( "opwlfb.27", 0x40000, 0x10000, CRC(441211a6) SHA1(82e84ae90765df5f7f6b6f32a2bb52ac40132f8d) ) - ROM_LOAD16_BYTE( "opwlfb.26", 0x60000, 0x10000, CRC(86d1d42d) SHA1(9d63e9e35fa51d8e6eac30556ba5a4dca7c14418) ) - ROM_LOAD16_BYTE( "opwlfb.25", 0x00001, 0x10000, CRC(85b87f58) SHA1(f26cf4ab8f9d30d1b1ac84be328ca821524b234e) ) - ROM_LOAD16_BYTE( "opwlfb.24", 0x20001, 0x10000, CRC(8efc5d4d) SHA1(21068d7fcfe293d99ad9f999d84483bf1a49ec6d) ) - ROM_LOAD16_BYTE( "opwlfb.23", 0x40001, 0x10000, CRC(a874c703) SHA1(c9d6074265f5d5028c69c81eaba29fa178943341) ) - ROM_LOAD16_BYTE( "opwlfb.22", 0x60001, 0x10000, CRC(9228481f) SHA1(8160f919f5e6a347c915a2bd7488b488fe2401bc) ) -ROM_END - - -//************************************************************************** -// SYSTEM DRIVERS -//************************************************************************** - -// Prototype rom set includes the string - 'T KATO 10/6/87' -// Regular rom set includes the string '11 Sep 1987' -// C-Chip includes the string 'By_TAITO_Copration_On_OSAKA_BUNSHITU._01.Sep.1987_Toshiaki.Kato_Tsutomuawa_4 - -// year rom parent machine inp state init -GAME( 1987, opwolf, 0, opwolf, opwolf, opwolf_state, init_opwolf, ROT0, "Taito Corporation Japan", "Operation Wolf (World, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, opwolfa, opwolf, opwolf, opwolf, opwolf_state, init_opwolf, ROT0, "Taito Corporation Japan", "Operation Wolf (World, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, opwolfj, opwolf, opwolf, opwolfu, opwolf_state, init_opwolf, ROT0, "Taito Corporation", "Operation Wolf (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, opwolfjsc,opwolf, opwolf, opwolfu, opwolf_state, init_opwolf, ROT0, "Taito Corporation", "Operation Wolf (Japan, SC)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, opwolfu, opwolf, opwolf, opwolfu, opwolf_state, init_opwolf, ROT0, "Taito America Corporation", "Operation Wolf (US)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, opwolfb, opwolf, opwolfb, opwolfb, opwolf_state, init_opwolfb, ROT0, "bootleg (Bear Corporation Korea)", "Operation Bear (bootleg of Operation Wolf)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, opwolfp, opwolf, opwolfp, opwolfp, opwolf_state, init_opwolfp, ROT0, "Taito Corporation", "Operation Wolf (Japan, prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // unprotected |