From 6be0b400ae28c4d7022226cfcc76260b116927db Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Mon, 27 Aug 2018 22:39:26 +0200 Subject: [PATCH] opwolf: Move cchip simulation out of driver, initial clean ups --- scripts/target/mame/arcade.lua | 3 - src/mame/drivers/opwolf.cpp | 678 ++++++++++-------- .../opwolf.cpp => etc/opwolf_cchip.txt} | 95 ++- src/mame/includes/opwolf.h | 156 ---- src/mame/video/opwolf.cpp | 65 -- 5 files changed, 463 insertions(+), 534 deletions(-) rename src/mame/{machine/opwolf.cpp => etc/opwolf_cchip.txt} (93%) delete mode 100644 src/mame/includes/opwolf.h delete mode 100644 src/mame/video/opwolf.cpp diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 9bf75cbb0d2..80d554c7129 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -3811,9 +3811,6 @@ files { MAME_DIR .. "src/mame/includes/nycaptor.h", MAME_DIR .. "src/mame/video/nycaptor.cpp", MAME_DIR .. "src/mame/drivers/opwolf.cpp", - MAME_DIR .. "src/mame/includes/opwolf.h", - MAME_DIR .. "src/mame/machine/opwolf.cpp", - MAME_DIR .. "src/mame/video/opwolf.cpp", MAME_DIR .. "src/mame/drivers/othunder.cpp", MAME_DIR .. "src/mame/includes/othunder.h", MAME_DIR .. "src/mame/video/othunder.cpp", diff --git a/src/mame/drivers/opwolf.cpp b/src/mame/drivers/opwolf.cpp index aea737e107f..7d4e25a7753 100644 --- a/src/mame/drivers/opwolf.cpp +++ b/src/mame/drivers/opwolf.cpp @@ -274,100 +274,122 @@ register. So what is controlling priority. #define SOUND_CPU_CLOCK (XTAL(8'000'000) / 2) /* clock for Z80 sound CPU */ #include "emu.h" -#include "includes/opwolf.h" -#include "audio/taitosnd.h" - #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" -#include "includes/taitoipt.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 "screen.h" #include "speaker.h" -READ16_MEMBER(opwolf_state::cchip_r) +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class opwolf_state : public driver_device { - return m_cchip_ram[offset]; -} +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) + { } -WRITE16_MEMBER(opwolf_state::cchip_w) -{ - m_cchip_ram[offset] = data &0xff; -} + void opwolf(machine_config &config); + void opwolfb(machine_config &config); + void opwolfp(machine_config &config); -/********************************************************** - GAME INPUTS -**********************************************************/ + void init_opwolf(); + void init_opwolfb(); + void init_opwolfp(); -#define P1X_PORT_TAG "P1X" -#define P1Y_PORT_TAG "P1Y" + DECLARE_CUSTOM_INPUT_MEMBER(opwolf_gun_x_r); + DECLARE_CUSTOM_INPUT_MEMBER(opwolf_gun_y_r); -READ16_MEMBER(opwolf_state::opwolf_in_r) -{ - static const char *const inname[2] = { "IN0", "IN1" }; - return ioport(inname[offset])->read(); -} +protected: + virtual void machine_start() override; -READ16_MEMBER(opwolf_state::opwolf_dsw_r) -{ - static const char *const dswname[2] = { "DSWA", "DSWB" }; - return ioport(dswname[offset])->read(); -} +private: + DECLARE_READ16_MEMBER(cchip_r); + DECLARE_WRITE16_MEMBER(cchip_w); + DECLARE_WRITE8_MEMBER(opwolf_adpcm_d_w); + DECLARE_WRITE8_MEMBER(opwolf_adpcm_e_w); + DECLARE_WRITE16_MEMBER(opwolf_spritectrl_w); + DECLARE_WRITE8_MEMBER(sound_bankswitch_w); + DECLARE_WRITE8_MEMBER(opwolf_adpcm_b_w); + DECLARE_WRITE8_MEMBER(opwolf_adpcm_c_w); + DECLARE_WRITE8_MEMBER(counters_w); -READ16_MEMBER(opwolf_state::opwolf_lightgun_r) -{ - static const char *const dswname[2] = { "IN2", "IN3" }; - return ioport(dswname[offset])->read(); -} + INTERRUPT_GEN_MEMBER(interrupt); + TIMER_DEVICE_CALLBACK_MEMBER(cchip_irq_clear_cb); -READ8_MEMBER(opwolf_state::z80_input1_r) -{ - return ioport("IN0")->read(); /* irrelevant mirror ? */ -} + DECLARE_MACHINE_RESET(opwolf); + uint32_t screen_update_opwolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void opwolf_msm5205_vck(msm5205_device *device, int chip); + template DECLARE_WRITE_LINE_MEMBER(msm5205_vck_w); -READ8_MEMBER(opwolf_state::z80_input2_r) -{ - return ioport("IN0")->read(); /* needed for coins */ -} + 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); -WRITE8_MEMBER(opwolf_state::counters_w) -{ - 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); -} + /* memory pointers */ + optional_shared_ptr m_cchip_ram; -/****************************************************** - SOUND -******************************************************/ + /* video-related */ + uint16_t m_sprite_ctrl; + uint16_t m_sprites_flipscreen; -WRITE8_MEMBER(opwolf_state::sound_bankswitch_w) -{ - membank("z80bank")->set_entry(data & 0x03); -} + /* 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]; -/*********************************************************** - MEMORY STRUCTURES -***********************************************************/ + int m_opwolf_gun_xoffs; + int m_opwolf_gun_yoffs; + /* devices */ + required_device m_maincpu; + required_device m_audiocpu; + optional_device m_cchip; + optional_device m_cchip_irq_clear; + required_device m_pc080sn; + required_device m_pc090oj; + required_device_array m_msm; +}; + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** void opwolf_state::opwolf_map(address_map &map) { map(0x000000, 0x03ffff).rom(); -// map(0x0f0000, 0x0f07ff).mirror(0xf000).r(FUNC(opwolf_state::opwolf_cchip_data_r)); -// map(0x0f0802, 0x0f0803).mirror(0xf000).r(FUNC(opwolf_state::opwolf_cchip_status_r)); -// map(0x0ff000, 0x0ff7ff).w(FUNC(opwolf_state::opwolf_cchip_data_w)); -// map(0x0ff802, 0x0ff803).w(FUNC(opwolf_state::opwolf_cchip_status_w)); -// map(0x0ffc00, 0x0ffc01).w(FUNC(opwolf_state::opwolf_cchip_bank_w)); 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, 0x380003).r(FUNC(opwolf_state::opwolf_dsw_r)); /* dip switches */ + 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, 0x3a0003).r(FUNC(opwolf_state::opwolf_lightgun_r)); /* lightgun, read at $11e0/6 */ + 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)); @@ -380,17 +402,19 @@ void opwolf_state::opwolf_map(address_map &map) 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(0x0f0008, 0x0f000b).r(FUNC(opwolf_state::opwolf_in_r)); /* coins and buttons */ + map(0x0f0008, 0x0f0009).portr("IN0"); + map(0x0f000a, 0x0f000b).portr("IN1"); map(0x0ff000, 0x0fffff).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, 0x380003).r(FUNC(opwolf_state::opwolf_dsw_r)); /* dip switches */ + 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, 0x3a0003).r(FUNC(opwolf_state::opwolf_lightgun_r)); /* lightgun, read at $11e0/6 */ + 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)); @@ -407,11 +431,12 @@ 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, 0x380003).r(FUNC(opwolf_state::opwolf_dsw_r)); /* dip switches */ + 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, 0x3a0003).r(FUNC(opwolf_state::opwolf_lightgun_r)); /* lightgun, read at $11e0/6 (AND INPUTS) */ + 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)); @@ -424,148 +449,6 @@ void opwolf_state::opwolfp_map(address_map &map) map(0xd00000, 0xd03fff).rw(m_pc090oj, FUNC(pc090oj_device::word_r), FUNC(pc090oj_device::word_w)); /* sprite ram */ } - -/*************************************************************************** - 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).r(FUNC(opwolf_state::z80_input1_r)); /* read at PC=$637: poked to $c004 */ - map(0x9000, 0x9000).nopw(); /* unknown write, 0 then 1 each interrupt */ - map(0x9800, 0x9800).r(FUNC(opwolf_state::z80_input2_r)); /* read at PC=$631: poked to $c005 */ - map(0xa000, 0xa000).nopw(); /* IRQ acknowledge (unimplemented) */ - map(0xc000, 0xc7ff).ram().share("cchip_ram"); -} - - -/***************************************************************************/ - - -//static uint8_t adpcm_d[0x08]; -//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 - always zero write (start trigger ?) -//5 - different values -//6 - different values - -void opwolf_state::machine_start() -{ - //m_opwolf_timer = timer_alloc(TIMER_OPWOLF); - - 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_msm1->reset_w(1); - m_msm2->reset_w(1); -} - -void opwolf_state::opwolf_msm5205_vck(msm5205_device *device,int chip) -{ - if (m_adpcm_data[chip] != -1) - { - device->write_data(m_adpcm_data[chip] & 0x0f); - m_adpcm_data[chip] = -1; - if (m_adpcm_pos[chip] == m_adpcm_end[chip]) - { - device->reset_w(1); - //logerror("reset device %d\n", chip); - } - } - else - { - m_adpcm_data[chip] = memregion("adpcm")->base()[m_adpcm_pos[chip]]; - m_adpcm_pos[chip] = (m_adpcm_pos[chip] + 1) & 0x7ffff; - device->write_data(m_adpcm_data[chip] >> 4); - } -} -WRITE_LINE_MEMBER(opwolf_state::opwolf_msm5205_vck_1) -{ - opwolf_msm5205_vck(m_msm1, 0); -} -WRITE_LINE_MEMBER(opwolf_state::opwolf_msm5205_vck_2) -{ - opwolf_msm5205_vck(m_msm2, 1); -} - -WRITE8_MEMBER(opwolf_state::opwolf_adpcm_b_w) -{ - 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_msm1->reset_w(0); - //logerror("TRIGGER MSM1\n"); - } - -// logerror("CPU #1 b00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); -} - - -WRITE8_MEMBER(opwolf_state::opwolf_adpcm_c_w) -{ - 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_msm2->reset_w(0); - - //logerror("TRIGGER MSM2\n"); - } - -// logerror("CPU #1 c00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); -} - - -WRITE8_MEMBER(opwolf_state::opwolf_adpcm_d_w) -{ -// logerror("CPU #1 d00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); -} - -WRITE8_MEMBER(opwolf_state::opwolf_adpcm_e_w) -{ -// logerror("CPU #1 e00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); -} - void opwolf_state::opwolf_sound_z80_map(address_map &map) { map(0x0000, 0x3fff).rom(); @@ -581,24 +464,24 @@ void opwolf_state::opwolf_sound_z80_map(address_map &map) map(0xe000, 0xe000).w(FUNC(opwolf_state::opwolf_adpcm_e_w)); } -/*********************************************************** - INPUT PORTS, DIPs -***********************************************************/ - - -CUSTOM_INPUT_MEMBER(opwolf_state::opwolf_gun_x_r ) +// this extra z80 substitutes for the c-chip in the bootleg +void opwolf_state::opwolfb_sub_z80_map(address_map &map) { - /* 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); + map(0x0000, 0x7fff).rom(); + map(0x8800, 0x8800).portr("IN0"); /* read at PC=$637: poked to $c004, irrelevant mirror? */ + map(0x9000, 0x9000).nopw(); /* unknown write, 0 then 1 each interrupt */ + map(0x9800, 0x9800).portr("IN0"); /* read at PC=$631: poked to $c005, needed for coins */ + 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) */ @@ -650,7 +533,6 @@ static INPUT_PORTS_START( opwolf ) 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(DEVICE_SELF, opwolf_state, opwolf_gun_x_r, nullptr) PORT_BIT( 0xfe00, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -664,24 +546,16 @@ static INPUT_PORTS_START( opwolf ) 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 ) @@ -712,7 +586,6 @@ static INPUT_PORTS_START( opwolfp ) 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 ) @@ -728,9 +601,89 @@ static INPUT_PORTS_START( opwolfb ) INPUT_PORTS_END -/************************************************************** - GFX DECODING -**************************************************************/ +//************************************************************************** +// INPUT PORT HANDLING +//************************************************************************** + +WRITE8_MEMBER(opwolf_state::counters_w) +{ + 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 +//************************************************************************** + +WRITE16_MEMBER(opwolf_state::opwolf_spritectrl_w) +{ + // 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->set_sprite_ctrl((data & 0xe0) >> 5); + + /* 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); + } + } +} + +uint32_t opwolf_state::screen_update_opwolf(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(bitmap, cliprect, screen.priority(), 1); + +// if (ioport("P1X")->read()) +// popmessage("%d %d", machine(), "P1X"), ioport("P1Y")->read()); + + return 0; +} + + +//************************************************************************** +// DRAWGFX LAYOUTS +//************************************************************************** static const gfx_layout charlayout = { @@ -786,13 +739,177 @@ static GFXDECODE_START( gfx_opwolfb ) GFXDECODE_ENTRY( "gfx1", 0, charlayout_b, 0, 128 ) /* scr tiles */ GFXDECODE_END -/***********************************************************/ + +//************************************************************************** +// SOUND +//************************************************************************** + +WRITE8_MEMBER(opwolf_state::sound_bankswitch_w) +{ + membank("z80bank")->set_entry(data & 0x03); +} + +//static uint8_t adpcm_d[0x08]; +//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 - always zero write (start trigger ?) +//5 - different values +//6 - different values + +template +WRITE_LINE_MEMBER(opwolf_state::msm5205_vck_w) +{ + if (m_adpcm_data[N] != -1) + { + m_msm[N]->write_data(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]->write_data(m_adpcm_data[N] >> 4); + } +} + +WRITE8_MEMBER(opwolf_state::opwolf_adpcm_b_w) +{ + 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); + //logerror("TRIGGER MSM1\n"); + } + +// logerror("CPU #1 b00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); +} + +WRITE8_MEMBER(opwolf_state::opwolf_adpcm_c_w) +{ + 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); + //logerror("TRIGGER MSM2\n"); + } + +// logerror("CPU #1 c00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); +} + +WRITE8_MEMBER(opwolf_state::opwolf_adpcm_d_w) +{ +// logerror("CPU #1 d00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); +} + +WRITE8_MEMBER(opwolf_state::opwolf_adpcm_e_w) +{ +// logerror("CPU #1 e00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); +} + + +//************************************************************************** +// 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); +} + +READ16_MEMBER(opwolf_state::cchip_r) +{ + return m_cchip_ram[offset]; +} + +WRITE16_MEMBER(opwolf_state::cchip_w) +{ + 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); + 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) @@ -800,9 +917,10 @@ TIMER_DEVICE_CALLBACK_MEMBER(opwolf_state::cchip_irq_clear_cb) m_cchip->ext_interrupt(CLEAR_LINE); } -/*********************************************************** - MACHINE DRIVERS -***********************************************************/ + +//************************************************************************** +// MACHINE DEFINTIONS +//************************************************************************** MACHINE_CONFIG_START(opwolf_state::opwolf) @@ -856,14 +974,14 @@ MACHINE_CONFIG_START(opwolf_state::opwolf) MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) - MCFG_DEVICE_ADD("msm1", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, opwolf_msm5205_vck_1)) /* VCK function */ + MCFG_DEVICE_ADD("msm0", MSM5205, 384000) + MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) - MCFG_DEVICE_ADD("msm2", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, opwolf_msm5205_vck_2)) /* VCK function */ + MCFG_DEVICE_ADD("msm1", MSM5205, 384000) + MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) @@ -873,7 +991,6 @@ MACHINE_CONFIG_START(opwolf_state::opwolf) MCFG_PC060HA_SLAVE_CPU("audiocpu") MACHINE_CONFIG_END - MACHINE_CONFIG_START(opwolf_state::opwolfp) opwolf(config); @@ -885,8 +1002,6 @@ MACHINE_CONFIG_START(opwolf_state::opwolfp) MCFG_DEVICE_REMOVE("cchip_irq_clear") MACHINE_CONFIG_END - - MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootleg, but changed to match original sets */ /* basic machine hardware */ @@ -903,7 +1018,6 @@ MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootle MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */ - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -935,14 +1049,14 @@ MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootle MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) - MCFG_DEVICE_ADD("msm1", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, opwolf_msm5205_vck_1)) /* VCK function */ + MCFG_DEVICE_ADD("msm0", MSM5205, 384000) + MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) - MCFG_DEVICE_ADD("msm2", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, opwolf_msm5205_vck_2)) /* VCK function */ + MCFG_DEVICE_ADD("msm1", MSM5205, 384000) + MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) @@ -953,9 +1067,9 @@ MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootle MACHINE_CONFIG_END -/*************************************************************************** - DRIVERS -***************************************************************************/ +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** ROM_START( opwolf ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 256k for 68000 code */ @@ -1103,7 +1217,6 @@ ROM_START( opwolfp ) 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) ) @@ -1149,46 +1262,9 @@ ROM_START( opwolfb ) ROM_END -void opwolf_state::init_opwolf() -{ - uint16_t* rom = (uint16_t*)memregion("maincpu")->base(); - - m_opwolf_region = rom[0x03fffe / 2] & 0xff; - - //opwolf_cchip_init(); // start old simulation, including periodic timer - - // 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() -{ - uint16_t* rom = (uint16_t*)memregion("maincpu")->base(); - - m_opwolf_region = rom[0x03fffe / 2] & 0xff; - - /* 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() -{ - uint16_t* rom = (uint16_t*)memregion("maincpu")->base(); - - m_opwolf_region = rom[0x03fffe / 2] & 0xff; - - m_opwolf_gun_xoffs = 5; - m_opwolf_gun_yoffs = 30; - - membank("z80bank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000); -} +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** // Prototype rom set includes the string - 'T KATO 10/6/87' // Regular rom set includes the string '11 Sep 1987' diff --git a/src/mame/machine/opwolf.cpp b/src/mame/etc/opwolf_cchip.txt similarity index 93% rename from src/mame/machine/opwolf.cpp rename to src/mame/etc/opwolf_cchip.txt index 861c806b60c..13904edc920 100644 --- a/src/mame/machine/opwolf.cpp +++ b/src/mame/etc/opwolf_cchip.txt @@ -1,6 +1,17 @@ -// license:GPL-2.0+ -// copyright-holders:Bryan McPhail -/************************************************************************* +Operation Wolf C-Chip Protection simulation +=========================================== + +The below simulation was replaced by emulating the actual cchip using an +extracted eprom image. The information previously contained in the MAME driver +is contained below for documentation purposes. + +Start of original notes and simulation below. + + +*************************************************************************** +File: mame/machine/opwolf.cpp +*************************************************************************** + Operation Wolf C-Chip Protection ================================ @@ -103,10 +114,8 @@ Notes by bmcphail@vcmame.net -*************************************************************************/ -#include "emu.h" -#include "includes/opwolf.h" + /* Select how coinage data is initialised in opwolf_cchip_data_w : 0 = user-defined in function - 1 = automatic */ #define OPWOLF_READ_COINAGE_FROM_ROM 1 @@ -476,7 +485,6 @@ static const uint16_t *const level_data_lookup[] = level_data_09 }; - void opwolf_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { switch (id) @@ -492,7 +500,6 @@ void opwolf_state::device_timer(emu_timer &timer, device_timer_id id, int param, } } - TIMER_CALLBACK_MEMBER(opwolf_state::opwolf_timer_callback) { // Level data command @@ -733,7 +740,6 @@ WRITE16_MEMBER(opwolf_state::opwolf_cchip_data_w) } } - /************************************* * * Reads from C-Chip @@ -1149,3 +1155,74 @@ void opwolf_state::opwolf_cchip_init( ) m_cchip_timer = timer_alloc(TIMER_CCHIP); m_cchip_timer->adjust(attotime::from_hz(60), 0, attotime::from_hz(60)); } + + +*************************************************************************** +File: mame/drivers/opwolf.cpp +*************************************************************************** + + +// map(0x0f0000, 0x0f07ff).mirror(0xf000).r(FUNC(opwolf_state::opwolf_cchip_data_r)); +// map(0x0f0802, 0x0f0803).mirror(0xf000).r(FUNC(opwolf_state::opwolf_cchip_status_r)); +// map(0x0ff000, 0x0ff7ff).w(FUNC(opwolf_state::opwolf_cchip_data_w)); +// map(0x0ff802, 0x0ff803).w(FUNC(opwolf_state::opwolf_cchip_status_w)); +// map(0x0ffc00, 0x0ffc01).w(FUNC(opwolf_state::opwolf_cchip_bank_w)); + +// m_opwolf_timer = timer_alloc(TIMER_OPWOLF); + +// opwolf_cchip_init(); // start old simulation, including periodic timer + + +*************************************************************************** +File: mame/includes/opwolf.h +*************************************************************************** + + +enum +{ + TIMER_OPWOLF, + TIMER_CCHIP +}; + +DECLARE_WRITE16_MEMBER(opwolf_cchip_status_w); +DECLARE_WRITE16_MEMBER(opwolf_cchip_bank_w); +DECLARE_WRITE16_MEMBER(opwolf_cchip_data_w); +DECLARE_READ16_MEMBER(opwolf_cchip_status_r); +DECLARE_READ16_MEMBER(opwolf_cchip_data_r); + +virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + +TIMER_CALLBACK_MEMBER(opwolf_timer_callback); +TIMER_CALLBACK_MEMBER(cchip_timer); +void updateDifficulty(int mode); +void opwolf_cchip_init(); + +emu_timer *m_opwolf_timer; + +/* c-chip */ +emu_timer *m_cchip_timer; + +int m_opwolf_region; + +uint8_t m_current_bank; +uint8_t m_current_cmd; +uint8_t m_cchip_last_7a; +uint8_t m_cchip_last_04; +uint8_t m_cchip_last_05; +uint8_t m_cchip_coins_for_credit[2]; +uint8_t m_cchip_credits_for_coin[2]; +uint8_t m_cchip_coins[2]; +uint8_t m_c588; +uint8_t m_c589; +uint8_t m_c58a; // These variables derived from the bootleg +uint8_t m_triggeredLevel1b; // These variables derived from comparison to unprotection version +uint8_t m_triggeredLevel2; +uint8_t m_triggeredLevel2b; +uint8_t m_triggeredLevel2c; +uint8_t m_triggeredLevel3b; +uint8_t m_triggeredLevel13b; +uint8_t m_triggeredLevel4; +uint8_t m_triggeredLevel5; +uint8_t m_triggeredLevel7; +uint8_t m_triggeredLevel8; +uint8_t m_triggeredLevel9; diff --git a/src/mame/includes/opwolf.h b/src/mame/includes/opwolf.h deleted file mode 100644 index 3e3d1b6fc93..00000000000 --- a/src/mame/includes/opwolf.h +++ /dev/null @@ -1,156 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:David Graves, Jarek Burczynski -/************************************************************************* - - Operation Wolf - -*************************************************************************/ -#ifndef MAME_INCLUDES_OPWOLF_H -#define MAME_INCLUDES_OPWOLF_H - -#pragma once - - -#include "machine/taitocchip.h" -#include "machine/timer.h" - -#include "sound/msm5205.h" -#include "video/pc080sn.h" -#include "video/pc090oj.h" - - -class opwolf_state : public driver_device -{ -public: - enum - { - TIMER_OPWOLF, - TIMER_CCHIP - }; - - 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_msm1(*this, "msm1"), - m_msm2(*this, "msm2") - { } - - 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); - -private: - DECLARE_READ16_MEMBER(cchip_r); - DECLARE_WRITE16_MEMBER(cchip_w); - DECLARE_READ16_MEMBER(opwolf_in_r); - DECLARE_READ16_MEMBER(opwolf_dsw_r); - DECLARE_READ16_MEMBER(opwolf_lightgun_r); - DECLARE_READ8_MEMBER(z80_input1_r); - DECLARE_READ8_MEMBER(z80_input2_r); - DECLARE_WRITE8_MEMBER(opwolf_adpcm_d_w); - DECLARE_WRITE8_MEMBER(opwolf_adpcm_e_w); - DECLARE_WRITE16_MEMBER(opwolf_cchip_status_w); - DECLARE_WRITE16_MEMBER(opwolf_cchip_bank_w); - DECLARE_WRITE16_MEMBER(opwolf_cchip_data_w); - DECLARE_READ16_MEMBER(opwolf_cchip_status_r); - DECLARE_READ16_MEMBER(opwolf_cchip_data_r); - DECLARE_WRITE16_MEMBER(opwolf_spritectrl_w); - DECLARE_WRITE8_MEMBER(sound_bankswitch_w); - DECLARE_WRITE8_MEMBER(opwolf_adpcm_b_w); - DECLARE_WRITE8_MEMBER(opwolf_adpcm_c_w); - DECLARE_WRITE8_MEMBER(counters_w); - - INTERRUPT_GEN_MEMBER(interrupt); - TIMER_DEVICE_CALLBACK_MEMBER(cchip_irq_clear_cb); - - virtual void machine_start() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - DECLARE_MACHINE_RESET(opwolf); - uint32_t screen_update_opwolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_CALLBACK_MEMBER(opwolf_timer_callback); - TIMER_CALLBACK_MEMBER(cchip_timer); - void updateDifficulty(int mode); - void opwolf_cchip_init(); - void opwolf_msm5205_vck(msm5205_device *device, int chip); - DECLARE_WRITE_LINE_MEMBER(opwolf_msm5205_vck_1); - DECLARE_WRITE_LINE_MEMBER(opwolf_msm5205_vck_2); - - 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 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; - - emu_timer *m_opwolf_timer; - - /* c-chip */ - emu_timer *m_cchip_timer; - - int m_opwolf_region; - - uint8_t m_current_bank; - uint8_t m_current_cmd; - uint8_t m_cchip_last_7a; - uint8_t m_cchip_last_04; - uint8_t m_cchip_last_05; - uint8_t m_cchip_coins_for_credit[2]; - uint8_t m_cchip_credits_for_coin[2]; - uint8_t m_cchip_coins[2]; - uint8_t m_c588; - uint8_t m_c589; - uint8_t m_c58a; // These variables derived from the bootleg - uint8_t m_triggeredLevel1b; // These variables derived from comparison to unprotection version - uint8_t m_triggeredLevel2; - uint8_t m_triggeredLevel2b; - uint8_t m_triggeredLevel2c; - uint8_t m_triggeredLevel3b; - uint8_t m_triggeredLevel13b; - uint8_t m_triggeredLevel4; - uint8_t m_triggeredLevel5; - uint8_t m_triggeredLevel7; - uint8_t m_triggeredLevel8; - uint8_t m_triggeredLevel9; - - /* devices */ - required_device m_maincpu; - required_device m_audiocpu; - optional_device m_cchip; - optional_device m_cchip_irq_clear; - required_device m_pc080sn; - required_device m_pc090oj; - required_device m_msm1; - required_device m_msm2; -}; - - -#endif // MAME_INCLUDES_OPWOLF_H diff --git a/src/mame/video/opwolf.cpp b/src/mame/video/opwolf.cpp deleted file mode 100644 index ad0f039bad5..00000000000 --- a/src/mame/video/opwolf.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:David Graves, Jarek Burczynski -/*************************************************************************** - Functions to emulate video hardware on these Taito games: - - - operation wolf - -***************************************************************************/ - -#include "emu.h" -#include "includes/opwolf.h" -#include "screen.h" - - -WRITE16_MEMBER(opwolf_state::opwolf_spritectrl_w) -{ - // 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->set_sprite_ctrl((data & 0xe0) >> 5); - - /* 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); - } - } -} - -/***************************************************************************/ - -uint32_t opwolf_state::screen_update_opwolf(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(bitmap, cliprect, screen.priority(), 1); - -// if (ioport("P1X")->read()) -// popmessage("%d %d", machine(), "P1X"), ioport("P1Y")->read()); - - return 0; -}