mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
opwolf: Move cchip simulation out of driver, initial clean ups
This commit is contained in:
parent
f54bfd6da6
commit
6be0b400ae
@ -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",
|
||||
|
@ -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<int N> 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<uint8_t> 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<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;
|
||||
};
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// 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<int N>
|
||||
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'
|
||||
|
@ -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;
|
@ -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<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;
|
||||
|
||||
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<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<msm5205_device> m_msm1;
|
||||
required_device<msm5205_device> m_msm2;
|
||||
};
|
||||
|
||||
|
||||
#endif // MAME_INCLUDES_OPWOLF_H
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user