From d1356cd5c1eba47a05187dbdd266519079b096f5 Mon Sep 17 00:00:00 2001 From: cam900 Date: Wed, 27 Jun 2018 00:24:14 +0900 Subject: [PATCH] nmk16.cpp Updates/Cleanups (#3589) * nmk16.cpp Updates/Cleanups Cleanup duplicates Move tilemap ram bankswitching into seperated value Add save states Reduce unnecessary routines Implement sprite limitation Simpler bit manipulations Add BAD_DUMP for tdragon3h ROMs when not from PCB Fix acrobatm palette size related to palette RAM size * nmk16.cpp : Add save state for protection values * nmk16.cpp : Reduce some runtime tag lookup * nmk16.cpp : Fix build, Fix naming * nmk16.cpp : Minor cleanup * nmk16.cpp : Sync to current master --- src/mame/drivers/nmk16.cpp | 253 ++++++++++---------- src/mame/includes/nmk16.h | 75 +++--- src/mame/video/nmk16.cpp | 472 ++++++++++++------------------------- 3 files changed, 299 insertions(+), 501 deletions(-) diff --git a/src/mame/drivers/nmk16.cpp b/src/mame/drivers/nmk16.cpp index 4c1c285afdd..f7f51c092ef 100644 --- a/src/mame/drivers/nmk16.cpp +++ b/src/mame/drivers/nmk16.cpp @@ -70,6 +70,8 @@ TODO: - Thunder Dragon 3 (bootleg of Thunder Dragon 2) : Sound System isn't hooked up correctly for this set. +- Verify sprite limits for games when resolution is 384x224 + NOT BUGS: - Hacha Mecha Fighter: (BTANB) the bomb graphics are pretty weird when the game is in japanese mode, but it's like this on the original game. @@ -78,6 +80,9 @@ NOT BUGS: rate limit for making their sound effect. This is normal, it's like this on all PCB recordings. +- Sprite number is limited related to screen size and each sprite size. + reference : http://upl-gravedigger.boo.jp/pcb_info/pcb_manual_7.jpg + ---- @@ -268,7 +273,7 @@ READ16_MEMBER(nmk16_state::tharrier_mcu_r) // the above statement appears to be incorrect, it should also read DSW1 from here, almost certainly // through the MCU. The weird 0x080202 address where we read IN2 is also probably just a mirror of 0x080002 (here) - return ~ioport("IN1")->read(); + return ~m_in_io[1]->read(); } } @@ -298,17 +303,12 @@ WRITE8_MEMBER(nmk16_state::tharrier_oki6295_bankswitch_w) ***************************************************************************/ -template +template WRITE16_MEMBER(nmk16_state::nmk_bgvideoram_w) { - COMBINE_DATA(&m_nmk_bgvideoram[Bank][offset]); - m_bg_tilemap[Bank]->mark_tile_dirty(offset); -} - -WRITE16_MEMBER(nmk16_state::nmk_fgvideoram_w) -{ - COMBINE_DATA(&m_nmk_fgvideoram[offset]); - m_fg_tilemap->mark_tile_dirty(offset); + COMBINE_DATA(&m_nmk_bgvideoram[Layer][offset]); + if ((offset >> 13) == m_tilerambank) + m_bg_tilemap[Layer]->mark_tile_dirty(offset & 0x1fff); } WRITE16_MEMBER(nmk16_state::nmk_txvideoram_w) @@ -317,6 +317,28 @@ WRITE16_MEMBER(nmk16_state::nmk_txvideoram_w) m_tx_tilemap->mark_tile_dirty(offset); } +template +WRITE8_MEMBER(nmk16_state::nmk_scroll_w) +{ + m_scroll[Layer][offset] = data; + + if (offset & 2) + { + m_bg_tilemap[Layer]->set_scrolly(0,((m_scroll[Layer][2] << 8) | m_scroll[Layer][3])); + } + else + { + if ((m_nmk_bgvideoram[Layer].bytes() > 0x4000) && (offset == 0)) + { + int newbank = (m_scroll[Layer][0] >> 4) & ((m_nmk_bgvideoram[Layer].bytes() >> 14)-1); + if (m_tilerambank != newbank) + m_tilerambank = newbank; + + } + m_bg_tilemap[Layer]->set_scrollx(0,((m_scroll[Layer][0] << 8) | m_scroll[Layer][1]) - m_videoshift); + } +} + /***************************************************************************/ @@ -329,7 +351,7 @@ void nmk16_state::vandyke_map(address_map &map) map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); map(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_x0016_w)); - map(0x080018, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x080019, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x08c000, 0x08c007).w(FUNC(nmk16_state::vandyke_scroll_w)); @@ -349,7 +371,7 @@ void nmk16_state::vandykeb_map(address_map &map) // map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); map(0x080010, 0x08001d).w(FUNC(nmk16_state::vandykeb_scroll_w)); /* 10, 12, 1a, 1c */ map(0x080016, 0x080017).nopw(); /* IRQ enable? */ - map(0x080018, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x080019, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); // map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x08c000, 0x08c007).nopw(); /* just in case... */ @@ -367,7 +389,7 @@ void nmk16_state::manybloc_map(address_map &map) map(0x080004, 0x080005).portr("DSW1"); map(0x080010, 0x080011).nopw(); /* See notes at the top of the driver */ map(0x080012, 0x080013).nopw(); /* See notes at the top of the driver */ - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x08001c, 0x08001d).nopw(); /* See notes at the top of the driver */ map(0x08001f, 0x08001f).r("soundlatch2", FUNC(generic_latch_8_device::read)).w(m_soundlatch, FUNC(generic_latch_8_device::write)).umask16(0x00ff); map(0x088000, 0x0883ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); @@ -391,8 +413,8 @@ void nmk16_tomagic_state::tomagic_map(address_map &map) map(0x08c000, 0x08c1ff).writeonly().share("scrollram"); map(0x08c200, 0x08c3ff).writeonly().share("scrollramy"); map(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); - map(0x094001, 0x094001).w("oki1", FUNC(okim6295_device::write)); - map(0x094003, 0x094003).r("oki1", FUNC(okim6295_device::read)); + map(0x094001, 0x094001).w(m_oki[0], FUNC(okim6295_device::write)); + map(0x094003, 0x094003).r(m_oki[0], FUNC(okim6295_device::read)); map(0x09c000, 0x09cfff).mirror(0x001000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0x0f0000, 0x0fffff).ram().share("mainram"); } @@ -421,12 +443,12 @@ void nmk16_state::tharrier_map(address_map &map) map(0x08000f, 0x08000f).r("soundlatch2", FUNC(generic_latch_8_device::read)); /* from Z80 */ map(0x080010, 0x080011).w(FUNC(nmk16_state::tharrier_mcu_control_w)); map(0x080012, 0x080013).nopw(); -// map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); -// map(0x080018, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); +// map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); +// map(0x080019, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x08001f, 0x08001f).w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0x080202, 0x080203).portr("IN2"); map(0x088000, 0x0883ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); -// map(0x08c000, 0x08c007).w(FUNC(nmk16_state::nmk_scroll_w)); +// map(0x08c000, 0x08c007).w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); map(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x09c000, 0x09c7ff).ram(); /* Unused txvideoram area? */ map(0x09d000, 0x09d7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); @@ -438,8 +460,8 @@ void nmk16_state::tharrier_sound_map(address_map &map) map(0x0000, 0xbfff).rom(); map(0xc000, 0xc7ff).ram(); map(0xf000, 0xf000).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w("soundlatch2", FUNC(generic_latch_8_device::write)); - map(0xf400, 0xf400).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0xf500, 0xf500).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xf400, 0xf400).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xf500, 0xf500).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xf600, 0xf600).w(FUNC(nmk16_state::tharrier_oki6295_bankswitch_w<0>)); map(0xf700, 0xf700).w(FUNC(nmk16_state::tharrier_oki6295_bankswitch_w<1>)); } @@ -461,7 +483,7 @@ void nmk16_state::mustang_map(address_map &map) map(0x080004, 0x080005).portr("DSW1"); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); map(0x08000e, 0x08000f).nopw(); - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_x0016_w)); // frame number? map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); @@ -479,7 +501,7 @@ void nmk16_state::mustangb_map(address_map &map) map(0x080002, 0x080003).portr("IN1"); map(0x080004, 0x080005).portr("DSW1"); map(0x08000e, 0x08000f).noprw(); - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080016, 0x080017).nopw(); // frame number? map(0x08001e, 0x08001f).w("seibu_sound", FUNC(seibu_sound_device::main_mustb_w)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); @@ -490,7 +512,6 @@ void nmk16_state::mustangb_map(address_map &map) map(0x0f0000, 0x0fffff).ram().w(FUNC(nmk16_state::nmk16_mainram_strange_w)).share("mainram"); } - void nmk16_state::twinactn_map(address_map &map) { map(0x000000, 0x03ffff).rom(); @@ -498,7 +519,7 @@ void nmk16_state::twinactn_map(address_map &map) map(0x080002, 0x080003).portr("IN1"); map(0x080004, 0x080005).portr("DSW1"); map(0x08000e, 0x08000f).noprw(); - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080016, 0x080017).nopw(); // frame number? map(0x08001f, 0x08001f).w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); @@ -509,7 +530,6 @@ void nmk16_state::twinactn_map(address_map &map) map(0x0f0000, 0x0fffff).ram().w(FUNC(nmk16_state::nmk16_mainram_strange_w)).share("mainram"); } - void nmk16_state::acrobatm_map(address_map &map) { map(0x00000, 0x3ffff).rom(); @@ -519,12 +539,12 @@ void nmk16_state::acrobatm_map(address_map &map) map(0xc0008, 0xc0009).portr("DSW1"); map(0xc000a, 0xc000b).portr("DSW2"); map(0xc000f, 0xc000f).r(m_nmk004, FUNC(nmk004_device::read)); - map(0xc0014, 0xc0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0xc0015, 0xc0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0xc0016, 0xc0017).w(FUNC(nmk16_state::nmk16_x0016_w)); - map(0xc0018, 0xc0019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0xc0019, 0xc0019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0xc001f, 0xc001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0xc4000, 0xc45ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0xc8000, 0xc8007).ram().w(FUNC(nmk16_state::nmk_scroll_w)); + map(0xc8000, 0xc8007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); map(0xcc000, 0xcffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0xd4000, 0xd47ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); } @@ -537,14 +557,14 @@ void nmk16_state::bioship_map(address_map &map) map(0x080008, 0x080009).portr("DSW1"); map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); -// map(0xc0014, 0xc0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); +// map(0xc0015, 0xc0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_bioship_x0016_w)); map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); - map(0x084000, 0x084001).w(FUNC(nmk16_state::bioship_bank_w)); + map(0x084001, 0x084001).w(FUNC(nmk16_state::bioship_bank_w)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x08c000, 0x08c007).ram().w(FUNC(nmk16_state::bioshipbg_scroll_w)); - map(0x08c010, 0x08c017).ram().w(FUNC(nmk16_state::bioship_scroll_w)); - map(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); + map(0x08c000, 0x08c007).ram().w(FUNC(nmk16_state::nmk_scroll_w<1>)).umask16(0xff00); + map(0x08c010, 0x08c017).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0xff00); + map(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<1>)).share("nmk_bgvideoram1"); map(0x09c000, 0x09c7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0x0f0000, 0x0fffff).ram().share("mainram"); } @@ -717,13 +737,13 @@ void nmk16_state::hachamf_map(address_map &map) map(0x080008, 0x080009).portr("DSW1"); map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_x0016_w)); - map(0x080018, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x080019, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); /* Video Region */ map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x08c000, 0x08c007).w(FUNC(nmk16_state::nmk_scroll_w)); + map(0x08c000, 0x08c007).w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); map(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x09c000, 0x09c7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); /* Main RAM, inc sprites, shared with MCU */ @@ -809,8 +829,8 @@ void nmk16_state::mcu_run(uint8_t dsw_setting) /*needed because of the uncompatibility of the dsw settings.*/ if(dsw_setting) // Thunder Dragon { - dsw[0] = (ioport("DSW2")->read() & 0x7); - dsw[1] = (ioport("DSW2")->read() & 0x38) >> 3; + dsw[0] = (m_dsw_io[1]->read() & 0x7); + dsw[1] = (m_dsw_io[1]->read() & 0x38) >> 3; for(i=0;i<2;i++) { switch(dsw[i] & 7) @@ -828,8 +848,8 @@ void nmk16_state::mcu_run(uint8_t dsw_setting) } else // Hacha Mecha Fighter { - dsw[0] = (ioport("DSW1")->read() & 0x0700) >> 8; - dsw[1] = (ioport("DSW1")->read() & 0x3800) >> 11; + dsw[0] = (m_dsw_io[0]->read() & 0x0700) >> 8; + dsw[1] = (m_dsw_io[0]->read() & 0x3800) >> 11; for(i=0;i<2;i++) { switch(dsw[i] & 7) @@ -847,7 +867,7 @@ void nmk16_state::mcu_run(uint8_t dsw_setting) } /*read the coin port*/ - coin_input = (~(ioport("IN0")->read())); + coin_input = (~(m_in_io[0]->read())); if(coin_input & 0x01)//coin 1 { @@ -951,11 +971,11 @@ void nmk16_state::tdragon_map(address_map &map) map(0x0c0008, 0x0c0009).portr("DSW1"); map(0x0c000a, 0x0c000b).portr("DSW2"); map(0x0c000f, 0x0c000f).r(m_nmk004, FUNC(nmk004_device::read)); - map(0x0c0014, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ + map(0x0c0015, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ map(0x0c0016, 0x0c0017).w(FUNC(nmk16_state::nmk16_x0016_w)); - map(0x0c0018, 0x0c0019).w(FUNC(nmk16_state::nmk_tilebank_w)); /* Tile Bank ? */ + map(0x0c0019, 0x0c0019).w(FUNC(nmk16_state::nmk_tilebank_w)); /* Tile Bank ? */ map(0x0c001f, 0x0c001f).w(m_nmk004, FUNC(nmk004_device::write)); - map(0x0c4000, 0x0c4007).ram().w(FUNC(nmk16_state::nmk_scroll_w)); + map(0x0c4000, 0x0c4007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); map(0x0c8000, 0x0c87ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x0cc000, 0x0cffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x0d0000, 0x0d07ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); @@ -976,10 +996,10 @@ void nmk16_state::tdragonb_map(address_map &map) map(0x0c0002, 0x0c0003).portr("IN1"); map(0x0c0008, 0x0c0009).portr("DSW1"); map(0x0c000a, 0x0c000b).portr("DSW2"); - map(0x0c0014, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ - map(0x0c0018, 0x0c0019).w(FUNC(nmk16_state::nmk_tilebank_w)); /* Tile Bank ? */ + map(0x0c0015, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ + map(0x0c0019, 0x0c0019).w(FUNC(nmk16_state::nmk_tilebank_w)); /* Tile Bank ? */ map(0x0c001e, 0x0c001f).w("seibu_sound", FUNC(seibu_sound_device::main_mustb_w)); - map(0x0c4000, 0x0c4007).ram().w(FUNC(nmk16_state::nmk_scroll_w)); + map(0x0c4000, 0x0c4007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); map(0x0c8000, 0x0c87ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x0cc000, 0x0cffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x0d0000, 0x0d07ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); @@ -993,10 +1013,10 @@ void nmk16_state::ssmissin_map(address_map &map) map(0x0c0004, 0x0c0005).portr("IN1"); map(0x0c0006, 0x0c0007).portr("DSW1"); // AM_RANGE(0x0c000e, 0x0c000f) AM_READ(??) - map(0x0c0014, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ - map(0x0c0018, 0x0c0019).w(FUNC(nmk16_state::nmk_tilebank_w)); /* Tile Bank ? */ + map(0x0c0015, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ + map(0x0c0019, 0x0c0019).w(FUNC(nmk16_state::nmk_tilebank_w)); /* Tile Bank ? */ map(0x0c001f, 0x0c001f).w(m_soundlatch, FUNC(generic_latch_8_device::write)); - map(0x0c4000, 0x0c4007).ram().w(FUNC(nmk16_state::nmk_scroll_w)); + map(0x0c4000, 0x0c4007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); map(0x0c8000, 0x0c87ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x0cc000, 0x0cffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x0d0000, 0x0d07ff).mirror(0x1800).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); //mirror for airattck @@ -1007,7 +1027,7 @@ void nmk16_state::ssmissin_sound_map(address_map &map) map(0x0000, 0x7fff).rom(); map(0x8000, 0x87ff).ram(); map(0x9000, 0x9000).w(FUNC(nmk16_state::ssmissin_soundbank_w)); - map(0x9800, 0x9800).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x9800, 0x9800).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); } @@ -1031,14 +1051,14 @@ void nmk16_state::strahl_map(address_map &map) map(0x80008, 0x80009).portr("DSW1"); map(0x8000a, 0x8000b).portr("DSW2"); map(0x8000f, 0x8000f).r(m_nmk004, FUNC(nmk004_device::read)); - map(0x80014, 0x80015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x80015, 0x80015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x80016, 0x80017).w(FUNC(nmk16_state::nmk16_x0016_w)); map(0x8001f, 0x8001f).w(m_nmk004, FUNC(nmk004_device::write)); - map(0x84000, 0x84007).ram().w(FUNC(nmk16_state::nmk_scroll_w)); - map(0x88000, 0x88007).ram().w(FUNC(nmk16_state::nmk_scroll_2_w)); + map(0x84000, 0x84007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); + map(0x88000, 0x88007).ram().w(FUNC(nmk16_state::nmk_scroll_w<1>)).umask16(0x00ff); map(0x8c000, 0x8c7ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x90000, 0x93fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); - map(0x94000, 0x97fff).ram().w(FUNC(nmk16_state::nmk_fgvideoram_w)).share("nmk_fgvideoram"); + map(0x94000, 0x97fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<1>)).share("nmk_bgvideoram1"); map(0x9c000, 0x9c7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0xf0000, 0xfffff).ram().share("mainram"); } @@ -1051,12 +1071,12 @@ void nmk16_state::macross_map(address_map &map) map(0x080008, 0x080009).portr("DSW1"); map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_x0016_w)); - map(0x080018, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x080019, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x08c000, 0x08c007).ram().w(FUNC(nmk16_state::nmk_scroll_w)); + map(0x08c000, 0x08c007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); map(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x09c000, 0x09c7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0x0f0000, 0x0fffff).ram().w(FUNC(nmk16_state::nmk16_mainram_strange_w)).share("mainram"); @@ -1070,9 +1090,9 @@ void nmk16_state::gunnail_map(address_map &map) map(0x080008, 0x080009).portr("DSW1"); map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_x0016_w)); - map(0x080018, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x080019, 0x080019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x08c000, 0x08c1ff).writeonly().share("scrollram"); @@ -1091,21 +1111,13 @@ void nmk16_state::macross2_map(address_map &map) map(0x100008, 0x100009).portr("DSW1"); map(0x10000a, 0x10000b).portr("DSW2"); map(0x10000f, 0x10000f).r("soundlatch2", FUNC(generic_latch_8_device::read)); /* from Z80 */ - map(0x100014, 0x100015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x100015, 0x100015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x100016, 0x100017).w(FUNC(nmk16_state::macross2_sound_reset_w)); /* Z80 reset */ - map(0x100018, 0x100019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x100019, 0x100019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x10001f, 0x10001f).w(m_soundlatch, FUNC(generic_latch_8_device::write)); /* to Z80 */ map(0x120000, 0x1207ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - - map(0x130000, 0x1301ff).ram().share("scrollram"); - map(0x130200, 0x1303ff).ram().share("scrollramy"); - map(0x130400, 0x1307ff).ram(); - - map(0x140000, 0x143fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); - map(0x144000, 0x147fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<1>)).share("nmk_bgvideoram1"); - map(0x148000, 0x14bfff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<2>)).share("nmk_bgvideoram2"); - map(0x14c000, 0x14ffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<3>)).share("nmk_bgvideoram3"); - + map(0x130000, 0x130007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff); + map(0x140000, 0x14ffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x170000, 0x170fff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0x1f0000, 0x1fffff).ram().share("mainram"); } @@ -1125,22 +1137,15 @@ void nmk16_state::raphero_map(address_map &map) map(0x100008, 0x100009).portr("DSW1"); map(0x10000a, 0x10000b).portr("DSW2"); map(0x10000f, 0x10000f).r("soundlatch2", FUNC(generic_latch_8_device::read)); /* from Z80 */ - map(0x100014, 0x100015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x100015, 0x100015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x100016, 0x100017).nopw(); /* IRQ enable or z80 sound reset like in Macross 2? */ - map(0x100018, 0x100019).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x100019, 0x100019).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x10001f, 0x10001f).w(m_soundlatch, FUNC(generic_latch_8_device::write)); /* to Z80 */ map(0x120000, 0x1207ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - - map(0x130000, 0x1301ff).ram().share("scrollram"); + map(0x130000, 0x1301ff).ram().w(FUNC(nmk16_state::raphero_scroll_w)).share("scrollram"); map(0x130200, 0x1303ff).ram().share("scrollramy"); map(0x130400, 0x1307ff).ram(); - - map(0x140000, 0x143fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); - map(0x144000, 0x147fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<1>)).share("nmk_bgvideoram1"); - map(0x148000, 0x14bfff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<2>)).share("nmk_bgvideoram2"); - map(0x14c000, 0x14ffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<3>)).share("nmk_bgvideoram3"); - - + map(0x140000, 0x14ffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x170000, 0x170fff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0x1f0000, 0x1fffff).ram().share("mainram"); } @@ -1150,8 +1155,8 @@ void nmk16_state::raphero_sound_mem_map(address_map &map) map(0x0000, 0x7fff).rom(); map(0x8000, 0xbfff).bankr("audiobank"); map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); - map(0xc800, 0xc800).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0xc808, 0xc808).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xc800, 0xc800).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xc808, 0xc808).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xc810, 0xc817).w("nmk112", FUNC(nmk112_device::okibank_w)); map(0xd000, 0xd000).w(FUNC(nmk16_state::macross2_sound_bank_w)); map(0xd800, 0xd800).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w("soundlatch2", FUNC(generic_latch_8_device::write)); // main cpu @@ -1172,8 +1177,8 @@ void nmk16_state::macross2_sound_io_map(address_map &map) { map.global_mask(0xff); map(0x00, 0x01).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); - map(0x80, 0x80).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0x88, 0x88).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x80, 0x80).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x88, 0x88).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x90, 0x97).w("nmk112", FUNC(nmk112_device::okibank_w)); } @@ -1184,12 +1189,12 @@ void nmk16_state::bjtwin_map(address_map &map) map(0x080002, 0x080003).portr("IN1"); map(0x080008, 0x080009).portr("DSW1"); map(0x08000a, 0x08000b).portr("DSW2"); - map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); - map(0x084001, 0x084001).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0x084011, 0x084011).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); + map(0x084001, 0x084001).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x084011, 0x084011).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x084020, 0x08402f).w("nmk112", FUNC(nmk112_device::okibank_w)).umask16(0x00ff); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x094000, 0x094001).w(FUNC(nmk16_state::nmk_tilebank_w)); + map(0x094001, 0x094001).w(FUNC(nmk16_state::nmk_tilebank_w)); map(0x094002, 0x094003).nopw(); /* IRQ enable? */ map(0x09c000, 0x09cfff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x0f0000, 0x0fffff).ram().share("mainram"); @@ -3813,7 +3818,6 @@ static INPUT_PORTS_START( dolmen ) INPUT_PORTS_END - static const gfx_layout charlayout = { 8,8, @@ -3861,8 +3865,6 @@ static GFXDECODE_START( gfx_bjtwin ) GFXDECODE_END - - static GFXDECODE_START( gfx_bioship ) GFXDECODE_ENTRY( "fgtile", 0, charlayout, 0x300, 16 ) /* color 0x300-0x3ff */ GFXDECODE_ENTRY( "bgtile", 0, tilelayout, 0x100, 16 ) /* color 0x100-0x1ff */ @@ -3959,8 +3961,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(nmk16_state::nmk16_scanline) MCFG_SCREEN_PALETTE("palette") - - MACHINE_CONFIG_START(nmk16_state::tharrier) /* basic machine hardware */ @@ -3976,7 +3976,6 @@ MACHINE_CONFIG_START(nmk16_state::tharrier) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_tharrier) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tharrier) MCFG_PALETTE_ADD("palette", 512) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4015,7 +4014,6 @@ MACHINE_CONFIG_START(nmk16_state::mustang) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4058,7 +4056,6 @@ MACHINE_CONFIG_START(nmk16_state::mustangb) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4094,8 +4091,7 @@ MACHINE_CONFIG_START(nmk16_state::bioship) /* video hardware */ NMK_HACKY_SCREEN_LOWRES - MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_bioship) - + MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_strahl) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bioship) MCFG_PALETTE_ADD("palette", 1024) @@ -4136,7 +4132,6 @@ MACHINE_CONFIG_START(nmk16_state::vandyke) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4179,7 +4174,6 @@ MACHINE_CONFIG_START(nmk16_state::vandykeb) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4205,9 +4199,8 @@ MACHINE_CONFIG_START(nmk16_state::acrobatm) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) - MCFG_PALETTE_ADD("palette", 1024) + MCFG_PALETTE_ADD("palette", 768) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBxxxx) MCFG_VIDEO_START_OVERRIDE(nmk16_state,macross) @@ -4249,7 +4242,6 @@ MACHINE_CONFIG_START(nmk16_state::tdragonb) /* bootleg using Raiden sound har NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4284,7 +4276,6 @@ MACHINE_CONFIG_START(nmk16_state::tdragon) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4332,7 +4323,6 @@ MACHINE_CONFIG_START(nmk16_state::ssmissin) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4401,7 +4391,6 @@ MACHINE_CONFIG_START(nmk16_state::hachamf) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4447,7 +4436,6 @@ MACHINE_CONFIG_START(nmk16_state::macross) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4487,7 +4475,6 @@ MACHINE_CONFIG_START(nmk16_state::blkheart) NMK_HACKY_SCREEN_LOWRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4525,7 +4512,7 @@ MACHINE_CONFIG_START(nmk16_state::gunnail) /* video hardware */ NMK_HACKY_SCREEN_HIRES - MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_gunnail) + MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) @@ -4568,8 +4555,7 @@ MACHINE_CONFIG_START(nmk16_state::macross2) /* video hardware */ NMK_HACKY_SCREEN_HIRES - MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_gunnail) - + MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross2) MCFG_PALETTE_ADD("palette", 1024) @@ -4616,7 +4602,6 @@ MACHINE_CONFIG_START(nmk16_state::tdragon2) NMK_HACKY_SCREEN_HIRES MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_tdragon2) - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross2) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) @@ -4674,7 +4659,7 @@ MACHINE_CONFIG_START(nmk16_state::raphero) MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) - MCFG_VIDEO_START_OVERRIDE(nmk16_state,raphero) + MCFG_VIDEO_START_OVERRIDE(nmk16_state,gunnail) /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -4817,7 +4802,7 @@ MACHINE_CONFIG_START(nmk16_tomagic_state::tomagic) /* video hardware */ NMK_HACKY_SCREEN_HIRES - MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_gunnail) + MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_PALETTE_ADD("palette", 1024) @@ -4998,6 +4983,13 @@ void nmk16_state::decode_ssmissin() } } +void nmk16_state::save_protregs() +{ + save_item(NAME(m_input_pressed)); + save_item(NAME(m_start_helper)); + save_item(NAME(m_coin_count)); + save_item(NAME(m_coin_count_frac)); +} void nmk16_state::init_nmk() { @@ -5013,6 +5005,7 @@ void nmk16_state::init_tharrier() { m_okibank[0]->configure_entries(0, 4, memregion("oki1")->base() + 0x20000, 0x20000); m_okibank[1]->configure_entries(0, 4, memregion("oki2")->base() + 0x20000, 0x20000); + save_item(NAME(m_prot_count)); } void nmk16_state::init_hachamf_prot() @@ -5026,6 +5019,7 @@ void nmk16_state::init_hachamf_prot() rom[0x04aa/2] = 0x4e71; m_maincpu->space(AS_PROGRAM).install_write_handler(0x0f0000, 0x0fffff, write16_delegate(FUNC(nmk16_state::hachamf_mainram_w),this)); + save_protregs(); } void nmk16_state::init_tdragonb() @@ -5045,6 +5039,7 @@ void nmk16_state::init_tdragon_prot() rom[0x04aa/2] = 0x4e71; m_maincpu->space(AS_PROGRAM).install_write_handler(0x0b0000, 0x0bffff, write16_delegate(FUNC(nmk16_state::tdragon_mainram_w),this)); + save_protregs(); } void nmk16_state::init_ssmissin() @@ -5192,9 +5187,9 @@ void nmk16_state::firehawk_map(address_map &map) WRITE8_MEMBER(nmk16_state::spec2k_oki1_banking_w) { if(data == 0xfe) - m_oki2->set_rom_bank(0); + m_oki[1]->set_rom_bank(0); else if(data == 0xff) - m_oki2->set_rom_bank(1); + m_oki[1]->set_rom_bank(1); } void nmk16_state::afega_sound_cpu(address_map &map) @@ -5205,7 +5200,7 @@ void nmk16_state::afega_sound_cpu(address_map &map) map(0xf000, 0xf7ff).ram(); // RAM map(0xf800, 0xf800).r(m_soundlatch, FUNC(generic_latch_8_device::read)); // From Main CPU map(0xf808, 0xf809).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); // YM2151 - map(0xf80a, 0xf80a).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xf80a, 0xf80a).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 } void nmk16_state::firehawk_sound_cpu(address_map &map) @@ -5215,14 +5210,14 @@ void nmk16_state::firehawk_sound_cpu(address_map &map) map(0xf800, 0xffff).ram(); // not used, only tested map(0xfff0, 0xfff0).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0xfff2, 0xfff2).w(FUNC(nmk16_state::spec2k_oki1_banking_w)); - map(0xfff8, 0xfff8).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0xfffa, 0xfffa).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xfff8, 0xfff8).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xfffa, 0xfffa).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); } WRITE8_MEMBER(nmk16_state::twinactn_oki_bank_w) { - m_oki1->set_rom_bank(data & 3); + m_oki[0]->set_rom_bank(data & 3); if (data & (~3)) logerror("%s: invalid oki bank %02x\n", machine().describe_context(), data); @@ -5235,7 +5230,7 @@ void nmk16_state::twinactn_sound_cpu(address_map &map) map(0x0000, 0x7fff).rom(); map(0x8000, 0x87ff).ram(); map(0x9000, 0x9000).w(FUNC(nmk16_state::twinactn_oki_bank_w)); - map(0x9800, 0x9800).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x9800, 0x9800).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); // From Main CPU } @@ -5383,7 +5378,7 @@ MACHINE_CONFIG_START(nmk16_state::grdnstrm) /* video hardware */ MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_grdnstrm) - MCFG_VIDEO_START_OVERRIDE(nmk16_state,firehawk) + MCFG_VIDEO_START_OVERRIDE(nmk16_state,grdnstrm) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_firehawk) MACHINE_CONFIG_END @@ -5429,7 +5424,7 @@ MACHINE_CONFIG_START(nmk16_state::firehawk) MCFG_PALETTE_ADD("palette", 768) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) - MCFG_VIDEO_START_OVERRIDE(nmk16_state,firehawk) + MCFG_VIDEO_START_OVERRIDE(nmk16_state,grdnstrm) /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -6578,7 +6573,7 @@ ROM_START( tdragon3h ) // Not from this PCB ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "1.27c1000", 0x00000, 0x20000, CRC(b870be61) SHA1(ea5d45c3a3ab805e55806967f00167cf6366212e) ) /* banked */ + ROM_LOAD( "1.27c1000", 0x00000, 0x20000, BAD_DUMP CRC(b870be61) SHA1(ea5d45c3a3ab805e55806967f00167cf6366212e) ) /* banked */ ROM_REGION( 0x020000, "fgtile", 0 ) ROM_LOAD( "12.27c1000", 0x000000, 0x020000, CRC(f809d616) SHA1(c6a4d776fee770ec197204b855b85bcc719469a5) ) /* 8x8 tiles */ @@ -6594,10 +6589,10 @@ ROM_START( tdragon3h ) // Not from this PCB ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 samples */ - ROM_LOAD( "ww930916.4", 0x040000, 0x200000, CRC(07c35fe6) SHA1(33547bd88764704310f2ef8cf3bfe21ceb56d5b7) ) /* all banked */ + ROM_LOAD( "ww930916.4", 0x040000, 0x200000, BAD_DUMP CRC(07c35fe6) SHA1(33547bd88764704310f2ef8cf3bfe21ceb56d5b7) ) /* all banked */ ROM_REGION( 0x240000, "oki2", 0 ) /* OKIM6295 samples */ - ROM_LOAD( "ww930915.3", 0x040000, 0x200000, CRC(82025bab) SHA1(ac6053700326ea730d00ec08193e2c8a2a019f0b) ) /* all banked */ + ROM_LOAD( "ww930915.3", 0x040000, 0x200000, BAD_DUMP CRC(82025bab) SHA1(ac6053700326ea730d00ec08193e2c8a2a019f0b) ) /* all banked */ ROM_REGION( 0x0200, "proms", 0 ) ROM_LOAD( "9.bpr", 0x0000, 0x0100, CRC(435653a2) SHA1(575b4a46ea65179de3042614da438d2f6d8b572e) ) /* unknown */ diff --git a/src/mame/includes/nmk16.h b/src/mame/includes/nmk16.h index c10d57c0540..efd277820ae 100644 --- a/src/mame/includes/nmk16.h +++ b/src/mame/includes/nmk16.h @@ -13,45 +13,42 @@ class nmk16_state : public driver_device, protected seibu_sound_common { public: - nmk16_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + nmk16_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_oki1(*this, "oki1"), - m_oki2(*this, "oki2"), + m_oki(*this, "oki%u", 1U), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_nmk004(*this, "nmk004"), m_soundlatch(*this, "soundlatch"), - m_nmk_bgvideoram(*this, "nmk_bgvideoram%u", 0), + m_nmk_bgvideoram(*this, "nmk_bgvideoram%u", 0U), m_nmk_txvideoram(*this, "nmk_txvideoram"), m_mainram(*this, "mainram"), m_gunnail_scrollram(*this, "scrollram"), m_spriteram(*this, "spriteram"), - m_nmk_fgvideoram(*this, "nmk_fgvideoram"), m_gunnail_scrollramy(*this, "scrollramy"), - m_afega_scroll(*this, "afega_scroll_%u", 0), + m_afega_scroll(*this, "afega_scroll_%u", 0U), m_tilemap_rom(*this, "tilerom"), m_audiobank(*this, "audiobank"), - m_okibank(*this, "okibank%u", 1), - m_sprdma_base(0x8000) - {} + m_okibank(*this, "okibank%u", 1U), + m_dsw_io(*this, "DSW%u", 1U), + m_in_io(*this, "IN%u", 0U), + m_sprdma_base(0x8000) { } required_device m_maincpu; optional_device m_audiocpu; - optional_device m_oki1; - optional_device m_oki2; + optional_device_array m_oki; required_device m_gfxdecode; required_device m_palette; optional_device m_nmk004; optional_device m_soundlatch; - optional_shared_ptr_array m_nmk_bgvideoram; + optional_shared_ptr_array m_nmk_bgvideoram; optional_shared_ptr m_nmk_txvideoram; required_shared_ptr m_mainram; optional_shared_ptr m_gunnail_scrollram; optional_shared_ptr m_spriteram; - optional_shared_ptr m_nmk_fgvideoram; optional_shared_ptr m_gunnail_scrollramy; optional_shared_ptr_array m_afega_scroll; @@ -59,23 +56,23 @@ public: optional_memory_bank m_audiobank; optional_memory_bank_array<2> m_okibank; + optional_ioport_array<2> m_dsw_io; + optional_ioport_array<3> m_in_io; + + int m_sprclk; + int m_sprlimit; + int m_tilerambank; int m_sprdma_base; int mask[4*2]; - int m_simple_scroll; - int m_redraw_bitmap; std::unique_ptr m_spriteram_old; std::unique_ptr m_spriteram_old2; int m_bgbank; int m_videoshift; int m_bioship_background_bank; - uint8_t m_bioship_scroll[4]; - tilemap_t *m_bg_tilemap[4]; + tilemap_t *m_bg_tilemap[2]; tilemap_t *m_tx_tilemap; - tilemap_t *m_fg_tilemap; - std::unique_ptr m_background_bitmap; int m_mustang_bg_xscroll; - uint8_t m_scroll[4]; - uint8_t m_scroll_2[4]; + uint8_t m_scroll[2][4]; uint16_t m_vscroll[4]; int m_prot_count; uint8_t m_input_pressed; @@ -95,24 +92,22 @@ public: DECLARE_READ16_MEMBER(tdragonb_prot_r); DECLARE_READ16_MEMBER(afega_unknown_r); template DECLARE_WRITE16_MEMBER(afega_scroll_w); - template DECLARE_WRITE16_MEMBER(nmk_bgvideoram_w); - DECLARE_WRITE16_MEMBER(nmk_fgvideoram_w); + template DECLARE_WRITE16_MEMBER(nmk_bgvideoram_w); DECLARE_WRITE16_MEMBER(nmk_txvideoram_w); DECLARE_WRITE16_MEMBER(mustang_scroll_w); - DECLARE_WRITE16_MEMBER(bioshipbg_scroll_w); - DECLARE_WRITE16_MEMBER(nmk_scroll_w); - DECLARE_WRITE16_MEMBER(nmk_scroll_2_w); + DECLARE_WRITE16_MEMBER(raphero_scroll_w); + template DECLARE_WRITE8_MEMBER(nmk_scroll_w); DECLARE_WRITE16_MEMBER(vandyke_scroll_w); DECLARE_WRITE16_MEMBER(vandykeb_scroll_w); DECLARE_WRITE16_MEMBER(manybloc_scroll_w); - DECLARE_WRITE16_MEMBER(nmk_flipscreen_w); - DECLARE_WRITE16_MEMBER(nmk_tilebank_w); - DECLARE_WRITE16_MEMBER(bioship_scroll_w); - DECLARE_WRITE16_MEMBER(bioship_bank_w); + DECLARE_WRITE8_MEMBER(nmk_flipscreen_w); + DECLARE_WRITE8_MEMBER(nmk_tilebank_w); + DECLARE_WRITE8_MEMBER(bioship_bank_w); DECLARE_WRITE8_MEMBER(spec2k_oki1_banking_w); DECLARE_WRITE8_MEMBER(twinactn_oki_bank_w); DECLARE_WRITE16_MEMBER(nmk16_x0016_w); DECLARE_WRITE16_MEMBER(nmk16_bioship_x0016_w); + void save_protregs(); void init_nmk(); void init_tharrier(); void init_vandykeb(); @@ -130,9 +125,9 @@ public: void init_bjtwin(); void init_atombjt(); TILEMAP_MAPPER_MEMBER(tilemap_scan_pages); - template TILE_GET_INFO_MEMBER(common_get_bg_tile_info); - TILE_GET_INFO_MEMBER(strahl_get_fg_tile_info); + template TILE_GET_INFO_MEMBER(common_get_bg_tile_info); TILE_GET_INFO_MEMBER(common_get_tx_tile_info); + TILE_GET_INFO_MEMBER(bioship_get_bg_tile_info); TILE_GET_INFO_MEMBER(bjtwin_get_bg_tile_info); TILE_GET_INFO_MEMBER(get_tile_info_0_8bit); DECLARE_VIDEO_START(macross); @@ -140,17 +135,13 @@ public: DECLARE_VIDEO_START(strahl); DECLARE_VIDEO_START(gunnail); DECLARE_VIDEO_START(macross2); - DECLARE_VIDEO_START(raphero); DECLARE_VIDEO_START(bjtwin); DECLARE_VIDEO_START(afega); - DECLARE_VIDEO_START(firehawk); DECLARE_VIDEO_START(grdnstrm); uint32_t screen_update_tharrier(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_manybloc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_macross(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_bioship(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_strahl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_gunnail(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_tdragon2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_bjtwin(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_afega(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -169,14 +160,8 @@ public: void nmk16_draw_sprites_swap_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect, int *bittbl); void nmk16_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void nmk16_draw_sprites_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect); - int nmk16_bg_spr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - int nmk16_bg_fg_spr_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - int nmk16_bg_spr_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - int nmk16_bg_sprflip_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - int nmk16_bioshipbg_sprflip_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - int nmk16_bg_sprswap_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bittbl[8]); - int nmk16_bg_sprswapflip_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bittbl[8]); - int nmk16_complexbg_sprswap_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bittbl[8]); + void nmk16_bg_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer = 0); + void nmk16_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect,int dsw_flipscreen,int xoffset, int yoffset,int attr_mask); void redhawki_video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ); void mcu_run(uint8_t dsw_setting); diff --git a/src/mame/video/nmk16.cpp b/src/mame/video/nmk16.cpp index f806a7765e9..061fcf39509 100644 --- a/src/mame/video/nmk16.cpp +++ b/src/mame/video/nmk16.cpp @@ -24,35 +24,23 @@ ***************************************************************************/ +/* #define TILES_PER_PAGE_X (0x10) #define TILES_PER_PAGE_Y (0x10) #define PAGES_PER_TMAP_X (0x10) #define PAGES_PER_TMAP_Y (0x02) +*/ TILEMAP_MAPPER_MEMBER(nmk16_state::tilemap_scan_pages) { - return (row / TILES_PER_PAGE_Y) * TILES_PER_PAGE_X * TILES_PER_PAGE_Y * PAGES_PER_TMAP_X + - (row % TILES_PER_PAGE_Y) + - - (col / TILES_PER_PAGE_X) * TILES_PER_PAGE_X * TILES_PER_PAGE_Y + - (col % TILES_PER_PAGE_X) * TILES_PER_PAGE_Y; + return (row & 0xf) | ((col & 0xff) << 4) | ((row & 0x10) << 8); } -template +template TILE_GET_INFO_MEMBER(nmk16_state::common_get_bg_tile_info) { - int code = m_nmk_bgvideoram[Bank][tile_index]; - SET_TILE_INFO_MEMBER(1,(code & 0xfff) + (m_bgbank << 12),code >> 12,0); -} - - -TILE_GET_INFO_MEMBER(nmk16_state::strahl_get_fg_tile_info) -{ - int code = m_nmk_fgvideoram[tile_index]; - SET_TILE_INFO_MEMBER(3, - (code & 0xfff), - code >> 12, - 0); + int code = m_nmk_bgvideoram[Layer][(m_tilerambank << 13)|tile_index]; + SET_TILE_INFO_MEMBER(Gfx,(code & 0xfff) | (m_bgbank << 12),code >> 12,0); } TILE_GET_INFO_MEMBER(nmk16_state::common_get_tx_tile_info) @@ -64,6 +52,12 @@ TILE_GET_INFO_MEMBER(nmk16_state::common_get_tx_tile_info) 0); } +TILE_GET_INFO_MEMBER(nmk16_state::bioship_get_bg_tile_info) +{ + int code = m_tilemap_rom[(m_bioship_background_bank << 13) | tile_index]; // ROM Based + SET_TILE_INFO_MEMBER(3,(code & 0xfff),code >> 12,0); +} + TILE_GET_INFO_MEMBER(nmk16_state::bjtwin_get_bg_tile_info) { int code = m_nmk_bgvideoram[0][tile_index]; @@ -96,43 +90,41 @@ void nmk16_state::nmk16_video_init() m_spriteram_old2 = make_unique_clear(0x1000/2); m_videoshift = 0; /* 256x224 screen, no shift */ - m_background_bitmap = nullptr; - m_simple_scroll = 1; + m_tilerambank = 0; + m_sprclk = 0; + + save_pointer(NAME(m_spriteram_old), 0x1000/2); + save_pointer(NAME(m_spriteram_old2), 0x1000/2); + save_item(NAME(m_bgbank)); + save_item(NAME(m_mustang_bg_xscroll)); + save_item(NAME(m_scroll[0])); + save_item(NAME(m_scroll[1])); + save_item(NAME(m_vscroll)); + save_item(NAME(m_tilerambank)); + save_item(NAME(m_sprclk)); } VIDEO_START_MEMBER(nmk16_state,bioship) { - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<0>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); + m_sprlimit = 384 * 263; + // ROM Based Tilemap + m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::bioship_get_bg_tile_info),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,256,32); + m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(&nmk16_state::common_get_bg_tile_info<1, 1>, "bg1_gfx1",this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,256,32); m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_tx_tile_info),this),TILEMAP_SCAN_COLS,8,8,32,32); - m_bg_tilemap[0]->set_transparent_pen(15); + m_bg_tilemap[1]->set_transparent_pen(15); m_tx_tilemap->set_transparent_pen(15); nmk16_video_init(); - m_background_bitmap = std::make_unique(8192,512); m_bioship_background_bank=0; - m_redraw_bitmap = 1; - -} - -VIDEO_START_MEMBER(nmk16_state,strahl) -{ - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<0>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::strahl_get_fg_tile_info),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_tx_tile_info),this),TILEMAP_SCAN_COLS,8,8,32,32); - - m_fg_tilemap->set_transparent_pen(15); - m_tx_tilemap->set_transparent_pen(15); - - m_sprdma_base = 0xf000; - - nmk16_video_init(); + save_item(NAME(m_bioship_background_bank)); } VIDEO_START_MEMBER(nmk16_state,macross) { - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<0>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); + m_sprlimit = 384 * 263; + m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(&nmk16_state::common_get_bg_tile_info<0, 1>, "bg0_gfx1",this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,256,32); m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_tx_tile_info),this),TILEMAP_SCAN_COLS,8,8,32,32); m_tx_tilemap->set_transparent_pen(15); @@ -140,27 +132,19 @@ VIDEO_START_MEMBER(nmk16_state,macross) nmk16_video_init(); } -VIDEO_START_MEMBER(nmk16_state,gunnail) +VIDEO_START_MEMBER(nmk16_state,strahl) { - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<0>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_tx_tile_info),this),TILEMAP_SCAN_COLS,8,8,64,32); + VIDEO_START_CALL_MEMBER( macross ); + m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(&nmk16_state::common_get_bg_tile_info<1, 3>, "bg1_gfx3",this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,256,32); + m_bg_tilemap[1]->set_transparent_pen(15); - m_tx_tilemap->set_transparent_pen(15); - m_bg_tilemap[0]->set_scroll_rows(512); - - nmk16_video_init(); - m_videoshift = 64; /* 384x224 screen, leftmost 64 pixels have to be retrieved */ - /* from the other side of the tilemap (!) */ - m_simple_scroll = 0; + m_sprdma_base = 0xf000; } VIDEO_START_MEMBER(nmk16_state,macross2) { - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<0>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<1>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - m_bg_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<2>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - m_bg_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<3>),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - + m_sprlimit = 512 * 263; // not verified + m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(&nmk16_state::common_get_bg_tile_info<0, 1>, "bg0_gfx1",this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this),16,16,256,32); m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::common_get_tx_tile_info),this),TILEMAP_SCAN_COLS,8,8,64,32); m_tx_tilemap->set_transparent_pen(15); @@ -170,14 +154,15 @@ VIDEO_START_MEMBER(nmk16_state,macross2) /* from the other side of the tilemap (!) */ } -VIDEO_START_MEMBER(nmk16_state,raphero) +VIDEO_START_MEMBER(nmk16_state,gunnail) { VIDEO_START_CALL_MEMBER( macross2 ); - m_simple_scroll = 0; + m_bg_tilemap[0]->set_scroll_rows(512); } VIDEO_START_MEMBER(nmk16_state,bjtwin) { + m_sprlimit = 512 * 263; // not verified m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::bjtwin_get_bg_tile_info),this),TILEMAP_SCAN_COLS,8,8,64,32); nmk16_video_init(); @@ -185,7 +170,6 @@ VIDEO_START_MEMBER(nmk16_state,bjtwin) /* from the other side of the tilemap (!) */ } - WRITE16_MEMBER(nmk16_state::mustang_scroll_w) { // osd_printf_debug("mustang %04x %04x %04x\n",offset,data,mem_mask); @@ -213,45 +197,6 @@ WRITE16_MEMBER(nmk16_state::mustang_scroll_w) m_bg_tilemap[0]->set_scrollx(0,m_mustang_bg_xscroll - m_videoshift); } -WRITE16_MEMBER(nmk16_state::bioshipbg_scroll_w) -{ - if (ACCESSING_BITS_8_15) - { - m_scroll[offset] = (data >> 8) & 0xff; - - if (offset & 2) - m_bg_tilemap[0]->set_scrolly(0,m_scroll[2] * 256 + m_scroll[3]); - else - m_bg_tilemap[0]->set_scrollx(0,m_scroll[0] * 256 + m_scroll[1] - m_videoshift); - } -} - -WRITE16_MEMBER(nmk16_state::nmk_scroll_w) -{ - if (ACCESSING_BITS_0_7) - { - m_scroll[offset] = data & 0xff; - - if (offset & 2) - m_bg_tilemap[0]->set_scrolly(0,m_scroll[2] * 256 + m_scroll[3]); - else - m_bg_tilemap[0]->set_scrollx(0,m_scroll[0] * 256 + m_scroll[1] - m_videoshift); - } -} - -WRITE16_MEMBER(nmk16_state::nmk_scroll_2_w) -{ - if (ACCESSING_BITS_0_7) - { - m_scroll_2[offset] = data & 0xff; - - if (offset & 2) - m_fg_tilemap->set_scrolly(0,m_scroll_2[2] * 256 + m_scroll_2[3]); - else - m_fg_tilemap->set_scrollx(0,m_scroll_2[0] * 256 + m_scroll_2[1] - m_videoshift); - } -} - WRITE16_MEMBER(nmk16_state::vandyke_scroll_w) { m_vscroll[offset] = data; @@ -282,41 +227,41 @@ WRITE16_MEMBER(nmk16_state::manybloc_scroll_w) m_bg_tilemap[0]->set_scrolly(0,m_gunnail_scrollram[0xc2/2]); } -WRITE16_MEMBER(nmk16_state::nmk_flipscreen_w) +WRITE8_MEMBER(nmk16_state::nmk_flipscreen_w) { - if (ACCESSING_BITS_0_7) - flip_screen_set(data & 0x01); + flip_screen_set(data & 0x01); } -WRITE16_MEMBER(nmk16_state::nmk_tilebank_w) +WRITE8_MEMBER(nmk16_state::nmk_tilebank_w) { - if (ACCESSING_BITS_0_7) + if (m_bgbank != data) { - if (m_bgbank != (data & 0xff)) - { - m_bgbank = data & 0xff; - for (int bank = 0; bank < 4; bank++) - if (m_bg_tilemap[bank]) m_bg_tilemap[bank]->mark_all_dirty(); + m_bgbank = data; + for (int layer = 0; layer < 2; layer++) + if (m_bg_tilemap[layer]) m_bg_tilemap[layer]->mark_all_dirty(); + } +} + +WRITE16_MEMBER(nmk16_state::raphero_scroll_w) +{ + COMBINE_DATA(&m_gunnail_scrollram[offset]); + if ((m_nmk_bgvideoram[0].bytes() > 0x4000) && (offset == 0)) + { + int newbank = (m_gunnail_scrollram[0] >> 12) & ((m_nmk_bgvideoram[0].bytes() >> 14)-1); + if (m_tilerambank != newbank) + { + m_tilerambank = newbank; } } } -WRITE16_MEMBER(nmk16_state::bioship_scroll_w) +WRITE8_MEMBER(nmk16_state::bioship_bank_w) { - if (ACCESSING_BITS_8_15) - m_bioship_scroll[offset]=data>>8; -} - -WRITE16_MEMBER(nmk16_state::bioship_bank_w) -{ - if (ACCESSING_BITS_0_7) + if (m_bioship_background_bank != data) { - if (m_bioship_background_bank != data) - { - m_bioship_background_bank = data; - m_redraw_bitmap=1; - } + m_bioship_background_bank = data; + m_bg_tilemap[0]->mark_all_dirty(); } } @@ -363,6 +308,10 @@ inline void nmk16_state::nmk16_draw_sprite(bitmap_ind16 &bitmap, const rectangle color, flip_screen(), flip_screen(), ((x + 16) & 0x1ff) - 16,sy & 0x1ff,15); + m_sprclk += 128; // 128 clock per each 16x16 tile + if (m_sprclk >= m_sprlimit) + return; + code++; x += delta; } while (--xx >= 0); @@ -411,6 +360,10 @@ inline void nmk16_state::nmk16_draw_sprite_flipsupported(bitmap_ind16 &bitmap, c color, flipx, flipy, ((x + 16) & 0x1ff) - 16,sy & 0x1ff,15); + m_sprclk += 128; // 128 clock per each 16x16 tile + if (m_sprclk >= m_sprlimit) + return; + code++; x += delta * (flipx ? -1 : 1); } while (--xx >= 0); @@ -420,10 +373,15 @@ inline void nmk16_state::nmk16_draw_sprite_flipsupported(bitmap_ind16 &bitmap, c void nmk16_state::nmk16_draw_sprites_swap(bitmap_ind16 &bitmap, const rectangle &cliprect, int *bittbl) { + m_sprclk = 0; int i; for (i = 0; i < 0x100; i++) { + m_sprclk += 16; // 16 clock per each reading + if (m_sprclk >= m_sprlimit) + return; + int spr = bitswap<8>(i, bittbl[0], bittbl[1], bittbl[2], bittbl[3], bittbl[4], bittbl[5], bittbl[6], bittbl[7]); nmk16_draw_sprite(bitmap, cliprect, m_spriteram_old2.get() + (spr * 16/2)); } @@ -431,10 +389,15 @@ void nmk16_state::nmk16_draw_sprites_swap(bitmap_ind16 &bitmap, const rectangle void nmk16_state::nmk16_draw_sprites_swap_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect, int *bittbl) { + m_sprclk = 0; int i; for ( i = 0; i < 0x100; i++ ) { + m_sprclk += 16; // 16 clock per each reading + if (m_sprclk >= m_sprlimit) + return; + int spr = bitswap<8>(i, bittbl[0], bittbl[1], bittbl[2], bittbl[3], bittbl[4], bittbl[5], bittbl[6], bittbl[7]); nmk16_draw_sprite_flipsupported(bitmap, cliprect, m_spriteram_old2.get() + (spr * 16/2)); } @@ -442,20 +405,30 @@ void nmk16_state::nmk16_draw_sprites_swap_flipsupported(bitmap_ind16 &bitmap, co void nmk16_state::nmk16_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) { + m_sprclk = 0; int offs; for (offs = 0; offs < 0x1000/2; offs += 8) { + m_sprclk += 16; // 16 clock per each reading + if (m_sprclk >= m_sprlimit) + return; + nmk16_draw_sprite(bitmap, cliprect, m_spriteram_old2.get() + offs); } } void nmk16_state::nmk16_draw_sprites_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect) { + m_sprclk = 0; int offs; for (offs = 0; offs < 0x1000/2; offs += 8) { + m_sprclk += 16; // 16 clock per each reading + if (m_sprclk >= m_sprlimit) + return; + nmk16_draw_sprite_flipsupported(bitmap, cliprect, m_spriteram_old2.get() + offs); } } @@ -468,157 +441,29 @@ void nmk16_state::nmk16_draw_sprites_flipsupported(bitmap_ind16 &bitmap, const r ***************************************************************************/ -int nmk16_state::nmk16_bg_spr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +void nmk16_state::nmk16_bg_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer) { - m_bg_tilemap[0]->set_scrollx(0,-m_videoshift); - - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - - nmk16_draw_sprites(bitmap,cliprect); - return 0; -} - -int nmk16_state::nmk16_bg_fg_spr_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_tx_tilemap->set_scrollx(0,-m_videoshift); - - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0); - - nmk16_draw_sprites(bitmap,cliprect); - - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -int nmk16_state::nmk16_bg_spr_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_tx_tilemap->set_scrollx(0,-m_videoshift); - - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - - nmk16_draw_sprites(bitmap,cliprect); - - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -int nmk16_state::nmk16_bg_sprflip_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_tx_tilemap->set_scrollx(0,-m_videoshift); - - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - - nmk16_draw_sprites_flipsupported(bitmap,cliprect); - - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -int nmk16_state::nmk16_bioshipbg_sprflip_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int scrollx=-(m_bioship_scroll[1] + m_bioship_scroll[0]*256); - int scrolly=-(m_bioship_scroll[3] + m_bioship_scroll[2]*256); - - m_tx_tilemap->set_scrollx(0,-m_videoshift); - - if (m_redraw_bitmap) + if (m_gunnail_scrollram && m_gunnail_scrollramy) { - int bank = m_bioship_background_bank * 0x2000; - int sx=0, sy=0, offs; - m_redraw_bitmap=0; - - /* Draw background from tile rom */ - for (offs = 0;offs <0x1000;offs++) { - uint16_t data = m_tilemap_rom[offs+bank]; - int numtile = data&0xfff; - int color = (data&0xf000)>>12; - - m_gfxdecode->gfx(3)->opaque(*m_background_bitmap,m_background_bitmap->cliprect(), - numtile, - color, - 0,0, /* no flip */ - 16*sx,16*sy); - - data = m_tilemap_rom[offs+0x1000+bank]; - numtile = data&0xfff; - color = (data&0xf000)>>12; - m_gfxdecode->gfx(3)->opaque(*m_background_bitmap,m_background_bitmap->cliprect(), - numtile, - color, - 0,0, /* no flip */ - 16*sx,(16*sy)+256); - - sy++; - if (sy==16) {sy=0; sx++;} - } - } - - copyscrollbitmap(bitmap,*m_background_bitmap,1,&scrollx,1,&scrolly,cliprect); - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - - nmk16_draw_sprites(bitmap,cliprect); - - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -int nmk16_state::nmk16_bg_sprswap_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bittbl[8]) -{ - m_tx_tilemap->set_scrollx(0,-m_videoshift); - - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - - nmk16_draw_sprites_swap(bitmap,cliprect, bittbl); - - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -int nmk16_state::nmk16_bg_sprswapflip_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bittbl[8]) -{ - m_tx_tilemap->set_scrollx(0,-m_videoshift); - - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - - nmk16_draw_sprites_swap_flipsupported(bitmap,cliprect, bittbl); - - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -int nmk16_state::nmk16_complexbg_sprswap_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bittbl[8]) -{ - m_tx_tilemap->set_scrollx(0,-m_videoshift); - - // the hardware supports per-scanline X *and* Y scroll which isn't - // supported by tilemaps so we have to draw the tilemap one line at a time - if (!m_simple_scroll) - { - int i=16; - int y1; - rectangle bgclip = cliprect; - y1 = cliprect.min_y; + // the hardware supports per-scanline X *and* Y scroll which isn't + // supported by tilemaps so we have to draw the tilemap one line at a time + int i=16; + int y1; + rectangle bgclip = cliprect; + y1 = cliprect.min_y; while (y1 <= cliprect.max_y) { int const yscroll = m_gunnail_scrollramy[0] + m_gunnail_scrollramy[y1]; - tilemap_t* bg_tilemap = m_bg_tilemap[0]; bgclip.min_y = y1; bgclip.max_y = y1; - if (m_bg_tilemap[1] && m_bg_tilemap[2] && m_bg_tilemap[3]) - { - int tilemap_bank_select = (m_gunnail_scrollram[0]&0x3000)>>12; - bg_tilemap = m_bg_tilemap[tilemap_bank_select]; - } + m_bg_tilemap[layer]->set_scroll_rows(512); - bg_tilemap->set_scroll_rows(512); + m_bg_tilemap[layer]->set_scrolly(0, yscroll); + m_bg_tilemap[layer]->set_scrollx((i + yscroll) & 0x1ff, m_gunnail_scrollram[0] + m_gunnail_scrollram[i] - m_videoshift); - bg_tilemap->set_scrolly(0, yscroll); - bg_tilemap->set_scrollx((i + yscroll) & 0x1ff, m_gunnail_scrollram[0] + m_gunnail_scrollram[i] - m_videoshift); - - bg_tilemap->draw(screen, bitmap, bgclip, 0,0); + m_bg_tilemap[layer]->draw(screen, bitmap, bgclip, 0,0); y1++; i++; @@ -626,30 +471,14 @@ int nmk16_state::nmk16_complexbg_sprswap_tx_update(screen_device &screen, bitmap } else { - uint16_t yscroll = ((m_gunnail_scrollram[2]&0xff)<<8) | ((m_gunnail_scrollram[3]&0xff)<<0); - uint16_t xscroll = ((m_gunnail_scrollram[0]&0xff)<<8) | ((m_gunnail_scrollram[1]&0xff)<<0); - tilemap_t* bg_tilemap = m_bg_tilemap[0]; - - //popmessage( "scroll %04x, %04x", yscroll,xscroll); - - if (m_bg_tilemap[1] && m_bg_tilemap[2] && m_bg_tilemap[3]) - { - int tilemap_bank_select = (xscroll&0x3000)>>12; - bg_tilemap = m_bg_tilemap[tilemap_bank_select]; - } - - bg_tilemap->set_scroll_rows(1); - - bg_tilemap->set_scrolly(0, yscroll); - bg_tilemap->set_scrollx(0, xscroll - m_videoshift); - - bg_tilemap->draw(screen, bitmap, cliprect, 0,0); + m_bg_tilemap[layer]->draw(screen, bitmap, cliprect, 0,0); } +} - nmk16_draw_sprites_swap(bitmap,cliprect, bittbl); - +void nmk16_state::nmk16_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_tx_tilemap->set_scrollx(0,-m_videoshift); m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; } /*************************************************************************** @@ -662,12 +491,18 @@ int nmk16_state::nmk16_complexbg_sprswap_tx_update(screen_device &screen, bitmap uint32_t nmk16_state::screen_update_macross(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - return nmk16_bg_spr_tx_update(screen, bitmap, cliprect); + nmk16_bg_update(screen,bitmap,cliprect,0); + nmk16_draw_sprites(bitmap,cliprect); + nmk16_tx_update(screen,bitmap,cliprect); + return 0; } uint32_t nmk16_state::screen_update_manybloc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - return nmk16_bg_sprflip_tx_update(screen, bitmap, cliprect); + nmk16_bg_update(screen,bitmap,cliprect,0); + nmk16_draw_sprites_flipsupported(bitmap,cliprect); + nmk16_tx_update(screen,bitmap,cliprect); + return 0; } uint32_t nmk16_state::screen_update_tharrier(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -677,7 +512,10 @@ uint32_t nmk16_state::screen_update_tharrier(screen_device &screen, bitmap_ind16 m_bg_tilemap[0]->set_scrollx(0,tharrier_scroll); - return nmk16_bg_sprflip_tx_update(screen, bitmap, cliprect); + nmk16_bg_update(screen,bitmap,cliprect,0); + nmk16_draw_sprites_flipsupported(bitmap,cliprect); + nmk16_tx_update(screen,bitmap,cliprect); + return 0; } uint32_t nmk16_state::screen_update_tdragon2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -686,31 +524,28 @@ uint32_t nmk16_state::screen_update_tdragon2(screen_device &screen, bitmap_ind16 4, 6, 5, 7, 3, 2, 1, 0 }; - return nmk16_complexbg_sprswap_tx_update(screen, bitmap, cliprect, bittbl); -} - -uint32_t nmk16_state::screen_update_gunnail(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - static int bittbl[8] = { - 7, 6, 5, 4, 3, 2, 1, 0 - }; - - return nmk16_complexbg_sprswap_tx_update(screen, bitmap, cliprect, bittbl); -} - -uint32_t nmk16_state::screen_update_bioship(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return nmk16_bioshipbg_sprflip_tx_update(screen, bitmap, cliprect); + nmk16_bg_update(screen,bitmap,cliprect,0); + nmk16_draw_sprites_swap(bitmap,cliprect, bittbl); + nmk16_tx_update(screen,bitmap,cliprect); + return 0; } uint32_t nmk16_state::screen_update_strahl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - return nmk16_bg_fg_spr_tx_update(screen, bitmap, cliprect); + nmk16_bg_update(screen,bitmap,cliprect,0); + nmk16_bg_update(screen,bitmap,cliprect,1); + nmk16_draw_sprites(bitmap,cliprect); + nmk16_tx_update(screen,bitmap,cliprect); + return 0; } uint32_t nmk16_state::screen_update_bjtwin(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - return nmk16_bg_spr_update(screen, bitmap, cliprect); + m_bg_tilemap[0]->set_scrollx(0,-m_videoshift); + + nmk16_bg_update(screen,bitmap,cliprect,0); + nmk16_draw_sprites(bitmap,cliprect); + return 0; } @@ -724,14 +559,15 @@ uint32_t nmk16_state::screen_update_bjtwin(screen_device &screen, bitmap_ind16 & VIDEO_START_MEMBER(nmk16_state,afega) { + m_sprlimit = 384 * 263; m_spriteram_old = make_unique_clear(0x1000/2); m_spriteram_old2 = make_unique_clear(0x1000/2); m_bg_tilemap[0] = &machine().tilemap().create( *m_gfxdecode, - tilemap_get_info_delegate(FUNC(nmk16_state::common_get_bg_tile_info<0>),this), + tilemap_get_info_delegate(&nmk16_state::common_get_bg_tile_info<0, 1>, "bg0_gfx1",this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this), - 16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); + 16,16, 256,32); m_tx_tilemap = &machine().tilemap().create( *m_gfxdecode, @@ -740,42 +576,22 @@ VIDEO_START_MEMBER(nmk16_state,afega) 8,8, 32,32); m_tx_tilemap->set_transparent_pen(0xf); + save_pointer(NAME(m_spriteram_old), 0x1000/2); + save_pointer(NAME(m_spriteram_old2), 0x1000/2); } VIDEO_START_MEMBER(nmk16_state,grdnstrm) { + m_sprlimit = 384 * 263; m_spriteram_old = make_unique_clear(0x1000/2); m_spriteram_old2 = make_unique_clear(0x1000/2); - m_bg_tilemap[0] = &machine().tilemap().create( *m_gfxdecode, tilemap_get_info_delegate(FUNC(nmk16_state::get_tile_info_0_8bit),this), tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this), - 16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - - m_tx_tilemap = &machine().tilemap().create( - *m_gfxdecode, - tilemap_get_info_delegate(FUNC(nmk16_state::common_get_tx_tile_info),this), - TILEMAP_SCAN_COLS, - 8,8, 32,32); - - m_tx_tilemap->set_transparent_pen(0xf); -} - - -VIDEO_START_MEMBER(nmk16_state,firehawk) -{ - m_spriteram_old = make_unique_clear(0x1000/2); - m_spriteram_old2 = make_unique_clear(0x1000/2); - - - m_bg_tilemap[0] = &machine().tilemap().create( - *m_gfxdecode, - tilemap_get_info_delegate(FUNC(nmk16_state::get_tile_info_0_8bit),this), - tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),this), - 16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); + 16,16, 256,32); m_tx_tilemap = &machine().tilemap().create( *m_gfxdecode, @@ -784,6 +600,8 @@ VIDEO_START_MEMBER(nmk16_state,firehawk) 8,8, 32,32); m_tx_tilemap->set_transparent_pen(0xf); + save_pointer(NAME(m_spriteram_old), 0x1000/2); + save_pointer(NAME(m_spriteram_old2), 0x1000/2); }