From 88d055a065b17e1f09eb03e768d6908495a49920 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 1 Apr 2019 05:59:45 +0900 Subject: [PATCH] raiden2.cpp : Update/Cleanups (#3941) Split video functions into video/raiden2.cpp, Cleanup ACCESSING_BITs, Fix naming, Reduce runtime tag lookups, Reduce unused, Add save state for sprite encryption values Fix xsedae config because This game is running into modified Zero Team Hardware, And second OKI chip/surface are not exists. raiden2.h : Use protected:/private: r2dx_v33.cpp : Fix compile, Fix naming, Reduce runtime tag lookups, Reduce duplicates between raiden2.cpp --- scripts/target/mame/arcade.lua | 1 + src/mame/drivers/r2dx_v33.cpp | 318 ++++++-------- src/mame/drivers/raiden2.cpp | 741 ++++++++------------------------- src/mame/includes/raiden2.h | 246 +++++------ src/mame/video/raiden2.cpp | 385 +++++++++++++++++ 5 files changed, 814 insertions(+), 877 deletions(-) create mode 100644 src/mame/video/raiden2.cpp diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index b80506d399c..1d3045d572e 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -3535,6 +3535,7 @@ files { MAME_DIR .. "src/mame/video/raiden.cpp", MAME_DIR .. "src/mame/drivers/raiden2.cpp", MAME_DIR .. "src/mame/includes/raiden2.h", + MAME_DIR .. "src/mame/video/raiden2.cpp", MAME_DIR .. "src/mame/machine/r2crypt.cpp", MAME_DIR .. "src/mame/machine/r2crypt.h", MAME_DIR .. "src/mame/machine/seibucop/seibucop.cpp", diff --git a/src/mame/drivers/r2dx_v33.cpp b/src/mame/drivers/r2dx_v33.cpp index 0fa581fbea7..5e3edf03489 100644 --- a/src/mame/drivers/r2dx_v33.cpp +++ b/src/mame/drivers/r2dx_v33.cpp @@ -54,7 +54,7 @@ Then it puts settings at 0x9e08 and 0x9e0a (bp 91acb) 230000-2fffff : 'Fixed' ROM data for Raiden DX 300000-3fffff : Banked ROM data for Raiden DX (16x 0x10000 banks) - New Zero Team /Zero + New Zero Team /Zero Team 2000 000000-01ffff : 0xff fill, inaccessible by hardware? 020000-0fffff : Fixed ROM data for Zero Team @@ -73,7 +73,6 @@ Then it puts settings at 0x9e08 and 0x9e0a (bp 91acb) #include "sound/okim6295.h" #include "machine/r2crypt.h" -#include "screen.h" #include "speaker.h" @@ -85,8 +84,10 @@ public: m_r2dxbank(0), m_r2dxgameselect(0), m_eeprom(*this, "eeprom"), - m_math(*this, "math") - { } + m_math(*this, "math"), + m_okibank(*this, "okibank") + { + } void nzerotea(machine_config &config); void rdx_v33(machine_config &config); @@ -98,17 +99,17 @@ public: private: - DECLARE_WRITE16_MEMBER(r2dx_angle_w); - DECLARE_WRITE16_MEMBER(r2dx_dx_w); - DECLARE_WRITE16_MEMBER(r2dx_dy_w); - DECLARE_WRITE16_MEMBER(r2dx_sdistl_w); - DECLARE_WRITE16_MEMBER(r2dx_sdisth_w); - DECLARE_READ16_MEMBER(r2dx_angle_r); - DECLARE_READ16_MEMBER(r2dx_dist_r); - DECLARE_READ16_MEMBER(r2dx_sin_r); - DECLARE_READ16_MEMBER(r2dx_cos_r); + DECLARE_WRITE16_MEMBER(angle_w); + DECLARE_WRITE16_MEMBER(dx_w); + DECLARE_WRITE16_MEMBER(dy_w); + DECLARE_WRITE16_MEMBER(sdistl_w); + DECLARE_WRITE16_MEMBER(sdisth_w); + DECLARE_READ16_MEMBER(angle_r); + DECLARE_READ16_MEMBER(dist_r); + DECLARE_READ16_MEMBER(sin_r); + DECLARE_READ16_MEMBER(cos_r); - DECLARE_WRITE16_MEMBER(tile_bank_w); + DECLARE_WRITE8_MEMBER(tile_bank_w); DECLARE_READ16_MEMBER(rdx_v33_unknown_r); DECLARE_WRITE16_MEMBER(mcu_xval_w); DECLARE_WRITE16_MEMBER(mcu_yval_w); @@ -121,12 +122,10 @@ private: DECLARE_WRITE16_MEMBER(zerotm2k_eeprom_w); DECLARE_WRITE16_MEMBER(r2dx_rom_bank_w); - DECLARE_WRITE16_MEMBER(r2dx_tilemapdma_w); - DECLARE_WRITE16_MEMBER(r2dx_paldma_w); + DECLARE_WRITE16_MEMBER(tilemapdma_w); + DECLARE_WRITE16_MEMBER(paldma_w); DECLARE_READ16_MEMBER(r2dx_debug_r); - INTERRUPT_GEN_MEMBER(rdx_v33_interrupt); - DECLARE_MACHINE_RESET(r2dx_v33); DECLARE_MACHINE_RESET(nzeroteam); @@ -138,13 +137,13 @@ private: virtual void machine_start() override; - void r2dx_setbanking(void); + void r2dx_setbanking(); int m_r2dxbank; int m_r2dxgameselect; - uint16_t m_r2dx_i_dx, m_r2dx_i_dy, m_r2dx_i_angle; - uint32_t m_r2dx_i_sdist; + uint16_t m_dx, m_dy, m_angle; + uint32_t m_sdist; uint16_t m_mcu_prog[0x800]; int m_mcu_prog_offs; uint16_t m_mcu_xval, m_mcu_yval; @@ -152,18 +151,20 @@ private: optional_device m_eeprom; required_region_ptr m_math; + + optional_memory_bank m_okibank; }; void r2dx_v33_state::machine_start() { - raiden2_state::machine_start(); + common_save_state(); save_item(NAME(m_r2dxbank)); save_item(NAME(m_r2dxgameselect)); - save_item(NAME(m_r2dx_i_dx)); - save_item(NAME(m_r2dx_i_dy)); - save_item(NAME(m_r2dx_i_angle)); - save_item(NAME(m_r2dx_i_sdist)); + save_item(NAME(m_dx)); + save_item(NAME(m_dy)); + save_item(NAME(m_angle)); + save_item(NAME(m_sdist)); save_item(NAME(m_mcu_prog)); save_item(NAME(m_mcu_prog_offs)); save_item(NAME(m_mcu_xval)); @@ -171,34 +172,32 @@ void r2dx_v33_state::machine_start() save_item(NAME(m_mcu_data)); } -WRITE16_MEMBER(r2dx_v33_state::tile_bank_w) +WRITE8_MEMBER(r2dx_v33_state::tile_bank_w) { - if(ACCESSING_BITS_0_7) { - int new_bank; - new_bank = ((data & 0x10)>>4); - if(new_bank != bg_bank) { - bg_bank = new_bank; - background_layer->mark_all_dirty(); - } + int new_bank; + new_bank = ((data & 0x10)>>4); + if(new_bank != m_bg_bank) { + m_bg_bank = new_bank; + m_background_layer->mark_all_dirty(); + } - new_bank = 2 + ((data & 0x20)>>5); - if(new_bank != mid_bank) { - mid_bank = new_bank; - midground_layer->mark_all_dirty(); - } + new_bank = 2 + ((data & 0x20)>>5); + if(new_bank != m_mid_bank) { + m_mid_bank = new_bank; + m_midground_layer->mark_all_dirty(); + } - new_bank = 4 | (data & 3); - if(new_bank != fg_bank) { - fg_bank = new_bank; - foreground_layer->mark_all_dirty(); - } + new_bank = 4 | (data & 3); + if(new_bank != m_fg_bank) { + m_fg_bank = new_bank; + m_foreground_layer->mark_all_dirty(); } } -void r2dx_v33_state::r2dx_setbanking(void) +void r2dx_v33_state::r2dx_setbanking() { - membank("bank1")->set_entry(m_r2dxgameselect*0x20 + m_r2dxbank + 16); - membank("bank3")->set_entry(m_r2dxgameselect); + m_mainbank[0]->set_entry(m_r2dxgameselect*0x10 + m_r2dxbank); + m_mainbank[1]->set_entry(m_r2dxgameselect); } WRITE16_MEMBER(r2dx_v33_state::rdx_v33_eeprom_w) @@ -216,12 +215,12 @@ WRITE16_MEMBER(r2dx_v33_state::rdx_v33_eeprom_w) // the bit gets set if it reads RAIDENDX from the EEPROM m_r2dxgameselect = (data & 0x04) >> 2; - tx_bank = m_r2dxgameselect; - text_layer->mark_all_dirty(); + m_tx_bank = m_r2dxgameselect; + m_text_layer->mark_all_dirty(); r2dx_setbanking(); - membank("okibank")->set_entry(data&3); + m_okibank->set_entry(data&3); } else @@ -308,55 +307,55 @@ WRITE16_MEMBER(r2dx_v33_state::r2dx_rom_bank_w) } -WRITE16_MEMBER(r2dx_v33_state::r2dx_angle_w) +WRITE16_MEMBER(r2dx_v33_state::angle_w) { - COMBINE_DATA(&m_r2dx_i_angle); + COMBINE_DATA(&m_angle); } -WRITE16_MEMBER(r2dx_v33_state::r2dx_dx_w) +WRITE16_MEMBER(r2dx_v33_state::dx_w) { - COMBINE_DATA(&m_r2dx_i_dx); + COMBINE_DATA(&m_dx); } -WRITE16_MEMBER(r2dx_v33_state::r2dx_dy_w) +WRITE16_MEMBER(r2dx_v33_state::dy_w) { - COMBINE_DATA(&m_r2dx_i_dy); + COMBINE_DATA(&m_dy); } -READ16_MEMBER(r2dx_v33_state::r2dx_angle_r) +READ16_MEMBER(r2dx_v33_state::angle_r) { - return m_math[((m_r2dx_i_dy & 0xff) << 8) | (m_r2dx_i_dx & 0xff)]; + return m_math[((m_dy & 0xff) << 8) | (m_dx & 0xff)]; } -READ16_MEMBER(r2dx_v33_state::r2dx_dist_r) +READ16_MEMBER(r2dx_v33_state::dist_r) { - return sqrt(double(m_r2dx_i_sdist)); + return sqrt(double(m_sdist)); } -READ16_MEMBER(r2dx_v33_state::r2dx_sin_r) +READ16_MEMBER(r2dx_v33_state::sin_r) { - int off = 65536 + (m_r2dx_i_angle & 0xff)*4; + int off = 65536 + (m_angle & 0xff)*4; return (m_math[off+0]) | (m_math[off+1] << 8); } -READ16_MEMBER(r2dx_v33_state::r2dx_cos_r) +READ16_MEMBER(r2dx_v33_state::cos_r) { - int off = 65536 + (m_r2dx_i_angle & 0xff)*4; + int off = 65536 + (m_angle & 0xff)*4; return (m_math[off+2]) | (m_math[off+3] << 8); } -WRITE16_MEMBER(r2dx_v33_state::r2dx_sdistl_w) +WRITE16_MEMBER(r2dx_v33_state::sdistl_w) { - m_r2dx_i_sdist = (m_r2dx_i_sdist & (0xffff0000 | uint16_t(~mem_mask))) | (data & mem_mask); + m_sdist = (m_sdist & (0xffff0000 | uint16_t(~mem_mask))) | (data & mem_mask); } -WRITE16_MEMBER(r2dx_v33_state::r2dx_sdisth_w) +WRITE16_MEMBER(r2dx_v33_state::sdisth_w) { - m_r2dx_i_sdist = (m_r2dx_i_sdist & (0x0000ffff | (uint16_t(~mem_mask)) << 16)) | ((data & mem_mask) << 16); + m_sdist = (m_sdist & (0x0000ffff | (uint16_t(~mem_mask)) << 16)) | ((data & mem_mask) << 16); } // these DMA operations seem to use hardcoded addresses on this hardware -WRITE16_MEMBER(r2dx_v33_state::r2dx_tilemapdma_w) +WRITE16_MEMBER(r2dx_v33_state::tilemapdma_w) { int src = 0xd000; @@ -368,7 +367,7 @@ WRITE16_MEMBER(r2dx_v33_state::r2dx_tilemapdma_w) } } -WRITE16_MEMBER(r2dx_v33_state::r2dx_paldma_w) +WRITE16_MEMBER(r2dx_v33_state::paldma_w) { int src = 0x1f000; @@ -390,23 +389,22 @@ void r2dx_v33_state::rdx_v33_map(address_map &map) { map(0x00000, 0x003ff).ram(); // vectors copied here - map(0x00400, 0x00401).w(FUNC(r2dx_v33_state::r2dx_tilemapdma_w)); // tilemaps to private buffer - map(0x00402, 0x00403).w(FUNC(r2dx_v33_state::r2dx_paldma_w)); // palettes to private buffer - + map(0x00400, 0x00401).w(FUNC(r2dx_v33_state::tilemapdma_w)); // tilemaps to private buffer + map(0x00402, 0x00403).w(FUNC(r2dx_v33_state::paldma_w)); // palettes to private buffer map(0x00404, 0x00405).w(FUNC(r2dx_v33_state::r2dx_rom_bank_w)); - map(0x00406, 0x00407).w(FUNC(r2dx_v33_state::tile_bank_w)); + map(0x00406, 0x00406).w(FUNC(r2dx_v33_state::tile_bank_w)); - map(0x00420, 0x00421).w(FUNC(r2dx_v33_state::r2dx_dx_w)); - map(0x00422, 0x00423).w(FUNC(r2dx_v33_state::r2dx_dy_w)); - map(0x00424, 0x00425).w(FUNC(r2dx_v33_state::r2dx_sdistl_w)); - map(0x00426, 0x00427).w(FUNC(r2dx_v33_state::r2dx_sdisth_w)); - map(0x00428, 0x00429).w(FUNC(r2dx_v33_state::r2dx_angle_w)); + map(0x00420, 0x00421).w(FUNC(r2dx_v33_state::dx_w)); + map(0x00422, 0x00423).w(FUNC(r2dx_v33_state::dy_w)); + map(0x00424, 0x00425).w(FUNC(r2dx_v33_state::sdistl_w)); + map(0x00426, 0x00427).w(FUNC(r2dx_v33_state::sdisth_w)); + map(0x00428, 0x00429).w(FUNC(r2dx_v33_state::angle_w)); - map(0x00430, 0x00431).r(FUNC(r2dx_v33_state::r2dx_angle_r)); - map(0x00432, 0x00433).r(FUNC(r2dx_v33_state::r2dx_dist_r)); - map(0x00434, 0x00435).r(FUNC(r2dx_v33_state::r2dx_sin_r)); - map(0x00436, 0x00437).r(FUNC(r2dx_v33_state::r2dx_cos_r)); + map(0x00430, 0x00431).r(FUNC(r2dx_v33_state::angle_r)); + map(0x00432, 0x00433).r(FUNC(r2dx_v33_state::dist_r)); + map(0x00434, 0x00435).r(FUNC(r2dx_v33_state::sin_r)); + map(0x00436, 0x00437).r(FUNC(r2dx_v33_state::cos_r)); map(0x00600, 0x0063f).rw("crtc", FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); //AM_RANGE(0x00640, 0x006bf) AM_DEVREADWRITE("obj", seibu_encrypted_sprite_device, read, write) @@ -428,7 +426,6 @@ void r2dx_v33_state::rdx_v33_map(address_map &map) map(0x006dc, 0x006dd).rw(FUNC(r2dx_v33_state::sprite_prot_maxx_r), FUNC(r2dx_v33_state::sprite_prot_maxx_w)); map(0x006de, 0x006df).w(FUNC(r2dx_v33_state::sprite_prot_src_w)); - map(0x00700, 0x00701).w(FUNC(r2dx_v33_state::rdx_v33_eeprom_w)); map(0x00740, 0x00741).r(FUNC(r2dx_v33_state::r2dx_debug_r)); map(0x00744, 0x00745).portr("INPUT"); @@ -440,18 +437,18 @@ void r2dx_v33_state::rdx_v33_map(address_map &map) map(0x00800, 0x00fff).ram(); // copies eeprom here? map(0x01000, 0x0bfff).ram(); - map(0x0c000, 0x0c7ff).ram().share("sprites"); + map(0x0c000, 0x0c7ff).ram().share("spriteram"); map(0x0c800, 0x0cfff).ram(); - map(0x0d000, 0x0d7ff).ram(); //_WRITE(raiden2_background_w) AM_SHARE("back_data") - map(0x0d800, 0x0dfff).ram(); //_WRITE(raiden2_foreground_w) AM_SHARE("fore_data") - map(0x0e000, 0x0e7ff).ram(); //_WRITE(raiden2_midground_w) AM_SHARE("mid_data") - map(0x0e800, 0x0f7ff).ram(); //_WRITE(raiden2_text_w) AM_SHARE("text_data") + map(0x0d000, 0x0d7ff).ram(); //_WRITE(background_w) AM_SHARE("back_data") + map(0x0d800, 0x0dfff).ram(); //_WRITE(foreground_w) AM_SHARE("fore_data") + map(0x0e000, 0x0e7ff).ram(); //_WRITE(midground_w) AM_SHARE("mid_data") + map(0x0e800, 0x0f7ff).ram(); //_WRITE(text_w) AM_SHARE("text_data") map(0x0f800, 0x0ffff).ram(); /* Stack area */ map(0x10000, 0x1efff).ram(); map(0x1f000, 0x1ffff).ram(); //_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") - map(0x20000, 0x2ffff).bankr("bank1").nopw(); - map(0x30000, 0xfffff).bankr("bank3").nopw(); + map(0x20000, 0x2ffff).bankr("mainbank1").nopw(); + map(0x30000, 0xfffff).bankr("mainbank2").nopw(); } @@ -459,23 +456,23 @@ void r2dx_v33_state::nzeroteam_base_map(address_map &map) { map(0x00000, 0x003ff).ram(); //stack area - map(0x00400, 0x00401).w(FUNC(r2dx_v33_state::r2dx_tilemapdma_w)); // tilemaps to private buffer - map(0x00402, 0x00403).w(FUNC(r2dx_v33_state::r2dx_paldma_w)); // palettes to private buffer + map(0x00400, 0x00401).w(FUNC(r2dx_v33_state::tilemapdma_w)); // tilemaps to private buffer + map(0x00402, 0x00403).w(FUNC(r2dx_v33_state::paldma_w)); // palettes to private buffer // 0x404 is bank on r2dx, this doesn't need it - // AM_RANGE(0x00406, 0x00407) AM_WRITE(tile_bank_w) // not the same? + // AM_RANGE(0x00406, 0x00406) AM_WRITE(tile_bank_w) // not the same? map(0x00406, 0x00407).noprw(); // always 6022, supposed to be the tile bank but ignores the actual value??? - map(0x00420, 0x00421).w(FUNC(r2dx_v33_state::r2dx_dx_w)); - map(0x00422, 0x00423).w(FUNC(r2dx_v33_state::r2dx_dy_w)); - map(0x00424, 0x00425).w(FUNC(r2dx_v33_state::r2dx_sdistl_w)); - map(0x00426, 0x00427).w(FUNC(r2dx_v33_state::r2dx_sdisth_w)); - map(0x00428, 0x00429).w(FUNC(r2dx_v33_state::r2dx_angle_w)); + map(0x00420, 0x00421).w(FUNC(r2dx_v33_state::dx_w)); + map(0x00422, 0x00423).w(FUNC(r2dx_v33_state::dy_w)); + map(0x00424, 0x00425).w(FUNC(r2dx_v33_state::sdistl_w)); + map(0x00426, 0x00427).w(FUNC(r2dx_v33_state::sdisth_w)); + map(0x00428, 0x00429).w(FUNC(r2dx_v33_state::angle_w)); - map(0x00430, 0x00431).r(FUNC(r2dx_v33_state::r2dx_angle_r)); - map(0x00432, 0x00433).r(FUNC(r2dx_v33_state::r2dx_dist_r)); - map(0x00434, 0x00435).r(FUNC(r2dx_v33_state::r2dx_sin_r)); - map(0x00436, 0x00437).r(FUNC(r2dx_v33_state::r2dx_cos_r)); + map(0x00430, 0x00431).r(FUNC(r2dx_v33_state::angle_r)); + map(0x00432, 0x00433).r(FUNC(r2dx_v33_state::dist_r)); + map(0x00434, 0x00435).r(FUNC(r2dx_v33_state::sin_r)); + map(0x00436, 0x00437).r(FUNC(r2dx_v33_state::cos_r)); map(0x00600, 0x0063f).rw("crtc", FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); //map(0x00640, 0x006bf)rw("obj", FUNC(seibu_encrypted_sprite_device::read), FUNC(seibu_encrypted_sprite_device::write)); @@ -499,12 +496,12 @@ void r2dx_v33_state::nzeroteam_base_map(address_map &map) map(0x00800, 0x00fff).ram(); map(0x01000, 0x0bfff).ram(); - map(0x0c000, 0x0c7ff).ram().share("sprites"); + map(0x0c000, 0x0c7ff).ram().share("spriteram"); map(0x0c800, 0x0cfff).ram(); - map(0x0d000, 0x0d7ff).ram(); //.w(FUNC(r2dx_v33_state::raiden2_background_w)).share("back_data"); - map(0x0d800, 0x0dfff).ram(); //.w(FUNC(r2dx_v33_state::raiden2_foreground_w)).share("fore_data"); - map(0x0e000, 0x0e7ff).ram(); //.w(FUNC(r2dx_v33_state::raiden2_midground_w)).share("mid_data"); - map(0x0e800, 0x0f7ff).ram(); //.w(FUNC(r2dx_v33_state::raiden2_text_w)).share("text_data"); + map(0x0d000, 0x0d7ff).ram(); //.w(FUNC(r2dx_v33_state::background_w)).share("back_data"); + map(0x0d800, 0x0dfff).ram(); //.w(FUNC(r2dx_v33_state::foreground_w)).share("fore_data"); + map(0x0e000, 0x0e7ff).ram(); //.w(FUNC(r2dx_v33_state::midground_w)).share("mid_data"); + map(0x0e800, 0x0f7ff).ram(); //.w(FUNC(r2dx_v33_state::text_w)).share("text_data"); map(0x0f800, 0x0ffff).ram(); /* Stack area */ map(0x10000, 0x1efff).ram(); map(0x1f000, 0x1ffff).ram(); //.w("palette", FUNC(palette_device::write)).share("palette"); @@ -540,56 +537,6 @@ void r2dx_v33_state::zerotm2k_map(address_map &map) -INTERRUPT_GEN_MEMBER(r2dx_v33_state::rdx_v33_interrupt) -{ - device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xc0/4); /* VBL */ -} - -static const gfx_layout rdx_v33_charlayout = -{ - 8,8, - RGN_FRAC(1,1), - 4, - { 8,12,0,4 }, - { 3,2,1,0,19,18,17,16 }, - { STEP8(0,32) }, - 32*8 -}; - - -static const gfx_layout rdx_v33_tilelayout = -{ - 16,16, - RGN_FRAC(1,1), - 4, - { 8,12,0,4 }, - { - 3,2,1,0, - 19,18,17,16, - 3+64*8, 2+64*8, 1+64*8, 0+64*8, - 19+64*8,18+64*8,17+64*8,16+64*8, - }, - { STEP16(0,32) }, - 128*8 -}; - -static const gfx_layout rdx_v33_spritelayout = -{ - 16, 16, - RGN_FRAC(1,1), - 4, - { STEP4(0,1) }, - { 4, 0, 12, 8, 20, 16, 28, 24, 36, 32, 44, 40, 52, 48, 60, 56 }, - { STEP16(0,64) }, - 16*16*4 -}; - -static GFXDECODE_START( gfx_rdx_v33 ) - GFXDECODE_ENTRY( "gfx1", 0x00000, rdx_v33_charlayout, 0x700, 128 ) - GFXDECODE_ENTRY( "gfx2", 0x00000, rdx_v33_tilelayout, 0x400, 128 ) - GFXDECODE_ENTRY( "gfx3", 0x00000, rdx_v33_spritelayout, 0x000, 4096 ) -GFXDECODE_END - static INPUT_PORTS_START( rdx_v33 ) PORT_START("SYSTEM") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) @@ -766,16 +713,12 @@ INPUT_PORTS_END MACHINE_RESET_MEMBER(r2dx_v33_state,r2dx_v33) { - common_reset(); + bank_reset(0,6,2,0); } MACHINE_RESET_MEMBER(r2dx_v33_state,nzeroteam) { - common_reset(); - - bg_bank = 0; - fg_bank = 2; - mid_bank = 1; + bank_reset(0,2,1,0); } void r2dx_v33_state::r2dx_oki_map(address_map &map) @@ -788,7 +731,7 @@ void r2dx_v33_state::rdx_v33(machine_config &config) /* basic machine hardware */ V33(config, m_maincpu, 32000000/2); // ? m_maincpu->set_addrmap(AS_PROGRAM, &r2dx_v33_state::rdx_v33_map); - m_maincpu->set_vblank_int("screen", FUNC(r2dx_v33_state::rdx_v33_interrupt)); + m_maincpu->set_vblank_int("screen", FUNC(r2dx_v33_state::interrupt)); MCFG_MACHINE_RESET_OVERRIDE(r2dx_v33_state,r2dx_v33) @@ -800,16 +743,14 @@ void r2dx_v33_state::rdx_v33(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(500)); /* not accurate */ screen.set_size(44*8, 34*8); screen.set_visarea(0*8, 40*8-1, 0, 30*8-1); - screen.set_screen_update(FUNC(raiden2_state::screen_update_raiden2)); + screen.set_screen_update(FUNC(r2dx_v33_state::screen_update)); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_rdx_v33); + GFXDECODE(config, m_gfxdecode, m_palette, r2dx_v33_state::gfx_raiden2); PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048); - MCFG_VIDEO_START_OVERRIDE(raiden2_state,raiden2) - seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); - crtc.layer_en_callback().set(FUNC(raiden2_state::tilemap_enable_w)); - crtc.layer_scroll_callback().set(FUNC(raiden2_state::tile_scroll_w)); + crtc.layer_en_callback().set(FUNC(r2dx_v33_state::tilemap_enable_w)); + crtc.layer_scroll_callback().set(FUNC(r2dx_v33_state::tile_scroll_w)); /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -824,7 +765,7 @@ void r2dx_v33_state::nzerotea(machine_config &config) /* basic machine hardware */ V33(config, m_maincpu, XTAL(32'000'000)/2); /* verified on pcb */ m_maincpu->set_addrmap(AS_PROGRAM, &r2dx_v33_state::nzerotea_map); - m_maincpu->set_vblank_int("screen", FUNC(r2dx_v33_state::rdx_v33_interrupt)); + m_maincpu->set_vblank_int("screen", FUNC(r2dx_v33_state::interrupt)); MCFG_MACHINE_RESET_OVERRIDE(r2dx_v33_state,nzeroteam) @@ -838,16 +779,14 @@ void r2dx_v33_state::nzerotea(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(500)); /* not accurate */ screen.set_size(44*8, 34*8); screen.set_visarea(0*8, 40*8-1, 0, 32*8-1); - screen.set_screen_update(FUNC(raiden2_state::screen_update_raiden2)); + screen.set_screen_update(FUNC(r2dx_v33_state::screen_update)); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_rdx_v33); + GFXDECODE(config, m_gfxdecode, m_palette, r2dx_v33_state::gfx_raiden2); PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048); - MCFG_VIDEO_START_OVERRIDE(raiden2_state,raiden2) - seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); - crtc.layer_en_callback().set(FUNC(raiden2_state::tilemap_enable_w)); - crtc.layer_scroll_callback().set(FUNC(raiden2_state::tile_scroll_w)); + crtc.layer_en_callback().set(FUNC(r2dx_v33_state::tilemap_enable_w)); + crtc.layer_scroll_callback().set(FUNC(r2dx_v33_state::tile_scroll_w)); /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -879,23 +818,20 @@ void r2dx_v33_state::init_rdx_v33() { init_blending(raiden_blended_colors); static const int spri[5] = { 0, 1, 2, 3, -1 }; - cur_spri = spri; - - membank("bank1")->configure_entries(0, 0x40, memregion("maincpu")->base(), 0x10000); - - membank("bank3")->configure_entry(0, memregion("maincpu")->base()+0x030000); // 0x30000 - 0xfffff bank for Raiden 2 - membank("bank3")->configure_entry(1, memregion("maincpu")->base()+0x230000); // 0x30000 - 0xfffff bank for Raiden DX + m_cur_spri = spri; + m_mainbank[0]->configure_entries( 0, 0x10, memregion("maincpu")->base() + 0x100000, 0x010000); // 0x20000 - 0x2ffff bank for Raiden 2 + m_mainbank[0]->configure_entries(0x10, 0x10, memregion("maincpu")->base() + 0x300000, 0x010000); // 0x20000 - 0x2ffff bank for Raiden DX + m_mainbank[1]->configure_entries( 0, 2, memregion("maincpu")->base() + 0x030000, 0x200000); raiden2_decrypt_sprites(machine()); // sensible defaults if booting as R2 - membank("bank1")->set_entry(0); - membank("bank3")->set_entry(0); + m_mainbank[0]->set_entry(0); + m_mainbank[1]->set_entry(0); - - membank("okibank")->configure_entries(0, 4, memregion("oki")->base(), 0x40000); - membank("okibank")->set_entry(0); + m_okibank->configure_entries(0, 4, memregion("oki")->base(), 0x40000); + m_okibank->set_entry(0); } @@ -903,7 +839,7 @@ void r2dx_v33_state::init_nzerotea() { init_blending(zeroteam_blended_colors); static const int spri[5] = { -1, 0, 1, 2, 3 }; - cur_spri = spri; + m_cur_spri = spri; zeroteam_decrypt_sprites(machine()); } @@ -912,7 +848,7 @@ void r2dx_v33_state::init_zerotm2k() { init_blending(zeroteam_blended_colors); static const int spri[5] = { -1, 0, 1, 2, 3 }; - cur_spri = spri; + m_cur_spri = spri; // no sprite encryption(!) diff --git a/src/mame/drivers/raiden2.cpp b/src/mame/drivers/raiden2.cpp index 3109b3c6d36..6701e868533 100644 --- a/src/mame/drivers/raiden2.cpp +++ b/src/mame/drivers/raiden2.cpp @@ -180,31 +180,43 @@ Protection Notes: #include "machine/r2crypt.h" #include "debugger.h" -#include "screen.h" #include "speaker.h" +void raiden2_state::common_save_state() +{ + save_item(NAME(m_bg_bank)); + save_item(NAME(m_fg_bank)); + save_item(NAME(m_mid_bank)); + save_item(NAME(m_tx_bank)); + save_item(NAME(m_tilemap_enable)); + save_item(NAME(m_prg_bank)); + save_item(NAME(m_cop_bank)); + + save_item(NAME(m_sprite_prot_x)); + save_item(NAME(m_sprite_prot_y)); + save_item(NAME(m_dst1)); + save_item(NAME(m_cop_spr_maxx)); + save_item(NAME(m_cop_spr_off)); + + save_item(NAME(m_scrollvals)); + + save_item(NAME(m_sprite_prot_src_addr)); +} + void raiden2_state::machine_start() { - save_item(NAME(bg_bank)); - save_item(NAME(fg_bank)); - save_item(NAME(mid_bank)); - save_item(NAME(tx_bank)); - save_item(NAME(raiden2_tilemap_enable)); - save_item(NAME(prg_bank)); - save_item(NAME(cop_bank)); - - save_item(NAME(sprite_prot_x)); - save_item(NAME(sprite_prot_y)); - save_item(NAME(dst1)); - save_item(NAME(cop_spr_maxx)); - save_item(NAME(cop_spr_off)); - - - save_item(NAME(scrollvals)); - - save_item(NAME(sprite_prot_src_addr)); + common_save_state(); + save_item(NAME(m_sprcpt_adr)); + save_item(NAME(m_sprcpt_idx)); + save_item(NAME(m_sprcpt_val)); + save_item(NAME(m_sprcpt_flags1)); + save_item(NAME(m_sprcpt_flags2)); + save_item(NAME(m_sprcpt_data_1)); + save_item(NAME(m_sprcpt_data_2)); + save_item(NAME(m_sprcpt_data_3)); + save_item(NAME(m_sprcpt_data_4)); } /* @@ -219,38 +231,6 @@ uint16_t raiden2_state::rpc() } */ -int cnt=0, ccol = -1; - - -WRITE16_MEMBER(raiden2_state::m_videoram_private_w) -{ - // map(0x0d000, 0x0d7ff).ram().w(FUNC(raiden2_state::raiden2_background_w)).share("back_data"); - // map(0x0d800, 0x0dfff).ram().w(FUNC(raiden2_state::raiden2_foreground_w).share("fore_data"); - // map(0x0e000, 0x0e7ff).ram().w(FUNC(raiden2_state::raiden2_midground_w).share("mid_data"); - // map(0x0e800, 0x0f7ff).ram().w(FUNC(raiden2_state::raiden2_text_w).share("text_data"); - - if (offset < 0x800 / 2) - { - raiden2_background_w(space, offset, data, 0xffff); - } - else if (offset < 0x1000 /2) - { - offset -= 0x800 / 2; - raiden2_foreground_w(space, offset, data, 0xffff); - } - else if (offset < 0x1800/2) - { - offset -= 0x1000 / 2; - raiden2_midground_w(space, offset, data, 0xffff); - } - else if (offset < 0x2800/2) - { - offset -= 0x1800 / 2; - raiden2_text_w(space, offset, data, 0xffff); - } -} - - void raiden2_state::combine32(uint32_t *val, int offset, uint16_t data, uint16_t mem_mask) { @@ -259,465 +239,98 @@ void raiden2_state::combine32(uint32_t *val, int offset, uint16_t data, uint16_t } - -/* SPRITE DRAWING (move to video file) */ - -void raiden2_state::draw_sprites(const rectangle &cliprect) -{ - uint16_t *source = sprites + (0x1000/2)-4; - sprite_buffer.fill(0xf, cliprect); - - gfx_element *gfx = m_gfxdecode->gfx(2); - - /* - 00 fhhh Fwww ppcc cccc h = height f=flipy w = width F = flipx p = priority c = color - 02 nnnn nnnn nnnn nnnn n = tileno - 04 xxxx xxxx xxxx xxxx x = xpos - 06 yyyy yyyy yyyy yyyy y = ypos - */ - - while( source >= sprites ){ - int tile_number = source[1]; - int sx = source[2]; - int sy = source[3]; - int colr; - int xtiles, ytiles; - int ytlim, xtlim; - int xflip, yflip; - int xstep, ystep; - int pri; - - ytlim = (source[0] >> 12) & 0x7; - xtlim = (source[0] >> 8 ) & 0x7; - - xflip = (source[0] >> 15) & 0x1; - yflip = (source[0] >> 11) & 0x1; - - colr = source[0] & 0x3f; - - pri = (source[0] >> 6) & 3; - - colr |= pri << (14-4); - - ytlim += 1; - xtlim += 1; - - xstep = 16; - ystep = 16; - - if (xflip) - { - ystep = -16; - sy += ytlim*16-16; - } - - if (yflip) - { - xstep = -16; - sx += xtlim*16-16; - } - - for (xtiles = 0; xtiles < xtlim; xtiles++) - { - for (ytiles = 0; ytiles < ytlim; ytiles++) - { - /* note this wraparound handling could be wrong if some of the COP maths is wrong */ - -#define ZEROTEAM_MASK_X (0x1ff) // causes a blank square in the corner of zero team, but otherwise the thrusters of the ship in the r2 intro are clipped, using 0x8000 as a sign bit instead of this logic works for r2, but not zero team -#define ZEROTEAM_MASK_Y (0x1ff) - - - - gfx->transpen( - sprite_buffer, - cliprect, - tile_number, - colr, - yflip,xflip, - (sx+xstep*xtiles)&ZEROTEAM_MASK_X,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, 15); - - - gfx->transpen( - sprite_buffer, - cliprect, - tile_number, - colr, - yflip,xflip, - ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, 15); - - - gfx->transpen( - sprite_buffer, - cliprect, - tile_number, - colr, - yflip,xflip, - (sx+xstep*xtiles)&ZEROTEAM_MASK_X,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, 15); - - - gfx->transpen( - sprite_buffer, - cliprect, - tile_number, - colr, - yflip,xflip, - ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, 15); - - - tile_number++; - } - } - - source -= 4; - } - -} - -/* VIDEO RELATED WRITE HANDLERS (move to video file) */ - -WRITE16_MEMBER(raiden2_state::raiden2_background_w) -{ - COMBINE_DATA(&m_back_data[offset]); - background_layer->mark_tile_dirty(offset); -} - -WRITE16_MEMBER(raiden2_state::raiden2_midground_w) -{ - COMBINE_DATA(&m_mid_data[offset]); - midground_layer->mark_tile_dirty(offset); -} - -WRITE16_MEMBER(raiden2_state::raiden2_foreground_w) -{ - COMBINE_DATA(&m_fore_data[offset]); - foreground_layer->mark_tile_dirty(offset); -} - -WRITE16_MEMBER(raiden2_state::raiden2_text_w) -{ - COMBINE_DATA(&m_text_data[offset]); - text_layer->mark_tile_dirty(offset); -} - -WRITE16_MEMBER(raiden2_state::tilemap_enable_w) -{ - COMBINE_DATA(&raiden2_tilemap_enable); -} - -WRITE16_MEMBER(raiden2_state::tile_scroll_w) -{ - tilemap_t *tm = nullptr; - switch(offset/2) { - case 0: tm = background_layer; break; - case 1: tm = midground_layer; break; - case 2: tm = foreground_layer; break; - default: assert(0); break; - } - - COMBINE_DATA(scrollvals + offset); - data = scrollvals[offset]; - - if(offset & 1) - tm->set_scrolly(0, data); - else - tm->set_scrollx(0, data); -} - -WRITE16_MEMBER(raiden2_state::tile_bank_01_w) -{ - if(ACCESSING_BITS_0_7) { - int new_bank; - new_bank = 0 | ((data & 1)<<1); - if(new_bank != bg_bank) { - bg_bank = new_bank; - background_layer->mark_all_dirty(); - } - - new_bank = 1 | (data & 2); - if(new_bank != mid_bank) { - mid_bank = new_bank; - midground_layer->mark_all_dirty(); - } - } -} - -READ16_MEMBER(raiden2_state::cop_tile_bank_2_r) -{ - return cop_bank; -} - -WRITE16_MEMBER(raiden2_state::cop_tile_bank_2_w) -{ - COMBINE_DATA(&cop_bank); - - if(ACCESSING_BITS_8_15) { - int new_bank = 4 | (data >> 14); - if(new_bank != fg_bank) { - fg_bank = new_bank; - foreground_layer->mark_all_dirty(); - } - } -} - -WRITE16_MEMBER(raiden2_state::raidendx_cop_bank_2_w) -{ - COMBINE_DATA(&cop_bank); - - int new_bank = 4 | ((cop_bank >> 4) & 3); - if(new_bank != fg_bank) { - fg_bank = new_bank; - foreground_layer->mark_all_dirty(); - } - - /* mainbank2 coming from 6c9 ? */ - int bb = cop_bank >> 12; - membank("mainbank1")->set_entry(bb + 16); - membank("mainbank2")->set_entry(3); -} - - - -/* TILEMAP RELATED (move to video file) */ - -TILE_GET_INFO_MEMBER(raiden2_state::get_back_tile_info) -{ - int tile = m_back_data[tile_index]; - int color = (tile >> 12) | (0 << 4); - - tile = (tile & 0xfff) | (bg_bank << 12); - - SET_TILE_INFO_MEMBER(1,tile+0x0000,color,0); -} - -TILE_GET_INFO_MEMBER(raiden2_state::get_mid_tile_info) -{ - int tile = m_mid_data[tile_index]; - int color = (tile >> 12) | (2 << 4); - - tile = (tile & 0xfff) | (mid_bank << 12); - - SET_TILE_INFO_MEMBER(1,tile,color,0); -} - -TILE_GET_INFO_MEMBER(raiden2_state::get_fore_tile_info) -{ - int tile = m_fore_data[tile_index]; - int color = (tile >> 12) | (1 << 4); - - tile = (tile & 0xfff) | (fg_bank << 12); - - SET_TILE_INFO_MEMBER(1,tile,color,0); -} - -TILE_GET_INFO_MEMBER(raiden2_state::get_text_tile_info) -{ - int tile = m_text_data[tile_index]; - int color = (tile>>12)&0xf; - - tile &= 0xfff; - - SET_TILE_INFO_MEMBER(0,tile + tx_bank * 0x1000,color,0); -} - -/* VIDEO START (move to video file) */ - - -VIDEO_START_MEMBER(raiden2_state,raiden2) -{ - m_back_data = make_unique_clear(0x800/2); - m_fore_data = make_unique_clear(0x800/2); - m_mid_data = make_unique_clear(0x800/2); - m_text_data = make_unique_clear(0x1000/2); - m_palette_data = make_unique_clear(0x1000/2); - m_palette->basemem().set(m_palette_data.get(), 0x1000/2 * sizeof(uint16_t), 16, ENDIANNESS_LITTLE, 2); - - save_pointer(NAME(m_back_data), 0x800/2); - save_pointer(NAME(m_fore_data), 0x800/2); - save_pointer(NAME(m_mid_data), 0x800/2); - save_pointer(NAME(m_text_data), 0x1000/2); - save_pointer(NAME(m_palette_data), 0x1000/2); - - text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_text_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64,32 ); - background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_back_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 ); - midground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_mid_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 ); - foreground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_fore_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 ); -} - -/* screen_update_raiden2 (move to video file) */ - -void raiden2_state::blend_layer(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind16 &source, int layer) -{ - if(layer == -1) - return; - - const pen_t *pens = &m_palette->pen(0); - layer <<= 14; - for(int y = cliprect.min_y; y <= cliprect.max_y; y++) { - const uint16_t *src = &source.pix16(y, cliprect.min_x); - uint32_t *dst = &bitmap.pix32(y, cliprect.min_x); - for(int x = cliprect.min_x; x <= cliprect.max_x; x++) { - uint16_t val = *src++; - if((val & 0xc000) == layer && (val & 0x000f) != 0x000f) { - val &= 0x07ff; - - if(blend_active[val]) - *dst = alpha_blend_r32(*dst, pens[val], 0x7f); - else - *dst = pens[val]; - } - dst++; - } - } -} - -void raiden2_state::tilemap_draw_and_blend(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tilemap) -{ - tilemap->draw(screen, tile_buffer, cliprect, 0, 0); - blend_layer(bitmap, cliprect, tile_buffer, 0); -} - -uint32_t raiden2_state::screen_update_raiden2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - bitmap.fill(m_palette->black_pen(), cliprect); - if (!(raiden2_tilemap_enable & 16)) { - draw_sprites(cliprect); - - blend_layer(bitmap, cliprect, sprite_buffer, cur_spri[0]); - } - - if (!(raiden2_tilemap_enable & 1)) - tilemap_draw_and_blend(screen, bitmap, cliprect, background_layer); - - if (!(raiden2_tilemap_enable & 16)) - blend_layer(bitmap, cliprect, sprite_buffer, cur_spri[1]); - - if (!(raiden2_tilemap_enable & 2)) - tilemap_draw_and_blend(screen, bitmap, cliprect, midground_layer); - - if (!(raiden2_tilemap_enable & 16)) - blend_layer(bitmap, cliprect, sprite_buffer, cur_spri[2]); - - if (!(raiden2_tilemap_enable & 4)) - tilemap_draw_and_blend(screen, bitmap, cliprect, foreground_layer); - - if (!(raiden2_tilemap_enable & 16)) - blend_layer(bitmap, cliprect, sprite_buffer, cur_spri[3]); - - if (!(raiden2_tilemap_enable & 8)) - tilemap_draw_and_blend(screen, bitmap, cliprect, text_layer); - - if (!(raiden2_tilemap_enable & 16)) - blend_layer(bitmap, cliprect, sprite_buffer, cur_spri[4]); - - if (machine().input().code_pressed_once(KEYCODE_Z)) - if (m_raiden2cop) m_raiden2cop->dump_table(); - - return 0; -} - - - - /************************************* * * Interrupts * *************************************/ -INTERRUPT_GEN_MEMBER(raiden2_state::raiden2_interrupt) +INTERRUPT_GEN_MEMBER(raiden2_state::interrupt) { device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xc0/4); /* VBL */ } - - // Sprite encryption key upload -static uint32_t sprcpt_adr, sprcpt_idx; - -static uint16_t sprcpt_flags2; -static uint32_t sprcpt_val[2], sprcpt_flags1; -static uint32_t sprcpt_data_1[0x100], sprcpt_data_2[0x40], sprcpt_data_3[6], sprcpt_data_4[4]; - -void raiden2_state::sprcpt_init(void) +void raiden2_state::sprcpt_init() { - memset(sprcpt_data_1, 0, sizeof(sprcpt_data_1)); - memset(sprcpt_data_2, 0, sizeof(sprcpt_data_2)); - memset(sprcpt_data_3, 0, sizeof(sprcpt_data_3)); - memset(sprcpt_data_4, 0, sizeof(sprcpt_data_4)); + std::fill(std::begin(m_sprcpt_data_1), std::end(m_sprcpt_data_1), 0); + std::fill(std::begin(m_sprcpt_data_2), std::end(m_sprcpt_data_2), 0); + std::fill(std::begin(m_sprcpt_data_3), std::end(m_sprcpt_data_3), 0); + std::fill(std::begin(m_sprcpt_data_4), std::end(m_sprcpt_data_4), 0); - sprcpt_adr = 0; - sprcpt_idx = 0; + m_sprcpt_adr = 0; + m_sprcpt_idx = 0; } WRITE16_MEMBER(raiden2_state::sprcpt_adr_w) { - combine32(&sprcpt_adr, offset, data, mem_mask); + combine32(&m_sprcpt_adr, offset, data, mem_mask); } WRITE16_MEMBER(raiden2_state::sprcpt_data_1_w) { - combine32(sprcpt_data_1+sprcpt_adr, offset, data, mem_mask); + combine32(m_sprcpt_data_1+m_sprcpt_adr, offset, data, mem_mask); } WRITE16_MEMBER(raiden2_state::sprcpt_data_2_w) { - combine32(sprcpt_data_2+sprcpt_adr, offset, data, mem_mask); + combine32(m_sprcpt_data_2+m_sprcpt_adr, offset, data, mem_mask); } WRITE16_MEMBER(raiden2_state::sprcpt_data_3_w) { - combine32(sprcpt_data_3+sprcpt_idx, offset, data, mem_mask); + combine32(m_sprcpt_data_3+m_sprcpt_idx, offset, data, mem_mask); if(offset == 1) { - sprcpt_idx ++; - if(sprcpt_idx == 6) - sprcpt_idx = 0; + m_sprcpt_idx ++; + if(m_sprcpt_idx == 6) + m_sprcpt_idx = 0; } } WRITE16_MEMBER(raiden2_state::sprcpt_data_4_w) { - combine32(sprcpt_data_4+sprcpt_idx, offset, data, mem_mask); + combine32(m_sprcpt_data_4+m_sprcpt_idx, offset, data, mem_mask); if(offset == 1) { - sprcpt_idx ++; - if(sprcpt_idx == 4) - sprcpt_idx = 0; + m_sprcpt_idx ++; + if(m_sprcpt_idx == 4) + m_sprcpt_idx = 0; } } WRITE16_MEMBER(raiden2_state::sprcpt_val_1_w) { - combine32(sprcpt_val+0, offset, data, mem_mask); + combine32(m_sprcpt_val+0, offset, data, mem_mask); } WRITE16_MEMBER(raiden2_state::sprcpt_val_2_w) { - combine32(sprcpt_val+1, offset, data, mem_mask); + combine32(m_sprcpt_val+1, offset, data, mem_mask); } WRITE16_MEMBER(raiden2_state::sprcpt_flags_1_w) { - combine32(&sprcpt_flags1, offset, data, mem_mask); + combine32(&m_sprcpt_flags1, offset, data, mem_mask); if(offset == 1) { // bit 31: 1 = allow write on sprcpt data - if(!(sprcpt_flags1 & 0x80000000U)) { + if(!(m_sprcpt_flags1 & 0x80000000U)) { // Upload finished if(1) { int i; - logerror("sprcpt_val 1: %08x\n", sprcpt_val[0]); - logerror("sprcpt_val 2: %08x\n", sprcpt_val[1]); + logerror("sprcpt_val 1: %08x\n", m_sprcpt_val[0]); + logerror("sprcpt_val 2: %08x\n", m_sprcpt_val[1]); logerror("sprcpt_data 1:\n"); for(i=0; i<0x100; i++) { - logerror(" %08x", sprcpt_data_1[i]); + logerror(" %08x", m_sprcpt_data_1[i]); if(!((i+1) & 7)) logerror("\n"); } logerror("sprcpt_data 2:\n"); for(i=0; i<0x40; i++) { - logerror(" %08x", sprcpt_data_2[i]); + logerror(" %08x", m_sprcpt_data_2[i]); if(!((i+1) & 7)) logerror("\n"); } @@ -728,167 +341,158 @@ WRITE16_MEMBER(raiden2_state::sprcpt_flags_1_w) WRITE16_MEMBER(raiden2_state::sprcpt_flags_2_w) { - COMBINE_DATA(&sprcpt_flags2); + COMBINE_DATA(&m_sprcpt_flags2); if(offset == 0) { - if(sprcpt_flags2 & 0x8000) { + if(m_sprcpt_flags2 & 0x8000) { // Reset decryption -> redo it } } } - -void raiden2_state::common_reset() +void raiden2_state::bank_reset(int bgbank, int fgbank, int midbank, int txbank) { - bg_bank=0; - fg_bank=6; - mid_bank=1; - tx_bank = 0; + m_bg_bank = bgbank; + m_fg_bank = fgbank; + m_mid_bank = midbank; + m_tx_bank = txbank; } MACHINE_RESET_MEMBER(raiden2_state,raiden2) { - common_reset(); + bank_reset(0,6,1,0); sprcpt_init(); - membank("mainbank1")->set_entry(2); - membank("mainbank2")->set_entry(3); + m_mainbank[0]->set_entry(2); + m_mainbank[1]->set_entry(3); - prg_bank = 0; + m_prg_bank = 0; //cop_init(); } MACHINE_RESET_MEMBER(raiden2_state,raidendx) { - common_reset(); + bank_reset(0,6,1,0); sprcpt_init(); - membank("mainbank1")->set_entry(16); - membank("mainbank2")->set_entry(3); + m_mainbank[0]->set_entry(16); + m_mainbank[1]->set_entry(3); - prg_bank = 0x08; + m_prg_bank = 0x08; //cop_init(); } MACHINE_RESET_MEMBER(raiden2_state,zeroteam) { - bg_bank = 0; - fg_bank = 2; - mid_bank = 1; - tx_bank = 0; + bank_reset(0,2,1,0); sprcpt_init(); - membank("mainbank1")->set_entry(2); - membank("mainbank2")->set_entry(3); + m_mainbank[0]->set_entry(2); + m_mainbank[1]->set_entry(3); - prg_bank = 0; + m_prg_bank = 0; //cop_init(); } MACHINE_RESET_MEMBER(raiden2_state,xsedae) { - bg_bank = 0; - fg_bank = 2; - mid_bank = 1; - tx_bank = 0; + bank_reset(0,2,1,0); sprcpt_init(); } -WRITE16_MEMBER(raiden2_state::raiden2_bank_w) +WRITE8_MEMBER(raiden2_state::raiden2_bank_w) { - if(ACCESSING_BITS_8_15) { - int bb = (~data >> 15) & 1; - logerror("select bank %d %04x\n", (data >> 15) & 1, data); - membank("mainbank1")->set_entry(bb*2); - membank("mainbank2")->set_entry(bb*2+1); - prg_bank = ((data >> 15) & 1); - } + int bb = (~data >> 7) & 1; + logerror("select bank %d %04x\n", (data >> 7) & 1, data); + m_mainbank[0]->set_entry(bb*2); + m_mainbank[1]->set_entry(bb*2+1); + m_prg_bank = ((data >> 7) & 1); } WRITE16_MEMBER(raiden2_state::sprite_prot_x_w) { - sprite_prot_x = data; - //popmessage("%04x %04x",sprite_prot_x,sprite_prot_y); + m_sprite_prot_x = data; + //popmessage("%04x %04x",m_sprite_prot_x,m_sprite_prot_y); } WRITE16_MEMBER(raiden2_state::sprite_prot_y_w) { - sprite_prot_y = data; - //popmessage("%04x %04x",sprite_prot_x,sprite_prot_y); + m_sprite_prot_y = data; + //popmessage("%04x %04x",m_sprite_prot_x,m_sprite_prot_y); } WRITE16_MEMBER(raiden2_state::sprite_prot_src_seg_w) { - sprite_prot_src_addr[0] = data; + m_sprite_prot_src_addr[0] = data; } READ16_MEMBER(raiden2_state::sprite_prot_src_seg_r) { - return sprite_prot_src_addr[0]; + return m_sprite_prot_src_addr[0]; } WRITE16_MEMBER(raiden2_state::sprite_prot_src_w) { - sprite_prot_src_addr[1] = data; - uint32_t src = (sprite_prot_src_addr[0]<<4)+sprite_prot_src_addr[1]; + m_sprite_prot_src_addr[1] = data; + uint32_t src = (m_sprite_prot_src_addr[0]<<4)+m_sprite_prot_src_addr[1]; - int x = int16_t((space.read_dword(src+0x08) >> 16) - (sprite_prot_x)); - int y = int16_t((space.read_dword(src+0x04) >> 16) - (sprite_prot_y)); + int x = int16_t((space.read_dword(src+0x08) >> 16) - (m_sprite_prot_x)); + int y = int16_t((space.read_dword(src+0x04) >> 16) - (m_sprite_prot_y)); - uint16_t head1 = space.read_word(src+cop_spr_off); - uint16_t head2 = space.read_word(src+cop_spr_off+2); + uint16_t head1 = space.read_word(src+m_cop_spr_off); + uint16_t head2 = space.read_word(src+m_cop_spr_off+2); int w = (((head1 >> 8 ) & 7) + 1) << 4; int h = (((head1 >> 12) & 7) + 1) << 4; - uint16_t flag = x-w/2 > -w && x-w/2 < cop_spr_maxx+w && y-h/2 > -h && y-h/2 < 256+h ? 1 : 0; + uint16_t flag = x-w/2 > -w && x-w/2 < m_cop_spr_maxx+w && y-h/2 > -h && y-h/2 < 256+h ? 1 : 0; flag = (space.read_word(src) & 0xfffe) | flag; space.write_word(src, flag); if(flag & 1) { - space.write_word(dst1, head1); - space.write_word(dst1+2, head2); - space.write_word(dst1+4, x-w/2); - space.write_word(dst1+6, y-h/2); + space.write_word(m_dst1, head1); + space.write_word(m_dst1+2, head2); + space.write_word(m_dst1+4, x-w/2); + space.write_word(m_dst1+6, y-h/2); - dst1 += 8; + m_dst1 += 8; } - //printf("[%08x] %08x %08x %04x %04x\n",src,dx,dy,dst1,dst2); + //printf("[%08x] %08x %08x %04x %04x\n",src,dx,dy,m_dst1,dst2); //machine().debug_break(); } READ16_MEMBER(raiden2_state::sprite_prot_dst1_r) { - return dst1; + return m_dst1; } READ16_MEMBER(raiden2_state::sprite_prot_maxx_r) { - return cop_spr_maxx; + return m_cop_spr_maxx; } READ16_MEMBER(raiden2_state::sprite_prot_off_r) { - return cop_spr_off; + return m_cop_spr_off; } WRITE16_MEMBER(raiden2_state::sprite_prot_dst1_w) { - dst1 = data; + m_dst1 = data; } WRITE16_MEMBER(raiden2_state::sprite_prot_maxx_w) { - cop_spr_maxx = data; + m_cop_spr_maxx = data; } WRITE16_MEMBER(raiden2_state::sprite_prot_off_w) { - cop_spr_off = data; + m_cop_spr_off = data; } /* MEMORY MAPS */ @@ -949,8 +553,8 @@ void raiden2_state::raiden2_cop_mem(address_map &map) map(0x006c2, 0x006c3).rw(FUNC(raiden2_state::sprite_prot_src_seg_r), FUNC(raiden2_state::sprite_prot_src_seg_w)); map(0x006c4, 0x006c5).nopw(); // constant value written along with 0x6c0 map(0x006c6, 0x006c7).w(FUNC(raiden2_state::sprite_prot_dst1_w)); - map(0x006ca, 0x006cb).w(FUNC(raiden2_state::raiden2_bank_w)); - map(0x006cc, 0x006cd).w(FUNC(raiden2_state::tile_bank_01_w)); + map(0x006cb, 0x006cb).w(FUNC(raiden2_state::raiden2_bank_w)); + map(0x006cc, 0x006cc).w(FUNC(raiden2_state::tile_bank_01_w)); map(0x006ce, 0x006cf).w(FUNC(raiden2_state::sprcpt_flags_2_w)); map(0x006d8, 0x006d9).w(FUNC(raiden2_state::sprite_prot_x_w)); map(0x006da, 0x006db).w(FUNC(raiden2_state::sprite_prot_y_w)); @@ -982,11 +586,11 @@ void raiden2_state::raiden2_mem(address_map &map) map(0x00800, 0x0bfff).ram(); - map(0x0c000, 0x0cfff).ram().share("sprites"); - map(0x0d000, 0x0d7ff).ram(); // .w(FUNC(raiden2_state::raiden2_background_w)).share("back_data"); - map(0x0d800, 0x0dfff).ram(); // .w(FUNC(raiden2_state::raiden2_foreground_w).share("fore_data"); - map(0x0e000, 0x0e7ff).ram(); // .w(FUNC(raiden2_state::raiden2_midground_w).share("mid_data"); - map(0x0e800, 0x0f7ff).ram(); // .w(FUNC(raiden2_state::raiden2_text_w).share("text_data"); + map(0x0c000, 0x0cfff).ram().share("spriteram"); + map(0x0d000, 0x0d7ff).ram(); // .w(FUNC(raiden2_state::background_w)).share("back_data"); + map(0x0d800, 0x0dfff).ram(); // .w(FUNC(raiden2_state::foreground_w).share("fore_data"); + map(0x0e000, 0x0e7ff).ram(); // .w(FUNC(raiden2_state::midground_w).share("mid_data"); + map(0x0e800, 0x0f7ff).ram(); // .w(FUNC(raiden2_state::text_w).share("text_data"); map(0x0f800, 0x0ffff).ram(); /* Stack area */ map(0x10000, 0x1efff).ram(); @@ -1027,12 +631,12 @@ void raiden2_state::zeroteam_mem(address_map &map) map(0x0074c, 0x0074d).portr("SYSTEM"); map(0x00800, 0x0b7ff).ram(); - map(0x0b800, 0x0bfff).ram(); // .w(FUNC(raiden2_state::raiden2_background_w)).share("back_data"); - map(0x0c000, 0x0c7ff).ram(); // .w(FUNC(raiden2_state::raiden2_foreground_w).share("fore_data"); - map(0x0c800, 0x0cfff).ram(); // .w(FUNC(raiden2_state::raiden2_midground_w).share("mid_data"); - map(0x0d000, 0x0dfff).ram(); // .w(FUNC(raiden2_state::raiden2_text_w).share("text_data"); + map(0x0b800, 0x0bfff).ram(); // .w(FUNC(raiden2_state::background_w)).share("back_data"); + map(0x0c000, 0x0c7ff).ram(); // .w(FUNC(raiden2_state::foreground_w).share("fore_data"); + map(0x0c800, 0x0cfff).ram(); // .w(FUNC(raiden2_state::midground_w).share("mid_data"); + map(0x0d000, 0x0dfff).ram(); // .w(FUNC(raiden2_state::text_w).share("text_data"); map(0x0e000, 0x0efff).ram(); // .w("palette", palette_device, write).share("palette"); - map(0x0f000, 0x0ffff).ram().share("sprites"); + map(0x0f000, 0x0ffff).ram().share("spriteram"); map(0x10000, 0x1ffff).ram(); map(0x20000, 0x2ffff).bankr("mainbank1"); @@ -1061,12 +665,12 @@ void raiden2_state::xsedae_mem(address_map &map) map(0x0074c, 0x0074d).portr("SYSTEM"); map(0x00800, 0x0b7ff).ram(); - map(0x0b800, 0x0bfff).ram(); // .w(FUNC(raiden2_state::raiden2_background_w)).share("back_data"); - map(0x0c000, 0x0c7ff).ram(); // .w(FUNC(raiden2_state::raiden2_foreground_w).share("fore_data"); - map(0x0c800, 0x0cfff).ram(); // .w(FUNC(raiden2_state::raiden2_midground_w).share("mid_data"); - map(0x0d000, 0x0dfff).ram(); // .w(FUNC(raiden2_state::raiden2_text_w).share("text_data"); + map(0x0b800, 0x0bfff).ram(); // .w(FUNC(raiden2_state::background_w)).share("back_data"); + map(0x0c000, 0x0c7ff).ram(); // .w(FUNC(raiden2_state::foreground_w).share("fore_data"); + map(0x0c800, 0x0cfff).ram(); // .w(FUNC(raiden2_state::midground_w).share("mid_data"); + map(0x0d000, 0x0dfff).ram(); // .w(FUNC(raiden2_state::text_w).share("text_data"); map(0x0e000, 0x0efff).ram(); // .w("palette", palette_device, write).share("palette"); - map(0x0f000, 0x0ffff).ram().share("sprites"); + map(0x0f000, 0x0ffff).ram().share("spriteram"); map(0x10000, 0x1ffff).ram(); @@ -1373,10 +977,10 @@ INPUT_PORTS_END * *************************************/ -static const gfx_layout raiden2_charlayout = +static const gfx_layout charlayout = { 8,8, - 4096, + RGN_FRAC(1,1), 4, { 8,12,0,4 }, { 3,2,1,0,19,18,17,16 }, @@ -1385,10 +989,10 @@ static const gfx_layout raiden2_charlayout = }; -static const gfx_layout raiden2_tilelayout = +static const gfx_layout tilelayout = { 16,16, - 0x8000, + RGN_FRAC(1,1), 4, { 8,12,0,4 }, { @@ -1401,10 +1005,10 @@ static const gfx_layout raiden2_tilelayout = 128*8 }; -static const gfx_layout raiden2_spritelayout = +static const gfx_layout spritelayout = { 16, 16, - 0x10000, + RGN_FRAC(1,1), 4, { STEP4(0,1) }, { 4, 0, 12, 8, 20, 16, 28, 24, 36, 32, 44, 40, 52, 48, 60, 56 }, @@ -1412,10 +1016,10 @@ static const gfx_layout raiden2_spritelayout = 16*16*4 }; -static GFXDECODE_START( gfx_raiden2 ) - GFXDECODE_ENTRY( "gfx1", 0x00000, raiden2_charlayout, 0x700, 128 ) - GFXDECODE_ENTRY( "gfx2", 0x00000, raiden2_tilelayout, 0x400, 128 ) - GFXDECODE_ENTRY( "gfx3", 0x00000, raiden2_spritelayout, 0x000, 4096 ) // really 128, but using the top bits for priority +GFXDECODE_START( raiden2_state::gfx_raiden2 ) + GFXDECODE_ENTRY( "gfx1", 0x00000, charlayout, 0x700, 0x10 ) + GFXDECODE_ENTRY( "gfx2", 0x00000, tilelayout, 0x400, 0x30 ) + GFXDECODE_ENTRY( "gfx3", 0x00000, spritelayout, 0x000, 0x40 ) // really 128, but using the top bits for priority GFXDECODE_END @@ -1426,7 +1030,7 @@ void raiden2_state::raiden2(machine_config &config) /* basic machine hardware */ V30(config, m_maincpu, XTAL(32'000'000)/2); /* verified on pcb */ m_maincpu->set_addrmap(AS_PROGRAM, &raiden2_state::raiden2_mem); - m_maincpu->set_vblank_int("screen", FUNC(raiden2_state::raiden2_interrupt)); + m_maincpu->set_vblank_int("screen", FUNC(raiden2_state::interrupt)); MCFG_MACHINE_RESET_OVERRIDE(raiden2_state,raiden2) @@ -1438,9 +1042,9 @@ void raiden2_state::raiden2(machine_config &config) screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); screen.set_raw(XTAL(32'000'000)/4, 512, 0, 40*8, 282, 0, 30*8); /* hand-tuned to match ~55.47 */ - screen.set_screen_update(FUNC(raiden2_state::screen_update_raiden2)); + screen.set_screen_update(FUNC(raiden2_state::screen_update)); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_raiden2); + GFXDECODE(config, m_gfxdecode, m_palette, raiden2_state::gfx_raiden2); PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048); seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); @@ -1452,8 +1056,6 @@ void raiden2_state::raiden2(machine_config &config) m_raiden2cop->paletteramout_cb().set(m_palette, FUNC(palette_device::write16)); m_raiden2cop->set_host_cpu_tag(m_maincpu); - MCFG_VIDEO_START_OVERRIDE(raiden2_state,raiden2) - /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -1476,17 +1078,6 @@ void raiden2_state::raiden2(machine_config &config) m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write)); } -void raiden2_state::xsedae(machine_config &config) -{ - raiden2(config); - m_maincpu->set_addrmap(AS_PROGRAM, &raiden2_state::xsedae_mem); - - MCFG_MACHINE_RESET_OVERRIDE(raiden2_state,xsedae) - - subdevice("screen")->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); - subdevice("screen")->set_visarea(0*8, 40*8-1, 0, 32*8-1); -} - void raiden2_state::raidendx(machine_config &config) { raiden2(config); @@ -1500,7 +1091,7 @@ void raiden2_state::zeroteam(machine_config &config) /* basic machine hardware */ V30(config, m_maincpu, XTAL(32'000'000)/2); /* verified on pcb */ m_maincpu->set_addrmap(AS_PROGRAM, &raiden2_state::zeroteam_mem); - m_maincpu->set_vblank_int("screen", FUNC(raiden2_state::raiden2_interrupt)); + m_maincpu->set_vblank_int("screen", FUNC(raiden2_state::interrupt)); MCFG_MACHINE_RESET_OVERRIDE(raiden2_state,zeroteam) @@ -1513,9 +1104,9 @@ void raiden2_state::zeroteam(machine_config &config) screen.set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK); // screen.set_refresh_hz(55.47); /* verified on pcb */ screen.set_raw(XTAL(32'000'000)/4, 512, 0, 40*8, 282, 0, 32*8); /* hand-tuned to match ~55.47 */ - screen.set_screen_update(FUNC(raiden2_state::screen_update_raiden2)); + screen.set_screen_update(FUNC(raiden2_state::screen_update)); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_raiden2); + GFXDECODE(config, m_gfxdecode, m_palette, raiden2_state::gfx_raiden2); PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048); seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); @@ -1527,8 +1118,6 @@ void raiden2_state::zeroteam(machine_config &config) m_raiden2cop->paletteramout_cb().set(m_palette, FUNC(palette_device::write16)); m_raiden2cop->set_host_cpu_tag(m_maincpu); - MCFG_VIDEO_START_OVERRIDE(raiden2_state,raiden2) - /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -1547,6 +1136,24 @@ void raiden2_state::zeroteam(machine_config &config) m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write)); } +void raiden2_state::xsedae(machine_config &config) +{ + zeroteam(config); + m_maincpu->set_addrmap(AS_PROGRAM, &raiden2_state::xsedae_mem); + + MCFG_MACHINE_RESET_OVERRIDE(raiden2_state,xsedae) + + subdevice("screen")->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + + ym2151_device &ymsnd(YM2151(config.replace(), "ymsnd", XTAL(28'636'363)/8)); + ymsnd.irq_handler().set(m_seibu_sound, FUNC(seibu_sound_device::fm_irqhandler)); + ymsnd.add_route(0, "mono", 0.50); + ymsnd.add_route(1, "mono", 0.50); + + m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read)); + m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write)); +} + /* ROM LOADING */ /* Raiden II @@ -3193,10 +2800,8 @@ ROM_START( xsedae ) ROM_LOAD32_WORD( "obj-1.u0811", 0x000000, 0x200000, CRC(6ae993eb) SHA1(d9713c79eacb4b3ce5e82dd3ce39003e3a433d8f) ) ROM_LOAD32_WORD( "obj-2.u082", 0x000002, 0x200000, CRC(26c806ee) SHA1(899a76a1b3f933c6f5cb6b5dcdf5b58e1b7e49c6) ) - ROM_REGION( 0x100000, "oki1", 0 ) /* ADPCM samples */ + ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM samples */ ROM_LOAD( "9.u105.4a", 0x00000, 0x40000, CRC(a7a0c5f9) SHA1(7882681ac152642aa4f859071f195842068b214b) ) - - ROM_REGION( 0x100000, "oki2", ROMREGION_ERASEFF ) /* ADPCM samples */ ROM_END const uint16_t raiden2_state::raiden_blended_colors[] = { @@ -3249,19 +2854,19 @@ const uint16_t raiden2_state::raiden_blended_colors[] = { void raiden2_state::init_blending(const uint16_t *table) { - for(auto & elem : blend_active) + for(auto & elem : m_blend_active) elem = false; while(*table != 0xffff) - blend_active[*table++] = true; + m_blend_active[*table++] = true; } void raiden2_state::init_raiden2() { init_blending(raiden_blended_colors); static const int spri[5] = { 0, 1, 2, 3, -1 }; - cur_spri = spri; - membank("mainbank1")->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); - membank("mainbank2")->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); + m_cur_spri = spri; + m_mainbank[0]->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); + m_mainbank[1]->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); raiden2_decrypt_sprites(machine()); } @@ -3269,9 +2874,9 @@ void raiden2_state::init_raidendx() { init_blending(raiden_blended_colors); static const int spri[5] = { 0, 1, 2, 3, -1 }; - cur_spri = spri; - membank("mainbank1")->configure_entries(0, 0x20, memregion("maincpu")->base(), 0x10000); - membank("mainbank2")->configure_entries(0, 0x20, memregion("maincpu")->base(), 0x10000); + m_cur_spri = spri; + m_mainbank[0]->configure_entries(0, 0x20, memregion("maincpu")->base(), 0x10000); + m_mainbank[1]->configure_entries(0, 0x20, memregion("maincpu")->base(), 0x10000); raiden2_decrypt_sprites(machine()); } @@ -3283,7 +2888,7 @@ void raiden2_state::init_xsedae() { init_blending(xsedae_blended_colors); static const int spri[5] = { -1, 0, 1, 2, 3 }; - cur_spri = spri; + m_cur_spri = spri; /* doesn't have banking */ } @@ -3305,9 +2910,9 @@ void raiden2_state::init_zeroteam() { init_blending(zeroteam_blended_colors); static const int spri[5] = { -1, 0, 1, 2, 3 }; - cur_spri = spri; - membank("mainbank1")->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); - membank("mainbank2")->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); + m_cur_spri = spri; + m_mainbank[0]->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); + m_mainbank[1]->configure_entries(0, 4, memregion("maincpu")->base(), 0x10000); zeroteam_decrypt_sprites(machine()); } diff --git a/src/mame/includes/raiden2.h b/src/mame/includes/raiden2.h index 81058005859..7791a240606 100644 --- a/src/mame/includes/raiden2.h +++ b/src/mame/includes/raiden2.h @@ -9,160 +9,170 @@ #include "machine/seibucop/seibucop.h" #include "video/seibu_crtc.h" #include "emupal.h" +#include "screen.h" + +#include class raiden2_state : public driver_device { public: raiden2_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , sprites(*this, "sprites") + , m_spriteram(*this, "spriteram") , m_maincpu(*this, "maincpu") , m_seibu_sound(*this, "seibu_sound") , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") - - , bg_bank(0) - , fg_bank(0) - , mid_bank(0) - , tx_bank(0) - , raiden2_tilemap_enable(0) - , prg_bank(0) - , cop_bank(0) - - , sprite_prot_x(0) - , sprite_prot_y(0) - , dst1(0) - , cop_spr_maxx(0) - , cop_spr_off(0) - - , tile_buffer(320, 256) - , sprite_buffer(320, 256) + , m_screen(*this, "screen") + , m_mainbank(*this, "mainbank%u", 1U) , m_raiden2cop(*this, "raiden2cop") + + , m_sprite_prot_x(0) + , m_sprite_prot_y(0) + , m_dst1(0) + , m_cop_spr_maxx(0) + , m_cop_spr_off(0) + + , m_bg_bank(0) + , m_fg_bank(0) + , m_mid_bank(0) + , m_tx_bank(0) + , m_tilemap_enable(0) + + , m_prg_bank(0) + , m_cop_bank(0) { - memset(scrollvals, 0, sizeof(uint16_t)*6); - memset(sprite_prot_src_addr, 0, sizeof(uint16_t)*2); + std::fill(std::begin(m_sprite_prot_src_addr), std::end(m_sprite_prot_src_addr), 0); + std::fill(std::begin(m_scrollvals), std::end(m_scrollvals), 0); } - std::unique_ptr m_back_data; - std::unique_ptr m_fore_data; - std::unique_ptr m_mid_data; - std::unique_ptr m_text_data; // private buffers, allocated in init - std::unique_ptr m_palette_data; - required_shared_ptr sprites; - required_device m_maincpu; - optional_device m_seibu_sound; - required_device m_gfxdecode; - required_device m_palette; - - - - - DECLARE_WRITE16_MEMBER ( raiden2_bank_w ); - DECLARE_READ16_MEMBER ( cop_tile_bank_2_r ); - DECLARE_WRITE16_MEMBER ( cop_tile_bank_2_w ); - DECLARE_WRITE16_MEMBER ( raidendx_cop_bank_2_w ); - DECLARE_WRITE16_MEMBER ( tilemap_enable_w ); - DECLARE_WRITE16_MEMBER ( tile_scroll_w ); - DECLARE_WRITE16_MEMBER ( tile_bank_01_w ); - DECLARE_WRITE16_MEMBER ( raiden2_background_w ); - DECLARE_WRITE16_MEMBER ( raiden2_foreground_w ); - DECLARE_WRITE16_MEMBER ( raiden2_midground_w ); - DECLARE_WRITE16_MEMBER ( raiden2_text_w ); - DECLARE_WRITE16_MEMBER(m_videoram_private_w); - - DECLARE_WRITE16_MEMBER( sprcpt_val_1_w ); - DECLARE_WRITE16_MEMBER( sprcpt_val_2_w ); - DECLARE_WRITE16_MEMBER( sprcpt_data_1_w ); - DECLARE_WRITE16_MEMBER( sprcpt_data_2_w ); - DECLARE_WRITE16_MEMBER( sprcpt_data_3_w ); - DECLARE_WRITE16_MEMBER( sprcpt_data_4_w ); - DECLARE_WRITE16_MEMBER( sprcpt_adr_w ); - DECLARE_WRITE16_MEMBER( sprcpt_flags_1_w ); - DECLARE_WRITE16_MEMBER( sprcpt_flags_2_w ); - - void common_reset(); - - static uint16_t const raiden_blended_colors[]; - static uint16_t const xsedae_blended_colors[]; - static uint16_t const zeroteam_blended_colors[]; - - bool blend_active[0x800]; // cfg - - tilemap_t *background_layer,*midground_layer,*foreground_layer,*text_layer; - - - int bg_bank, fg_bank, mid_bank, tx_bank; - uint16_t raiden2_tilemap_enable; - uint8_t prg_bank; - uint16_t cop_bank; - - uint16_t scrollvals[6]; - - - - - DECLARE_WRITE16_MEMBER( sprite_prot_x_w ); - DECLARE_WRITE16_MEMBER( sprite_prot_y_w ); - DECLARE_WRITE16_MEMBER( sprite_prot_src_seg_w ); - DECLARE_WRITE16_MEMBER( sprite_prot_src_w ); - DECLARE_READ16_MEMBER( sprite_prot_src_seg_r ); - DECLARE_READ16_MEMBER( sprite_prot_dst1_r ); - DECLARE_READ16_MEMBER( sprite_prot_maxx_r ); - DECLARE_READ16_MEMBER( sprite_prot_off_r ); - DECLARE_WRITE16_MEMBER( sprite_prot_dst1_w ); - DECLARE_WRITE16_MEMBER( sprite_prot_maxx_w ); - DECLARE_WRITE16_MEMBER( sprite_prot_off_w ); - - uint16_t sprite_prot_x,sprite_prot_y,dst1,cop_spr_maxx,cop_spr_off; - uint16_t sprite_prot_src_addr[2]; - - - - void draw_sprites(const rectangle &cliprect); - - - - const int *cur_spri; // cfg + void raidendx(machine_config &config); + void xsedae(machine_config &config); + void zeroteam(machine_config &config); + void raiden2(machine_config &config); void init_raidendx(); void init_xsedae(); void init_zeroteam(); void init_raiden2(); + +protected: + std::unique_ptr m_back_data; + std::unique_ptr m_fore_data; + std::unique_ptr m_mid_data; + std::unique_ptr m_text_data; // private buffers, allocated in init + std::unique_ptr m_palette_data; + required_shared_ptr m_spriteram; + required_device m_maincpu; + optional_device m_seibu_sound; + required_device m_gfxdecode; + required_device m_palette; + required_device m_screen; + optional_memory_bank_array<2> m_mainbank; + optional_device m_raiden2cop; + + DECLARE_WRITE16_MEMBER(sprite_prot_x_w); + DECLARE_WRITE16_MEMBER(sprite_prot_y_w); + DECLARE_WRITE16_MEMBER(sprite_prot_src_seg_w); + DECLARE_WRITE16_MEMBER(sprite_prot_src_w); + DECLARE_READ16_MEMBER(sprite_prot_src_seg_r); + DECLARE_READ16_MEMBER(sprite_prot_dst1_r); + DECLARE_READ16_MEMBER(sprite_prot_maxx_r); + DECLARE_READ16_MEMBER(sprite_prot_off_r); + DECLARE_WRITE16_MEMBER(sprite_prot_dst1_w); + DECLARE_WRITE16_MEMBER(sprite_prot_maxx_w); + DECLARE_WRITE16_MEMBER(sprite_prot_off_w); + + uint16_t m_sprite_prot_x,m_sprite_prot_y,m_dst1,m_cop_spr_maxx,m_cop_spr_off; + uint16_t m_sprite_prot_src_addr[2]; + + INTERRUPT_GEN_MEMBER(interrupt); + void common_save_state(); + virtual void video_start() override; + + DECLARE_WRITE16_MEMBER(tilemap_enable_w); + DECLARE_WRITE16_MEMBER(tile_scroll_w); + DECLARE_WRITE16_MEMBER(background_w); + DECLARE_WRITE16_MEMBER(foreground_w); + DECLARE_WRITE16_MEMBER(midground_w); + DECLARE_WRITE16_MEMBER(text_w); + DECLARE_WRITE16_MEMBER(m_videoram_private_w); + + void bank_reset(int bgbank, int fgbank, int midbank, int txbank); + + static uint16_t const raiden_blended_colors[]; + static uint16_t const xsedae_blended_colors[]; + static uint16_t const zeroteam_blended_colors[]; + + bool m_blend_active[0x800]; // cfg + + tilemap_t *m_background_layer,*m_midground_layer,*m_foreground_layer,*m_text_layer; + + int m_bg_bank, m_fg_bank, m_mid_bank, m_tx_bank; + uint16_t m_tilemap_enable; + + uint16_t m_scrollvals[6]; + + void draw_sprites(const rectangle &cliprect); + + const int *m_cur_spri; // cfg + + DECLARE_GFXDECODE_MEMBER(gfx_raiden2); TILE_GET_INFO_MEMBER(get_back_tile_info); TILE_GET_INFO_MEMBER(get_mid_tile_info); TILE_GET_INFO_MEMBER(get_fore_tile_info); TILE_GET_INFO_MEMBER(get_text_tile_info); - DECLARE_MACHINE_RESET(raiden2); - DECLARE_VIDEO_START(raiden2); - DECLARE_MACHINE_RESET(zeroteam); - DECLARE_MACHINE_RESET(xsedae); - DECLARE_MACHINE_RESET(raidendx); - uint32_t screen_update_raiden2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(raiden2_interrupt); - void combine32(uint32_t *val, int offset, uint16_t data, uint16_t mem_mask); - void sprcpt_init(void); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void blend_layer(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind16 &source, int layer); void tilemap_draw_and_blend(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tilemap); void init_blending(const uint16_t *table); - bitmap_ind16 tile_buffer, sprite_buffer; - optional_device m_raiden2cop; + bitmap_ind16 m_tile_bitmap, m_sprite_bitmap; - void raidendx(machine_config &config); - void xsedae(machine_config &config); - void zeroteam(machine_config &config); - void raiden2(machine_config &config); + void zeroteam_sound_map(address_map &map); + +private: + DECLARE_WRITE8_MEMBER(raiden2_bank_w); + DECLARE_WRITE8_MEMBER(tile_bank_01_w); + DECLARE_READ16_MEMBER(cop_tile_bank_2_r); + DECLARE_WRITE16_MEMBER(cop_tile_bank_2_w); + DECLARE_WRITE16_MEMBER(raidendx_cop_bank_2_w); + + uint8_t m_prg_bank; + uint16_t m_cop_bank; + + DECLARE_WRITE16_MEMBER(sprcpt_val_1_w); + DECLARE_WRITE16_MEMBER(sprcpt_val_2_w); + DECLARE_WRITE16_MEMBER(sprcpt_data_1_w); + DECLARE_WRITE16_MEMBER(sprcpt_data_2_w); + DECLARE_WRITE16_MEMBER(sprcpt_data_3_w); + DECLARE_WRITE16_MEMBER(sprcpt_data_4_w); + DECLARE_WRITE16_MEMBER(sprcpt_adr_w); + DECLARE_WRITE16_MEMBER(sprcpt_flags_1_w); + DECLARE_WRITE16_MEMBER(sprcpt_flags_2_w); + + uint32_t m_sprcpt_adr, m_sprcpt_idx; + + uint32_t m_sprcpt_val[2], m_sprcpt_flags1; + uint16_t m_sprcpt_flags2; + uint32_t m_sprcpt_data_1[0x100], m_sprcpt_data_2[0x40], m_sprcpt_data_3[6], m_sprcpt_data_4[4]; + + virtual void machine_start() override; + DECLARE_MACHINE_RESET(raiden2); + DECLARE_MACHINE_RESET(zeroteam); + DECLARE_MACHINE_RESET(xsedae); + DECLARE_MACHINE_RESET(raidendx); + + void combine32(uint32_t *val, int offset, uint16_t data, uint16_t mem_mask); + void sprcpt_init(); void raiden2_cop_mem(address_map &map); void raiden2_mem(address_map &map); void raiden2_sound_map(address_map &map); void raidendx_mem(address_map &map); void xsedae_mem(address_map &map); void zeroteam_mem(address_map &map); - void zeroteam_sound_map(address_map &map); -protected: - virtual void machine_start() override; }; #endif // MAME_INCLUDES_RAIDEN2_H diff --git a/src/mame/video/raiden2.cpp b/src/mame/video/raiden2.cpp new file mode 100644 index 00000000000..5679c15a296 --- /dev/null +++ b/src/mame/video/raiden2.cpp @@ -0,0 +1,385 @@ +// license:LGPL-2.1+ +// copyright-holders:Olivier Galibert, Angelo Salese, David Haywood, Tomasz Slanina +/******************************************************************************************************** + + Seibu Protected 1993-94 era hardware, V30 based (sequel to the SYS68C hardware) + +********************************************************************************************************/ + +#include "emu.h" +#include "includes/raiden2.h" + +WRITE16_MEMBER(raiden2_state::m_videoram_private_w) +{ + // map(0x0d000, 0x0d7ff).ram().w(FUNC(raiden2_state::background_w)).share("back_data"); + // map(0x0d800, 0x0dfff).ram().w(FUNC(raiden2_state::foreground_w).share("fore_data"); + // map(0x0e000, 0x0e7ff).ram().w(FUNC(raiden2_state::midground_w).share("mid_data"); + // map(0x0e800, 0x0f7ff).ram().w(FUNC(raiden2_state::text_w).share("text_data"); + + if (offset < 0x800 / 2) + { + background_w(space, offset, data, 0xffff); + } + else if (offset < 0x1000 /2) + { + offset -= 0x800 / 2; + foreground_w(space, offset, data, 0xffff); + } + else if (offset < 0x1800/2) + { + offset -= 0x1000 / 2; + midground_w(space, offset, data, 0xffff); + } + else if (offset < 0x2800/2) + { + offset -= 0x1800 / 2; + text_w(space, offset, data, 0xffff); + } +} + + +void raiden2_state::draw_sprites(const rectangle &cliprect) +{ + uint16_t *source = m_spriteram + (0x1000/2)-4; + m_sprite_bitmap.fill(0xf, cliprect); + + gfx_element *gfx = m_gfxdecode->gfx(2); + + /* + 00 fhhh Fwww ppcc cccc h = height f=flipy w = width F = flipx p = priority c = color + 02 nnnn nnnn nnnn nnnn n = tileno + 04 xxxx xxxx xxxx xxxx x = xpos + 06 yyyy yyyy yyyy yyyy y = ypos + */ + + while( source >= m_spriteram ){ + int tile_number = source[1]; + int sx = source[2]; + int sy = source[3]; + int colr; + int xtiles, ytiles; + int ytlim, xtlim; + int xflip, yflip; + int xstep, ystep; + int pri; + + ytlim = (source[0] >> 12) & 0x7; + xtlim = (source[0] >> 8 ) & 0x7; + + xflip = (source[0] >> 15) & 0x1; + yflip = (source[0] >> 11) & 0x1; + + colr = source[0] & 0x3f; + + pri = (source[0] >> 6) & 3; + + colr |= pri << (14-4); + + ytlim += 1; + xtlim += 1; + + xstep = 16; + ystep = 16; + + if (xflip) + { + ystep = -16; + sy += ytlim*16-16; + } + + if (yflip) + { + xstep = -16; + sx += xtlim*16-16; + } + + for (xtiles = 0; xtiles < xtlim; xtiles++) + { + for (ytiles = 0; ytiles < ytlim; ytiles++) + { + /* note this wraparound handling could be wrong if some of the COP maths is wrong */ + +#define ZEROTEAM_MASK_X (0x1ff) // causes a blank square in the corner of zero team, but otherwise the thrusters of the ship in the r2 intro are clipped, using 0x8000 as a sign bit instead of this logic works for r2, but not zero team +#define ZEROTEAM_MASK_Y (0x1ff) + + + + gfx->transpen_raw( + m_sprite_bitmap, + cliprect, + tile_number, + colr << 4, + yflip,xflip, + (sx+xstep*xtiles)&ZEROTEAM_MASK_X,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, 15); + + + gfx->transpen_raw( + m_sprite_bitmap, + cliprect, + tile_number, + colr << 4, + yflip,xflip, + ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,(sy+ystep*ytiles)&ZEROTEAM_MASK_Y, 15); + + + gfx->transpen_raw( + m_sprite_bitmap, + cliprect, + tile_number, + colr << 4, + yflip,xflip, + (sx+xstep*xtiles)&ZEROTEAM_MASK_X,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, 15); + + + gfx->transpen_raw( + m_sprite_bitmap, + cliprect, + tile_number, + colr << 4, + yflip,xflip, + ((sx+xstep*xtiles)&ZEROTEAM_MASK_X)-0x200,((sy+ystep*ytiles)&ZEROTEAM_MASK_Y)-0x200, 15); + + + tile_number++; + } + } + + source -= 4; + } + +} + +WRITE16_MEMBER(raiden2_state::background_w) +{ + COMBINE_DATA(&m_back_data[offset]); + m_background_layer->mark_tile_dirty(offset); +} + +WRITE16_MEMBER(raiden2_state::midground_w) +{ + COMBINE_DATA(&m_mid_data[offset]); + m_midground_layer->mark_tile_dirty(offset); +} + +WRITE16_MEMBER(raiden2_state::foreground_w) +{ + COMBINE_DATA(&m_fore_data[offset]); + m_foreground_layer->mark_tile_dirty(offset); +} + +WRITE16_MEMBER(raiden2_state::text_w) +{ + COMBINE_DATA(&m_text_data[offset]); + m_text_layer->mark_tile_dirty(offset); +} + +WRITE16_MEMBER(raiden2_state::tilemap_enable_w) +{ + COMBINE_DATA(&m_tilemap_enable); +} + +WRITE16_MEMBER(raiden2_state::tile_scroll_w) +{ + tilemap_t *tm = nullptr; + switch(offset/2) { + case 0: tm = m_background_layer; break; + case 1: tm = m_midground_layer; break; + case 2: tm = m_foreground_layer; break; + default: assert(0); break; + } + + COMBINE_DATA(&m_scrollvals[offset]); + data = m_scrollvals[offset]; + + if(offset & 1) + tm->set_scrolly(0, data); + else + tm->set_scrollx(0, data); +} + +WRITE8_MEMBER(raiden2_state::tile_bank_01_w) +{ + int new_bank; + new_bank = 0 | ((data & 1)<<1); + if(new_bank != m_bg_bank) { + m_bg_bank = new_bank; + m_background_layer->mark_all_dirty(); + } + + new_bank = 1 | (data & 2); + if(new_bank != m_mid_bank) { + m_mid_bank = new_bank; + m_midground_layer->mark_all_dirty(); + } +} + +READ16_MEMBER(raiden2_state::cop_tile_bank_2_r) +{ + return m_cop_bank; +} + +WRITE16_MEMBER(raiden2_state::cop_tile_bank_2_w) +{ + COMBINE_DATA(&m_cop_bank); + + if(ACCESSING_BITS_8_15) { + int new_bank = 4 | (data >> 14); + if(new_bank != m_fg_bank) { + m_fg_bank = new_bank; + m_foreground_layer->mark_all_dirty(); + } + } +} + +WRITE16_MEMBER(raiden2_state::raidendx_cop_bank_2_w) +{ + COMBINE_DATA(&m_cop_bank); + + int new_bank = 4 | ((m_cop_bank >> 4) & 3); + if(new_bank != m_fg_bank) { + m_fg_bank = new_bank; + m_foreground_layer->mark_all_dirty(); + } + + /* mainbank2 coming from 6c9 ? */ + int bb = m_cop_bank >> 12; + m_mainbank[0]->set_entry(bb + 16); + m_mainbank[1]->set_entry(3); +} + + +TILE_GET_INFO_MEMBER(raiden2_state::get_back_tile_info) +{ + int tile = m_back_data[tile_index]; + int color = (tile >> 12) | (0 << 4); + + tile = (tile & 0xfff) | (m_bg_bank << 12); + + SET_TILE_INFO_MEMBER(1,tile+0x0000,color,0); +} + +TILE_GET_INFO_MEMBER(raiden2_state::get_mid_tile_info) +{ + int tile = m_mid_data[tile_index]; + int color = (tile >> 12) | (2 << 4); + + tile = (tile & 0xfff) | (m_mid_bank << 12); + + SET_TILE_INFO_MEMBER(1,tile,color,0); +} + +TILE_GET_INFO_MEMBER(raiden2_state::get_fore_tile_info) +{ + int tile = m_fore_data[tile_index]; + int color = (tile >> 12) | (1 << 4); + + tile = (tile & 0xfff) | (m_fg_bank << 12); + + SET_TILE_INFO_MEMBER(1,tile,color,0); +} + +TILE_GET_INFO_MEMBER(raiden2_state::get_text_tile_info) +{ + int tile = m_text_data[tile_index]; + int color = (tile>>12)&0xf; + + tile &= 0xfff; + + SET_TILE_INFO_MEMBER(0,tile + m_tx_bank * 0x1000,color,0); +} + +void raiden2_state::video_start() +{ + m_screen->register_screen_bitmap(m_tile_bitmap); + m_screen->register_screen_bitmap(m_sprite_bitmap); + + m_back_data = make_unique_clear(0x800/2); + m_fore_data = make_unique_clear(0x800/2); + m_mid_data = make_unique_clear(0x800/2); + m_text_data = make_unique_clear(0x1000/2); + m_palette_data = make_unique_clear(0x1000/2); + m_palette->basemem().set(m_palette_data.get(), 0x1000/2 * sizeof(uint16_t), 16, ENDIANNESS_LITTLE, 2); + + save_pointer(NAME(m_back_data), 0x800/2); + save_pointer(NAME(m_fore_data), 0x800/2); + save_pointer(NAME(m_mid_data), 0x800/2); + save_pointer(NAME(m_text_data), 0x1000/2); + save_pointer(NAME(m_palette_data), 0x1000/2); + + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_text_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64,32 ); + m_background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_back_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 ); + m_midground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_mid_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 ); + m_foreground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(raiden2_state::get_fore_tile_info),this), TILEMAP_SCAN_ROWS, 16,16, 32,32 ); +} + +void raiden2_state::blend_layer(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind16 &source, int layer) +{ + if(layer == -1) + return; + + const pen_t *pens = &m_palette->pen(0); + layer <<= 14; + for(int y = cliprect.min_y; y <= cliprect.max_y; y++) { + const uint16_t *src = &source.pix16(y, cliprect.min_x); + uint32_t *dst = &bitmap.pix32(y, cliprect.min_x); + for(int x = cliprect.min_x; x <= cliprect.max_x; x++) { + uint16_t val = *src++; + if((val & 0xc000) == layer && (val & 0x000f) != 0x000f) { + val &= 0x07ff; + + if(m_blend_active[val]) + *dst = alpha_blend_r32(*dst, pens[val], 0x7f); + else + *dst = pens[val]; + } + dst++; + } + } +} + +void raiden2_state::tilemap_draw_and_blend(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tilemap) +{ + tilemap->draw(screen, m_tile_bitmap, cliprect, 0, 0); + blend_layer(bitmap, cliprect, m_tile_bitmap, 0); +} + +uint32_t raiden2_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(m_palette->black_pen(), cliprect); + if (!(m_tilemap_enable & 16)) { + draw_sprites(cliprect); + + blend_layer(bitmap, cliprect, m_sprite_bitmap, m_cur_spri[0]); + } + + if (!(m_tilemap_enable & 1)) + tilemap_draw_and_blend(screen, bitmap, cliprect, m_background_layer); + + if (!(m_tilemap_enable & 16)) + blend_layer(bitmap, cliprect, m_sprite_bitmap, m_cur_spri[1]); + + if (!(m_tilemap_enable & 2)) + tilemap_draw_and_blend(screen, bitmap, cliprect, m_midground_layer); + + if (!(m_tilemap_enable & 16)) + blend_layer(bitmap, cliprect, m_sprite_bitmap, m_cur_spri[2]); + + if (!(m_tilemap_enable & 4)) + tilemap_draw_and_blend(screen, bitmap, cliprect, m_foreground_layer); + + if (!(m_tilemap_enable & 16)) + blend_layer(bitmap, cliprect, m_sprite_bitmap, m_cur_spri[3]); + + if (!(m_tilemap_enable & 8)) + tilemap_draw_and_blend(screen, bitmap, cliprect, m_text_layer); + + if (!(m_tilemap_enable & 16)) + blend_layer(bitmap, cliprect, m_sprite_bitmap, m_cur_spri[4]); + + if (machine().input().code_pressed_once(KEYCODE_Z)) + if (m_raiden2cop) m_raiden2cop->dump_table(); + + return 0; +} + +