From 7ae39e007c2e4567bd6d540b207ab9318e3d1af2 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Tue, 9 Sep 2014 16:30:58 +0000 Subject: [PATCH] fix scrolling in godzilla (nw) --- src/mame/drivers/legionna.c | 71 ++++++++++++++++++++---------------- src/mame/includes/legionna.h | 13 ++++--- src/mame/machine/seicop.c | 29 +++++++++++++-- src/mame/machine/seicop.h | 6 +++ src/mame/video/legionna.c | 47 ++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 41 deletions(-) diff --git a/src/mame/drivers/legionna.c b/src/mame/drivers/legionna.c index c7f6d0e762f..27d486ec833 100644 --- a/src/mame/drivers/legionna.c +++ b/src/mame/drivers/legionna.c @@ -85,10 +85,10 @@ static ADDRESS_MAP_START( legionna_map, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100400, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, legionna_mcu_r, legionna_mcu_w) AM_SHARE("cop_mcu_ram") /* COP mcu */ - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x102000, 0x1027ff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102800, 0x1037ff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x102000, 0x1027ff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102800, 0x1037ff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x104000, 0x104fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") /* palette xRRRRxGGGGxBBBBx ? */ AM_RANGE(0x105000, 0x105fff) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x106000, 0x107fff) AM_RAM @@ -100,10 +100,10 @@ static ADDRESS_MAP_START( heatbrl_map, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100400, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, heatbrl_mcu_r, heatbrl_mcu_w) AM_SHARE("cop_mcu_ram") /* COP mcu */ - AM_RANGE(0x100800, 0x100fff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102000, 0x102fff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x100800, 0x100fff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102000, 0x102fff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x103000, 0x103fff) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x104000, 0x104fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") AM_RANGE(0x108000, 0x11ffff) AM_RAM @@ -114,10 +114,10 @@ static ADDRESS_MAP_START( godzilla_map, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100400, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, godzilla_mcu_r, godzilla_mcu_w) AM_SHARE("cop_mcu_ram") /* COP mcu */ AM_RANGE(0x100800, 0x100fff) AM_RAM - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x102000, 0x1027ff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102800, 0x1037ff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x102000, 0x1027ff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102800, 0x1037ff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x103800, 0x103fff) AM_RAM // check? AM_RANGE(0x104000, 0x104fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") AM_RANGE(0x105000, 0x105fff) AM_RAM AM_SHARE("spriteram") @@ -139,10 +139,10 @@ static ADDRESS_MAP_START( denjinmk_map, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100400, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, denjinmk_mcu_r, denjinmk_mcu_w) AM_SHARE("cop_mcu_ram") /* COP mcu */ AM_RANGE(0x100800, 0x100fff) AM_RAM - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x102000, 0x1027ff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102800, 0x103fff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x102000, 0x1027ff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102800, 0x103fff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x104000, 0x104fff) AM_RAM_WRITE(denjin_paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_SHARE("palette") AM_RANGE(0x105000, 0x105fff) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x106000, 0x107fff) AM_RAM @@ -155,10 +155,10 @@ static ADDRESS_MAP_START( grainbow_map, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100400, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, grainbow_mcu_r, grainbow_mcu_w) AM_SHARE("cop_mcu_ram") /* COP mcu */ - AM_RANGE(0x100800, 0x100fff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102000, 0x102fff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x100800, 0x100fff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102000, 0x102fff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x103000, 0x103fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") AM_RANGE(0x104000, 0x104fff) AM_RAM//_WRITE(paletteram_xBBBBBGGGGGRRRRR_word_w) AM_SHARE("paletteram") AM_RANGE(0x105000, 0x105fff) AM_RAM @@ -171,10 +171,10 @@ static ADDRESS_MAP_START( cupsoc_mem, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100400, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, cupsoc_mcu_r,cupsoc_mcu_w) AM_SHARE("cop_mcu_ram") - AM_RANGE(0x100800, 0x100fff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102000, 0x102fff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x100800, 0x100fff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102000, 0x102fff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x103000, 0x103fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") AM_RANGE(0x104000, 0x104fff) AM_RAM AM_RANGE(0x105000, 0x106fff) AM_RAM @@ -190,10 +190,10 @@ static ADDRESS_MAP_START( cupsocs_mem, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100400, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, cupsocs_mcu_r,cupsocs_mcu_w) AM_SHARE("cop_mcu_ram") - AM_RANGE(0x100800, 0x100fff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102000, 0x102fff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x100800, 0x100fff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102000, 0x102fff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x103000, 0x103fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") AM_RANGE(0x104000, 0x104fff) AM_RAM AM_RANGE(0x105000, 0x106fff) AM_RAM @@ -209,10 +209,10 @@ static ADDRESS_MAP_START( cupsocbl_mem, AS_PROGRAM, 16, legionna_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM //AM_RANGE(0x100000, 0x1003ff) AM_RAM AM_RANGE(0x100000, 0x1007ff) AM_DEVREADWRITE("seibucop", seibu_cop_legacy_device, copdxbl_0_r,copdxbl_0_w) AM_SHARE("cop_mcu_ram") - AM_RANGE(0x100800, 0x100fff) AM_RAM_WRITE(legionna_background_w) AM_SHARE("back_data") - AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(legionna_foreground_w) AM_SHARE("fore_data") - AM_RANGE(0x101800, 0x101fff) AM_RAM_WRITE(legionna_midground_w) AM_SHARE("mid_data") - AM_RANGE(0x102000, 0x102fff) AM_RAM_WRITE(legionna_text_w) AM_SHARE("textram") + AM_RANGE(0x100800, 0x100fff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + AM_RANGE(0x102000, 0x102fff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") AM_RANGE(0x103000, 0x103fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") AM_RANGE(0x104000, 0x104fff) AM_RAM AM_RANGE(0x105000, 0x106fff) AM_RAM @@ -1066,6 +1066,7 @@ static MACHINE_CONFIG_START( legionna, legionna_state ) SEIBU_SOUND_SYSTEM_CPU(14318180/4) MCFG_SEIBU_COP_ADD("seibucop") + MCFG_VIDEORAM_OUT_CB(WRITE16(legionna_state, videowrite_cb_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1097,6 +1098,7 @@ static MACHINE_CONFIG_START( heatbrl, legionna_state ) SEIBU_SOUND_SYSTEM_CPU(14318180/4) MCFG_SEIBU_COP_ADD("seibucop") + MCFG_VIDEORAM_OUT_CB(WRITE16(legionna_state, videowrite_cb_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1128,6 +1130,7 @@ static MACHINE_CONFIG_START( godzilla, legionna_state ) SEIBU2_SOUND_SYSTEM_CPU(14318180/4) MCFG_SEIBU_COP_ADD("seibucop") + MCFG_VIDEORAM_OUT_CB(WRITE16(legionna_state, videowrite_cb_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1160,6 +1163,7 @@ static MACHINE_CONFIG_START( denjinmk, legionna_state ) SEIBU2_SOUND_SYSTEM_CPU(14318180/4) MCFG_SEIBU_COP_ADD("seibucop") + MCFG_VIDEORAM_OUT_CB(WRITE16(legionna_state, videowrite_cb_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1191,6 +1195,7 @@ static MACHINE_CONFIG_START( grainbow, legionna_state ) SEIBU2_SOUND_SYSTEM_CPU(14318180/4) MCFG_SEIBU_COP_ADD("seibucop") + MCFG_VIDEORAM_OUT_CB(WRITE16(legionna_state, videowrite_cb_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1223,6 +1228,7 @@ static MACHINE_CONFIG_START( cupsoc, legionna_state ) SEIBU_SOUND_SYSTEM_CPU(14318180/4) MCFG_SEIBU_COP_ADD("seibucop") + MCFG_VIDEORAM_OUT_CB(WRITE16(legionna_state, videowrite_cb_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1257,6 +1263,7 @@ static MACHINE_CONFIG_START( cupsocbl, legionna_state ) MCFG_CPU_VBLANK_INT_DRIVER("screen", legionna_state, irq4_line_hold) /* VBL */ MCFG_SEIBU_COP_ADD("seibucop") + MCFG_VIDEORAM_OUT_CB(WRITE16(legionna_state, videowrite_cb_w)) /*Different Sound hardware*/ //SEIBU_SOUND_SYSTEM_CPU(14318180/4) diff --git a/src/mame/includes/legionna.h b/src/mame/includes/legionna.h index fb8f1478dc7..8abb634bafb 100644 --- a/src/mame/includes/legionna.h +++ b/src/mame/includes/legionna.h @@ -6,10 +6,10 @@ public: legionna_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_spriteram(*this, "spriteram"), - m_back_data(*this, "back_data"), + /*m_back_data(*this, "back_data"), m_fore_data(*this, "fore_data"), m_mid_data(*this, "mid_data"), - m_textram(*this, "textram"), + m_textram(*this, "textram"),*/ m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_oki(*this, "oki"), @@ -17,10 +17,10 @@ public: m_palette(*this, "palette") { } required_shared_ptr m_spriteram; - required_shared_ptr m_back_data; - required_shared_ptr m_fore_data; - required_shared_ptr m_mid_data; - required_shared_ptr m_textram; + UINT16* m_back_data; + UINT16* m_fore_data; + UINT16* m_mid_data; + UINT16* m_textram; UINT16 *m_scrollram16; UINT16 m_layer_disable; int m_sprite_xoffs; @@ -35,6 +35,7 @@ public: UINT16 m_fore_gfx_bank; UINT16 m_mid_gfx_bank; + DECLARE_WRITE16_MEMBER(videowrite_cb_w); DECLARE_WRITE16_MEMBER(denjin_paletteram16_xBBBBBGGGGGRRRRR_word_w); DECLARE_WRITE16_MEMBER(legionna_background_w); DECLARE_WRITE16_MEMBER(legionna_midground_w); diff --git a/src/mame/machine/seicop.c b/src/mame/machine/seicop.c index 8f4f587e6b6..c98e0ae0213 100644 --- a/src/mame/machine/seicop.c +++ b/src/mame/machine/seicop.c @@ -1639,7 +1639,8 @@ seibu_cop_legacy_device::seibu_cop_legacy_device(const machine_config &mconfig, 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_cop_sprite_dma_param(0), + m_videoramout_cb(*this) { memset(m_copd2_table, 0, sizeof(UINT16)*0x100); memset(m_copd2_table_2, 0, sizeof(UINT16)*0x100/8); @@ -1673,6 +1674,7 @@ void seibu_cop_legacy_device::device_config_complete() void seibu_cop_legacy_device::device_start() { m_cop_mcu_ram = reinterpret_cast(machine().root_device().memshare("cop_mcu_ram")->ptr()); + m_videoramout_cb.resolve_safe(); save_item(NAME(m_cop_438)); save_item(NAME(m_cop_43a)); @@ -3084,6 +3086,7 @@ WRITE16_MEMBER( seibu_cop_legacy_device::generic_cop_w ) case (0x2fc/2): { //seibu_cop_log("%06x: COPX execute current layer clear??? %04x\n", space.device().safe_pc(), data); + //printf("SRC: %08x %08x DST:%08x SIZE:%08x TRIGGER: %08x\n",m_cop_dma_src[m_cop_dma_trigger] << 6,m_cop_dma_fade_table,m_cop_dma_dst[m_cop_dma_trigger] << 6,m_cop_dma_size[m_cop_dma_trigger] << 5,m_cop_dma_trigger); if (m_cop_dma_trigger >= 0x80 && m_cop_dma_trigger <= 0x87) { @@ -3234,8 +3237,28 @@ WRITE16_MEMBER( seibu_cop_legacy_device::generic_cop_w ) return; } - /* private buffer copies */ - if ((m_cop_dma_trigger==0x14) || (m_cop_dma_trigger==0x15)) + /* private buffer copies - tilemaps */ + if (m_cop_dma_trigger == 0x14) + { + // AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + // AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + // AM_RANGE(0x102000, 0x1027ff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + // AM_RANGE(0x102800, 0x1037ff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") + int src = m_cop_dma_src[m_cop_dma_trigger] << 6; + + for (int i = 0; i < 0x2800 /2; i++) + { + UINT16 tileval = space.read_word(src); + //printf("reading source %04x (data is %04x)\n", src, data); + src += 2; + m_videoramout_cb(space, i, tileval, 0xffff); + } + + return; + } + + /* privaet buffer copy - sprites? */ + if (m_cop_dma_trigger==0x15) return; printf("SRC: %08x %08x DST:%08x SIZE:%08x TRIGGER: %08x\n",m_cop_dma_src[m_cop_dma_trigger] << 6,m_cop_dma_fade_table,m_cop_dma_dst[m_cop_dma_trigger] << 6,m_cop_dma_size[m_cop_dma_trigger] << 5,m_cop_dma_trigger); diff --git a/src/mame/machine/seicop.h b/src/mame/machine/seicop.h index 45dd4dcb1e5..98308ac02e8 100644 --- a/src/mame/machine/seicop.h +++ b/src/mame/machine/seicop.h @@ -18,6 +18,9 @@ struct collision_info UINT16 hitbox_x,hitbox_y; }; +#define MCFG_VIDEORAM_OUT_CB(_devcb) \ + devcb = &seibu_cop_legacy_device::set_m_videoramout_cb(*device, DEVCB_##_devcb); + class seibu_cop_legacy_device : public device_t { public: @@ -43,6 +46,7 @@ seibu_cop_legacy_device(const machine_config &mconfig, const char *tag, device_t //DECLARE_READ16_MEMBER( raiden2_mcu_r ); unused //DECLARE_WRITE16_MEMBER( raiden2_mcu_w ); unused + template static devcb_base &set_m_videoramout_cb(device_t &device, _Object object) { return downcast(device).m_videoramout_cb.set_callback(object); } protected: // device-level overrides @@ -92,6 +96,8 @@ private: UINT8 cop_calculate_collsion_detection(); DECLARE_READ16_MEMBER( generic_cop_r ); DECLARE_WRITE16_MEMBER( generic_cop_w ); + devcb_write16 m_videoramout_cb; + }; extern const device_type SEIBU_COP_LEGACY; diff --git a/src/mame/video/legionna.c b/src/mame/video/legionna.c index b723eabd96e..143d549b72c 100644 --- a/src/mame/video/legionna.c +++ b/src/mame/video/legionna.c @@ -40,6 +40,34 @@ void denjinmk_setgfxbank(running_machine &machine, UINT16 data) state->m_text_layer->mark_all_dirty(); } +WRITE16_MEMBER(legionna_state::videowrite_cb_w) +{ + // AM_RANGE(0x101000, 0x1017ff) AM_RAM // _WRITE(legionna_background_w) AM_SHARE("back_data") + // AM_RANGE(0x101800, 0x101fff) AM_RAM // _WRITE(legionna_foreground_w) AM_SHARE("fore_data") + // AM_RANGE(0x102000, 0x1027ff) AM_RAM // _WRITE(legionna_midground_w) AM_SHARE("mid_data") + // AM_RANGE(0x102800, 0x1037ff) AM_RAM // _WRITE(legionna_text_w) AM_SHARE("textram") + + if (offset < 0x800 / 2) + { + legionna_background_w(space, offset, data, 0xffff); + } + else if (offset < 0x1000 /2) + { + offset -= 0x800 / 2; + legionna_foreground_w(space, offset, data, 0xffff); + } + else if (offset < 0x1800/2) + { + offset -= 0x1000 / 2; + legionna_midground_w(space, offset, data, 0xffff); + } + else if (offset < 0x2800/2) + { + offset -= 0x1800 / 2; + legionna_text_w(space, offset, data, 0xffff); + } +} + WRITE16_MEMBER(legionna_state::legionna_background_w) { COMBINE_DATA(&m_back_data[offset]); @@ -141,8 +169,16 @@ TILE_GET_INFO_MEMBER(legionna_state::get_text_tile_info) SET_TILE_INFO_MEMBER(0,tile,color,0); } + + VIDEO_START_MEMBER(legionna_state,legionna) { + + m_back_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_fore_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_mid_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_textram = auto_alloc_array_clear(machine(), UINT16, 0x1000/2); + m_background_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_back_tile_info),this),TILEMAP_SCAN_ROWS,16,16,32,32); m_foreground_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_fore_tile_info),this),TILEMAP_SCAN_ROWS,16,16,32,32); m_midground_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_mid_tile_info),this), TILEMAP_SCAN_ROWS,16,16,32,32); @@ -163,6 +199,12 @@ VIDEO_START_MEMBER(legionna_state,legionna) VIDEO_START_MEMBER(legionna_state,denjinmk) { + + m_back_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_fore_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_mid_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_textram = auto_alloc_array_clear(machine(), UINT16, 0x1000/2); + m_background_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_back_tile_info),this),TILEMAP_SCAN_ROWS,16,16,32,32); m_foreground_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_fore_tile_info_denji),this),TILEMAP_SCAN_ROWS,16,16,32,32); m_midground_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_mid_tile_info_denji),this), TILEMAP_SCAN_ROWS,16,16,32,32); @@ -183,6 +225,11 @@ VIDEO_START_MEMBER(legionna_state,denjinmk) VIDEO_START_MEMBER(legionna_state,cupsoc) { + m_back_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_fore_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_mid_data = auto_alloc_array_clear(machine(), UINT16, 0x800/2); + m_textram = auto_alloc_array_clear(machine(), UINT16, 0x1000/2); + m_background_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_back_tile_info),this),TILEMAP_SCAN_ROWS,16,16,32,32); m_foreground_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_fore_tile_info),this),TILEMAP_SCAN_ROWS,16,16,32,32); m_midground_layer = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(legionna_state::get_mid_tile_info_cupsoc),this), TILEMAP_SCAN_ROWS,16,16,32,32);