namcos1.cpp : Updates

Reduce duplicates, Runtime tag lookups, Simplify handlers, Use shorter/correct type values
This commit is contained in:
cam900 2019-03-22 16:03:38 +09:00
parent 809f16a672
commit d3eb9d346a
4 changed files with 165 additions and 250 deletions

View File

@ -347,12 +347,12 @@ C - uses sub board with support for player 3 and 4 controls
/**********************************************************************/ /**********************************************************************/
WRITE8_MEMBER(namcos1_state::audiocpu_irq_ack_w) void namcos1_state::audiocpu_irq_ack_w(u8 data)
{ {
m_audiocpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE); m_audiocpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
} }
WRITE8_MEMBER(namcos1_state::mcu_irq_ack_w) void namcos1_state::mcu_irq_ack_w(u8 data)
{ {
m_mcu->set_input_line(HD6301_IRQ_LINE, CLEAR_LINE); m_mcu->set_input_line(HD6301_IRQ_LINE, CLEAR_LINE);
} }
@ -372,14 +372,14 @@ READ8_MEMBER(namcos1_state::dsw_r)
return 0xf0 | bitswap<4>(m_dsw_sel->output_r(space, 0), 0, 1, 2, 3); return 0xf0 | bitswap<4>(m_dsw_sel->output_r(space, 0), 0, 1, 2, 3);
} }
WRITE8_MEMBER(namcos1_state::coin_w) void namcos1_state::coin_w(u8 data)
{ {
machine().bookkeeping().coin_lockout_global_w(BIT(~data, 0)); machine().bookkeeping().coin_lockout_global_w(BIT(~data, 0));
machine().bookkeeping().coin_counter_w(0, BIT(data, 1)); machine().bookkeeping().coin_counter_w(0, BIT(data, 1));
machine().bookkeeping().coin_counter_w(1, BIT(data, 2)); machine().bookkeeping().coin_counter_w(1, BIT(data, 2));
} }
WRITE8_MEMBER(namcos1_state::dac_gain_w) void namcos1_state::dac_gain_w(u8 data)
{ {
/* DAC0 (GAIN0 = bit0, GAIN1 = bit2) */ /* DAC0 (GAIN0 = bit0, GAIN1 = bit2) */
int dac0_gain = (BIT(data, 2) << 1) | BIT(data, 0); int dac0_gain = (BIT(data, 2) << 1) | BIT(data, 0);

View File

@ -33,6 +33,9 @@ public:
m_rom(*this, "user1"), m_rom(*this, "user1"),
m_soundbank(*this, "soundbank"), m_soundbank(*this, "soundbank"),
m_mcubank(*this, "mcubank"), m_mcubank(*this, "mcubank"),
m_io_in(*this, "IN%u", 0U),
m_io_control(*this, "CONTROL%u", 0U),
m_io_paddle(*this, "PADDLE%u", 0U),
m_io_dipsw(*this, "DIPSW"), m_io_dipsw(*this, "DIPSW"),
m_dsw_sel(*this, "dsw_sel") m_dsw_sel(*this, "dsw_sel")
{ } { }
@ -63,6 +66,12 @@ public:
void init_dspirit(); void init_dspirit();
void init_pistoldm(); void init_pistoldm();
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void driver_init() override;
private: private:
required_device<mc6809e_device> m_maincpu; required_device<mc6809e_device> m_maincpu;
required_device<mc6809e_device> m_subcpu; required_device<mc6809e_device> m_subcpu;
@ -74,13 +83,16 @@ private:
required_device_array<dac_8bit_r2r_device, 2> m_dac; required_device_array<dac_8bit_r2r_device, 2> m_dac;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint8_t> m_spriteram; required_shared_ptr<u8> m_spriteram;
required_shared_ptr<uint8_t> m_triram; required_shared_ptr<u8> m_triram;
required_region_ptr<uint8_t> m_rom; required_region_ptr<u8> m_rom;
required_memory_bank m_soundbank; required_memory_bank m_soundbank;
required_memory_bank m_mcubank; required_memory_bank m_mcubank;
optional_ioport_array<4> m_io_in;
optional_ioport_array<2> m_io_control;
optional_ioport_array<2> m_io_paddle;
required_ioport m_io_dipsw; required_ioport m_io_dipsw;
required_device<ls157_device> m_dsw_sel; required_device<ls157_device> m_dsw_sel;
@ -91,51 +103,50 @@ private:
int m_key_swap4; int m_key_swap4;
int m_key_bottom4; int m_key_bottom4;
int m_key_top4; int m_key_top4;
unsigned int m_key_quotient; u32 m_key_quotient;
unsigned int m_key_reminder; u32 m_key_reminder;
unsigned int m_key_numerator_high_word; u32 m_key_numerator_high_word;
uint8_t m_key[8]; u8 m_key[8];
int m_mcu_patch_data; int m_mcu_patch_data;
int m_reset; int m_reset;
int m_input_count; int m_input_count;
int m_strobe; int m_strobe;
int m_strobe_count; int m_strobe_count;
int m_stored_input[2]; int m_stored_input[2];
int m_copy_sprites; bool m_copy_sprites;
uint8_t m_drawmode_table[16]; u8 m_drawmode_table[16];
DECLARE_WRITE_LINE_MEMBER(subres_w); DECLARE_WRITE_LINE_MEMBER(subres_w);
DECLARE_WRITE8_MEMBER(audiocpu_irq_ack_w); void audiocpu_irq_ack_w(u8 data);
DECLARE_WRITE8_MEMBER(mcu_irq_ack_w); void mcu_irq_ack_w(u8 data);
DECLARE_READ8_MEMBER(dsw_r); DECLARE_READ8_MEMBER(dsw_r);
DECLARE_WRITE8_MEMBER(coin_w); void coin_w(u8 data);
DECLARE_WRITE8_MEMBER(dac_gain_w); void dac_gain_w(u8 data);
DECLARE_WRITE8_MEMBER(sound_bankswitch_w); void sound_bankswitch_w(u8 data);
DECLARE_WRITE8_MEMBER(mcu_bankswitch_w); void mcu_bankswitch_w(u8 data);
DECLARE_WRITE8_MEMBER(mcu_patch_w); void mcu_patch_w(u8 data);
DECLARE_READ8_MEMBER(quester_paddle_r); u8 quester_paddle_r(offs_t offset);
DECLARE_READ8_MEMBER(berabohm_buttons_r); u8 berabohm_buttons_r(offs_t offset);
DECLARE_READ8_MEMBER(faceoff_inputs_r); u8 faceoff_inputs_r(offs_t offset);
DECLARE_WRITE8_MEMBER(spriteram_w); void spriteram_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(_3dcs_w); void _3dcs_w(offs_t offset, u8 data);
DECLARE_READ8_MEMBER(no_key_r); u8 no_key_r(offs_t offset);
DECLARE_WRITE8_MEMBER(no_key_w); void no_key_w(offs_t offset, u8 data);
DECLARE_READ8_MEMBER(key_type1_r); u8 key_type1_r(offs_t offset);
DECLARE_WRITE8_MEMBER(key_type1_w); void key_type1_w(offs_t offset, u8 data);
DECLARE_READ8_MEMBER(key_type2_r); u8 key_type2_r(offs_t offset);
DECLARE_WRITE8_MEMBER(key_type2_w); void key_type2_w(offs_t offset, u8 data);
DECLARE_READ8_MEMBER(key_type3_r); u8 key_type3_r(offs_t offset);
DECLARE_WRITE8_MEMBER(key_type3_w); void key_type3_w(offs_t offset, u8 data);
virtual void machine_start() override; void key_type_1_init(int key_id);
virtual void machine_reset() override; void key_type_2_init(int key_id);
virtual void video_start() override; void key_type_3_init(int key_id, int reg, int rng, int swap4_arg, int swap4, int bottom4, int top4);
void driver_init() override;
void TilemapCB(uint16_t code, int *tile, int *mask); void TilemapCB(u16 code, int *tile, int *mask);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank); DECLARE_WRITE_LINE_MEMBER(screen_vblank);
void main_map(address_map &map); void main_map(address_map &map);

View File

@ -10,20 +10,20 @@
* * * *
*******************************************************************************/ *******************************************************************************/
WRITE8_MEMBER( namcos1_state::_3dcs_w ) void namcos1_state::_3dcs_w(offs_t offset, u8 data)
{ {
if (offset & 1) popmessage("LEFT"); if (offset & 1) popmessage("LEFT");
else popmessage("RIGHT"); else popmessage("RIGHT");
} }
READ8_MEMBER( namcos1_state::no_key_r ) u8 namcos1_state::no_key_r(offs_t offset)
{ {
popmessage("%s: keychip read %04x\n", m_mcu->tag(), m_mcu->pc(), offset); popmessage("%s: keychip read %04x\n", m_mcu->tag(), m_mcu->pc(), offset);
return 0; return 0;
} }
WRITE8_MEMBER( namcos1_state::no_key_w ) void namcos1_state::no_key_w(offs_t offset, u8 data)
{ {
popmessage("%s: keychip write %04x=%02x\n", m_mcu->tag(), m_mcu->pc(), offset, data); popmessage("%s: keychip write %04x=%02x\n", m_mcu->tag(), m_mcu->pc(), offset, data);
} }
@ -128,7 +128,7 @@ puzlclub:
CPU #0 PC e017: keychip write 0003=35 [they probably used RAM instead of a key chip for this prototype] CPU #0 PC e017: keychip write 0003=35 [they probably used RAM instead of a key chip for this prototype]
CPU #0 PC e3d4: keychip read 0003 [AND #$37 = key no.] CPU #0 PC e3d4: keychip read 0003 [AND #$37 = key no.]
*/ */
READ8_MEMBER( namcos1_state::key_type1_r ) u8 namcos1_state::key_type1_r(offs_t offset)
{ {
// logerror("%s: keychip read %04x\n", machine().describe_context(), offset); // logerror("%s: keychip read %04x\n", machine().describe_context(), offset);
@ -159,7 +159,7 @@ READ8_MEMBER( namcos1_state::key_type1_r )
return 0; return 0;
} }
WRITE8_MEMBER( namcos1_state::key_type1_w ) void namcos1_state::key_type1_w(offs_t offset, u8 data)
{ {
// logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data); // logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data);
@ -311,7 +311,7 @@ CPU #0 PC e574: keychip read 0001
*/ */
READ8_MEMBER( namcos1_state::key_type2_r ) u8 namcos1_state::key_type2_r(offs_t offset)
{ {
// logerror("%s: keychip read %04x\n", machine().describe_context(), offset); // logerror("%s: keychip read %04x\n", machine().describe_context(), offset);
@ -330,7 +330,7 @@ READ8_MEMBER( namcos1_state::key_type2_r )
return 0; return 0;
} }
WRITE8_MEMBER( namcos1_state::key_type2_w ) void namcos1_state::key_type2_w(offs_t offset, u8 data)
{ {
// logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data); // logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data);
@ -340,8 +340,8 @@ WRITE8_MEMBER( namcos1_state::key_type2_w )
if (offset == 3) if (offset == 3)
{ {
unsigned int d = (m_key[0] << 8) | m_key[1]; u32 d = (m_key[0] << 8) | m_key[1];
unsigned int n = (m_key_numerator_high_word << 16) | (m_key[2] << 8) | m_key[3]; u32 n = (m_key_numerator_high_word << 16) | (m_key[2] << 8) | m_key[3];
if (d) if (d)
{ {
@ -437,7 +437,7 @@ CPU #0 PC ca96: keychip read 0043 [0x30 | (ARG & 0x0f)]
CPU #0 PC e45a: keychip read 0030 [discarded] CPU #0 PC e45a: keychip read 0030 [discarded]
*/ */
READ8_MEMBER( namcos1_state::key_type3_r ) u8 namcos1_state::key_type3_r(offs_t offset)
{ {
// logerror("%s: keychip read %04x\n", machine().describe_context(), offset); // logerror("%s: keychip read %04x\n", machine().describe_context(), offset);
@ -447,7 +447,7 @@ READ8_MEMBER( namcos1_state::key_type3_r )
The schematics don't show A11 being used, so I go for this handling. The schematics don't show A11 being used, so I go for this handling.
*/ */
int op = (offset & 0x70) >> 4; const int op = (offset & 0x70) >> 4;
if (op == m_key_reg) return m_key_id; if (op == m_key_reg) return m_key_id;
if (op == m_key_rng) return machine().rand(); if (op == m_key_rng) return machine().rand();
@ -461,7 +461,7 @@ READ8_MEMBER( namcos1_state::key_type3_r )
return 0; return 0;
} }
WRITE8_MEMBER( namcos1_state::key_type3_w ) void namcos1_state::key_type3_w(offs_t offset, u8 data)
{ {
// logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data); // logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data);
@ -476,7 +476,7 @@ WRITE8_MEMBER( namcos1_state::key_type3_w )
* * * *
*******************************************************************************/ *******************************************************************************/
WRITE8_MEMBER(namcos1_state::sound_bankswitch_w) void namcos1_state::sound_bankswitch_w(u8 data)
{ {
m_soundbank->set_entry((data & 0x70) >> 4); m_soundbank->set_entry((data & 0x70) >> 4);
} }
@ -545,7 +545,7 @@ void namcos1_state::machine_reset()
*******************************************************************************/ *******************************************************************************/
/* mcu banked rom area select */ /* mcu banked rom area select */
WRITE8_MEMBER(namcos1_state::mcu_bankswitch_w) void namcos1_state::mcu_bankswitch_w(u8 data)
{ {
int bank; int bank;
@ -581,7 +581,7 @@ WRITE8_MEMBER(namcos1_state::mcu_bankswitch_w)
/* I found set $A6 only initialize in MCU */ /* I found set $A6 only initialize in MCU */
/* This patch kill write this data by MCU case $A6 to xx(clear) */ /* This patch kill write this data by MCU case $A6 to xx(clear) */
WRITE8_MEMBER(namcos1_state::mcu_patch_w) void namcos1_state::mcu_patch_w(u8 data)
{ {
//logerror("mcu C000 write %s data=%02x\n",machine().describe_context(),data); //logerror("mcu C000 write %s data=%02x\n",machine().describe_context(),data);
if (m_mcu_patch_data == 0xa6) return; if (m_mcu_patch_data == 0xa6) return;
@ -603,14 +603,14 @@ void namcos1_state::driver_init()
{ {
if ((i & 0x010000) == 0) if ((i & 0x010000) == 0)
{ {
uint8_t t = m_rom[i]; u8 t = m_rom[i];
m_rom[i] = m_rom[i + 0x010000]; m_rom[i] = m_rom[i + 0x010000];
m_rom[i + 0x010000] = t; m_rom[i + 0x010000] = t;
} }
} }
// kludge! see notes // kludge! see notes
m_mcu->space(AS_PROGRAM).install_write_handler(0xc000, 0xc000, write8_delegate(FUNC(namcos1_state::mcu_patch_w), this)); m_mcu->space(AS_PROGRAM).install_write_handler(0xc000, 0xc000, write8smo_delegate(FUNC(namcos1_state::mcu_patch_w), this));
// these are overridden as needed in the specific DRIVER_INIT_MEMBERs // these are overridden as needed in the specific DRIVER_INIT_MEMBERs
m_key_id = 0; m_key_id = 0;
@ -622,6 +622,38 @@ void namcos1_state::driver_init()
m_key_top4 = 0; m_key_top4 = 0;
} }
void namcos1_state::key_type_1_init(int key_id)
{
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
read8sm_delegate(FUNC(namcos1_state::key_type1_r),this),
write8sm_delegate(FUNC(namcos1_state::key_type1_w),this));
m_key_id = key_id;
}
void namcos1_state::key_type_2_init(int key_id)
{
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
read8sm_delegate(FUNC(namcos1_state::key_type2_r),this),
write8sm_delegate(FUNC(namcos1_state::key_type2_w),this));
m_key_id = key_id;
save_item(NAME(m_key_quotient));
save_item(NAME(m_key_reminder));
save_item(NAME(m_key_numerator_high_word));
}
void namcos1_state::key_type_3_init(int key_id, int reg, int rng, int swap4_arg, int swap4, int bottom4, int top4)
{
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
read8sm_delegate(FUNC(namcos1_state::key_type3_r),this),
write8sm_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = key_id;
m_key_reg = reg;
m_key_rng = rng;
m_key_swap4_arg = swap4_arg;
m_key_swap4 = swap4;
m_key_bottom4 = bottom4;
m_key_top4 = top4;
}
/******************************************************************************* /*******************************************************************************
* Shadowland / Youkai Douchuuki specific * * Shadowland / Youkai Douchuuki specific *
@ -637,10 +669,7 @@ void namcos1_state::init_shadowld()
void namcos1_state::init_dspirit() void namcos1_state::init_dspirit()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_1_init(0x36);
read8_delegate(FUNC(namcos1_state::key_type1_r),this),
write8_delegate(FUNC(namcos1_state::key_type1_w),this));
m_key_id = 0x36;
} }
/******************************************************************************* /*******************************************************************************
@ -649,10 +678,7 @@ void namcos1_state::init_dspirit()
void namcos1_state::init_wldcourt() void namcos1_state::init_wldcourt()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_1_init(0x35);
read8_delegate(FUNC(namcos1_state::key_type1_r),this),
write8_delegate(FUNC(namcos1_state::key_type1_w),this));
m_key_id = 0x35;
} }
/******************************************************************************* /*******************************************************************************
@ -661,10 +687,7 @@ void namcos1_state::init_wldcourt()
void namcos1_state::init_blazer() void namcos1_state::init_blazer()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_1_init(0x13);
read8_delegate(FUNC(namcos1_state::key_type1_r),this),
write8_delegate(FUNC(namcos1_state::key_type1_w),this));
m_key_id = 0x13;
} }
/******************************************************************************* /*******************************************************************************
@ -673,10 +696,7 @@ void namcos1_state::init_blazer()
void namcos1_state::init_puzlclub() void namcos1_state::init_puzlclub()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_1_init(0x35);
read8_delegate(FUNC(namcos1_state::key_type1_r),this),
write8_delegate(FUNC(namcos1_state::key_type1_w),this));
m_key_id = 0x35;
} }
/******************************************************************************* /*******************************************************************************
@ -685,13 +705,7 @@ void namcos1_state::init_puzlclub()
void namcos1_state::init_pacmania() void namcos1_state::init_pacmania()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_2_init(0x12);
read8_delegate(FUNC(namcos1_state::key_type2_r),this),
write8_delegate(FUNC(namcos1_state::key_type2_w),this));
m_key_id = 0x12;
save_item(NAME(m_key_quotient));
save_item(NAME(m_key_reminder));
save_item(NAME(m_key_numerator_high_word));
} }
/******************************************************************************* /*******************************************************************************
@ -700,13 +714,7 @@ void namcos1_state::init_pacmania()
void namcos1_state::init_alice() void namcos1_state::init_alice()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_2_init(0x25);
read8_delegate(FUNC(namcos1_state::key_type2_r),this),
write8_delegate(FUNC(namcos1_state::key_type2_w),this));
m_key_id = 0x25;
save_item(NAME(m_key_quotient));
save_item(NAME(m_key_reminder));
save_item(NAME(m_key_numerator_high_word));
} }
/******************************************************************************* /*******************************************************************************
@ -715,13 +723,7 @@ void namcos1_state::init_alice()
void namcos1_state::init_galaga88() void namcos1_state::init_galaga88()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_2_init(0x31);
read8_delegate(FUNC(namcos1_state::key_type2_r),this),
write8_delegate(FUNC(namcos1_state::key_type2_w),this));
m_key_id = 0x31;
save_item(NAME(m_key_quotient));
save_item(NAME(m_key_reminder));
save_item(NAME(m_key_numerator_high_word));
} }
/******************************************************************************* /*******************************************************************************
@ -730,13 +732,7 @@ void namcos1_state::init_galaga88()
void namcos1_state::init_ws() void namcos1_state::init_ws()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_2_init(0x07);
read8_delegate(FUNC(namcos1_state::key_type2_r),this),
write8_delegate(FUNC(namcos1_state::key_type2_w),this));
m_key_id = 0x07;
save_item(NAME(m_key_quotient));
save_item(NAME(m_key_reminder));
save_item(NAME(m_key_numerator_high_word));
} }
/******************************************************************************* /*******************************************************************************
@ -745,13 +741,7 @@ void namcos1_state::init_ws()
void namcos1_state::init_bakutotu() void namcos1_state::init_bakutotu()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_2_init(0x22);
read8_delegate(FUNC(namcos1_state::key_type2_r),this),
write8_delegate(FUNC(namcos1_state::key_type2_w),this));
m_key_id = 0x22;
save_item(NAME(m_key_quotient));
save_item(NAME(m_key_reminder));
save_item(NAME(m_key_numerator_high_word));
} }
/******************************************************************************* /*******************************************************************************
@ -760,16 +750,7 @@ void namcos1_state::init_bakutotu()
void namcos1_state::init_splatter() void namcos1_state::init_splatter()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(181, 3, 4, -1, -1, -1, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 181;
m_key_reg = 3;
m_key_rng = 4;
m_key_swap4_arg = -1;
m_key_swap4 = -1;
m_key_bottom4 = -1;
m_key_top4 = -1;
} }
/******************************************************************************* /*******************************************************************************
@ -778,16 +759,7 @@ void namcos1_state::init_splatter()
void namcos1_state::init_rompers() void namcos1_state::init_rompers()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(182, 7, -1, -1, -1, -1, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 182;
m_key_reg = 7;
m_key_rng = -1;
m_key_swap4_arg = -1;
m_key_swap4 = -1;
m_key_bottom4 = -1;
m_key_top4 = -1;
} }
/******************************************************************************* /*******************************************************************************
@ -796,16 +768,7 @@ void namcos1_state::init_rompers()
void namcos1_state::init_blastoff() void namcos1_state::init_blastoff()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(183, 0, 7, 3, 5, -1, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 183;
m_key_reg = 0;
m_key_rng = 7;
m_key_swap4_arg = 3;
m_key_swap4 = 5;
m_key_bottom4 = -1;
m_key_top4 = -1;
} }
/******************************************************************************* /*******************************************************************************
@ -814,16 +777,7 @@ void namcos1_state::init_blastoff()
void namcos1_state::init_ws89() void namcos1_state::init_ws89()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(184, 2, -1, -1, -1, -1, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 184;
m_key_reg = 2;
m_key_rng = -1;
m_key_swap4_arg = -1;
m_key_swap4 = -1;
m_key_bottom4 = -1;
m_key_top4 = -1;
} }
/******************************************************************************* /*******************************************************************************
@ -832,16 +786,7 @@ void namcos1_state::init_ws89()
void namcos1_state::init_tankfrce() void namcos1_state::init_tankfrce()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(185, 5, -1, 1, -1, 2, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 185;
m_key_reg = 5;
m_key_rng = -1;
m_key_swap4_arg = 1;
m_key_swap4 = -1;
m_key_bottom4 = 2;
m_key_top4 = -1;
} }
void namcos1_state::init_tankfrc4() void namcos1_state::init_tankfrc4()
@ -853,7 +798,7 @@ void namcos1_state::init_tankfrc4()
m_stored_input[0] = 0; m_stored_input[0] = 0;
m_stored_input[1] = 0; m_stored_input[1] = 0;
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::faceoff_inputs_r), this)); m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
save_item(NAME(m_input_count)); save_item(NAME(m_input_count));
save_item(NAME(m_stored_input)); save_item(NAME(m_stored_input));
} }
@ -864,16 +809,7 @@ void namcos1_state::init_tankfrc4()
void namcos1_state::init_dangseed() void namcos1_state::init_dangseed()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(308, 6, -1, 5, -1, 0, 4);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 308;
m_key_reg = 6;
m_key_rng = -1;
m_key_swap4_arg = 5;
m_key_swap4 = -1;
m_key_bottom4 = 0;
m_key_top4 = 4;
} }
/******************************************************************************* /*******************************************************************************
@ -882,16 +818,7 @@ void namcos1_state::init_dangseed()
void namcos1_state::init_pistoldm() void namcos1_state::init_pistoldm()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(309, 1, 2, 0, -1, 4, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 309;
m_key_reg = 1;
m_key_rng = 2;
m_key_swap4_arg = 0;
m_key_swap4 = -1;
m_key_bottom4 = 4;
m_key_top4 = -1;
} }
/******************************************************************************* /*******************************************************************************
@ -900,16 +827,7 @@ void namcos1_state::init_pistoldm()
void namcos1_state::init_ws90() void namcos1_state::init_ws90()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(310, 4, -1, 7, -1, 3, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 310;
m_key_reg = 4;
m_key_rng = -1;
m_key_swap4_arg = 7;
m_key_swap4 = -1;
m_key_bottom4 = 3;
m_key_top4 = -1;
} }
/******************************************************************************* /*******************************************************************************
@ -918,16 +836,7 @@ void namcos1_state::init_ws90()
void namcos1_state::init_soukobdx() void namcos1_state::init_soukobdx()
{ {
driver_init(); driver_init();
m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff, key_type_3_init(311, 2, 3 /*?*/, 0, -1, 4, -1);
read8_delegate(FUNC(namcos1_state::key_type3_r),this),
write8_delegate(FUNC(namcos1_state::key_type3_w),this));
m_key_id = 311;
m_key_reg = 2;
m_key_rng = 3; /*?*/
m_key_swap4_arg = 0;
m_key_swap4 = -1;
m_key_bottom4 = 4;
m_key_top4 = -1;
} }
@ -935,16 +844,16 @@ void namcos1_state::init_soukobdx()
/******************************************************************************* /*******************************************************************************
* Quester specific * * Quester specific *
*******************************************************************************/ *******************************************************************************/
READ8_MEMBER( namcos1_state::quester_paddle_r ) u8 namcos1_state::quester_paddle_r(offs_t offset)
{ {
if (offset == 0) if (offset == 0)
{ {
int ret; int ret;
if (!(m_strobe & 0x20)) if (!(m_strobe & 0x20))
ret = (ioport("CONTROL0")->read()&0x90) | (m_strobe & 0x40) | (ioport("PADDLE0")->read()&0x0f); ret = (m_io_control[0]->read()&0x90) | (m_strobe & 0x40) | (m_io_paddle[0]->read()&0x0f);
else else
ret = (ioport("CONTROL0")->read()&0x90) | (m_strobe & 0x40) | (ioport("PADDLE1")->read()&0x0f); ret = (m_io_control[0]->read()&0x90) | (m_strobe & 0x40) | (m_io_paddle[1]->read()&0x0f);
m_strobe ^= 0x40; m_strobe ^= 0x40;
@ -955,9 +864,9 @@ READ8_MEMBER( namcos1_state::quester_paddle_r )
int ret; int ret;
if (!(m_strobe & 0x20)) if (!(m_strobe & 0x20))
ret = (ioport("CONTROL1")->read()&0x90) | 0x00 | (ioport("PADDLE0")->read()>>4); ret = (m_io_control[1]->read()&0x90) | 0x00 | (m_io_paddle[0]->read()>>4);
else else
ret = (ioport("CONTROL1")->read()&0x90) | 0x20 | (ioport("PADDLE1")->read()>>4); ret = (m_io_control[1]->read()&0x90) | 0x20 | (m_io_paddle[1]->read()>>4);
if (!(m_strobe & 0x40)) m_strobe ^= 0x20; if (!(m_strobe & 0x40)) m_strobe ^= 0x20;
@ -969,7 +878,7 @@ void namcos1_state::init_quester()
{ {
m_strobe = 0; m_strobe = 0;
driver_init(); driver_init();
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::quester_paddle_r), this)); m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::quester_paddle_r), this));
save_item(NAME(m_strobe)); save_item(NAME(m_strobe));
} }
@ -979,7 +888,7 @@ void namcos1_state::init_quester()
* Beraboh Man specific * * Beraboh Man specific *
*******************************************************************************/ *******************************************************************************/
READ8_MEMBER( namcos1_state::berabohm_buttons_r ) u8 namcos1_state::berabohm_buttons_r(offs_t offset)
{ {
int res; int res;
@ -987,16 +896,13 @@ READ8_MEMBER( namcos1_state::berabohm_buttons_r )
{ {
int inp = m_input_count; int inp = m_input_count;
if (inp == 4) res = ioport("CONTROL0")->read(); if (inp == 4) res = m_io_control[0]->read();
else else
{ {
char portname[40];
#ifdef PRESSURE_SENSITIVE #ifdef PRESSURE_SENSITIVE
static int counter[4]; static int counter[4];
sprintf(portname,"IN%d",inp); /* IN0-IN3 */ res = m_io_in[inp]->read(); /* IN0-IN3 */
res = ioport(portname)->read();
if (res & 0x80) if (res & 0x80)
{ {
if (counter[inp] >= 0) if (counter[inp] >= 0)
@ -1019,8 +925,7 @@ READ8_MEMBER( namcos1_state::berabohm_buttons_r )
else else
counter[inp] = -1; counter[inp] = -1;
#else #else
sprintf(portname,"IN%d",inp); /* IN0-IN3 */ res = m_io_in[inp]->read(); /* IN0-IN3 */
res = ioport(portname)->read();
if (res & 1) res = 0x7f; /* weak */ if (res & 1) res = 0x7f; /* weak */
else if (res & 2) res = 0x48; /* medium */ else if (res & 2) res = 0x48; /* medium */
else if (res & 4) res = 0x40; /* strong */ else if (res & 4) res = 0x40; /* strong */
@ -1031,7 +936,7 @@ READ8_MEMBER( namcos1_state::berabohm_buttons_r )
} }
else else
{ {
res = ioport("CONTROL1")->read() & 0x8f; res = m_io_control[1]->read() & 0x8f;
/* the strobe cannot happen too often, otherwise the MCU will waste too /* the strobe cannot happen too often, otherwise the MCU will waste too
much time reading the inputs and won't have enough cycles to play two much time reading the inputs and won't have enough cycles to play two
@ -1059,7 +964,7 @@ void namcos1_state::init_berabohm()
m_strobe = 0; m_strobe = 0;
m_strobe_count = 0; m_strobe_count = 0;
driver_init(); driver_init();
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::berabohm_buttons_r), this)); m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::berabohm_buttons_r), this));
save_item(NAME(m_input_count)); save_item(NAME(m_input_count));
save_item(NAME(m_strobe)); save_item(NAME(m_strobe));
save_item(NAME(m_strobe_count)); save_item(NAME(m_strobe_count));
@ -1073,19 +978,19 @@ void namcos1_state::init_berabohm()
// used by faceoff and tankforce 4 player (input multiplex) // used by faceoff and tankforce 4 player (input multiplex)
READ8_MEMBER( namcos1_state::faceoff_inputs_r ) u8 namcos1_state::faceoff_inputs_r(offs_t offset)
{ {
int res; int res;
if (offset == 0) if (offset == 0)
{ {
res = (ioport("CONTROL0")->read() & 0x80) | m_stored_input[0]; res = (m_io_control[0]->read() & 0x80) | m_stored_input[0];
return res; return res;
} }
else else
{ {
res = ioport("CONTROL1")->read() & 0x80; res = m_io_control[1]->read() & 0x80;
/* the strobe cannot happen too often, otherwise the MCU will waste too /* the strobe cannot happen too often, otherwise the MCU will waste too
much time reading the inputs and won't have enough cycles to play two much time reading the inputs and won't have enough cycles to play two
@ -1100,17 +1005,17 @@ READ8_MEMBER( namcos1_state::faceoff_inputs_r )
switch (m_input_count) switch (m_input_count)
{ {
case 0: case 0:
m_stored_input[0] = ioport("IN0")->read() & 0x1f; m_stored_input[0] = m_io_in[0]->read() & 0x1f;
m_stored_input[1] = (ioport("IN3")->read() & 0x07) << 3; m_stored_input[1] = (m_io_in[3]->read() & 0x07) << 3;
break; break;
case 3: case 3:
m_stored_input[0] = ioport("IN2")->read() & 0x1f; m_stored_input[0] = m_io_in[2]->read() & 0x1f;
break; break;
case 4: case 4:
m_stored_input[0] = ioport("IN1")->read() & 0x1f; m_stored_input[0] = m_io_in[1]->read() & 0x1f;
m_stored_input[1] = ioport("IN3")->read() & 0x18; m_stored_input[1] = m_io_in[3]->read() & 0x18;
break; break;
default: default:
@ -1138,7 +1043,7 @@ void namcos1_state::init_faceoff()
m_stored_input[1] = 0; m_stored_input[1] = 0;
driver_init(); driver_init();
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::faceoff_inputs_r), this)); m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
save_item(NAME(m_input_count)); save_item(NAME(m_input_count));
save_item(NAME(m_stored_input)); save_item(NAME(m_stored_input));
} }

View File

@ -53,7 +53,7 @@ Namco System 1 Video Hardware
***************************************************************************/ ***************************************************************************/
void namcos1_state::TilemapCB(uint16_t code, int *tile, int *mask) void namcos1_state::TilemapCB(u16 code, int *tile, int *mask)
{ {
code &= 0x3fff; code &= 0x3fff;
*tile = code; *tile = code;
@ -82,7 +82,7 @@ void namcos1_state::video_start()
for (i = 0x0800;i < 0x1000;i++) for (i = 0x0800;i < 0x1000;i++)
m_c116->shadow_table()[i] = i + 0x0800; m_c116->shadow_table()[i] = i + 0x0800;
m_copy_sprites = 0; m_copy_sprites = false;
save_item(NAME(m_copy_sprites)); save_item(NAME(m_copy_sprites));
} }
@ -95,7 +95,7 @@ void namcos1_state::video_start()
***************************************************************************/ ***************************************************************************/
WRITE8_MEMBER( namcos1_state::spriteram_w ) void namcos1_state::spriteram_w(offs_t offset, u8 data)
{ {
/* 0000-07ff work ram */ /* 0000-07ff work ram */
/* 0800-0fff sprite ram */ /* 0800-0fff sprite ram */
@ -103,7 +103,7 @@ WRITE8_MEMBER( namcos1_state::spriteram_w )
/* a write to this offset tells the sprite chip to buffer the sprite list */ /* a write to this offset tells the sprite chip to buffer the sprite list */
if (offset == 0x0ff2) if (offset == 0x0ff2)
m_copy_sprites = 1; m_copy_sprites = true;
} }
@ -136,32 +136,32 @@ sprite format:
void namcos1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) void namcos1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
uint8_t *spriteram = m_spriteram + 0x800; u8 *spriteram = m_spriteram + 0x800;
const uint8_t *source = &spriteram[0x800-0x20]; /* the last is NOT a sprite */ const u8 *source = &spriteram[0x800-0x20]; /* the last is NOT a sprite */
const uint8_t *finish = &spriteram[0]; const u8 *finish = &spriteram[0];
gfx_element *gfx = m_gfxdecode->gfx(0); gfx_element *gfx = m_gfxdecode->gfx(0);
int sprite_xoffs = spriteram[0x07f5] + ((spriteram[0x07f4] & 1) << 8); const int sprite_xoffs = spriteram[0x07f5] + ((spriteram[0x07f4] & 1) << 8);
int sprite_yoffs = spriteram[0x07f7]; const int sprite_yoffs = spriteram[0x07f7];
while (source >= finish) while (source >= finish)
{ {
static const int sprite_size[4] = { 16, 8, 32, 4 }; static const int sprite_size[4] = { 16, 8, 32, 4 };
int attr1 = source[10]; const u8 attr1 = source[10];
int attr2 = source[14]; const u8 attr2 = source[14];
int color = source[12]; u32 color = source[12];
int flipx = (attr1 & 0x20) >> 5; int flipx = (attr1 & 0x20) >> 5;
int flipy = (attr2 & 0x01); int flipy = (attr2 & 0x01);
int sizex = sprite_size[(attr1 & 0xc0) >> 6]; const u16 sizex = sprite_size[(attr1 & 0xc0) >> 6];
int sizey = sprite_size[(attr2 & 0x06) >> 1]; const u16 sizey = sprite_size[(attr2 & 0x06) >> 1];
int tx = (attr1 & 0x18) & (~(sizex-1)); const u16 tx = (attr1 & 0x18) & (~(sizex - 1));
int ty = (attr2 & 0x18) & (~(sizey-1)); const u16 ty = (attr2 & 0x18) & (~(sizey - 1));
int sx = source[13] + ((color & 0x01) << 8); int sx = source[13] + ((color & 0x01) << 8);
int sy = -source[15] - sizey; int sy = -source[15] - sizey;
int sprite = source[11]; u32 sprite = source[11];
int sprite_bank = attr1 & 7; const u32 sprite_bank = attr1 & 7;
int priority = (source[14] & 0xe0) >> 5; const int priority = (source[14] & 0xe0) >> 5;
int pri_mask = (0xff << (priority + 1)) & 0xff; const u8 pri_mask = (0xff << (priority + 1)) & 0xff;
sprite += sprite_bank * 256; sprite += sprite_bank * 256;
color = color >> 1; color = color >> 1;
@ -205,7 +205,7 @@ void namcos1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
uint32_t namcos1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) u32 namcos1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
int i; int i;
rectangle new_clip = cliprect; rectangle new_clip = cliprect;
@ -252,16 +252,15 @@ WRITE_LINE_MEMBER(namcos1_state::screen_vblank)
{ {
if (m_copy_sprites) if (m_copy_sprites)
{ {
uint8_t *spriteram = m_spriteram + 0x800; u8 *spriteram = m_spriteram + 0x800;
int i,j;
for (i = 0;i < 0x800;i += 16) for (int i = 0; i < 0x800; i += 16)
{ {
for (j = 10;j < 16;j++) for (int j = 10; j < 16; j++)
spriteram[i+j] = spriteram[i+j - 6]; spriteram[i + j] = spriteram[i + j - 6];
} }
m_copy_sprites = 0; m_copy_sprites = false;
} }
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE); m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
m_subcpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE); m_subcpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);