converted namcos1 to use delegates instead of _space_func and modernized all remaining functions (nw)

This commit is contained in:
Miodrag Milanovic 2014-03-28 07:29:28 +00:00
parent 39007a7d58
commit 1293e42d7c
4 changed files with 328 additions and 302 deletions

View File

@ -380,19 +380,17 @@ WRITE8_MEMBER(namcos1_state::namcos1_coin_w)
coin_counter_w(machine(), 1,data & 4);
}
static void namcos1_update_DACs(running_machine &machine)
void namcos1_state::namcos1_update_DACs()
{
namcos1_state *state = machine.driver_data<namcos1_state>();
state->m_dac->write_signed16(0x8000 + (state->m_dac0_value * state->m_dac0_gain) + (state->m_dac1_value * state->m_dac1_gain));
m_dac->write_signed16(0x8000 + (m_dac0_value * m_dac0_gain) + (m_dac1_value * m_dac1_gain));
}
void namcos1_init_DACs(running_machine &machine)
void namcos1_state::namcos1_init_DACs()
{
namcos1_state *state = machine.driver_data<namcos1_state>();
state->m_dac0_value = 0;
state->m_dac1_value = 0;
state->m_dac0_gain=0x80;
state->m_dac1_gain=0x80;
m_dac0_value = 0;
m_dac1_value = 0;
m_dac0_gain=0x80;
m_dac1_gain=0x80;
}
WRITE8_MEMBER(namcos1_state::namcos1_dac_gain_w)
@ -407,19 +405,19 @@ WRITE8_MEMBER(namcos1_state::namcos1_dac_gain_w)
value = (data >> 3) & 3; /* GAIN2,GAIN3 */
m_dac1_gain = 0x20 * (value+1);
namcos1_update_DACs(machine());
namcos1_update_DACs();
}
WRITE8_MEMBER(namcos1_state::namcos1_dac0_w)
{
m_dac0_value = data - 0x80; /* shift zero point */
namcos1_update_DACs(machine());
namcos1_update_DACs();
}
WRITE8_MEMBER(namcos1_state::namcos1_dac1_w)
{
m_dac1_value = data - 0x80; /* shift zero point */
namcos1_update_DACs(machine());
namcos1_update_DACs();
}

View File

@ -6,8 +6,8 @@
/* Bank handler definitions */
struct bankhandler
{
read8_space_func bank_handler_r;
write8_space_func bank_handler_w;
read8_delegate bank_handler_r;
write8_delegate bank_handler_w;
int bank_offset;
UINT8 *bank_pointer;
};
@ -116,23 +116,84 @@ public:
TILE_GET_INFO_MEMBER(fg_get_info5);
virtual void machine_reset();
virtual void video_start();
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_namcos1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_eof_namcos1(screen_device &screen, bool state);
void namcos1_update_DACs();
void namcos1_init_DACs();
DECLARE_READ8_MEMBER( namcos1_videoram_r );
DECLARE_WRITE8_MEMBER( namcos1_videoram_w );
DECLARE_WRITE8_MEMBER( namcos1_paletteram_w );
DECLARE_READ8_MEMBER( namcos1_spriteram_r );
DECLARE_WRITE8_MEMBER( namcos1_spriteram_w );
inline UINT8 bank_r(address_space &space, offs_t offset, int bank);
READ8_MEMBER( bank1_r );
READ8_MEMBER( bank2_r );
READ8_MEMBER( bank3_r );
READ8_MEMBER( bank4_r );
READ8_MEMBER( bank5_r );
READ8_MEMBER( bank6_r );
READ8_MEMBER( bank7_r );
READ8_MEMBER( bank8_r );
READ8_MEMBER( bank9_r );
READ8_MEMBER( bank10_r );
READ8_MEMBER( bank11_r );
READ8_MEMBER( bank12_r );
READ8_MEMBER( bank13_r );
READ8_MEMBER( bank14_r );
READ8_MEMBER( bank15_r );
READ8_MEMBER( bank16_r );
inline void bank_w(address_space &space, offs_t offset, UINT8 data, int bank);
WRITE8_MEMBER( bank1_w );
WRITE8_MEMBER( bank2_w );
WRITE8_MEMBER( bank3_w );
WRITE8_MEMBER( bank4_w );
WRITE8_MEMBER( bank5_w );
WRITE8_MEMBER( bank6_w );
WRITE8_MEMBER( bank7_w );
WRITE8_MEMBER( bank8_w );
WRITE8_MEMBER( bank9_w );
WRITE8_MEMBER( bank10_w );
WRITE8_MEMBER( bank11_w );
WRITE8_MEMBER( bank12_w );
WRITE8_MEMBER( bank13_w );
WRITE8_MEMBER( bank14_w );
WRITE8_MEMBER( bank15_w );
WRITE8_MEMBER( bank16_w );
WRITE8_MEMBER( namcos1_3dcs_w );
READ8_MEMBER( no_key_r );
WRITE8_MEMBER( no_key_w );
READ8_MEMBER( key_type1_r );
WRITE8_MEMBER( key_type1_w );
READ8_MEMBER( key_type2_r );
WRITE8_MEMBER( key_type2_w );
READ8_MEMBER( key_type3_r );
WRITE8_MEMBER( key_type3_w );
READ8_MEMBER( soundram_r );
WRITE8_MEMBER( soundram_w );
WRITE8_MEMBER( rom_w );
READ8_MEMBER( unknown_r );
WRITE8_MEMBER( unknown_w );
void set_bank(int banknum, const bankhandler *handler);
void namcos1_bankswitch(int cpu, offs_t offset, UINT8 data);
void namcos1_install_bank(int start,int end,read8_delegate hr,write8_delegate hw,int offset,UINT8 *pointer);
void namcos1_build_banks(read8_delegate key_r,write8_delegate key_w);
struct namcos1_specific
{
/* keychip */
read8_delegate key_r;
write8_delegate key_w;
int key_id;
int key_reg1;
int key_reg2;
int key_reg3;
int key_reg4;
int key_reg5;
int key_reg6;
};
void namcos1_driver_init(const struct namcos1_specific *specific );
private:
inline void bg_get_info(tile_data &tileinfo,int tile_index,UINT8 *info_vram);
inline void fg_get_info(tile_data &tileinfo,int tile_index,UINT8 *info_vram);
};
/*----------- defined in drivers/namcos1.c -----------*/
void namcos1_init_DACs(running_machine &machine);
/*----------- defined in video/namcos1.c -----------*/
DECLARE_READ8_HANDLER( namcos1_videoram_r );
DECLARE_WRITE8_HANDLER( namcos1_videoram_w );
DECLARE_WRITE8_HANDLER( namcos1_paletteram_w );
DECLARE_READ8_HANDLER( namcos1_spriteram_r );
DECLARE_WRITE8_HANDLER( namcos1_spriteram_w );

View File

@ -11,84 +11,65 @@
/* hardware elements of 1Mbytes physical memory space */
INLINE UINT8 bank_r(address_space &space, offs_t offset, int bank)
UINT8 namcos1_state::bank_r(address_space &space, offs_t offset, int bank)
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
return (*state->m_active_bank[bank].bank_handler_r )(space, offset + state->m_active_bank[bank].bank_offset, 0xff);
return m_active_bank[bank].bank_handler_r(space, offset + m_active_bank[bank].bank_offset, 0xff);
}
static READ8_HANDLER( bank1_r ) { return bank_r(space, offset, 0); }
static READ8_HANDLER( bank2_r ) { return bank_r(space, offset, 1); }
static READ8_HANDLER( bank3_r ) { return bank_r(space, offset, 2); }
static READ8_HANDLER( bank4_r ) { return bank_r(space, offset, 3); }
static READ8_HANDLER( bank5_r ) { return bank_r(space, offset, 4); }
static READ8_HANDLER( bank6_r ) { return bank_r(space, offset, 5); }
static READ8_HANDLER( bank7_r ) { return bank_r(space, offset, 6); }
static READ8_HANDLER( bank8_r ) { return bank_r(space, offset, 7); }
static READ8_HANDLER( bank9_r ) { return bank_r(space, offset, 8); }
static READ8_HANDLER( bank10_r ) { return bank_r(space, offset, 9); }
static READ8_HANDLER( bank11_r ) { return bank_r(space, offset, 10); }
static READ8_HANDLER( bank12_r ) { return bank_r(space, offset, 11); }
static READ8_HANDLER( bank13_r ) { return bank_r(space, offset, 12); }
static READ8_HANDLER( bank14_r ) { return bank_r(space, offset, 13); }
static READ8_HANDLER( bank15_r ) { return bank_r(space, offset, 14); }
static READ8_HANDLER( bank16_r ) { return bank_r(space, offset, 15); }
READ8_MEMBER( namcos1_state::bank1_r ) { return bank_r(space, offset, 0); }
READ8_MEMBER( namcos1_state::bank2_r ) { return bank_r(space, offset, 1); }
READ8_MEMBER( namcos1_state::bank3_r ) { return bank_r(space, offset, 2); }
READ8_MEMBER( namcos1_state::bank4_r ) { return bank_r(space, offset, 3); }
READ8_MEMBER( namcos1_state::bank5_r ) { return bank_r(space, offset, 4); }
READ8_MEMBER( namcos1_state::bank6_r ) { return bank_r(space, offset, 5); }
READ8_MEMBER( namcos1_state::bank7_r ) { return bank_r(space, offset, 6); }
READ8_MEMBER( namcos1_state::bank8_r ) { return bank_r(space, offset, 7); }
READ8_MEMBER( namcos1_state::bank9_r ) { return bank_r(space, offset, 8); }
READ8_MEMBER( namcos1_state::bank10_r ) { return bank_r(space, offset, 9); }
READ8_MEMBER( namcos1_state::bank11_r ) { return bank_r(space, offset, 10); }
READ8_MEMBER( namcos1_state::bank12_r ) { return bank_r(space, offset, 11); }
READ8_MEMBER( namcos1_state::bank13_r ) { return bank_r(space, offset, 12); }
READ8_MEMBER( namcos1_state::bank14_r ) { return bank_r(space, offset, 13); }
READ8_MEMBER( namcos1_state::bank15_r ) { return bank_r(space, offset, 14); }
READ8_MEMBER( namcos1_state::bank16_r ) { return bank_r(space, offset, 15); }
INLINE void bank_w(address_space &space, offs_t offset, UINT8 data, int bank)
void namcos1_state::bank_w(address_space &space, offs_t offset, UINT8 data, int bank)
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
(*state->m_active_bank[bank].bank_handler_w )(space, offset + state->m_active_bank[bank].bank_offset, data, 0xff);
m_active_bank[bank].bank_handler_w(space, offset + m_active_bank[bank].bank_offset, data, 0xff);
}
static WRITE8_HANDLER( bank1_w ) { bank_w(space, offset, data, 0); }
static WRITE8_HANDLER( bank2_w ) { bank_w(space, offset, data, 1); }
static WRITE8_HANDLER( bank3_w ) { bank_w(space, offset, data, 2); }
static WRITE8_HANDLER( bank4_w ) { bank_w(space, offset, data, 3); }
static WRITE8_HANDLER( bank5_w ) { bank_w(space, offset, data, 4); }
static WRITE8_HANDLER( bank6_w ) { bank_w(space, offset, data, 5); }
static WRITE8_HANDLER( bank7_w ) { bank_w(space, offset, data, 6); }
static WRITE8_HANDLER( bank8_w ) { bank_w(space, offset, data, 7); }
static WRITE8_HANDLER( bank9_w ) { bank_w(space, offset, data, 8); }
static WRITE8_HANDLER( bank10_w ) { bank_w(space, offset, data, 9); }
static WRITE8_HANDLER( bank11_w ) { bank_w(space, offset, data, 10); }
static WRITE8_HANDLER( bank12_w ) { bank_w(space, offset, data, 11); }
static WRITE8_HANDLER( bank13_w ) { bank_w(space, offset, data, 12); }
static WRITE8_HANDLER( bank14_w ) { bank_w(space, offset, data, 13); }
static WRITE8_HANDLER( bank15_w ) { bank_w(space, offset, data, 14); }
static WRITE8_HANDLER( bank16_w ) { bank_w(space, offset, data, 15); }
WRITE8_MEMBER( namcos1_state::bank1_w ) { bank_w(space, offset, data, 0); }
WRITE8_MEMBER( namcos1_state::bank2_w ) { bank_w(space, offset, data, 1); }
WRITE8_MEMBER( namcos1_state::bank3_w ) { bank_w(space, offset, data, 2); }
WRITE8_MEMBER( namcos1_state::bank4_w ) { bank_w(space, offset, data, 3); }
WRITE8_MEMBER( namcos1_state::bank5_w ) { bank_w(space, offset, data, 4); }
WRITE8_MEMBER( namcos1_state::bank6_w ) { bank_w(space, offset, data, 5); }
WRITE8_MEMBER( namcos1_state::bank7_w ) { bank_w(space, offset, data, 6); }
WRITE8_MEMBER( namcos1_state::bank8_w ) { bank_w(space, offset, data, 7); }
WRITE8_MEMBER( namcos1_state::bank9_w ) { bank_w(space, offset, data, 8); }
WRITE8_MEMBER( namcos1_state::bank10_w ) { bank_w(space, offset, data, 9); }
WRITE8_MEMBER( namcos1_state::bank11_w ) { bank_w(space, offset, data, 10); }
WRITE8_MEMBER( namcos1_state::bank12_w ) { bank_w(space, offset, data, 11); }
WRITE8_MEMBER( namcos1_state::bank13_w ) { bank_w(space, offset, data, 12); }
WRITE8_MEMBER( namcos1_state::bank14_w ) { bank_w(space, offset, data, 13); }
WRITE8_MEMBER( namcos1_state::bank15_w ) { bank_w(space, offset, data, 14); }
WRITE8_MEMBER( namcos1_state::bank16_w ) { bank_w(space, offset, data, 15); }
static const struct { read8_space_func func; const char *name; } io_bank_handler_r[16] =
{
{ FUNC(bank1_r) }, { FUNC(bank2_r) }, { FUNC(bank3_r) }, { FUNC(bank4_r) },
{ FUNC(bank5_r) }, { FUNC(bank6_r) }, { FUNC(bank7_r) }, { FUNC(bank8_r) },
{ FUNC(bank9_r) }, { FUNC(bank10_r) }, { FUNC(bank11_r) }, { FUNC(bank12_r) },
{ FUNC(bank13_r) }, { FUNC(bank14_r) }, { FUNC(bank15_r) }, { FUNC(bank16_r) }
};
static const struct { write8_space_func func; const char *name; } io_bank_handler_w[16] =
{
{ FUNC(bank1_w) }, { FUNC(bank2_w) }, { FUNC(bank3_w) }, { FUNC(bank4_w) },
{ FUNC(bank5_w) }, { FUNC(bank6_w) }, { FUNC(bank7_w) }, { FUNC(bank8_w) },
{ FUNC(bank9_w) }, { FUNC(bank10_w) }, { FUNC(bank11_w) }, { FUNC(bank12_w) },
{ FUNC(bank13_w) }, { FUNC(bank14_w) }, { FUNC(bank15_w) }, { FUNC(bank16_w) }
};
static WRITE8_HANDLER( namcos1_3dcs_w )
WRITE8_MEMBER( namcos1_state::namcos1_3dcs_w )
{
if (offset & 1) popmessage("LEFT");
else popmessage("RIGHT");
}
static READ8_HANDLER( no_key_r )
READ8_MEMBER( namcos1_state::no_key_r )
{
popmessage("CPU %s PC %08x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset);
return 0;
}
static WRITE8_HANDLER( no_key_w )
WRITE8_MEMBER( namcos1_state::no_key_w )
{
popmessage("CPU %s PC %08x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data);
}
@ -193,15 +174,14 @@ puzlclub:
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.]
*/
static READ8_HANDLER( key_type1_r )
READ8_MEMBER( namcos1_state::key_type1_r )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset);
if (offset < 3)
{
int d = state->m_key[0];
int n = (state->m_key[1] << 8) | state->m_key[2];
int d = m_key[0];
int n = (m_key[1] << 8) | m_key[2];
int q,r;
if (d)
@ -220,18 +200,17 @@ static READ8_HANDLER( key_type1_r )
if (offset == 2) return q & 0xff;
}
else if (offset == 3)
return state->m_key_id;
return m_key_id;
return 0;
}
static WRITE8_HANDLER( key_type1_w )
WRITE8_MEMBER( namcos1_state::key_type1_w )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data);
if (offset < 4)
state->m_key[offset] = data;
m_key[offset] = data;
}
@ -378,54 +357,52 @@ CPU #0 PC e574: keychip read 0001
*/
static READ8_HANDLER( key_type2_r )
READ8_MEMBER( namcos1_state::key_type2_r )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset);
state->m_key_numerator_high_word = 0;
m_key_numerator_high_word = 0;
if (offset < 4)
{
if (offset == 0) return state->m_key_reminder >> 8;
if (offset == 1) return state->m_key_reminder & 0xff;
if (offset == 2) return state->m_key_quotient >> 8;
if (offset == 3) return state->m_key_quotient & 0xff;
if (offset == 0) return m_key_reminder >> 8;
if (offset == 1) return m_key_reminder & 0xff;
if (offset == 2) return m_key_quotient >> 8;
if (offset == 3) return m_key_quotient & 0xff;
}
else if (offset == 4)
return state->m_key_id;
return m_key_id;
return 0;
}
static WRITE8_HANDLER( key_type2_w )
WRITE8_MEMBER( namcos1_state::key_type2_w )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data);
if (offset < 5)
{
state->m_key[offset] = data;
m_key[offset] = data;
if (offset == 3)
{
unsigned int d = (state->m_key[0] << 8) | state->m_key[1];
unsigned int n = (state->m_key_numerator_high_word << 16) | (state->m_key[2] << 8) | state->m_key[3];
unsigned int d = (m_key[0] << 8) | m_key[1];
unsigned int n = (m_key_numerator_high_word << 16) | (m_key[2] << 8) | m_key[3];
if (d)
{
state->m_key_quotient = n / d;
state->m_key_reminder = n % d;
m_key_quotient = n / d;
m_key_reminder = n % d;
}
else
{
state->m_key_quotient = 0xffff;
state->m_key_reminder = 0x0000;
m_key_quotient = 0xffff;
m_key_reminder = 0x0000;
}
// logerror("calculating division: %08x / %04x = %04x, %04x\n", n, d, key_quotient, state->m_key_reminder);
// logerror("calculating division: %08x / %04x = %04x, %04x\n", n, d, key_quotient, m_key_reminder);
state->m_key_numerator_high_word = (state->m_key[2] << 8) | state->m_key[3];
m_key_numerator_high_word = (m_key[2] << 8) | m_key[3];
}
}
}
@ -506,9 +483,8 @@ CPU #0 PC ca96: keychip read 0043 [0x30 | (ARG & 0x0f)]
CPU #0 PC e45a: keychip read 0030 [discarded]
*/
static READ8_HANDLER( key_type3_r )
READ8_MEMBER( namcos1_state::key_type3_r )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
int op;
// logerror("CPU %s PC %04x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset);
@ -521,23 +497,22 @@ static READ8_HANDLER( key_type3_r )
op = (offset & 0x70) >> 4;
if (op == state->m_key_reg) return state->m_key_id;
if (op == state->m_key_rng) return space.machine().rand();
if (op == state->m_key_swap4) return (state->m_key[state->m_key_swap4_arg] << 4) | (state->m_key[state->m_key_swap4_arg] >> 4);
if (op == state->m_key_bottom4) return (offset << 4) | (state->m_key[state->m_key_swap4_arg] & 0x0f);
if (op == state->m_key_top4) return (offset << 4) | (state->m_key[state->m_key_swap4_arg] >> 4);
if (op == m_key_reg) return m_key_id;
if (op == m_key_rng) return machine().rand();
if (op == m_key_swap4) return (m_key[m_key_swap4_arg] << 4) | (m_key[m_key_swap4_arg] >> 4);
if (op == m_key_bottom4) return (offset << 4) | (m_key[m_key_swap4_arg] & 0x0f);
if (op == m_key_top4) return (offset << 4) | (m_key[m_key_swap4_arg] >> 4);
popmessage("CPU %s PC %08x: keychip read %04x", space.device().tag(), space.device().safe_pc(), offset);
return 0;
}
static WRITE8_HANDLER( key_type3_w )
WRITE8_MEMBER( namcos1_state::key_type3_w )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data);
state->m_key[(offset & 0x70) >> 4] = data;
m_key[(offset & 0x70) >> 4] = data;
}
@ -599,141 +574,156 @@ WRITE8_MEMBER(namcos1_state::namcos1_watchdog_w)
static READ8_HANDLER( soundram_r )
READ8_MEMBER( namcos1_state::soundram_r )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
if (offset < 0x1000)
{
offset &= 0x3ff;
/* CUS 30 */
return space.machine().device<namco_cus30_device>("namco")->namcos1_cus30_r(space,offset);
return machine().device<namco_cus30_device>("namco")->namcos1_cus30_r(space,offset);
}
else
{
offset &= 0x7ff;
/* shared ram */
return state->m_triram[offset];
return m_triram[offset];
}
}
static WRITE8_HANDLER( soundram_w )
WRITE8_MEMBER( namcos1_state::soundram_w )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
if (offset < 0x1000)
{
offset &= 0x3ff;
/* CUS 30 */
space.machine().device<namco_cus30_device>("namco")->namcos1_cus30_w(space,offset,data);
machine().device<namco_cus30_device>("namco")->namcos1_cus30_w(space,offset,data);
}
else
{
offset &= 0x7ff;
/* shared ram */
state->m_triram[offset] = data;
m_triram[offset] = data;
return;
}
}
/* ROM handlers */
static WRITE8_HANDLER( rom_w )
WRITE8_MEMBER( namcos1_state::rom_w )
{
logerror("CPU %s PC %04x: warning - write %02x to rom address %04x\n", space.device().tag(), space.device().safe_pc(), data, offset);
}
/* error handlers */
static READ8_HANDLER( unknown_r )
READ8_MEMBER( namcos1_state::unknown_r )
{
logerror("CPU %s PC %04x: warning - read from unknown chip\n", space.device().tag(), space.device().safe_pc() );
// popmessage("CPU %s PC %04x: read from unknown chip", space.device().tag(), space.device().safe_pc() );
return 0;
}
static WRITE8_HANDLER( unknown_w )
WRITE8_MEMBER( namcos1_state::unknown_w )
{
logerror("CPU %s PC %04x: warning - wrote to unknown chip\n", space.device().tag(), space.device().safe_pc() );
// popmessage("CPU %s PC %04x: wrote to unknown chip", space.device().tag(), space.device().safe_pc() );
}
/* Main bankswitching routine */
static void set_bank(running_machine &machine, int banknum, const bankhandler *handler)
void namcos1_state::set_bank(int banknum, const bankhandler *handler)
{
namcos1_state *state = machine.driver_data<namcos1_state>();
static const char *const banktags[] = {
"bank1", "bank2", "bank3", "bank4", "bank5", "bank6", "bank7", "bank8",
"bank9", "bank10", "bank11", "bank12", "bank13", "bank14", "bank15", "bank16"
};
static const struct { read8_delegate func; } io_bank_handler_r[16] =
{
{ read8_delegate(FUNC(namcos1_state::bank1_r),this) }, { read8_delegate(FUNC(namcos1_state::bank2_r),this) }, { read8_delegate(FUNC(namcos1_state::bank3_r),this) }, { read8_delegate(FUNC(namcos1_state::bank4_r),this) },
{ read8_delegate(FUNC(namcos1_state::bank5_r),this) }, { read8_delegate(FUNC(namcos1_state::bank6_r),this) }, { read8_delegate(FUNC(namcos1_state::bank7_r),this) }, { read8_delegate(FUNC(namcos1_state::bank8_r),this) },
{ read8_delegate(FUNC(namcos1_state::bank9_r),this) }, { read8_delegate(FUNC(namcos1_state::bank10_r),this) }, { read8_delegate(FUNC(namcos1_state::bank11_r),this) }, { read8_delegate(FUNC(namcos1_state::bank12_r),this) },
{ read8_delegate(FUNC(namcos1_state::bank13_r),this) }, { read8_delegate(FUNC(namcos1_state::bank14_r),this) }, { read8_delegate(FUNC(namcos1_state::bank15_r),this) }, { read8_delegate(FUNC(namcos1_state::bank16_r),this) }
};
static const struct { write8_delegate func; } io_bank_handler_w[16] =
{
{ write8_delegate(FUNC(namcos1_state::bank1_w),this) }, { write8_delegate(FUNC(namcos1_state::bank2_w),this) }, { write8_delegate(FUNC(namcos1_state::bank3_w),this) }, { write8_delegate(FUNC(namcos1_state::bank4_w),this) },
{ write8_delegate(FUNC(namcos1_state::bank5_w),this) }, { write8_delegate(FUNC(namcos1_state::bank6_w),this) }, { write8_delegate(FUNC(namcos1_state::bank7_w),this) }, { write8_delegate(FUNC(namcos1_state::bank8_w),this) },
{ write8_delegate(FUNC(namcos1_state::bank9_w),this) }, { write8_delegate(FUNC(namcos1_state::bank10_w),this) }, { write8_delegate(FUNC(namcos1_state::bank11_w),this) }, { write8_delegate(FUNC(namcos1_state::bank12_w),this) },
{ write8_delegate(FUNC(namcos1_state::bank13_w),this) }, { write8_delegate(FUNC(namcos1_state::bank14_w),this) }, { write8_delegate(FUNC(namcos1_state::bank15_w),this) }, { write8_delegate(FUNC(namcos1_state::bank16_w),this) }
};
static const char *const cputags[] = { "maincpu", "sub" };
address_space &space = machine.device(cputags[(banknum >> 3) & 1])->memory().space(AS_PROGRAM);
address_space &space = machine().device(cputags[(banknum >> 3) & 1])->memory().space(AS_PROGRAM);
int bankstart = (banknum & 7) * 0x2000;
/* for BANK handlers , memory direct and OP-code base */
if (handler->bank_pointer)
state->membank(banktags[banknum])->set_base(handler->bank_pointer);
membank(banktags[banknum])->set_base(handler->bank_pointer);
/* read handlers */
if (!handler->bank_handler_r)
if (handler->bank_handler_r.isnull())
{
if (state->m_active_bank[banknum].bank_handler_r)
if (!m_active_bank[banknum].bank_handler_r.isnull())
space.install_read_bank(bankstart, bankstart + 0x1fff, banktags[banknum]);
}
else
{
if (!state->m_active_bank[banknum].bank_handler_r)
space.install_legacy_read_handler(bankstart, bankstart + 0x1fff, io_bank_handler_r[banknum].func, io_bank_handler_r[banknum].name);
if (m_active_bank[banknum].bank_handler_r.isnull())
space.install_read_handler(bankstart, bankstart + 0x1fff, io_bank_handler_r[banknum].func);
}
/* write handlers (except for the 0xe000-0xffff range) */
if (bankstart != 0xe000)
{
if (!handler->bank_handler_w)
if (handler->bank_handler_w.isnull())
{
if (state->m_active_bank[banknum].bank_handler_w)
if (!m_active_bank[banknum].bank_handler_w.isnull())
space.install_write_bank(bankstart, bankstart + 0x1fff, banktags[banknum]);
}
else
{
if (!state->m_active_bank[banknum].bank_handler_r)
space.install_legacy_write_handler(bankstart, bankstart + 0x1fff, io_bank_handler_w[banknum].func, io_bank_handler_w[banknum].name);
if (m_active_bank[banknum].bank_handler_r.isnull())
space.install_write_handler(bankstart, bankstart + 0x1fff, io_bank_handler_w[banknum].func);
}
}
/* Remember this bank handler */
state->m_active_bank[banknum] = *handler;
m_active_bank[banknum] = *handler;
}
static void namcos1_bankswitch(running_machine &machine, int cpu, offs_t offset, UINT8 data)
void namcos1_state::namcos1_bankswitch(int cpu, offs_t offset, UINT8 data)
{
namcos1_state *state = machine.driver_data<namcos1_state>();
int bank = (cpu*8) + (( offset >> 9) & 0x07);
int old = state->m_chip[bank];
int old = m_chip[bank];
if (offset & 1)
{
state->m_chip[bank] &= 0x0300;
state->m_chip[bank] |= (data & 0xff);
m_chip[bank] &= 0x0300;
m_chip[bank] |= (data & 0xff);
}
else
{
state->m_chip[bank] &= 0x00ff;
state->m_chip[bank] |= (data & 0x03) << 8;
m_chip[bank] &= 0x00ff;
m_chip[bank] |= (data & 0x03) << 8;
}
/* set_bank is slow, so only call it if uninitialized(unmapped) or changed */
if (state->m_active_bank[bank].bank_handler_r == unknown_r || state->m_chip[bank] != old)
set_bank(machine, bank, &state->m_bank_element[state->m_chip[bank]]);
if (m_active_bank[bank].bank_handler_r == read8_delegate(FUNC(namcos1_state::unknown_r),this) || m_chip[bank] != old)
set_bank(bank, &m_bank_element[m_chip[bank]]);
/* unmapped bank warning */
if( state->m_active_bank[bank].bank_handler_r == unknown_r)
if( m_active_bank[bank].bank_handler_r == read8_delegate(FUNC(namcos1_state::unknown_r),this))
{
logerror("%s:warning unknown chip selected bank %x=$%04x\n", machine.describe_context(), bank , state->m_chip[bank] );
// if (state->m_chip) popmessage("%s:unknown chip selected bank %x=$%04x", cpu , machine.describe_context(), bank , state->m_chip[bank] );
logerror("%s:warning unknown chip selected bank %x=$%04x\n", machine().describe_context(), bank , m_chip[bank] );
// if (m_chip) popmessage("%s:unknown chip selected bank %x=$%04x", cpu , machine.describe_context(), bank , m_chip[bank] );
}
}
@ -741,7 +731,7 @@ WRITE8_MEMBER(namcos1_state::namcos1_bankswitch_w)
{
// logerror("cpu %s: namcos1_bankswitch_w offset %04x data %02x\n", device().tag(), offset, data);
namcos1_bankswitch(machine(), (&space.device() == m_maincpu) ? 0 : 1, offset, data);
namcos1_bankswitch((&space.device() == m_maincpu) ? 0 : 1, offset, data);
}
/* Sub cpu set start bank port */
@ -750,8 +740,8 @@ WRITE8_MEMBER(namcos1_state::namcos1_subcpu_bank_w)
// logerror("namcos1_subcpu_bank_w offset %04x data %02x\n",offset,data);
/* Prepare code for CPU 1 */
namcos1_bankswitch( machine(), 1, 0x0e00, 0x03 );
namcos1_bankswitch( machine(), 1, 0x0e01, data );
namcos1_bankswitch( 1, 0x0e00, 0x03 );
namcos1_bankswitch( 1, 0x0e01, data );
}
/*******************************************************************************
@ -760,16 +750,15 @@ WRITE8_MEMBER(namcos1_state::namcos1_subcpu_bank_w)
* *
*******************************************************************************/
static void namcos1_install_bank(namcos1_state *state, int start,int end,read8_space_func hr,write8_space_func hw,
int offset,UINT8 *pointer)
void namcos1_state::namcos1_install_bank(int start,int end,read8_delegate hr,write8_delegate hw, int offset,UINT8 *pointer)
{
int i;
for(i=start;i<=end;i++)
{
state->m_bank_element[i].bank_handler_r = hr;
state->m_bank_element[i].bank_handler_w = hw;
state->m_bank_element[i].bank_offset = offset;
state->m_bank_element[i].bank_pointer = pointer;
m_bank_element[i].bank_handler_r = hr;
m_bank_element[i].bank_handler_w = hw;
m_bank_element[i].bank_offset = offset;
m_bank_element[i].bank_pointer = pointer;
offset += 0x2000;
if(pointer) pointer += 0x2000;
}
@ -777,13 +766,12 @@ static void namcos1_install_bank(namcos1_state *state, int start,int end,read8_s
static void namcos1_build_banks(running_machine &machine,read8_space_func key_r,write8_space_func key_w)
void namcos1_state::namcos1_build_banks(read8_delegate key_r,write8_delegate key_w)
{
namcos1_state *state = machine.driver_data<namcos1_state>();
int i;
/**** kludge alert ****/
UINT8 *dummyrom = auto_alloc_array(machine, UINT8, 0x2000);
UINT8 *dummyrom = auto_alloc_array(machine(), UINT8, 0x2000);
/* when the games want to reset because the test switch has been flipped (or
because the protection checks failed!) they just set the top bits of bank #7
@ -803,30 +791,30 @@ static void namcos1_build_banks(running_machine &machine,read8_space_func key_r,
/* clear all banks to unknown area */
for(i = 0;i < NAMCOS1_MAX_BANK;i++)
namcos1_install_bank(state,i,i,0,unknown_w,0,dummyrom);
namcos1_install_bank(i,i,read8_delegate(),write8_delegate(FUNC(namcos1_state::unknown_w),this),0,dummyrom);
/**** end of kludge alert ****/
/* 3D glasses */
namcos1_install_bank(state,0x160,0x160,0,namcos1_3dcs_w,0,0);
namcos1_install_bank(0x160,0x160,read8_delegate(),write8_delegate(FUNC(namcos1_state::namcos1_3dcs_w),this),0,0);
/* RAM 6 banks - palette */
namcos1_install_bank(state,0x170,0x173,0,namcos1_paletteram_w,0,state->m_paletteram);
namcos1_install_bank(0x170,0x173,read8_delegate(),write8_delegate(FUNC(namcos1_state::namcos1_paletteram_w),this),0,m_paletteram);
/* RAM 5 banks - videoram */
namcos1_install_bank(state,0x178,0x17b,namcos1_videoram_r,namcos1_videoram_w,0,0);
namcos1_install_bank(0x178,0x17b,read8_delegate(FUNC(namcos1_state::namcos1_videoram_r),this),write8_delegate(FUNC(namcos1_state::namcos1_videoram_w),this),0,0);
/* key chip bank */
namcos1_install_bank(state,0x17c,0x17c,key_r,key_w,0,0);
namcos1_install_bank(0x17c,0x17c,key_r,key_w,0,0);
/* RAM 7 banks - display control, playfields, sprites */
namcos1_install_bank(state,0x17e,0x17e,namcos1_spriteram_r,namcos1_spriteram_w,0,0);
namcos1_install_bank(0x17e,0x17e,read8_delegate(FUNC(namcos1_state::namcos1_spriteram_r),this),write8_delegate(FUNC(namcos1_state::namcos1_spriteram_w),this),0,0);
/* RAM 1 shared ram, PSG device */
namcos1_install_bank(state,0x17f,0x17f,soundram_r,soundram_w,0,0);
namcos1_install_bank(0x17f,0x17f,read8_delegate(FUNC(namcos1_state::soundram_r),this),write8_delegate(FUNC(namcos1_state::soundram_w),this),0,0);
/* RAM 3 banks */
namcos1_install_bank(state,0x180,0x183,0,0,0,state->m_s1ram);
namcos1_install_bank(0x180,0x183,read8_delegate(),write8_delegate(),0,m_s1ram);
/* PRG0-PRG7 */
{
UINT8 *rom = machine.root_device().memregion("user1")->base();
UINT8 *rom = machine().root_device().memregion("user1")->base();
namcos1_install_bank(state,0x200,0x3ff,0,rom_w,0,rom);
namcos1_install_bank(0x200,0x3ff,read8_delegate(),write8_delegate(FUNC(namcos1_state::rom_w),this),0,rom);
/* bit 16 of the address is inverted for PRG7 (and bits 17,18 just not connected) */
for (i = 0x380000;i < 0x400000;i++)
@ -843,30 +831,30 @@ static void namcos1_build_banks(running_machine &machine,read8_space_func key_r,
void namcos1_state::machine_reset()
{
static const bankhandler unknown_handler = { unknown_r, unknown_w, 0, NULL };
static const bankhandler unknown_handler = { read8_delegate(FUNC(namcos1_state::unknown_r),this), write8_delegate(FUNC(namcos1_state::unknown_w),this), 0, NULL };
int bank;
/* Point all of our bankhandlers to the error handlers */
for (bank = 0; bank < 2*8 ; bank++)
set_bank(machine(), bank, &unknown_handler);
set_bank(bank, &unknown_handler);
memset(m_chip, 0, sizeof(m_chip));
/* Default MMU setup for Cpu 0 */
namcos1_bankswitch(machine(), 0, 0x0000, 0x01 ); /* bank0 = 0x180(RAM) - evidence: wldcourt */
namcos1_bankswitch(machine(), 0, 0x0001, 0x80 );
namcos1_bankswitch(machine(), 0, 0x0200, 0x01 ); /* bank1 = 0x180(RAM) - evidence: berabohm */
namcos1_bankswitch(machine(), 0, 0x0201, 0x80 );
namcos1_bankswitch(0, 0x0000, 0x01 ); /* bank0 = 0x180(RAM) - evidence: wldcourt */
namcos1_bankswitch(0, 0x0001, 0x80 );
namcos1_bankswitch(0, 0x0200, 0x01 ); /* bank1 = 0x180(RAM) - evidence: berabohm */
namcos1_bankswitch(0, 0x0201, 0x80 );
namcos1_bankswitch(machine(), 0, 0x0e00, 0x03 ); /* bank7 = 0x3ff(PRG7) */
namcos1_bankswitch(machine(), 0, 0x0e01, 0xff );
namcos1_bankswitch(0, 0x0e00, 0x03 ); /* bank7 = 0x3ff(PRG7) */
namcos1_bankswitch(0, 0x0e01, 0xff );
/* Default MMU setup for Cpu 1 */
namcos1_bankswitch(machine(), 1, 0x0000, 0x01 ); /* bank0 = 0x180(RAM) - evidence: wldcourt */
namcos1_bankswitch(machine(), 1, 0x0001, 0x80 );
namcos1_bankswitch(1, 0x0000, 0x01 ); /* bank0 = 0x180(RAM) - evidence: wldcourt */
namcos1_bankswitch(1, 0x0001, 0x80 );
namcos1_bankswitch(machine(), 1, 0x0e00, 0x03); /* bank7 = 0x3ff(PRG7) */
namcos1_bankswitch(machine(), 1, 0x0e01, 0xff);
namcos1_bankswitch(1, 0x0e00, 0x03); /* bank7 = 0x3ff(PRG7) */
namcos1_bankswitch(1, 0x0e01, 0xff);
/* reset Cpu 0 and stop all other CPUs */
m_maincpu->reset();
@ -878,7 +866,7 @@ void namcos1_state::machine_reset()
m_mcu_patch_data = 0;
m_reset = 0;
namcos1_init_DACs(machine());
namcos1_init_DACs();
memset(m_key, 0, sizeof(m_key));
m_wdog = 0;
}
@ -949,56 +937,41 @@ WRITE8_MEMBER(namcos1_state::namcos1_mcu_patch_w)
* driver specific initialize routine *
* *
*******************************************************************************/
struct namcos1_specific
void namcos1_state::namcos1_driver_init(const struct namcos1_specific *specific )
{
/* keychip */
read8_space_func key_r;
write8_space_func key_w;
int key_id;
int key_reg1;
int key_reg2;
int key_reg3;
int key_reg4;
int key_reg5;
int key_reg6;
};
static void namcos1_driver_init( running_machine &machine, const struct namcos1_specific *specific )
{
namcos1_state *state = machine.driver_data<namcos1_state>();
static const struct namcos1_specific no_key =
{
no_key_r,no_key_w
read8_delegate(FUNC(namcos1_state::no_key_r),this), write8_delegate(FUNC(namcos1_state::no_key_w),this)
};
if (!specific) specific = &no_key;
/* keychip id */
state->m_key_id = specific->key_id;
m_key_id = specific->key_id;
/* for key type 3 */
state->m_key_reg = specific->key_reg1;
state->m_key_rng = specific->key_reg2;
state->m_key_swap4_arg = specific->key_reg3;
state->m_key_swap4 = specific->key_reg4;
state->m_key_bottom4 = specific->key_reg5;
state->m_key_top4 = specific->key_reg6;
m_key_reg = specific->key_reg1;
m_key_rng = specific->key_reg2;
m_key_swap4_arg = specific->key_reg3;
m_key_swap4 = specific->key_reg4;
m_key_bottom4 = specific->key_reg5;
m_key_top4 = specific->key_reg6;
/* S1 RAM pointer set */
state->m_s1ram = auto_alloc_array(machine, UINT8, 0x8000);
state->m_triram = auto_alloc_array(machine, UINT8, 0x800);
state->m_paletteram = auto_alloc_array(machine, UINT8, 0x8000);
m_s1ram = auto_alloc_array(machine(), UINT8, 0x8000);
m_triram = auto_alloc_array(machine(), UINT8, 0x800);
m_paletteram = auto_alloc_array(machine(), UINT8, 0x8000);
/* Register volatile user memory for save state */
state->save_pointer(NAME(state->m_s1ram), 0x8000);
state->save_pointer(NAME(state->m_triram), 0x800);
state->save_pointer(NAME(state->m_paletteram), 0x8000);
save_pointer(NAME(m_s1ram), 0x8000);
save_pointer(NAME(m_triram), 0x800);
save_pointer(NAME(m_paletteram), 0x8000);
/* Point mcu & sound shared RAM to destination */
state->membank("bank18")->set_base(state->m_triram );
state->membank("bank19")->set_base(state->m_triram );
membank("bank18")->set_base(m_triram );
membank("bank19")->set_base(m_triram );
/* build bank elements */
namcos1_build_banks(machine,specific->key_r,specific->key_w);
namcos1_build_banks(specific->key_r,specific->key_w);
}
@ -1007,7 +980,7 @@ static void namcos1_driver_init( running_machine &machine, const struct namcos1_
*******************************************************************************/
DRIVER_INIT_MEMBER(namcos1_state,shadowld)
{
namcos1_driver_init(machine(), NULL);
namcos1_driver_init(NULL);
}
/*******************************************************************************
@ -1017,9 +990,9 @@ DRIVER_INIT_MEMBER(namcos1_state,dspirit)
{
static const struct namcos1_specific dspirit_specific=
{
key_type1_r,key_type1_w, 0x36
read8_delegate(FUNC(namcos1_state::key_type1_r),this), write8_delegate(FUNC(namcos1_state::key_type1_w),this), 0x36
};
namcos1_driver_init(machine(), &dspirit_specific);
namcos1_driver_init(&dspirit_specific);
}
/*******************************************************************************
@ -1029,9 +1002,9 @@ DRIVER_INIT_MEMBER(namcos1_state,wldcourt)
{
static const struct namcos1_specific worldcourt_specific=
{
key_type1_r,key_type1_w, 0x35
read8_delegate(FUNC(namcos1_state::key_type1_r),this), write8_delegate(FUNC(namcos1_state::key_type1_w),this), 0x35
};
namcos1_driver_init(machine(), &worldcourt_specific);
namcos1_driver_init(&worldcourt_specific);
}
/*******************************************************************************
@ -1041,9 +1014,9 @@ DRIVER_INIT_MEMBER(namcos1_state,blazer)
{
static const struct namcos1_specific blazer_specific=
{
key_type1_r,key_type1_w, 0x13
read8_delegate(FUNC(namcos1_state::key_type1_r),this), write8_delegate(FUNC(namcos1_state::key_type1_w),this), 0x13
};
namcos1_driver_init(machine(), &blazer_specific);
namcos1_driver_init(&blazer_specific);
}
/*******************************************************************************
@ -1053,9 +1026,9 @@ DRIVER_INIT_MEMBER(namcos1_state,puzlclub)
{
static const struct namcos1_specific puzlclub_specific=
{
key_type1_r,key_type1_w, 0x35
read8_delegate(FUNC(namcos1_state::key_type1_r),this), write8_delegate(FUNC(namcos1_state::key_type1_w),this), 0x35
};
namcos1_driver_init(machine(), &puzlclub_specific);
namcos1_driver_init(&puzlclub_specific);
}
/*******************************************************************************
@ -1065,9 +1038,9 @@ DRIVER_INIT_MEMBER(namcos1_state,pacmania)
{
static const struct namcos1_specific pacmania_specific=
{
key_type2_r,key_type2_w, 0x12
read8_delegate(FUNC(namcos1_state::key_type2_r),this), write8_delegate(FUNC(namcos1_state::key_type2_w),this), 0x12
};
namcos1_driver_init(machine(), &pacmania_specific);
namcos1_driver_init(&pacmania_specific);
}
/*******************************************************************************
@ -1077,9 +1050,9 @@ DRIVER_INIT_MEMBER(namcos1_state,alice)
{
static const struct namcos1_specific alice_specific=
{
key_type2_r,key_type2_w, 0x25
read8_delegate(FUNC(namcos1_state::key_type2_r),this), write8_delegate(FUNC(namcos1_state::key_type2_w),this), 0x25
};
namcos1_driver_init(machine(), &alice_specific);
namcos1_driver_init(&alice_specific);
}
/*******************************************************************************
@ -1089,9 +1062,9 @@ DRIVER_INIT_MEMBER(namcos1_state,galaga88)
{
static const struct namcos1_specific galaga88_specific=
{
key_type2_r,key_type2_w, 0x31
read8_delegate(FUNC(namcos1_state::key_type2_r),this), write8_delegate(FUNC(namcos1_state::key_type2_w),this), 0x31
};
namcos1_driver_init(machine(), &galaga88_specific);
namcos1_driver_init(&galaga88_specific);
}
/*******************************************************************************
@ -1101,9 +1074,9 @@ DRIVER_INIT_MEMBER(namcos1_state,ws)
{
static const struct namcos1_specific ws_specific=
{
key_type2_r,key_type2_w, 0x07
read8_delegate(FUNC(namcos1_state::key_type2_r),this), write8_delegate(FUNC(namcos1_state::key_type2_w),this), 0x07
};
namcos1_driver_init(machine(), &ws_specific);
namcos1_driver_init(&ws_specific);
}
/*******************************************************************************
@ -1113,9 +1086,9 @@ DRIVER_INIT_MEMBER(namcos1_state,bakutotu)
{
static const struct namcos1_specific bakutotu_specific=
{
key_type2_r,key_type2_w, 0x22
read8_delegate(FUNC(namcos1_state::key_type2_r),this), write8_delegate(FUNC(namcos1_state::key_type2_w),this), 0x22
};
namcos1_driver_init(machine(), &bakutotu_specific);
namcos1_driver_init(&bakutotu_specific);
#if 0
// resolves CPU deadlocks caused by sloppy coding(see driver\namcos1.c)
@ -1150,10 +1123,10 @@ DRIVER_INIT_MEMBER(namcos1_state,splatter)
{
static const struct namcos1_specific splatter_specific=
{
key_type3_r,key_type3_w, 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), 181, 3, 4,-1,-1,-1,-1
};
namcos1_driver_init(machine(), &splatter_specific);
namcos1_driver_init(&splatter_specific);
}
/*******************************************************************************
@ -1163,9 +1136,9 @@ DRIVER_INIT_MEMBER(namcos1_state,rompers)
{
static const struct namcos1_specific rompers_specific=
{
key_type3_r,key_type3_w, 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), 182, 7,-1,-1,-1,-1,-1
};
namcos1_driver_init(machine(), &rompers_specific);
namcos1_driver_init(&rompers_specific);
}
/*******************************************************************************
@ -1175,9 +1148,9 @@ DRIVER_INIT_MEMBER(namcos1_state,blastoff)
{
static const struct namcos1_specific blastoff_specific=
{
key_type3_r,key_type3_w, 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), 183, 0, 7, 3, 5,-1,-1
};
namcos1_driver_init(machine(), &blastoff_specific);
namcos1_driver_init(&blastoff_specific);
}
/*******************************************************************************
@ -1187,9 +1160,9 @@ DRIVER_INIT_MEMBER(namcos1_state,ws89)
{
static const struct namcos1_specific ws89_specific=
{
key_type3_r,key_type3_w, 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), 184, 2,-1,-1,-1,-1,-1
};
namcos1_driver_init(machine(), &ws89_specific);
namcos1_driver_init(&ws89_specific);
}
/*******************************************************************************
@ -1199,9 +1172,9 @@ DRIVER_INIT_MEMBER(namcos1_state,tankfrce)
{
static const struct namcos1_specific tankfrce_specific=
{
key_type3_r,key_type3_w, 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), 185, 5,-1, 1,-1, 2,-1
};
namcos1_driver_init(machine(), &tankfrce_specific);
namcos1_driver_init(&tankfrce_specific);
}
@ -1210,9 +1183,9 @@ DRIVER_INIT_MEMBER(namcos1_state,tankfrc4)
{
static const struct namcos1_specific tankfrce_specific=
{
key_type3_r,key_type3_w, 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), 185, 5,-1, 1,-1, 2,-1
};
namcos1_driver_init(machine(), &tankfrce_specific);
namcos1_driver_init(&tankfrce_specific);
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
}
@ -1224,9 +1197,9 @@ DRIVER_INIT_MEMBER(namcos1_state,dangseed)
{
static const struct namcos1_specific dangseed_specific=
{
key_type3_r,key_type3_w, 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), 308, 6,-1, 5,-1, 0, 4
};
namcos1_driver_init(machine(), &dangseed_specific);
namcos1_driver_init(&dangseed_specific);
}
/*******************************************************************************
@ -1236,9 +1209,9 @@ DRIVER_INIT_MEMBER(namcos1_state,pistoldm)
{
static const struct namcos1_specific pistoldm_specific=
{
key_type3_r,key_type3_w, 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), 309, 1, 2, 0,-1, 4,-1
};
namcos1_driver_init(machine(), &pistoldm_specific);
namcos1_driver_init(&pistoldm_specific);
}
/*******************************************************************************
@ -1248,9 +1221,9 @@ DRIVER_INIT_MEMBER(namcos1_state,ws90)
{
static const struct namcos1_specific ws90_specific=
{
key_type3_r,key_type3_w, 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), 310, 4,-1, 7,-1, 3,-1
};
namcos1_driver_init(machine(), &ws90_specific);
namcos1_driver_init(&ws90_specific);
}
/*******************************************************************************
@ -1260,9 +1233,9 @@ DRIVER_INIT_MEMBER(namcos1_state,soukobdx)
{
static const struct namcos1_specific soukobdx_specific=
{
key_type3_r,key_type3_w, 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), 311, 2, 3/*?*/, 0,-1, 4,-1
};
namcos1_driver_init(machine(), &soukobdx_specific);
namcos1_driver_init(&soukobdx_specific);
}
@ -1304,7 +1277,7 @@ READ8_MEMBER( namcos1_state::quester_paddle_r )
DRIVER_INIT_MEMBER(namcos1_state,quester)
{
namcos1_driver_init(machine(), NULL);
namcos1_driver_init(NULL);
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::quester_paddle_r), this));
}
@ -1393,7 +1366,7 @@ READ8_MEMBER( namcos1_state::berabohm_buttons_r )
DRIVER_INIT_MEMBER(namcos1_state,berabohm)
{
namcos1_driver_init(machine(), NULL);
namcos1_driver_init(NULL);
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::berabohm_buttons_r), this));
}
@ -1465,6 +1438,6 @@ READ8_MEMBER( namcos1_state::faceoff_inputs_r )
DRIVER_INIT_MEMBER(namcos1_state,faceoff)
{
namcos1_driver_init(machine(), NULL);
namcos1_driver_init(NULL);
m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
}

View File

@ -175,36 +175,33 @@ void namcos1_state::video_start()
***************************************************************************/
READ8_HANDLER( namcos1_videoram_r )
READ8_MEMBER( namcos1_state::namcos1_videoram_r )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
return state->m_videoram[offset];
return m_videoram[offset];
}
WRITE8_HANDLER( namcos1_videoram_w )
WRITE8_MEMBER( namcos1_state::namcos1_videoram_w )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
state->m_videoram[offset] = data;
m_videoram[offset] = data;
if (offset < 0x7000)
{ /* background 0-3 */
int layer = offset >> 13;
int num = (offset & 0x1fff) >> 1;
state->m_bg_tilemap[layer]->mark_tile_dirty(num);
m_bg_tilemap[layer]->mark_tile_dirty(num);
}
else
{ /* foreground 4-5 */
int layer = (offset >> 11 & 1) + 4;
int num = ((offset & 0x7ff) - 0x10) >> 1;
if (num >= 0 && num < 0x3f0)
state->m_bg_tilemap[layer]->mark_tile_dirty(num);
m_bg_tilemap[layer]->mark_tile_dirty(num);
}
}
WRITE8_HANDLER( namcos1_paletteram_w )
WRITE8_MEMBER( namcos1_state::namcos1_paletteram_w )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
if (state->m_paletteram[offset] == data)
if (m_paletteram[offset] == data)
return;
if ((offset & 0x1800) != 0x1800)
@ -212,26 +209,26 @@ WRITE8_HANDLER( namcos1_paletteram_w )
int r,g,b;
int color = ((offset & 0x6000) >> 2) | (offset & 0x7ff);
state->m_paletteram[offset] = data;
m_paletteram[offset] = data;
offset &= ~0x1800;
r = state->m_paletteram[offset];
g = state->m_paletteram[offset + 0x0800];
b = state->m_paletteram[offset + 0x1000];
state->m_palette->set_pen_color(color,rgb_t(r,g,b));
r = m_paletteram[offset];
g = m_paletteram[offset + 0x0800];
b = m_paletteram[offset + 0x1000];
m_palette->set_pen_color(color,rgb_t(r,g,b));
}
else
{
int i, j;
state->m_cus116[offset & 0x0f] = data;
m_cus116[offset & 0x0f] = data;
for (i = 0x1800; i < 0x8000; i += 0x2000)
{
offset = (offset & 0x0f) | i;
for (j = 0; j < 0x80; j++, offset += 0x10)
state->m_paletteram[offset] = data;
m_paletteram[offset] = data;
}
}
}
@ -239,34 +236,32 @@ WRITE8_HANDLER( namcos1_paletteram_w )
READ8_HANDLER( namcos1_spriteram_r )
READ8_MEMBER( namcos1_state::namcos1_spriteram_r )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
/* 0000-07ff work ram */
/* 0800-0fff sprite ram */
if (offset < 0x1000)
return state->m_spriteram[offset];
return m_spriteram[offset];
/* 1xxx playfield control ram */
else
return state->m_playfield_control[offset & 0x1f];
return m_playfield_control[offset & 0x1f];
}
WRITE8_HANDLER( namcos1_spriteram_w )
WRITE8_MEMBER( namcos1_state::namcos1_spriteram_w )
{
namcos1_state *state = space.machine().driver_data<namcos1_state>();
/* 0000-07ff work ram */
/* 0800-0fff sprite ram */
if (offset < 0x1000)
{
state->m_spriteram[offset] = data;
m_spriteram[offset] = data;
/* a write to this offset tells the sprite chip to buffer the sprite list */
if (offset == 0x0ff2)
state->m_copy_sprites = 1;
m_copy_sprites = 1;
}
/* 1xxx playfield control ram */
else
state->m_playfield_control[offset & 0x1f] = data;
m_playfield_control[offset & 0x1f] = data;
}
@ -297,13 +292,12 @@ sprite format:
15 xxxxxxxx Y position
*/
static void 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)
{
namcos1_state *state = screen.machine().driver_data<namcos1_state>();
UINT8 *spriteram = state->m_spriteram + 0x800;
UINT8 *spriteram = m_spriteram + 0x800;
const UINT8 *source = &spriteram[0x800-0x20]; /* the last is NOT a sprite */
const UINT8 *finish = &spriteram[0];
gfx_element *gfx = state->m_gfxdecode->gfx(1);
gfx_element *gfx = m_gfxdecode->gfx(1);
int sprite_xoffs = spriteram[0x07f5] + ((spriteram[0x07f4] & 1) << 8);
int sprite_yoffs = spriteram[0x07f7];
@ -333,7 +327,7 @@ static void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rect
sx += sprite_xoffs;
sy -= sprite_yoffs;
if (state->flip_screen())
if (flip_screen())
{
sx = -sx - sizex;
sy = -sy - sizey;
@ -361,7 +355,7 @@ static void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rect
sx & 0x1ff,
((sy + 16) & 0xff) - 16,
screen.priority(), pri_mask,
state->m_drawmode_table);
m_drawmode_table);
source -= 0x10;
}