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
This commit is contained in:
cam900 2018-06-27 00:24:14 +09:00 committed by Vas Crabb
parent afa66e6b8d
commit d1356cd5c1
3 changed files with 299 additions and 501 deletions

View File

@ -70,6 +70,8 @@ TODO:
- Thunder Dragon 3 (bootleg of Thunder Dragon 2) : - Thunder Dragon 3 (bootleg of Thunder Dragon 2) :
Sound System isn't hooked up correctly for this set. Sound System isn't hooked up correctly for this set.
- Verify sprite limits for games when resolution is 384x224
NOT BUGS: NOT BUGS:
- Hacha Mecha Fighter: (BTANB) the bomb graphics are pretty weird when the game - 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. 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 rate limit for making their sound effect. This is normal, it's like this on all
PCB recordings. 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 // 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) // 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<int Bank> template<int Layer>
WRITE16_MEMBER(nmk16_state::nmk_bgvideoram_w) WRITE16_MEMBER(nmk16_state::nmk_bgvideoram_w)
{ {
COMBINE_DATA(&m_nmk_bgvideoram[Bank][offset]); COMBINE_DATA(&m_nmk_bgvideoram[Layer][offset]);
m_bg_tilemap[Bank]->mark_tile_dirty(offset); if ((offset >> 13) == m_tilerambank)
} m_bg_tilemap[Layer]->mark_tile_dirty(offset & 0x1fff);
WRITE16_MEMBER(nmk16_state::nmk_fgvideoram_w)
{
COMBINE_DATA(&m_nmk_fgvideoram[offset]);
m_fg_tilemap->mark_tile_dirty(offset);
} }
WRITE16_MEMBER(nmk16_state::nmk_txvideoram_w) 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); m_tx_tilemap->mark_tile_dirty(offset);
} }
template<int Layer>
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(0x08000a, 0x08000b).portr("DSW2");
map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read));
map(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_x0016_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(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write));
map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x08c000, 0x08c007).w(FUNC(nmk16_state::vandyke_scroll_w)); 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(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read));
map(0x080010, 0x08001d).w(FUNC(nmk16_state::vandykeb_scroll_w)); /* 10, 12, 1a, 1c */ map(0x080010, 0x08001d).w(FUNC(nmk16_state::vandykeb_scroll_w)); /* 10, 12, 1a, 1c */
map(0x080016, 0x080017).nopw(); /* IRQ enable? */ 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(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write));
map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x08c000, 0x08c007).nopw(); /* just in case... */ 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(0x080004, 0x080005).portr("DSW1");
map(0x080010, 0x080011).nopw(); /* See notes at the top of the driver */ 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(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(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(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"); 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(0x08c000, 0x08c1ff).writeonly().share("scrollram");
map(0x08c200, 0x08c3ff).writeonly().share("scrollramy"); map(0x08c200, 0x08c3ff).writeonly().share("scrollramy");
map(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); 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(0x094001, 0x094001).w(m_oki[0], FUNC(okim6295_device::write));
map(0x094003, 0x094003).r("oki1", FUNC(okim6295_device::read)); 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(0x09c000, 0x09cfff).mirror(0x001000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram");
map(0x0f0000, 0x0fffff).ram().share("mainram"); 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(0x08000f, 0x08000f).r("soundlatch2", FUNC(generic_latch_8_device::read)); /* from Z80 */
map(0x080010, 0x080011).w(FUNC(nmk16_state::tharrier_mcu_control_w)); map(0x080010, 0x080011).w(FUNC(nmk16_state::tharrier_mcu_control_w));
map(0x080012, 0x080013).nopw(); map(0x080012, 0x080013).nopw();
// map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); // map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_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_soundlatch, FUNC(generic_latch_8_device::write)); map(0x08001f, 0x08001f).w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0x080202, 0x080203).portr("IN2"); map(0x080202, 0x080203).portr("IN2");
map(0x088000, 0x0883ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); 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(0x090000, 0x093fff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0");
map(0x09c000, 0x09c7ff).ram(); /* Unused txvideoram area? */ map(0x09c000, 0x09c7ff).ram(); /* Unused txvideoram area? */
map(0x09d000, 0x09d7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); 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(0x0000, 0xbfff).rom();
map(0xc000, 0xc7ff).ram(); 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(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(0xf400, 0xf400).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0xf500, 0xf500).rw(m_oki2, 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(0xf600, 0xf600).w(FUNC(nmk16_state::tharrier_oki6295_bankswitch_w<0>));
map(0xf700, 0xf700).w(FUNC(nmk16_state::tharrier_oki6295_bankswitch_w<1>)); 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(0x080004, 0x080005).portr("DSW1");
map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read));
map(0x08000e, 0x08000f).nopw(); 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(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_x0016_w)); // frame number?
map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write));
map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); 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(0x080002, 0x080003).portr("IN1");
map(0x080004, 0x080005).portr("DSW1"); map(0x080004, 0x080005).portr("DSW1");
map(0x08000e, 0x08000f).noprw(); 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(0x080016, 0x080017).nopw(); // frame number?
map(0x08001e, 0x08001f).w("seibu_sound", FUNC(seibu_sound_device::main_mustb_w)); 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"); 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"); map(0x0f0000, 0x0fffff).ram().w(FUNC(nmk16_state::nmk16_mainram_strange_w)).share("mainram");
} }
void nmk16_state::twinactn_map(address_map &map) void nmk16_state::twinactn_map(address_map &map)
{ {
map(0x000000, 0x03ffff).rom(); map(0x000000, 0x03ffff).rom();
@ -498,7 +519,7 @@ void nmk16_state::twinactn_map(address_map &map)
map(0x080002, 0x080003).portr("IN1"); map(0x080002, 0x080003).portr("IN1");
map(0x080004, 0x080005).portr("DSW1"); map(0x080004, 0x080005).portr("DSW1");
map(0x08000e, 0x08000f).noprw(); 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(0x080016, 0x080017).nopw(); // frame number?
map(0x08001f, 0x08001f).w(m_soundlatch, FUNC(generic_latch_8_device::write)); 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"); 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"); map(0x0f0000, 0x0fffff).ram().w(FUNC(nmk16_state::nmk16_mainram_strange_w)).share("mainram");
} }
void nmk16_state::acrobatm_map(address_map &map) void nmk16_state::acrobatm_map(address_map &map)
{ {
map(0x00000, 0x3ffff).rom(); map(0x00000, 0x3ffff).rom();
@ -519,12 +539,12 @@ void nmk16_state::acrobatm_map(address_map &map)
map(0xc0008, 0xc0009).portr("DSW1"); map(0xc0008, 0xc0009).portr("DSW1");
map(0xc000a, 0xc000b).portr("DSW2"); map(0xc000a, 0xc000b).portr("DSW2");
map(0xc000f, 0xc000f).r(m_nmk004, FUNC(nmk004_device::read)); 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(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(0xc001f, 0xc001f).w(m_nmk004, FUNC(nmk004_device::write));
map(0xc4000, 0xc45ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); 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(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"); 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(0x080008, 0x080009).portr("DSW1");
map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000a, 0x08000b).portr("DSW2");
map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); 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(0x080016, 0x080017).w(FUNC(nmk16_state::nmk16_bioship_x0016_w));
map(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write)); 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(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x08c000, 0x08c007).ram().w(FUNC(nmk16_state::bioshipbg_scroll_w)); map(0x08c000, 0x08c007).ram().w(FUNC(nmk16_state::nmk_scroll_w<1>)).umask16(0xff00);
map(0x08c010, 0x08c017).ram().w(FUNC(nmk16_state::bioship_scroll_w)); 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<0>)).share("nmk_bgvideoram0"); 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(0x09c000, 0x09c7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram");
map(0x0f0000, 0x0fffff).ram().share("mainram"); map(0x0f0000, 0x0fffff).ram().share("mainram");
} }
@ -717,13 +737,13 @@ void nmk16_state::hachamf_map(address_map &map)
map(0x080008, 0x080009).portr("DSW1"); map(0x080008, 0x080009).portr("DSW1");
map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000a, 0x08000b).portr("DSW2");
map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); 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(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(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write));
/* Video Region */ /* Video Region */
map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); 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(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(0x09c000, 0x09c7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram");
/* Main RAM, inc sprites, shared with MCU */ /* 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.*/ /*needed because of the uncompatibility of the dsw settings.*/
if(dsw_setting) // Thunder Dragon if(dsw_setting) // Thunder Dragon
{ {
dsw[0] = (ioport("DSW2")->read() & 0x7); dsw[0] = (m_dsw_io[1]->read() & 0x7);
dsw[1] = (ioport("DSW2")->read() & 0x38) >> 3; dsw[1] = (m_dsw_io[1]->read() & 0x38) >> 3;
for(i=0;i<2;i++) for(i=0;i<2;i++)
{ {
switch(dsw[i] & 7) switch(dsw[i] & 7)
@ -828,8 +848,8 @@ void nmk16_state::mcu_run(uint8_t dsw_setting)
} }
else // Hacha Mecha Fighter else // Hacha Mecha Fighter
{ {
dsw[0] = (ioport("DSW1")->read() & 0x0700) >> 8; dsw[0] = (m_dsw_io[0]->read() & 0x0700) >> 8;
dsw[1] = (ioport("DSW1")->read() & 0x3800) >> 11; dsw[1] = (m_dsw_io[0]->read() & 0x3800) >> 11;
for(i=0;i<2;i++) for(i=0;i<2;i++)
{ {
switch(dsw[i] & 7) switch(dsw[i] & 7)
@ -847,7 +867,7 @@ void nmk16_state::mcu_run(uint8_t dsw_setting)
} }
/*read the coin port*/ /*read the coin port*/
coin_input = (~(ioport("IN0")->read())); coin_input = (~(m_in_io[0]->read()));
if(coin_input & 0x01)//coin 1 if(coin_input & 0x01)//coin 1
{ {
@ -951,11 +971,11 @@ void nmk16_state::tdragon_map(address_map &map)
map(0x0c0008, 0x0c0009).portr("DSW1"); map(0x0c0008, 0x0c0009).portr("DSW1");
map(0x0c000a, 0x0c000b).portr("DSW2"); map(0x0c000a, 0x0c000b).portr("DSW2");
map(0x0c000f, 0x0c000f).r(m_nmk004, FUNC(nmk004_device::read)); 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(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(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(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(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"); 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(0x0c0002, 0x0c0003).portr("IN1");
map(0x0c0008, 0x0c0009).portr("DSW1"); map(0x0c0008, 0x0c0009).portr("DSW1");
map(0x0c000a, 0x0c000b).portr("DSW2"); map(0x0c000a, 0x0c000b).portr("DSW2");
map(0x0c0014, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ map(0x0c0015, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */
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(0x0c001e, 0x0c001f).w("seibu_sound", FUNC(seibu_sound_device::main_mustb_w)); 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(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(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"); 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(0x0c0004, 0x0c0005).portr("IN1");
map(0x0c0006, 0x0c0007).portr("DSW1"); map(0x0c0006, 0x0c0007).portr("DSW1");
// AM_RANGE(0x0c000e, 0x0c000f) AM_READ(??) // AM_RANGE(0x0c000e, 0x0c000f) AM_READ(??)
map(0x0c0014, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */ map(0x0c0015, 0x0c0015).w(FUNC(nmk16_state::nmk_flipscreen_w)); /* Maybe */
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_soundlatch, FUNC(generic_latch_8_device::write)); 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(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(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 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(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram(); map(0x8000, 0x87ff).ram();
map(0x9000, 0x9000).w(FUNC(nmk16_state::ssmissin_soundbank_w)); 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)); 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(0x80008, 0x80009).portr("DSW1");
map(0x8000a, 0x8000b).portr("DSW2"); map(0x8000a, 0x8000b).portr("DSW2");
map(0x8000f, 0x8000f).r(m_nmk004, FUNC(nmk004_device::read)); 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(0x80016, 0x80017).w(FUNC(nmk16_state::nmk16_x0016_w));
map(0x8001f, 0x8001f).w(m_nmk004, FUNC(nmk004_device::write)); map(0x8001f, 0x8001f).w(m_nmk004, FUNC(nmk004_device::write));
map(0x84000, 0x84007).ram().w(FUNC(nmk16_state::nmk_scroll_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_2_w)); 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(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(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(0x9c000, 0x9c7ff).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram");
map(0xf0000, 0xfffff).ram().share("mainram"); map(0xf0000, 0xfffff).ram().share("mainram");
} }
@ -1051,12 +1071,12 @@ void nmk16_state::macross_map(address_map &map)
map(0x080008, 0x080009).portr("DSW1"); map(0x080008, 0x080009).portr("DSW1");
map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000a, 0x08000b).portr("DSW2");
map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); 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(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(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write));
map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); 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(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(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"); 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(0x080008, 0x080009).portr("DSW1");
map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000a, 0x08000b).portr("DSW2");
map(0x08000f, 0x08000f).r(m_nmk004, FUNC(nmk004_device::read)); 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(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(0x08001f, 0x08001f).w(m_nmk004, FUNC(nmk004_device::write));
map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x08c000, 0x08c1ff).writeonly().share("scrollram"); map(0x08c000, 0x08c1ff).writeonly().share("scrollram");
@ -1091,21 +1111,13 @@ void nmk16_state::macross2_map(address_map &map)
map(0x100008, 0x100009).portr("DSW1"); map(0x100008, 0x100009).portr("DSW1");
map(0x10000a, 0x10000b).portr("DSW2"); map(0x10000a, 0x10000b).portr("DSW2");
map(0x10000f, 0x10000f).r("soundlatch2", FUNC(generic_latch_8_device::read)); /* from Z80 */ 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(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(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(0x120000, 0x1207ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x130000, 0x130007).ram().w(FUNC(nmk16_state::nmk_scroll_w<0>)).umask16(0x00ff);
map(0x130000, 0x1301ff).ram().share("scrollram"); map(0x140000, 0x14ffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0");
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(0x170000, 0x170fff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0x170000, 0x170fff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram");
map(0x1f0000, 0x1fffff).ram().share("mainram"); map(0x1f0000, 0x1fffff).ram().share("mainram");
} }
@ -1125,22 +1137,15 @@ void nmk16_state::raphero_map(address_map &map)
map(0x100008, 0x100009).portr("DSW1"); map(0x100008, 0x100009).portr("DSW1");
map(0x10000a, 0x10000b).portr("DSW2"); map(0x10000a, 0x10000b).portr("DSW2");
map(0x10000f, 0x10000f).r("soundlatch2", FUNC(generic_latch_8_device::read)); /* from Z80 */ 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(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(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(0x120000, 0x1207ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x130000, 0x1301ff).ram().w(FUNC(nmk16_state::raphero_scroll_w)).share("scrollram");
map(0x130000, 0x1301ff).ram().share("scrollram");
map(0x130200, 0x1303ff).ram().share("scrollramy"); map(0x130200, 0x1303ff).ram().share("scrollramy");
map(0x130400, 0x1307ff).ram(); map(0x130400, 0x1307ff).ram();
map(0x140000, 0x14ffff).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0");
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(0x170000, 0x170fff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram"); map(0x170000, 0x170fff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_txvideoram_w)).share("nmk_txvideoram");
map(0x1f0000, 0x1fffff).ram().share("mainram"); 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(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("audiobank"); map(0x8000, 0xbfff).bankr("audiobank");
map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); 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(0xc800, 0xc800).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0xc808, 0xc808).rw(m_oki2, 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(0xc810, 0xc817).w("nmk112", FUNC(nmk112_device::okibank_w));
map(0xd000, 0xd000).w(FUNC(nmk16_state::macross2_sound_bank_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 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.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); 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(0x80, 0x80).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x88, 0x88).rw(m_oki2, 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)); 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(0x080002, 0x080003).portr("IN1");
map(0x080008, 0x080009).portr("DSW1"); map(0x080008, 0x080009).portr("DSW1");
map(0x08000a, 0x08000b).portr("DSW2"); map(0x08000a, 0x08000b).portr("DSW2");
map(0x080014, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w)); map(0x080015, 0x080015).w(FUNC(nmk16_state::nmk_flipscreen_w));
map(0x084001, 0x084001).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x084001, 0x084001).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x084011, 0x084011).rw(m_oki2, 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(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(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(0x094002, 0x094003).nopw(); /* IRQ enable? */
map(0x09c000, 0x09cfff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0"); map(0x09c000, 0x09cfff).mirror(0x1000).ram().w(FUNC(nmk16_state::nmk_bgvideoram_w<0>)).share("nmk_bgvideoram0");
map(0x0f0000, 0x0fffff).ram().share("mainram"); map(0x0f0000, 0x0fffff).ram().share("mainram");
@ -3813,7 +3818,6 @@ static INPUT_PORTS_START( dolmen )
INPUT_PORTS_END INPUT_PORTS_END
static const gfx_layout charlayout = static const gfx_layout charlayout =
{ {
8,8, 8,8,
@ -3861,8 +3865,6 @@ static GFXDECODE_START( gfx_bjtwin )
GFXDECODE_END GFXDECODE_END
static GFXDECODE_START( gfx_bioship ) static GFXDECODE_START( gfx_bioship )
GFXDECODE_ENTRY( "fgtile", 0, charlayout, 0x300, 16 ) /* color 0x300-0x3ff */ GFXDECODE_ENTRY( "fgtile", 0, charlayout, 0x300, 16 ) /* color 0x300-0x3ff */
GFXDECODE_ENTRY( "bgtile", 0, tilelayout, 0x100, 16 ) /* color 0x100-0x1ff */ 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") MCFG_SCREEN_PALETTE("palette")
MACHINE_CONFIG_START(nmk16_state::tharrier) MACHINE_CONFIG_START(nmk16_state::tharrier)
/* basic machine hardware */ /* basic machine hardware */
@ -3976,7 +3976,6 @@ MACHINE_CONFIG_START(nmk16_state::tharrier)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_tharrier) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_tharrier)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tharrier) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tharrier)
MCFG_PALETTE_ADD("palette", 512) MCFG_PALETTE_ADD("palette", 512)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4015,7 +4014,6 @@ MACHINE_CONFIG_START(nmk16_state::mustang)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4058,7 +4056,6 @@ MACHINE_CONFIG_START(nmk16_state::mustangb)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4094,8 +4091,7 @@ MACHINE_CONFIG_START(nmk16_state::bioship)
/* video hardware */ /* video hardware */
NMK_HACKY_SCREEN_LOWRES 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_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bioship)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
@ -4136,7 +4132,6 @@ MACHINE_CONFIG_START(nmk16_state::vandyke)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4179,7 +4174,6 @@ MACHINE_CONFIG_START(nmk16_state::vandykeb)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4205,9 +4199,8 @@ MACHINE_CONFIG_START(nmk16_state::acrobatm)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 768)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBxxxx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBxxxx)
MCFG_VIDEO_START_OVERRIDE(nmk16_state,macross) 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 NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4284,7 +4276,6 @@ MACHINE_CONFIG_START(nmk16_state::tdragon)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4332,7 +4323,6 @@ MACHINE_CONFIG_START(nmk16_state::ssmissin)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4401,7 +4391,6 @@ MACHINE_CONFIG_START(nmk16_state::hachamf)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4447,7 +4436,6 @@ MACHINE_CONFIG_START(nmk16_state::macross)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4487,7 +4475,6 @@ MACHINE_CONFIG_START(nmk16_state::blkheart)
NMK_HACKY_SCREEN_LOWRES NMK_HACKY_SCREEN_LOWRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_macross)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4525,7 +4512,7 @@ MACHINE_CONFIG_START(nmk16_state::gunnail)
/* video hardware */ /* video hardware */
NMK_HACKY_SCREEN_HIRES 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_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
@ -4568,8 +4555,7 @@ MACHINE_CONFIG_START(nmk16_state::macross2)
/* video hardware */ /* video hardware */
NMK_HACKY_SCREEN_HIRES 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_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross2)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
@ -4616,7 +4602,6 @@ MACHINE_CONFIG_START(nmk16_state::tdragon2)
NMK_HACKY_SCREEN_HIRES NMK_HACKY_SCREEN_HIRES
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_tdragon2) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_tdragon2)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross2) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross2)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
@ -4674,7 +4659,7 @@ MACHINE_CONFIG_START(nmk16_state::raphero)
MCFG_PALETTE_ADD("palette", 1024) MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
MCFG_VIDEO_START_OVERRIDE(nmk16_state,raphero) MCFG_VIDEO_START_OVERRIDE(nmk16_state,gunnail)
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
@ -4817,7 +4802,7 @@ MACHINE_CONFIG_START(nmk16_tomagic_state::tomagic)
/* video hardware */ /* video hardware */
NMK_HACKY_SCREEN_HIRES 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_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_macross)
MCFG_PALETTE_ADD("palette", 1024) 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() 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[0]->configure_entries(0, 4, memregion("oki1")->base() + 0x20000, 0x20000);
m_okibank[1]->configure_entries(0, 4, memregion("oki2")->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() void nmk16_state::init_hachamf_prot()
@ -5026,6 +5019,7 @@ void nmk16_state::init_hachamf_prot()
rom[0x04aa/2] = 0x4e71; rom[0x04aa/2] = 0x4e71;
m_maincpu->space(AS_PROGRAM).install_write_handler(0x0f0000, 0x0fffff, write16_delegate(FUNC(nmk16_state::hachamf_mainram_w),this)); 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() void nmk16_state::init_tdragonb()
@ -5045,6 +5039,7 @@ void nmk16_state::init_tdragon_prot()
rom[0x04aa/2] = 0x4e71; rom[0x04aa/2] = 0x4e71;
m_maincpu->space(AS_PROGRAM).install_write_handler(0x0b0000, 0x0bffff, write16_delegate(FUNC(nmk16_state::tdragon_mainram_w),this)); 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() 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) WRITE8_MEMBER(nmk16_state::spec2k_oki1_banking_w)
{ {
if(data == 0xfe) if(data == 0xfe)
m_oki2->set_rom_bank(0); m_oki[1]->set_rom_bank(0);
else if(data == 0xff) 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) 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(0xf000, 0xf7ff).ram(); // RAM
map(0xf800, 0xf800).r(m_soundlatch, FUNC(generic_latch_8_device::read)); // From Main CPU 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(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) 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(0xf800, 0xffff).ram(); // not used, only tested
map(0xfff0, 0xfff0).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0xfff0, 0xfff0).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xfff2, 0xfff2).w(FUNC(nmk16_state::spec2k_oki1_banking_w)); 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(0xfff8, 0xfff8).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0xfffa, 0xfffa).rw(m_oki1, 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) 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)) if (data & (~3))
logerror("%s: invalid oki bank %02x\n", machine().describe_context(), data); 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(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram(); map(0x8000, 0x87ff).ram();
map(0x9000, 0x9000).w(FUNC(nmk16_state::twinactn_oki_bank_w)); 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 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 */ /* video hardware */
MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_grdnstrm) 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_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_firehawk) MCFG_SCREEN_UPDATE_DRIVER(nmk16_state, screen_update_firehawk)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -5429,7 +5424,7 @@ MACHINE_CONFIG_START(nmk16_state::firehawk)
MCFG_PALETTE_ADD("palette", 768) MCFG_PALETTE_ADD("palette", 768)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
MCFG_VIDEO_START_OVERRIDE(nmk16_state,firehawk) MCFG_VIDEO_START_OVERRIDE(nmk16_state,grdnstrm)
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
@ -6578,7 +6573,7 @@ ROM_START( tdragon3h )
// Not from this PCB // Not from this PCB
ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ 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_REGION( 0x020000, "fgtile", 0 )
ROM_LOAD( "12.27c1000", 0x000000, 0x020000, CRC(f809d616) SHA1(c6a4d776fee770ec197204b855b85bcc719469a5) ) /* 8x8 tiles */ ROM_LOAD( "12.27c1000", 0x000000, 0x020000, CRC(f809d616) SHA1(c6a4d776fee770ec197204b855b85bcc719469a5) ) /* 8x8 tiles */
@ -6594,10 +6589,10 @@ ROM_START( tdragon3h )
// Not from this PCB // Not from this PCB
ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 samples */ 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_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_REGION( 0x0200, "proms", 0 )
ROM_LOAD( "9.bpr", 0x0000, 0x0100, CRC(435653a2) SHA1(575b4a46ea65179de3042614da438d2f6d8b572e) ) /* unknown */ ROM_LOAD( "9.bpr", 0x0000, 0x0100, CRC(435653a2) SHA1(575b4a46ea65179de3042614da438d2f6d8b572e) ) /* unknown */

View File

@ -13,45 +13,42 @@
class nmk16_state : public driver_device, protected seibu_sound_common class nmk16_state : public driver_device, protected seibu_sound_common
{ {
public: public:
nmk16_state(const machine_config &mconfig, device_type type, const char *tag) nmk16_state(const machine_config &mconfig, device_type type, const char *tag) :
: driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"), m_audiocpu(*this, "audiocpu"),
m_oki1(*this, "oki1"), m_oki(*this, "oki%u", 1U),
m_oki2(*this, "oki2"),
m_gfxdecode(*this, "gfxdecode"), m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"), m_palette(*this, "palette"),
m_nmk004(*this, "nmk004"), m_nmk004(*this, "nmk004"),
m_soundlatch(*this, "soundlatch"), 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_nmk_txvideoram(*this, "nmk_txvideoram"),
m_mainram(*this, "mainram"), m_mainram(*this, "mainram"),
m_gunnail_scrollram(*this, "scrollram"), m_gunnail_scrollram(*this, "scrollram"),
m_spriteram(*this, "spriteram"), m_spriteram(*this, "spriteram"),
m_nmk_fgvideoram(*this, "nmk_fgvideoram"),
m_gunnail_scrollramy(*this, "scrollramy"), 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_tilemap_rom(*this, "tilerom"),
m_audiobank(*this, "audiobank"), m_audiobank(*this, "audiobank"),
m_okibank(*this, "okibank%u", 1), m_okibank(*this, "okibank%u", 1U),
m_sprdma_base(0x8000) m_dsw_io(*this, "DSW%u", 1U),
{} m_in_io(*this, "IN%u", 0U),
m_sprdma_base(0x8000) { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu; optional_device<cpu_device> m_audiocpu;
optional_device<okim6295_device> m_oki1; optional_device_array<okim6295_device, 2> m_oki;
optional_device<okim6295_device> m_oki2;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
optional_device<nmk004_device> m_nmk004; optional_device<nmk004_device> m_nmk004;
optional_device<generic_latch_8_device> m_soundlatch; optional_device<generic_latch_8_device> m_soundlatch;
optional_shared_ptr_array<uint16_t, 4> m_nmk_bgvideoram; optional_shared_ptr_array<uint16_t, 2> m_nmk_bgvideoram;
optional_shared_ptr<uint16_t> m_nmk_txvideoram; optional_shared_ptr<uint16_t> m_nmk_txvideoram;
required_shared_ptr<uint16_t> m_mainram; required_shared_ptr<uint16_t> m_mainram;
optional_shared_ptr<uint16_t> m_gunnail_scrollram; optional_shared_ptr<uint16_t> m_gunnail_scrollram;
optional_shared_ptr<uint8_t> m_spriteram; optional_shared_ptr<uint8_t> m_spriteram;
optional_shared_ptr<uint16_t> m_nmk_fgvideoram;
optional_shared_ptr<uint16_t> m_gunnail_scrollramy; optional_shared_ptr<uint16_t> m_gunnail_scrollramy;
optional_shared_ptr_array<uint16_t, 2> m_afega_scroll; optional_shared_ptr_array<uint16_t, 2> m_afega_scroll;
@ -59,23 +56,23 @@ public:
optional_memory_bank m_audiobank; optional_memory_bank m_audiobank;
optional_memory_bank_array<2> m_okibank; 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 m_sprdma_base;
int mask[4*2]; int mask[4*2];
int m_simple_scroll;
int m_redraw_bitmap;
std::unique_ptr<uint16_t[]> m_spriteram_old; std::unique_ptr<uint16_t[]> m_spriteram_old;
std::unique_ptr<uint16_t[]> m_spriteram_old2; std::unique_ptr<uint16_t[]> m_spriteram_old2;
int m_bgbank; int m_bgbank;
int m_videoshift; int m_videoshift;
int m_bioship_background_bank; int m_bioship_background_bank;
uint8_t m_bioship_scroll[4]; tilemap_t *m_bg_tilemap[2];
tilemap_t *m_bg_tilemap[4];
tilemap_t *m_tx_tilemap; tilemap_t *m_tx_tilemap;
tilemap_t *m_fg_tilemap;
std::unique_ptr<bitmap_ind16> m_background_bitmap;
int m_mustang_bg_xscroll; 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]; uint16_t m_vscroll[4];
int m_prot_count; int m_prot_count;
uint8_t m_input_pressed; uint8_t m_input_pressed;
@ -95,24 +92,22 @@ public:
DECLARE_READ16_MEMBER(tdragonb_prot_r); DECLARE_READ16_MEMBER(tdragonb_prot_r);
DECLARE_READ16_MEMBER(afega_unknown_r); DECLARE_READ16_MEMBER(afega_unknown_r);
template<int Scroll> DECLARE_WRITE16_MEMBER(afega_scroll_w); template<int Scroll> DECLARE_WRITE16_MEMBER(afega_scroll_w);
template<int Bank> DECLARE_WRITE16_MEMBER(nmk_bgvideoram_w); template<int Layer> DECLARE_WRITE16_MEMBER(nmk_bgvideoram_w);
DECLARE_WRITE16_MEMBER(nmk_fgvideoram_w);
DECLARE_WRITE16_MEMBER(nmk_txvideoram_w); DECLARE_WRITE16_MEMBER(nmk_txvideoram_w);
DECLARE_WRITE16_MEMBER(mustang_scroll_w); DECLARE_WRITE16_MEMBER(mustang_scroll_w);
DECLARE_WRITE16_MEMBER(bioshipbg_scroll_w); DECLARE_WRITE16_MEMBER(raphero_scroll_w);
DECLARE_WRITE16_MEMBER(nmk_scroll_w); template<int Layer> DECLARE_WRITE8_MEMBER(nmk_scroll_w);
DECLARE_WRITE16_MEMBER(nmk_scroll_2_w);
DECLARE_WRITE16_MEMBER(vandyke_scroll_w); DECLARE_WRITE16_MEMBER(vandyke_scroll_w);
DECLARE_WRITE16_MEMBER(vandykeb_scroll_w); DECLARE_WRITE16_MEMBER(vandykeb_scroll_w);
DECLARE_WRITE16_MEMBER(manybloc_scroll_w); DECLARE_WRITE16_MEMBER(manybloc_scroll_w);
DECLARE_WRITE16_MEMBER(nmk_flipscreen_w); DECLARE_WRITE8_MEMBER(nmk_flipscreen_w);
DECLARE_WRITE16_MEMBER(nmk_tilebank_w); DECLARE_WRITE8_MEMBER(nmk_tilebank_w);
DECLARE_WRITE16_MEMBER(bioship_scroll_w); DECLARE_WRITE8_MEMBER(bioship_bank_w);
DECLARE_WRITE16_MEMBER(bioship_bank_w);
DECLARE_WRITE8_MEMBER(spec2k_oki1_banking_w); DECLARE_WRITE8_MEMBER(spec2k_oki1_banking_w);
DECLARE_WRITE8_MEMBER(twinactn_oki_bank_w); DECLARE_WRITE8_MEMBER(twinactn_oki_bank_w);
DECLARE_WRITE16_MEMBER(nmk16_x0016_w); DECLARE_WRITE16_MEMBER(nmk16_x0016_w);
DECLARE_WRITE16_MEMBER(nmk16_bioship_x0016_w); DECLARE_WRITE16_MEMBER(nmk16_bioship_x0016_w);
void save_protregs();
void init_nmk(); void init_nmk();
void init_tharrier(); void init_tharrier();
void init_vandykeb(); void init_vandykeb();
@ -130,9 +125,9 @@ public:
void init_bjtwin(); void init_bjtwin();
void init_atombjt(); void init_atombjt();
TILEMAP_MAPPER_MEMBER(tilemap_scan_pages); TILEMAP_MAPPER_MEMBER(tilemap_scan_pages);
template<int Bank> TILE_GET_INFO_MEMBER(common_get_bg_tile_info); template<int Layer, int Gfx> TILE_GET_INFO_MEMBER(common_get_bg_tile_info);
TILE_GET_INFO_MEMBER(strahl_get_fg_tile_info);
TILE_GET_INFO_MEMBER(common_get_tx_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(bjtwin_get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_tile_info_0_8bit); TILE_GET_INFO_MEMBER(get_tile_info_0_8bit);
DECLARE_VIDEO_START(macross); DECLARE_VIDEO_START(macross);
@ -140,17 +135,13 @@ public:
DECLARE_VIDEO_START(strahl); DECLARE_VIDEO_START(strahl);
DECLARE_VIDEO_START(gunnail); DECLARE_VIDEO_START(gunnail);
DECLARE_VIDEO_START(macross2); DECLARE_VIDEO_START(macross2);
DECLARE_VIDEO_START(raphero);
DECLARE_VIDEO_START(bjtwin); DECLARE_VIDEO_START(bjtwin);
DECLARE_VIDEO_START(afega); DECLARE_VIDEO_START(afega);
DECLARE_VIDEO_START(firehawk);
DECLARE_VIDEO_START(grdnstrm); DECLARE_VIDEO_START(grdnstrm);
uint32_t screen_update_tharrier(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 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_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_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_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_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_bjtwin(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_afega(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_swap_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect, int *bittbl);
void nmk16_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void nmk16_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void nmk16_draw_sprites_flipsupported(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); void nmk16_bg_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer = 0);
int nmk16_bg_fg_spr_tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void nmk16_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 video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect,int dsw_flipscreen,int xoffset, int yoffset,int attr_mask); 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 redhawki_video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect );
void mcu_run(uint8_t dsw_setting); void mcu_run(uint8_t dsw_setting);

View File

@ -24,35 +24,23 @@
***************************************************************************/ ***************************************************************************/
/*
#define TILES_PER_PAGE_X (0x10) #define TILES_PER_PAGE_X (0x10)
#define TILES_PER_PAGE_Y (0x10) #define TILES_PER_PAGE_Y (0x10)
#define PAGES_PER_TMAP_X (0x10) #define PAGES_PER_TMAP_X (0x10)
#define PAGES_PER_TMAP_Y (0x02) #define PAGES_PER_TMAP_Y (0x02)
*/
TILEMAP_MAPPER_MEMBER(nmk16_state::tilemap_scan_pages) 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 + return (row & 0xf) | ((col & 0xff) << 4) | ((row & 0x10) << 8);
(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;
} }
template<int Bank> template<int Layer, int Gfx>
TILE_GET_INFO_MEMBER(nmk16_state::common_get_bg_tile_info) TILE_GET_INFO_MEMBER(nmk16_state::common_get_bg_tile_info)
{ {
int code = m_nmk_bgvideoram[Bank][tile_index]; int code = m_nmk_bgvideoram[Layer][(m_tilerambank << 13)|tile_index];
SET_TILE_INFO_MEMBER(1,(code & 0xfff) + (m_bgbank << 12),code >> 12,0); SET_TILE_INFO_MEMBER(Gfx,(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);
} }
TILE_GET_INFO_MEMBER(nmk16_state::common_get_tx_tile_info) 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); 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) TILE_GET_INFO_MEMBER(nmk16_state::bjtwin_get_bg_tile_info)
{ {
int code = m_nmk_bgvideoram[0][tile_index]; int code = m_nmk_bgvideoram[0][tile_index];
@ -96,43 +90,41 @@ void nmk16_state::nmk16_video_init()
m_spriteram_old2 = make_unique_clear<uint16_t[]>(0x1000/2); m_spriteram_old2 = make_unique_clear<uint16_t[]>(0x1000/2);
m_videoshift = 0; /* 256x224 screen, no shift */ m_videoshift = 0; /* 256x224 screen, no shift */
m_background_bitmap = nullptr; m_tilerambank = 0;
m_simple_scroll = 1; 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) 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_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); m_tx_tilemap->set_transparent_pen(15);
nmk16_video_init(); nmk16_video_init();
m_background_bitmap = std::make_unique<bitmap_ind16>(8192,512);
m_bioship_background_bank=0; m_bioship_background_bank=0;
m_redraw_bitmap = 1; save_item(NAME(m_bioship_background_bank));
}
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();
} }
VIDEO_START_MEMBER(nmk16_state,macross) 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 = &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); m_tx_tilemap->set_transparent_pen(15);
@ -140,27 +132,19 @@ VIDEO_START_MEMBER(nmk16_state,macross)
nmk16_video_init(); 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); VIDEO_START_CALL_MEMBER( macross );
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_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_sprdma_base = 0xf000;
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;
} }
VIDEO_START_MEMBER(nmk16_state,macross2) 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_sprlimit = 512 * 263; // not verified
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[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_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_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 = &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); m_tx_tilemap->set_transparent_pen(15);
@ -170,14 +154,15 @@ VIDEO_START_MEMBER(nmk16_state,macross2)
/* from the other side of the tilemap (!) */ /* from the other side of the tilemap (!) */
} }
VIDEO_START_MEMBER(nmk16_state,raphero) VIDEO_START_MEMBER(nmk16_state,gunnail)
{ {
VIDEO_START_CALL_MEMBER( macross2 ); VIDEO_START_CALL_MEMBER( macross2 );
m_simple_scroll = 0; m_bg_tilemap[0]->set_scroll_rows(512);
} }
VIDEO_START_MEMBER(nmk16_state,bjtwin) 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); 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(); nmk16_video_init();
@ -185,7 +170,6 @@ VIDEO_START_MEMBER(nmk16_state,bjtwin)
/* from the other side of the tilemap (!) */ /* from the other side of the tilemap (!) */
} }
WRITE16_MEMBER(nmk16_state::mustang_scroll_w) WRITE16_MEMBER(nmk16_state::mustang_scroll_w)
{ {
// osd_printf_debug("mustang %04x %04x %04x\n",offset,data,mem_mask); // 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); 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) WRITE16_MEMBER(nmk16_state::vandyke_scroll_w)
{ {
m_vscroll[offset] = data; 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]); 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;
{ for (int layer = 0; layer < 2; layer++)
m_bgbank = data & 0xff; if (m_bg_tilemap[layer]) m_bg_tilemap[layer]->mark_all_dirty();
for (int bank = 0; bank < 4; bank++)
if (m_bg_tilemap[bank]) m_bg_tilemap[bank]->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) if (m_bioship_background_bank != data)
m_bioship_scroll[offset]=data>>8;
}
WRITE16_MEMBER(nmk16_state::bioship_bank_w)
{
if (ACCESSING_BITS_0_7)
{ {
if (m_bioship_background_bank != data) m_bioship_background_bank = data;
{ m_bg_tilemap[0]->mark_all_dirty();
m_bioship_background_bank = data;
m_redraw_bitmap=1;
}
} }
} }
@ -363,6 +308,10 @@ inline void nmk16_state::nmk16_draw_sprite(bitmap_ind16 &bitmap, const rectangle
color, color,
flip_screen(), flip_screen(), flip_screen(), flip_screen(),
((x + 16) & 0x1ff) - 16,sy & 0x1ff,15); ((x + 16) & 0x1ff) - 16,sy & 0x1ff,15);
m_sprclk += 128; // 128 clock per each 16x16 tile
if (m_sprclk >= m_sprlimit)
return;
code++; code++;
x += delta; x += delta;
} while (--xx >= 0); } while (--xx >= 0);
@ -411,6 +360,10 @@ inline void nmk16_state::nmk16_draw_sprite_flipsupported(bitmap_ind16 &bitmap, c
color, color,
flipx, flipy, flipx, flipy,
((x + 16) & 0x1ff) - 16,sy & 0x1ff,15); ((x + 16) & 0x1ff) - 16,sy & 0x1ff,15);
m_sprclk += 128; // 128 clock per each 16x16 tile
if (m_sprclk >= m_sprlimit)
return;
code++; code++;
x += delta * (flipx ? -1 : 1); x += delta * (flipx ? -1 : 1);
} while (--xx >= 0); } 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) void nmk16_state::nmk16_draw_sprites_swap(bitmap_ind16 &bitmap, const rectangle &cliprect, int *bittbl)
{ {
m_sprclk = 0;
int i; int i;
for (i = 0; i < 0x100; 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]); 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)); 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) void nmk16_state::nmk16_draw_sprites_swap_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect, int *bittbl)
{ {
m_sprclk = 0;
int i; int i;
for ( i = 0; i < 0x100; 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]); 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)); 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) void nmk16_state::nmk16_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
m_sprclk = 0;
int offs; int offs;
for (offs = 0; offs < 0x1000/2; offs += 8) 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); nmk16_draw_sprite(bitmap, cliprect, m_spriteram_old2.get() + offs);
} }
} }
void nmk16_state::nmk16_draw_sprites_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect) void nmk16_state::nmk16_draw_sprites_flipsupported(bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
m_sprclk = 0;
int offs; int offs;
for (offs = 0; offs < 0x1000/2; offs += 8) 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); 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); if (m_gunnail_scrollram && m_gunnail_scrollramy)
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)
{ {
int bank = m_bioship_background_bank * 0x2000; // the hardware supports per-scanline X *and* Y scroll which isn't
int sx=0, sy=0, offs; // supported by tilemaps so we have to draw the tilemap one line at a time
m_redraw_bitmap=0; int i=16;
int y1;
/* Draw background from tile rom */ rectangle bgclip = cliprect;
for (offs = 0;offs <0x1000;offs++) { y1 = cliprect.min_y;
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;
while (y1 <= cliprect.max_y) while (y1 <= cliprect.max_y)
{ {
int const yscroll = m_gunnail_scrollramy[0] + m_gunnail_scrollramy[y1]; int const yscroll = m_gunnail_scrollramy[0] + m_gunnail_scrollramy[y1];
tilemap_t* bg_tilemap = m_bg_tilemap[0];
bgclip.min_y = y1; bgclip.min_y = y1;
bgclip.max_y = y1; bgclip.max_y = y1;
if (m_bg_tilemap[1] && m_bg_tilemap[2] && m_bg_tilemap[3]) m_bg_tilemap[layer]->set_scroll_rows(512);
{
int tilemap_bank_select = (m_gunnail_scrollram[0]&0x3000)>>12;
bg_tilemap = m_bg_tilemap[tilemap_bank_select];
}
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); m_bg_tilemap[layer]->draw(screen, bitmap, bgclip, 0,0);
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);
y1++; y1++;
i++; i++;
@ -626,30 +471,14 @@ int nmk16_state::nmk16_complexbg_sprswap_tx_update(screen_device &screen, bitmap
} }
else else
{ {
uint16_t yscroll = ((m_gunnail_scrollram[2]&0xff)<<8) | ((m_gunnail_scrollram[3]&0xff)<<0); m_bg_tilemap[layer]->draw(screen, bitmap, cliprect, 0,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);
} }
}
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); 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) 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) 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) 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); 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) 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 4, 6, 5, 7, 3, 2, 1, 0
}; };
return nmk16_complexbg_sprswap_tx_update(screen, bitmap, cliprect, bittbl); nmk16_bg_update(screen,bitmap,cliprect,0);
} nmk16_draw_sprites_swap(bitmap,cliprect, bittbl);
nmk16_tx_update(screen,bitmap,cliprect);
uint32_t nmk16_state::screen_update_gunnail(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) return 0;
{
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);
} }
uint32_t nmk16_state::screen_update_strahl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) 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) 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) VIDEO_START_MEMBER(nmk16_state,afega)
{ {
m_sprlimit = 384 * 263;
m_spriteram_old = make_unique_clear<uint16_t[]>(0x1000/2); m_spriteram_old = make_unique_clear<uint16_t[]>(0x1000/2);
m_spriteram_old2 = make_unique_clear<uint16_t[]>(0x1000/2); m_spriteram_old2 = make_unique_clear<uint16_t[]>(0x1000/2);
m_bg_tilemap[0] = &machine().tilemap().create( m_bg_tilemap[0] = &machine().tilemap().create(
*m_gfxdecode, *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), 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_tx_tilemap = &machine().tilemap().create(
*m_gfxdecode, *m_gfxdecode,
@ -740,42 +576,22 @@ VIDEO_START_MEMBER(nmk16_state,afega)
8,8, 32,32); 8,8, 32,32);
m_tx_tilemap->set_transparent_pen(0xf); 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) VIDEO_START_MEMBER(nmk16_state,grdnstrm)
{ {
m_sprlimit = 384 * 263;
m_spriteram_old = make_unique_clear<uint16_t[]>(0x1000/2); m_spriteram_old = make_unique_clear<uint16_t[]>(0x1000/2);
m_spriteram_old2 = make_unique_clear<uint16_t[]>(0x1000/2); m_spriteram_old2 = make_unique_clear<uint16_t[]>(0x1000/2);
m_bg_tilemap[0] = &machine().tilemap().create( m_bg_tilemap[0] = &machine().tilemap().create(
*m_gfxdecode, *m_gfxdecode,
tilemap_get_info_delegate(FUNC(nmk16_state::get_tile_info_0_8bit),this), tilemap_get_info_delegate(FUNC(nmk16_state::get_tile_info_0_8bit),this),
tilemap_mapper_delegate(FUNC(nmk16_state::tilemap_scan_pages),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,
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<uint16_t[]>(0x1000/2);
m_spriteram_old2 = make_unique_clear<uint16_t[]>(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_tx_tilemap = &machine().tilemap().create(
*m_gfxdecode, *m_gfxdecode,
@ -784,6 +600,8 @@ VIDEO_START_MEMBER(nmk16_state,firehawk)
8,8, 32,32); 8,8, 32,32);
m_tx_tilemap->set_transparent_pen(0xf); m_tx_tilemap->set_transparent_pen(0xf);
save_pointer(NAME(m_spriteram_old), 0x1000/2);
save_pointer(NAME(m_spriteram_old2), 0x1000/2);
} }