opwolf: Move cchip simulation out of driver, initial clean ups

This commit is contained in:
Dirk Best 2018-08-27 22:39:26 +02:00
parent f54bfd6da6
commit 6be0b400ae
5 changed files with 463 additions and 534 deletions

View File

@ -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",

View File

@ -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'

View File

@ -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;

View File

@ -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

View File

@ -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;
}