more (nw)

This commit is contained in:
David Haywood 2014-09-24 00:46:25 +00:00
parent 626cb0ebd7
commit 8f590ef8f0
5 changed files with 54 additions and 24 deletions

View File

@ -90,6 +90,10 @@ WRITE16_MEMBER(legionna_state::sound_comms_w)
}
static ADDRESS_MAP_START( legionna_cop_mem, AS_PROGRAM, 16, legionna_state )
AM_RANGE(0x100400, 0x100401) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sprite_dma_param_lo_w) // grainbow
AM_RANGE(0x100402, 0x100403) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sprite_dma_param_hi_w) // grainbow
AM_RANGE(0x10040c, 0x10040d) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sprite_dma_size_w) // grainbow
// AM_RANGE(0x10041c, 0x10041d) AM_WRITE(cop_angle_target_w) // angle target (for 0x6200 COP macro)
// AM_RANGE(0x10041e, 0x10041f) AM_WRITE(cop_angle_step_w) // angle step (for 0x6200 COP macro)
AM_RANGE(0x100420, 0x100421) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_itoa_low_w)

View File

@ -43,6 +43,10 @@ raiden2cop_device::raiden2cop_device(const machine_config &mconfig, const char *
m_cop_rng_max_value(0),
m_cop_sprite_dma_param(0),
m_cop_sprite_dma_size(0),
m_videoramout_cb(*this),
m_palette(*this, ":palette")
{
@ -129,6 +133,10 @@ void raiden2cop_device::device_start()
save_item(NAME(m_cop_rng_max_value));
save_item(NAME(m_cop_sprite_dma_param));
save_item(NAME(m_cop_sprite_dma_size));
m_videoramout_cb.resolve_safe();
@ -1080,4 +1088,21 @@ WRITE16_MEMBER(raiden2cop_device::cop_prng_maxvalue_w)
READ16_MEMBER(raiden2cop_device::cop_prng_maxvalue_r)
{
return m_cop_rng_max_value;
}
}
// misc used by 68k games (mostly grainbow?)
WRITE16_MEMBER( raiden2cop_device::cop_sprite_dma_param_hi_w)
{
m_cop_sprite_dma_param = (m_cop_sprite_dma_param&0x0000ffff)|(data<<16);
}
WRITE16_MEMBER( raiden2cop_device::cop_sprite_dma_param_lo_w)
{
m_cop_sprite_dma_param = (m_cop_sprite_dma_param&0xffff0000)|(data&0xffff);
}
WRITE16_MEMBER(raiden2cop_device::cop_sprite_dma_size_w)
{
m_cop_sprite_dma_size = data;
}

View File

@ -108,12 +108,7 @@ public:
DECLARE_WRITE16_MEMBER( cop_angle_mod_val_w );
DECLARE_WRITE16_MEMBER(cop_hitbox_baseadr_w);
DECLARE_WRITE16_MEMBER(cop_sort_lookup_hi_w);
DECLARE_WRITE16_MEMBER(cop_sort_lookup_lo_w);
DECLARE_WRITE16_MEMBER(cop_sort_ram_addr_hi_w);
DECLARE_WRITE16_MEMBER(cop_sort_ram_addr_lo_w);
DECLARE_WRITE16_MEMBER(cop_sort_param_w);
DECLARE_WRITE16_MEMBER(cop_sort_dma_trig_w);
UINT32 cop_regs[8];
UINT16 cop_status, cop_scale, cop_angle, cop_dist;
@ -141,15 +136,30 @@ public:
void cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap);
void cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr);
// Sort DMA (zeroteam, cupsoc)
UINT32 cop_sort_ram_addr, cop_sort_lookup;
UINT16 cop_sort_param;
// RNG
DECLARE_WRITE16_MEMBER(cop_sort_lookup_hi_w);
DECLARE_WRITE16_MEMBER(cop_sort_lookup_lo_w);
DECLARE_WRITE16_MEMBER(cop_sort_ram_addr_hi_w);
DECLARE_WRITE16_MEMBER(cop_sort_ram_addr_lo_w);
DECLARE_WRITE16_MEMBER(cop_sort_param_w);
DECLARE_WRITE16_MEMBER(cop_sort_dma_trig_w);
// RNG (cupsoc)
UINT16 m_cop_rng_max_value;
DECLARE_READ16_MEMBER(cop_prng_r);
DECLARE_WRITE16_MEMBER(cop_prng_maxvalue_w);
DECLARE_READ16_MEMBER(cop_prng_maxvalue_r);
// misc 68k (grainbow)
UINT32 m_cop_sprite_dma_param;
DECLARE_WRITE16_MEMBER(cop_sprite_dma_param_hi_w);
DECLARE_WRITE16_MEMBER(cop_sprite_dma_param_lo_w);
DECLARE_WRITE16_MEMBER(cop_sprite_dma_size_w);
int m_cop_sprite_dma_size;
protected:
// device-level overrides

View File

@ -1614,8 +1614,6 @@ seibu_cop_legacy_device::seibu_cop_legacy_device(const machine_config &mconfig,
m_cop_sprite_dma_src(0),
m_cop_sprite_dma_abs_x(0),
m_cop_sprite_dma_abs_y(0),
m_cop_sprite_dma_size(0),
m_cop_sprite_dma_param(0),
m_raiden2cop(*this, ":raiden2cop")
{
@ -1656,8 +1654,6 @@ void seibu_cop_legacy_device::device_start()
save_item(NAME(m_cop_sprite_dma_src));
save_item(NAME(m_cop_sprite_dma_abs_x));
save_item(NAME(m_cop_sprite_dma_abs_y));
save_item(NAME(m_cop_sprite_dma_size));
save_item(NAME(m_cop_sprite_dma_param));
}
//-------------------------------------------------
@ -2070,14 +2066,10 @@ WRITE16_MEMBER( seibu_cop_legacy_device::generic_cop_w )
seibu_cop_log("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2);
break;
/* Sprite DMA */
case (0x000/2):
case (0x002/2):
m_cop_sprite_dma_param = (m_cop_mcu_ram[0x000/2]) | (m_cop_mcu_ram[0x002/2] << 16);
//popmessage("%08x",m_cop_sprite_dma_param & 0xffffffc0);
break;
case (0x00c/2): { m_cop_sprite_dma_size = m_cop_mcu_ram[offset]; break; }
case (0x010/2):
{
if(data)
@ -2088,9 +2080,9 @@ WRITE16_MEMBER( seibu_cop_legacy_device::generic_cop_w )
m_raiden2cop->cop_regs[4]+=8;
m_cop_sprite_dma_src+=6;
m_cop_sprite_dma_size--;
m_raiden2cop->m_cop_sprite_dma_size--;
if(m_cop_sprite_dma_size > 0)
if(m_raiden2cop->m_cop_sprite_dma_size > 0)
m_raiden2cop->cop_status &= ~2;
else
m_raiden2cop->cop_status |= 2;
@ -2500,7 +2492,7 @@ WRITE16_MEMBER( seibu_cop_legacy_device::generic_cop_w )
offs = (offset & 3) * 4;
space.write_word(m_raiden2cop->cop_regs[4] + offs + 0,space.read_word(m_cop_sprite_dma_src + offs) + (m_cop_sprite_dma_param & 0x3f));
space.write_word(m_raiden2cop->cop_regs[4] + offs + 0,space.read_word(m_cop_sprite_dma_src + offs) + (m_raiden2cop->m_cop_sprite_dma_param & 0x3f));
//space.write_word(m_raiden2cop->cop_regs[4] + offs + 2,space.read_word(m_cop_sprite_dma_src+2 + offs));
return;
}

View File

@ -50,8 +50,7 @@ private:
UINT16 m_cop_rom_addr_lo,m_cop_rom_addr_hi,m_cop_rom_addr_unk;
UINT32 m_cop_sprite_dma_src;
int m_cop_sprite_dma_abs_x,m_cop_sprite_dma_abs_y,m_cop_sprite_dma_size;
UINT32 m_cop_sprite_dma_param;
int m_cop_sprite_dma_abs_x,m_cop_sprite_dma_abs_y;
void cop_take_hit_box_params(UINT8 offs);