diff --git a/src/mame/drivers/legionna.c b/src/mame/drivers/legionna.c index aa41c6793a8..d9ce85c97be 100644 --- a/src/mame/drivers/legionna.c +++ b/src/mame/drivers/legionna.c @@ -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) diff --git a/src/mame/machine/raiden2cop.c b/src/mame/machine/raiden2cop.c index 13b0232fdcb..c275de79cf6 100644 --- a/src/mame/machine/raiden2cop.c +++ b/src/mame/machine/raiden2cop.c @@ -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; -} \ No newline at end of file +} + +// 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; +} diff --git a/src/mame/machine/raiden2cop.h b/src/mame/machine/raiden2cop.h index b24f5d54032..b08ed207c9b 100644 --- a/src/mame/machine/raiden2cop.h +++ b/src/mame/machine/raiden2cop.h @@ -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 diff --git a/src/mame/machine/seicop.c b/src/mame/machine/seicop.c index 56107a79d64..c530e637104 100644 --- a/src/mame/machine/seicop.c +++ b/src/mame/machine/seicop.c @@ -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; } diff --git a/src/mame/machine/seicop.h b/src/mame/machine/seicop.h index d589d0af98d..1698f202818 100644 --- a/src/mame/machine/seicop.h +++ b/src/mame/machine/seicop.h @@ -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);