diff options
-rw-r--r-- | src/mame/drivers/tatsumi.cpp | 170 | ||||
-rw-r--r-- | src/mame/includes/tatsumi.h | 106 | ||||
-rw-r--r-- | src/mame/machine/tatsumi.cpp | 7 | ||||
-rw-r--r-- | src/mame/video/tatsumi.cpp | 201 |
4 files changed, 244 insertions, 240 deletions
diff --git a/src/mame/drivers/tatsumi.cpp b/src/mame/drivers/tatsumi.cpp index 02829da98e0..63b4d70b4aa 100644 --- a/src/mame/drivers/tatsumi.cpp +++ b/src/mame/drivers/tatsumi.cpp @@ -149,7 +149,6 @@ #include "machine/adc0808.h" #include "machine/i8255.h" #include "machine/nvram.h" -#include "sound/ym2151.h" #include "screen.h" #include "speaker.h" @@ -187,10 +186,21 @@ WRITE16_MEMBER(cyclwarr_state::bigfight_a60000_w) COMBINE_DATA(&m_bigfight_a60000[offset]); } -WRITE16_MEMBER(cyclwarr_state::cyclwarr_sound_w) +template<int Bank> +READ16_MEMBER(cyclwarr_state::cyclwarr_videoram_r) { - m_soundlatch->write(space, 0, data >> 8); - m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); + return m_cyclwarr_videoram[Bank][offset]; +} + +template<int Bank> +WRITE16_MEMBER(cyclwarr_state::cyclwarr_videoram_w) +{ + COMBINE_DATA(&m_cyclwarr_videoram[Bank][offset]); + if (offset>=0x400) + { + m_layer[(Bank<<1)|0]->mark_tile_dirty(offset-0x400); + m_layer[(Bank<<1)|1]->mark_tile_dirty(offset-0x400); + } } /***************************************************************************/ @@ -228,7 +238,7 @@ void apache3_state::apache3_v20_map(address_map &map) map(0x00000, 0x01fff).ram(); map(0x04000, 0x04003).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x06000, 0x06001).portr("IN0"); // esw - map(0x08000, 0x08001).r(this, FUNC(apache3_state::tatsumi_hack_ym2151_r)).w("ymsnd", FUNC(ym2151_device::write)); + map(0x08000, 0x08001).r(this, FUNC(apache3_state::tatsumi_hack_ym2151_r)).w(m_ym2151, FUNC(ym2151_device::write)); map(0x0a000, 0x0a000).r(this, FUNC(apache3_state::tatsumi_hack_oki_r)).w(m_oki, FUNC(okim6295_device::write)); map(0x0e000, 0x0e007).rw("adc", FUNC(adc0808_device::data_r), FUNC(adc0808_device::address_offset_start_w)); map(0xf0000, 0xfffff).rom(); @@ -276,7 +286,7 @@ void roundup5_state::roundup5_z80_map(address_map &map) { map(0x0000, 0xdfff).rom(); map(0xe000, 0xffef).ram(); - map(0xfff0, 0xfff1).r(this, FUNC(roundup5_state::tatsumi_hack_ym2151_r)).w("ymsnd", FUNC(ym2151_device::write)); + map(0xfff0, 0xfff1).r(this, FUNC(roundup5_state::tatsumi_hack_ym2151_r)).w(m_ym2151, FUNC(ym2151_device::write)); map(0xfff4, 0xfff4).r(this, FUNC(roundup5_state::tatsumi_hack_oki_r)).w(m_oki, FUNC(okim6295_device::write)); map(0xfff8, 0xfffb).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xfffc, 0xfffc).portr("STICKX"); @@ -289,14 +299,14 @@ void cyclwarr_state::cyclwarr_68000a_map(address_map &map) map(0x000000, 0x00ffff).ram().share("cw_cpua_ram"); map(0x03e000, 0x03efff).ram(); map(0x040000, 0x04ffff).ram().share("cw_cpub_ram"); - map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram1_r), FUNC(cyclwarr_state::cyclwarr_videoram1_w)).share("cw_videoram1"); - map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram0_r), FUNC(cyclwarr_state::cyclwarr_videoram0_w)).share("cw_videoram0"); + map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<1>), FUNC(cyclwarr_state::cyclwarr_videoram_w<1>)).share("cw_videoram1"); + map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<0>), FUNC(cyclwarr_state::cyclwarr_videoram_w<0>)).share("cw_videoram0"); map(0x0a2000, 0x0a2007).w(this, FUNC(cyclwarr_state::bigfight_a20000_w)); map(0x0a4000, 0x0a4001).w(this, FUNC(cyclwarr_state::bigfight_a40000_w)); map(0x0a6000, 0x0a6001).w(this, FUNC(cyclwarr_state::bigfight_a60000_w)); - map(0x0b8000, 0x0b8001).w(this, FUNC(cyclwarr_state::cyclwarr_sound_w)); + map(0x0b8000, 0x0b8001).w(m_soundlatch, FUNC(generic_latch_8_device::write)).umask16(0xff00).cswidth(16); map(0x0b9000, 0x0b900f).rw("io1", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16); map(0x0ba000, 0x0ba00f).rw("io2", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16); map(0x0c0000, 0x0c3fff).rw(this, FUNC(cyclwarr_state::cyclwarr_sprite_r), FUNC(cyclwarr_state::cyclwarr_sprite_w)).share("spriteram"); @@ -310,8 +320,8 @@ void cyclwarr_state::cyclwarr_68000b_map(address_map &map) { map(0x000000, 0x00ffff).ram().share("cw_cpub_ram"); - map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram1_r), FUNC(cyclwarr_state::cyclwarr_videoram1_w)); - map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram0_r), FUNC(cyclwarr_state::cyclwarr_videoram0_w)); + map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<1>), FUNC(cyclwarr_state::cyclwarr_videoram_w<1>)); + map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<0>), FUNC(cyclwarr_state::cyclwarr_videoram_w<0>)); map(0x0a2000, 0x0a2007).w(this, FUNC(cyclwarr_state::bigfight_a20000_w)); map(0x0a4000, 0x0a4001).w(this, FUNC(cyclwarr_state::bigfight_a40000_w)); @@ -330,7 +340,7 @@ void cyclwarr_state::cyclwarr_z80_map(address_map &map) { map(0x0000, 0xdfff).rom(); map(0xe000, 0xffef).ram(); - map(0xfff0, 0xfff1).r(this, FUNC(cyclwarr_state::tatsumi_hack_ym2151_r)).w("ymsnd", FUNC(ym2151_device::write)); + map(0xfff0, 0xfff1).r(this, FUNC(cyclwarr_state::tatsumi_hack_ym2151_r)).w(m_ym2151, FUNC(ym2151_device::write)); map(0xfff4, 0xfff4).r(this, FUNC(cyclwarr_state::tatsumi_hack_oki_r)).w(m_oki, FUNC(okim6295_device::write)); map(0xfffc, 0xfffc).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0xfffe, 0xfffe).nopw(); @@ -345,14 +355,14 @@ void cyclwarr_state::bigfight_68000a_map(address_map &map) map(0x03e000, 0x03efff).ram(); map(0x040000, 0x04ffff).ram().share("cw_cpub_ram"); - map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram1_r), FUNC(cyclwarr_state::cyclwarr_videoram1_w)).share("cw_videoram1"); - map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram0_r), FUNC(cyclwarr_state::cyclwarr_videoram0_w)).share("cw_videoram0"); + map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<1>), FUNC(cyclwarr_state::cyclwarr_videoram_w<1>)).share("cw_videoram1"); + map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<0>), FUNC(cyclwarr_state::cyclwarr_videoram_w<0>)).share("cw_videoram0"); map(0x0a2000, 0x0a2007).w(this, FUNC(cyclwarr_state::bigfight_a20000_w)); map(0x0a4000, 0x0a4001).w(this, FUNC(cyclwarr_state::bigfight_a40000_w)); map(0x0a6000, 0x0a6001).w(this, FUNC(cyclwarr_state::bigfight_a60000_w)); - map(0x0b8000, 0x0b8001).w(this, FUNC(cyclwarr_state::cyclwarr_sound_w)); + map(0x0b8000, 0x0b8001).w(m_soundlatch, FUNC(generic_latch_8_device::write)).umask16(0xff00).cswidth(16); map(0x0b9000, 0x0b900f).rw("io1", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16); map(0x0ba000, 0x0ba00f).rw("io2", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16); map(0x0c0000, 0x0c3fff).rw(this, FUNC(cyclwarr_state::cyclwarr_sprite_r), FUNC(cyclwarr_state::cyclwarr_sprite_w)).share("spriteram"); @@ -365,8 +375,8 @@ void cyclwarr_state::bigfight_68000a_map(address_map &map) void cyclwarr_state::bigfight_68000b_map(address_map &map) { map(0x000000, 0x00ffff).ram().share("cw_cpub_ram"); - map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram1_r), FUNC(cyclwarr_state::cyclwarr_videoram1_w)); - map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram0_r), FUNC(cyclwarr_state::cyclwarr_videoram0_w)); + map(0x080000, 0x08ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<1>), FUNC(cyclwarr_state::cyclwarr_videoram_w<1>)); + map(0x090000, 0x09ffff).rw(this, FUNC(cyclwarr_state::cyclwarr_videoram_r<0>), FUNC(cyclwarr_state::cyclwarr_videoram_w<0>)); map(0x0a2000, 0x0a2007).w(this, FUNC(cyclwarr_state::bigfight_a20000_w)); map(0x0a4000, 0x0a4001).w(this, FUNC(cyclwarr_state::bigfight_a40000_w)); map(0x0a6000, 0x0a6001).w(this, FUNC(cyclwarr_state::bigfight_a60000_w)); @@ -794,9 +804,9 @@ static const gfx_layout spritelayout = 8,8, RGN_FRAC(1,1), 4, - { 0, 1, 2, 3 }, - { 8,12,0,4, 24,28, 16,20}, - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32}, + { STEP4(0,1) }, + { 8,12,0,4, 24,28,16,20 }, + { STEP8(0,4*8) }, 32*8 }; @@ -806,24 +816,24 @@ static const gfx_layout roundup5_vramlayout = 4096 + 2048, 3, { 0x30000 * 8, 0x18000 * 8, 0 }, - { 0, 1, 2, 3, 4, 5, 6, 7}, - { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16}, + { STEP8(0,1) }, + { STEP8(0,8*2) }, 8*16 }; static GFXDECODE_START( apache3 ) - GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 1024, 128) - GFXDECODE_ENTRY( "gfx4", 0, gfx_8x8x3_planar, 768, 16) + GFXDECODE_ENTRY( "sprites", 0, spritelayout, 1024, 128) + GFXDECODE_ENTRY( "text", 0, gfx_8x8x3_planar, 768, 16) GFXDECODE_END static GFXDECODE_START( roundup5 ) - GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 1024, 256) - GFXDECODE_ENTRY( nullptr, 0, roundup5_vramlayout, 0, 16) + GFXDECODE_ENTRY( "sprites", 0, spritelayout, 1024, 256) + GFXDECODE_ENTRY( nullptr, 0, roundup5_vramlayout, 0, 16) GFXDECODE_END static GFXDECODE_START( cyclwarr ) - GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 8192, 512) - GFXDECODE_ENTRY( "gfx5", 0, gfx_8x8x3_planar, 0, 512) + GFXDECODE_ENTRY( "sprites", 0, spritelayout, 8192, 512) + GFXDECODE_ENTRY( "tilerom", 0, gfx_8x8x3_planar, 0, 16) GFXDECODE_END /******************************************************************************/ @@ -1010,6 +1020,7 @@ MACHINE_CONFIG_START(cyclwarr_state::cyclwarr) SPEAKER(config, "rspeaker").front_right(); MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_DEVICE_ADD("ymsnd", YM2151, CLOCK_1 / 4) MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_IRQ0)) @@ -1069,6 +1080,7 @@ MACHINE_CONFIG_START(cyclwarr_state::bigfight) SPEAKER(config, "rspeaker").front_right(); MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_DEVICE_ADD("ymsnd", YM2151, CLOCK_1 / 4) MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_IRQ0)) @@ -1098,10 +1110,10 @@ ROM_START( apache3 ) ROM_REGION( 0x100000, "audiocpu", 0 ) /* 64k code for sound V20 */ ROM_LOAD( "ap-27d.151", 0x0f0000, 0x10000, CRC(294b4d79) SHA1(2b03418a12a2aaf3919b98161d8d0ce6ae29a2bb) ) - ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x200000, "sprites", ROMREGION_ERASE00 ) /* Filled in by both regions below */ - ROM_REGION( 0x100000, "gfx2", 0) + ROM_REGION( 0x100000, "sprites_l", 0) ROM_LOAD32_BYTE( "ap-00c.15", 0x000000, 0x20000, CRC(ad1ddc2b) SHA1(81f64663c4892ab5fb0e2dc99513dbfee73f15b8) ) ROM_LOAD32_BYTE( "ap-01c.22", 0x000001, 0x20000, CRC(6286ff00) SHA1(920da4a3a441dbf54ad86c0f4fb6f47a867e9cda) ) ROM_LOAD32_BYTE( "ap-04c.58", 0x000002, 0x20000, CRC(dc6d55e4) SHA1(9f48f8d6aa1a329a71913139a8d5a50d95a9b9e5) ) @@ -1111,7 +1123,7 @@ ROM_START( apache3 ) ROM_LOAD32_BYTE( "ap-06c.71", 0x080002, 0x20000, CRC(0ea90e55) SHA1(b16d6b8be4853797507d3e5c933a9dd1d451308e) ) ROM_LOAD32_BYTE( "ap-07c.75", 0x080003, 0x20000, CRC(ba685543) SHA1(140a2b708d4e4de4d207fc2c4a96a5cab8639988) ) - ROM_REGION( 0x100000, "gfx3", 0) + ROM_REGION( 0x100000, "sprites_h", 0) ROM_LOAD32_BYTE( "ap-08c.14", 0x000000, 0x20000, CRC(6437b580) SHA1(2b2ba42add18bbec04fbcf53645a8d44b972e26a) ) ROM_LOAD32_BYTE( "ap-09c.21", 0x000001, 0x20000, CRC(54d18ef9) SHA1(40ebc6ea49b2a501fe843d60bec8c32d07f2d25d) ) ROM_LOAD32_BYTE( "ap-12c.57", 0x000002, 0x20000, CRC(f95cf5cf) SHA1(ce373c648cbf3e4863bbc3a1175efe065c75eb13) ) @@ -1121,7 +1133,7 @@ ROM_START( apache3 ) ROM_LOAD32_BYTE( "ap-14c.70", 0x080002, 0x20000, CRC(58f7fe16) SHA1(a5b87b42b85808c226df0d2a7b7cdde12d474a41) ) ROM_LOAD32_BYTE( "ap-15c.74", 0x080003, 0x20000, CRC(1ffd5496) SHA1(25efb568957fc9441a40a7d64cc6afe1a14b392b) ) - ROM_REGION( 0x18000, "gfx4", 0 ) + ROM_REGION( 0x18000, "text", 0 ) ROM_LOAD( "ap-18d.73", 0x000000, 0x8000, CRC(55e664bf) SHA1(505bec8b5ff3f9fa2c5fb1213d54683347905be1) ) ROM_LOAD( "ap-17d.68", 0x008000, 0x8000, CRC(6199afe4) SHA1(ad8c0ed6c33d984bb29c89f2e7fc7e5a923cefe3) ) ROM_LOAD( "ap-16d.63", 0x010000, 0x8000, CRC(f115656d) SHA1(61798858dc0172192d89e666696b2c7642756899) ) @@ -1150,10 +1162,10 @@ ROM_START( apache3a ) ROM_REGION( 0x100000, "audiocpu", 0 ) /* 64k code for sound V20 */ ROM_LOAD( "ap-27d.151", 0x0f0000, 0x10000, CRC(294b4d79) SHA1(2b03418a12a2aaf3919b98161d8d0ce6ae29a2bb) ) - ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x200000, "sprites", ROMREGION_ERASE00 ) /* Filled in by both regions below */ - ROM_REGION( 0x100000, "gfx2", 0) + ROM_REGION( 0x100000, "sprites_l", 0) ROM_LOAD32_BYTE( "ap-00c.15", 0x000000, 0x20000, CRC(ad1ddc2b) SHA1(81f64663c4892ab5fb0e2dc99513dbfee73f15b8) ) ROM_LOAD32_BYTE( "ap-01c.22", 0x000001, 0x20000, CRC(6286ff00) SHA1(920da4a3a441dbf54ad86c0f4fb6f47a867e9cda) ) ROM_LOAD32_BYTE( "ap-04c.58", 0x000002, 0x20000, CRC(dc6d55e4) SHA1(9f48f8d6aa1a329a71913139a8d5a50d95a9b9e5) ) @@ -1163,7 +1175,7 @@ ROM_START( apache3a ) ROM_LOAD32_BYTE( "ap-06c.71", 0x080002, 0x20000, CRC(0ea90e55) SHA1(b16d6b8be4853797507d3e5c933a9dd1d451308e) ) ROM_LOAD32_BYTE( "ap-07c.75", 0x080003, 0x20000, CRC(ba685543) SHA1(140a2b708d4e4de4d207fc2c4a96a5cab8639988) ) - ROM_REGION( 0x100000, "gfx3", 0) + ROM_REGION( 0x100000, "sprites_h", 0) ROM_LOAD32_BYTE( "ap-08c.14", 0x000000, 0x20000, CRC(6437b580) SHA1(2b2ba42add18bbec04fbcf53645a8d44b972e26a) ) ROM_LOAD32_BYTE( "ap-09c.21", 0x000001, 0x20000, CRC(54d18ef9) SHA1(40ebc6ea49b2a501fe843d60bec8c32d07f2d25d) ) ROM_LOAD32_BYTE( "ap-12c.57", 0x000002, 0x20000, CRC(f95cf5cf) SHA1(ce373c648cbf3e4863bbc3a1175efe065c75eb13) ) @@ -1173,7 +1185,7 @@ ROM_START( apache3a ) ROM_LOAD32_BYTE( "ap-14c.70", 0x080002, 0x20000, CRC(58f7fe16) SHA1(a5b87b42b85808c226df0d2a7b7cdde12d474a41) ) ROM_LOAD32_BYTE( "ap-15c.74", 0x080003, 0x20000, CRC(1ffd5496) SHA1(25efb568957fc9441a40a7d64cc6afe1a14b392b) ) - ROM_REGION( 0x18000, "gfx4", 0 ) + ROM_REGION( 0x18000, "text", 0 ) ROM_LOAD( "ap-18e.73", 0x000000, 0x10000, CRC(d7861a26) SHA1(b1a1e089a293a5536d342c9edafbea303f4f128c) ) ROM_LOAD( "ap-16e.63", 0x008000, 0x10000, CRC(d3251965) SHA1(aef4f58a6f773060434abda9d7f5f003693577bf) ) ROM_LOAD( "ap-17e.68", 0x008000, 0x08000, CRC(4509c2ed) SHA1(97a6a6710e83aca212ce43d06c3f26c35f9782b8) ) @@ -1202,10 +1214,10 @@ ROM_START( roundup5 ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k code for sound Z80 */ ROM_LOAD( "ru-28d", 0x000000, 0x10000, CRC(df36c6c5) SHA1(c046482043f6b54c55696ba3d339ffb11d78f674) ) - ROM_REGION( 0x180000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x180000, "sprites", ROMREGION_ERASE00 ) /* Filled in by both regions below */ - ROM_REGION( 0x0c0000, "gfx2", 0) + ROM_REGION( 0x0c0000, "sprites_l", 0) ROM_LOAD32_BYTE( "ru-00b", 0x000000, 0x20000, CRC(388a0647) SHA1(e4ab43832872f44c0fe1aaede4372cc00ca7d32b) ) ROM_LOAD32_BYTE( "ru-02b", 0x000001, 0x20000, CRC(eff33945) SHA1(3f4c3aaa11ccf945c2f898dfdf815705d8539e21) ) ROM_LOAD32_BYTE( "ru-04b", 0x000002, 0x20000, CRC(40fda247) SHA1(f5fbc07fda024baedf35ac209210e94df9f15065) ) @@ -1215,7 +1227,7 @@ ROM_START( roundup5 ) ROM_LOAD32_BYTE( "ru-05b", 0x080002, 0x10000, CRC(23dd10e1) SHA1(f30ff1a8c7ed9bc567b901cbdd202028fffb9f80) ) ROM_LOAD32_BYTE( "ru-07b", 0x080003, 0x10000, CRC(bb40f46e) SHA1(da694e16d19f60a0dee47551f00f3e50b2d5dcaf) ) - ROM_REGION( 0x0c0000, "gfx3", 0) + ROM_REGION( 0x0c0000, "sprites_h", 0) ROM_LOAD32_BYTE( "ru-08b", 0x000000, 0x20000, CRC(01729e3c) SHA1(1445287fde0b993d053aab73efafc902a6b7e2cc) ) ROM_LOAD32_BYTE( "ru-10b", 0x000001, 0x20000, CRC(cd2357a7) SHA1(313460a74244325ce2c659816f2b738f3dc5358a) ) ROM_LOAD32_BYTE( "ru-12b", 0x000002, 0x20000, CRC(ca63b1f8) SHA1(a50ef8259745dc166eb0a1b2c812ff620818a755) ) @@ -1246,10 +1258,10 @@ ROM_START( cyclwarr ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k code for sound Z80 */ ROM_LOAD( "cw26a", 0x000000, 0x10000, CRC(f7a70e3a) SHA1(5581633bf1f15d7f5c1e03de897d65d60f9f1e33) ) - ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x200000, "sprites", ROMREGION_ERASE00 ) /* Filled in by both regions below */ - ROM_REGION( 0x100000, "gfx2", 0) + ROM_REGION( 0x100000, "sprites_l", 0) ROM_LOAD32_BYTE( "cw00a", 0x000000, 0x20000, CRC(058a77f1) SHA1(93f99fcf6ce6714d76af6f6e930115516f0379d3) ) ROM_LOAD32_BYTE( "cw08a", 0x000001, 0x20000, CRC(f53993e7) SHA1(ef2d502ab180d2bc0bdb698c2878fdee9a2c33a8) ) ROM_LOAD32_BYTE( "cw02a", 0x000002, 0x20000, CRC(4dadf3cb) SHA1(e42c56e295a443cb605d48eba23a16fab3c86525) ) @@ -1259,7 +1271,7 @@ ROM_START( cyclwarr ) ROM_LOAD32_BYTE( "cw03a", 0x080002, 0x20000, CRC(3ca6f98e) SHA1(8526fe38d3b4c66e09049ba18651a9e7255d85d6) ) ROM_LOAD32_BYTE( "cw11a", 0x080003, 0x20000, CRC(5d760392) SHA1(7bbda2880af4659c267193ce10ed887a1b54a981) ) - ROM_REGION( 0x100000, "gfx3", 0) + ROM_REGION( 0x100000, "sprites_h", 0) ROM_LOAD32_BYTE( "cw04a", 0x000000, 0x20000, CRC(f05f594d) SHA1(80effaa517b2154c013419e0bc05fd0797b74c8d) ) ROM_LOAD32_BYTE( "cw12a", 0x000001, 0x20000, CRC(4ac07e8b) SHA1(f9de96fba39d5752d61b8f6be87fb605694624ed) ) ROM_LOAD32_BYTE( "cw06a", 0x000002, 0x20000, CRC(f628edc9) SHA1(473f7ec28000e6bf72782c1c3f4afb5e021bd430) ) @@ -1269,10 +1281,10 @@ ROM_START( cyclwarr ) ROM_LOAD32_BYTE( "cw07a", 0x080002, 0x20000, CRC(314579b5) SHA1(3c10ec490f7821a5b5412295232bbb104d0e4b83) ) ROM_LOAD32_BYTE( "cw15a", 0x080003, 0x20000, CRC(7ed4b721) SHA1(b87865effeff77a9ea74354ef2b5911a5102a647) ) - ROM_REGION( 0x20000, "gfx4", 0 ) + ROM_REGION( 0x20000, "cw_tileclut", 0 ) ROM_LOAD( "cw27", 0x000000, 0x20000, CRC(2db48a9e) SHA1(16c307340d17cd3b5455ebcee681fbe0335dec58) ) - ROM_REGION( 0x60000, "gfx5", 0 ) + ROM_REGION( 0x60000, "tilerom", 0 ) ROM_LOAD( "cw30", 0x000000, 0x20000, CRC(331d0711) SHA1(82251fe1f1d36f079080943ab1fd04a60077c353) ) ROM_LOAD( "cw29", 0x020000, 0x20000, CRC(64dd519c) SHA1(e23611fc2be896861997063546c3eb03527eaf8e) ) ROM_LOAD( "cw28", 0x040000, 0x20000, CRC(3fc568ed) SHA1(91125c9deddc659449ca6791a847fe908c2818b2) ) @@ -1298,10 +1310,10 @@ ROM_START( cyclwarra ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k code for sound Z80 */ ROM_LOAD( "cw26a", 0x000000, 0x10000, CRC(f7a70e3a) SHA1(5581633bf1f15d7f5c1e03de897d65d60f9f1e33) ) - ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x200000, "sprites", ROMREGION_ERASE00 ) /* Filled in by both regions below */ - ROM_REGION( 0x100000, "gfx2", 0) + ROM_REGION( 0x100000, "sprites_l", 0) ROM_LOAD32_BYTE( "cw00a", 0x000000, 0x20000, CRC(058a77f1) SHA1(93f99fcf6ce6714d76af6f6e930115516f0379d3) ) ROM_LOAD32_BYTE( "cw08a", 0x000001, 0x20000, CRC(f53993e7) SHA1(ef2d502ab180d2bc0bdb698c2878fdee9a2c33a8) ) ROM_LOAD32_BYTE( "cw02a", 0x000002, 0x20000, CRC(4dadf3cb) SHA1(e42c56e295a443cb605d48eba23a16fab3c86525) ) @@ -1311,7 +1323,7 @@ ROM_START( cyclwarra ) ROM_LOAD32_BYTE( "cw03a", 0x080002, 0x20000, CRC(3ca6f98e) SHA1(8526fe38d3b4c66e09049ba18651a9e7255d85d6) ) ROM_LOAD32_BYTE( "cw11a", 0x080003, 0x20000, CRC(5d760392) SHA1(7bbda2880af4659c267193ce10ed887a1b54a981) ) - ROM_REGION( 0x100000, "gfx3", 0) + ROM_REGION( 0x100000, "sprites_h", 0) ROM_LOAD32_BYTE( "cw04a", 0x000000, 0x20000, CRC(f05f594d) SHA1(80effaa517b2154c013419e0bc05fd0797b74c8d) ) ROM_LOAD32_BYTE( "cw12a", 0x000001, 0x20000, CRC(4ac07e8b) SHA1(f9de96fba39d5752d61b8f6be87fb605694624ed) ) ROM_LOAD32_BYTE( "cw06a", 0x000002, 0x20000, CRC(f628edc9) SHA1(473f7ec28000e6bf72782c1c3f4afb5e021bd430) ) @@ -1321,10 +1333,10 @@ ROM_START( cyclwarra ) ROM_LOAD32_BYTE( "cw07a", 0x080002, 0x20000, CRC(314579b5) SHA1(3c10ec490f7821a5b5412295232bbb104d0e4b83) ) ROM_LOAD32_BYTE( "cw15a", 0x080003, 0x20000, CRC(7ed4b721) SHA1(b87865effeff77a9ea74354ef2b5911a5102a647) ) - ROM_REGION( 0x20000, "gfx4", 0 ) + ROM_REGION( 0x20000, "cw_tileclut", 0 ) ROM_LOAD( "cw27", 0x000000, 0x20000, CRC(2db48a9e) SHA1(16c307340d17cd3b5455ebcee681fbe0335dec58) ) - ROM_REGION( 0x60000, "gfx5", 0 ) + ROM_REGION( 0x60000, "tilerom", 0 ) ROM_LOAD( "cw30", 0x000000, 0x20000, CRC(331d0711) SHA1(82251fe1f1d36f079080943ab1fd04a60077c353) ) ROM_LOAD( "cw29", 0x020000, 0x20000, CRC(64dd519c) SHA1(e23611fc2be896861997063546c3eb03527eaf8e) ) ROM_LOAD( "cw28", 0x040000, 0x20000, CRC(3fc568ed) SHA1(91125c9deddc659449ca6791a847fe908c2818b2) ) @@ -1346,25 +1358,25 @@ ROM_START( bigfight ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k code for sound Z80 */ ROM_LOAD( "rom20.ic91", 0x000000, 0x10000, CRC(b3add091) SHA1(8a67bfff75c13fe4d9b89d30449199200d11cea7) ) - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "sprites", ROMREGION_ERASE00 ) /* Filled in by both regions below */ - ROM_REGION( 0x200000, "gfx2", 0 ) + ROM_REGION( 0x200000, "sprites_l", 0 ) ROM_LOAD32_BYTE( "rom0.ic26", 0x000000, 0x80000, CRC(a4a3c8d6) SHA1(b5365d9bc6068260c23ba9d5971c7c7d7cc07a97) ) ROM_LOAD32_BYTE( "rom8.ic45", 0x000001, 0x80000, CRC(220956ed) SHA1(68e0ba1e850101b4cc2778819dfa76f04d88d2d6) ) ROM_LOAD32_BYTE( "rom2.ic28", 0x000002, 0x80000, CRC(c4f6d243) SHA1(e23b241b5a40b332165a34e2f1bc4366973b2070) ) ROM_LOAD32_BYTE( "rom10.ic47", 0x000003, 0x80000, CRC(0212d472) SHA1(5549461195fd7b6b43c0174462d7fe1a1bac24e9) ) - ROM_REGION( 0x200000, "gfx3", 0 ) + ROM_REGION( 0x200000, "sprites_h", 0 ) ROM_LOAD32_BYTE( "rom4.ic30", 0x000000, 0x80000, CRC(999ff7e9) SHA1(a53b06ad084722d7a52fcf01c52967f68620e609) ) ROM_LOAD32_BYTE( "rom12.ic49", 0x000001, 0x80000, CRC(cb4c1f0b) SHA1(32d64b78ed3d5971eb5d25be2c38e6f2c9048f74) ) ROM_LOAD32_BYTE( "rom6.ic32", 0x000002, 0x80000, CRC(f70e2d47) SHA1(00517b5f3b2deb6f3f3bd12df421e63884c22b2e) ) ROM_LOAD32_BYTE( "rom14.ic51", 0x000003, 0x80000, CRC(77430bc9) SHA1(0b1fd54ace84a9fb5b44d5600de8089a20bcbd47) ) - ROM_REGION( 0x20000, "gfx4", 0 ) + ROM_REGION( 0x20000, "cw_tileclut", 0 ) ROM_LOAD( "rom21.ic128", 0x000000, 0x20000, CRC(da027dcf) SHA1(47d18a8a273fea72cb3ad3d58166fe38ca28a860) ) - ROM_REGION( 0x60000, "gfx5", 0 ) + ROM_REGION( 0x60000, "tilerom", 0 ) ROM_LOAD( "rom24.ic73", 0x000000, 0x20000, CRC(c564185d) SHA1(e9b5fc10a5a5014735852c22db2a054d5787d8cb) ) ROM_LOAD( "rom23.ic72", 0x020000, 0x20000, CRC(f8bb340b) SHA1(905a1ec778d6ed5c6f53d9d08cd105eed7e307ca) ) ROM_LOAD( "rom22.ic71", 0x040000, 0x20000, CRC(fb505074) SHA1(b6d9b20be7c3e971e5a4392736f087e807b9c850) ) @@ -1377,9 +1389,9 @@ ROM_END void apache3_state::init_apache3() { - uint8_t *dst = memregion("gfx1")->base(); - uint8_t *src1 = memregion("gfx2")->base(); - uint8_t *src2 = memregion("gfx3")->base(); + uint8_t *dst = memregion("sprites")->base(); + uint8_t *src1 = memregion("sprites_l")->base(); + uint8_t *src2 = memregion("sprites_h")->base(); for (int i = 0; i < 0x100000; i += 32) { @@ -1392,10 +1404,10 @@ void apache3_state::init_apache3() } // Copy sprite & palette data out of GFX rom area - m_rom_sprite_lookup1 = memregion("gfx2")->base(); - m_rom_sprite_lookup2 = memregion("gfx3")->base(); - m_rom_clut0 = memregion("gfx2")->base()+ 0x100000 - 0x800; - m_rom_clut1 = memregion("gfx3")->base()+ 0x100000 - 0x800; + m_rom_sprite_lookup[0] = memregion("sprites_l")->base(); + m_rom_sprite_lookup[1] = memregion("sprites_h")->base(); + m_rom_clut[0] = memregion("sprites_l")->base()+ 0x100000 - 0x800; + m_rom_clut[1] = memregion("sprites_h")->base()+ 0x100000 - 0x800; tatsumi_reset(); @@ -1409,9 +1421,9 @@ void apache3_state::init_apache3() void roundup5_state::init_roundup5() { - uint8_t *dst = memregion("gfx1")->base(); - uint8_t *src1 = memregion("gfx2")->base(); - uint8_t *src2 = memregion("gfx3")->base(); + uint8_t *dst = memregion("sprites")->base(); + uint8_t *src1 = memregion("sprites_l")->base(); + uint8_t *src2 = memregion("sprites_h")->base(); for (int i = 0; i < 0xc0000; i += 32) { @@ -1424,21 +1436,21 @@ void roundup5_state::init_roundup5() } // Copy sprite & palette data out of GFX rom area - m_rom_sprite_lookup1 = memregion("gfx2")->base(); - m_rom_sprite_lookup2 = memregion("gfx3")->base(); - m_rom_clut0 = memregion("gfx2")->base()+ 0xc0000 - 0x800; - m_rom_clut1 = memregion("gfx3")->base()+ 0xc0000 - 0x800; + m_rom_sprite_lookup[0] = memregion("sprites_l")->base(); + m_rom_sprite_lookup[1] = memregion("sprites_h")->base(); + m_rom_clut[0] = memregion("sprites_l")->base()+ 0xc0000 - 0x800; + m_rom_clut[1] = memregion("sprites_h")->base()+ 0xc0000 - 0x800; tatsumi_reset(); } void cyclwarr_state::init_cyclwarr() { - uint8_t *dst = memregion("gfx1")->base(); - uint8_t *src1 = memregion("gfx2")->base(); - int len1 = memregion("gfx2")->bytes(); - uint8_t *src2 = memregion("gfx3")->base(); - int len2 = memregion("gfx3")->bytes(); + uint8_t *dst = memregion("sprites")->base(); + uint8_t *src1 = memregion("sprites_l")->base(); + int len1 = memregion("sprites_l")->bytes(); + uint8_t *src2 = memregion("sprites_h")->base(); + int len2 = memregion("sprites_h")->bytes(); for (int i = 0; i < len1; i += 32) { @@ -1450,19 +1462,19 @@ void cyclwarr_state::init_cyclwarr() src2+=32; } - dst = memregion("maincpu")->base(); + dst = m_mainregion->base(); memcpy(m_cyclwarr_cpua_ram,dst,8); membank("bank1")->set_base(dst); - dst = memregion("sub")->base(); + dst = m_subregion->base(); memcpy(m_cyclwarr_cpub_ram,dst,8); membank("bank2")->set_base(dst); // Copy sprite & palette data out of GFX rom area - m_rom_sprite_lookup1 = memregion("gfx2")->base(); - m_rom_sprite_lookup2 = memregion("gfx3")->base(); - m_rom_clut0 = memregion("gfx2")->base() + len1 - 0x1000; - m_rom_clut1 = memregion("gfx3")->base() + len2 - 0x1000; + m_rom_sprite_lookup[0] = memregion("sprites_l")->base(); + m_rom_sprite_lookup[1] = memregion("sprites_h")->base(); + m_rom_clut[0] = memregion("sprites_l")->base() + len1 - 0x1000; + m_rom_clut[1] = memregion("sprites_h")->base() + len2 - 0x1000; tatsumi_reset(); } diff --git a/src/mame/includes/tatsumi.h b/src/mame/includes/tatsumi.h index b54172a5e3d..ab536791c21 100644 --- a/src/mame/includes/tatsumi.h +++ b/src/mame/includes/tatsumi.h @@ -2,6 +2,7 @@ // copyright-holders:Bryan McPhail #include "sound/okim6295.h" +#include "sound/ym2151.h" #include "cpu/m68000/m68000.h" #include "machine/cxd1095.h" #include "machine/gen_latch.h" @@ -10,21 +11,26 @@ class tatsumi_state : public driver_device { public: tatsumi_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_subcpu(*this, "sub"), - m_oki(*this, "oki"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_videoram(*this, "videoram"), - m_68k_ram(*this, "68k_ram"), - m_sprite_control_ram(*this, "sprite_ctlram"), - m_spriteram(*this, "spriteram") { } + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_audiocpu(*this, "audiocpu") + , m_subcpu(*this, "sub") + , m_ym2151(*this, "ymsnd") + , m_oki(*this, "oki") + , m_gfxdecode(*this, "gfxdecode") + , m_palette(*this, "palette") + , m_videoram(*this, "videoram") + , m_68k_ram(*this, "68k_ram") + , m_sprite_control_ram(*this, "sprite_ctlram") + , m_spriteram(*this, "spriteram") + , m_mainregion(*this, "maincpu") + , m_subregion(*this, "sub") + { } required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; required_device<m68000_base_device> m_subcpu; + optional_device<ym2151_device> m_ym2151; required_device<okim6295_device> m_oki; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; @@ -33,11 +39,11 @@ public: optional_shared_ptr<uint16_t> m_68k_ram; required_shared_ptr<uint16_t> m_sprite_control_ram; required_shared_ptr<uint16_t> m_spriteram; + required_memory_region m_mainregion; + required_memory_region m_subregion; - uint8_t *m_rom_sprite_lookup1; - uint8_t *m_rom_sprite_lookup2; - uint8_t *m_rom_clut0; - uint8_t *m_rom_clut1; + uint8_t *m_rom_sprite_lookup[2]; + uint8_t *m_rom_clut[2]; uint16_t m_control_word; uint8_t m_last_control; tilemap_t *m_tx_layer; @@ -53,6 +59,9 @@ public: DECLARE_READ8_MEMBER(tatsumi_hack_oki_r); void tatsumi_reset(); template<class _BitmapClass> void draw_sprites(_BitmapClass &bitmap, const rectangle &cliprect, int write_priority_only, int rambank); + template<class _BitmapClass> inline void roundupt_drawgfxzoomrotate( _BitmapClass &dest_bmp, const rectangle &clip, + gfx_element *gfx, uint32_t code,uint32_t color,int flipx,int flipy,uint32_t ssx,uint32_t ssy, + int scalex, int scaley, int rotate, int write_priority_only ); void update_cluts(int fake_palette_offset, int object_base, int length); }; @@ -60,11 +69,12 @@ class apache3_state : public tatsumi_state { public: apache3_state(const machine_config &mconfig, device_type type, const char *tag) - : tatsumi_state(mconfig, type, tag), - m_subcpu2(*this, "sub2"), - m_apache3_g_ram(*this, "apache3_g_ram"), - m_apache3_z80_ram(*this, "apache3_z80_ram"), - m_vr1(*this, "VR1") + : tatsumi_state(mconfig, type, tag) + , m_subcpu2(*this, "sub2") + , m_apache3_g_ram(*this, "apache3_g_ram") + , m_apache3_z80_ram(*this, "apache3_z80_ram") + , m_apache3_prom(*this, "proms") + , m_vr1(*this, "VR1") { } @@ -99,6 +109,7 @@ private: required_shared_ptr<uint16_t> m_apache3_g_ram; required_shared_ptr<uint8_t> m_apache3_z80_ram; + required_region_ptr<uint8_t> m_apache3_prom; required_ioport m_vr1; @@ -112,15 +123,15 @@ class roundup5_state : public tatsumi_state { public: roundup5_state(const machine_config &mconfig, device_type type, const char *tag) - : tatsumi_state(mconfig, type, tag), - m_roundup5_d0000_ram(*this, "ru5_d0000_ram"), - m_roundup5_e0000_ram(*this, "ru5_e0000_ram"), - m_roundup5_unknown0(*this, "ru5_unknown0"), - m_roundup5_unknown1(*this, "ru5_unknown1"), - m_roundup5_unknown2(*this, "ru5_unknown2"), - m_roundup_r_ram(*this, "roundup_r_ram"), - m_roundup_p_ram(*this, "roundup_p_ram"), - m_roundup_l_ram(*this, "roundup_l_ram") + : tatsumi_state(mconfig, type, tag) + , m_roundup5_d0000_ram(*this, "ru5_d0000_ram") + , m_roundup5_e0000_ram(*this, "ru5_e0000_ram") + , m_roundup5_unknown0(*this, "ru5_unknown0") + , m_roundup5_unknown1(*this, "ru5_unknown1") + , m_roundup5_unknown2(*this, "ru5_unknown2") + , m_roundup_r_ram(*this, "roundup_r_ram") + , m_roundup_p_ram(*this, "roundup_p_ram") + , m_roundup_l_ram(*this, "roundup_l_ram") { } @@ -162,12 +173,12 @@ class cyclwarr_state : public tatsumi_state { public: cyclwarr_state(const machine_config &mconfig, device_type type, const char *tag) - : tatsumi_state(mconfig, type, tag), - m_soundlatch(*this, "soundlatch"), - m_cyclwarr_cpua_ram(*this, "cw_cpua_ram"), - m_cyclwarr_cpub_ram(*this, "cw_cpub_ram"), - m_cyclwarr_videoram0(*this, "cw_videoram0"), - m_cyclwarr_videoram1(*this, "cw_videoram1") + : tatsumi_state(mconfig, type, tag) + , m_soundlatch(*this, "soundlatch") + , m_cyclwarr_cpua_ram(*this, "cw_cpua_ram") + , m_cyclwarr_cpub_ram(*this, "cw_cpub_ram") + , m_cyclwarr_videoram(*this, "cw_videoram%u", 0U) + , m_cyclwarr_tileclut(*this, "cw_tileclut") { } @@ -176,16 +187,12 @@ public: DECLARE_WRITE16_MEMBER(bigfight_a20000_w); DECLARE_WRITE16_MEMBER(bigfight_a40000_w); DECLARE_WRITE16_MEMBER(bigfight_a60000_w); - DECLARE_WRITE16_MEMBER(cyclwarr_sound_w); DECLARE_WRITE8_MEMBER(cyclwarr_control_w); - DECLARE_READ16_MEMBER(cyclwarr_videoram0_r); - DECLARE_READ16_MEMBER(cyclwarr_videoram1_r); - DECLARE_WRITE16_MEMBER(cyclwarr_videoram0_w); - DECLARE_WRITE16_MEMBER(cyclwarr_videoram1_w); + template<int Bank> DECLARE_READ16_MEMBER(cyclwarr_videoram_r); + template<int Bank> DECLARE_WRITE16_MEMBER(cyclwarr_videoram_w); void init_cyclwarr(); - TILE_GET_INFO_MEMBER(get_tile_info_bigfight_0); - TILE_GET_INFO_MEMBER(get_tile_info_bigfight_1); + template<int Bank> TILE_GET_INFO_MEMBER(get_tile_info_bigfight); DECLARE_VIDEO_START(cyclwarr); DECLARE_VIDEO_START(bigfight); uint32_t screen_update_cyclwarr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -203,13 +210,11 @@ private: required_shared_ptr<uint16_t> m_cyclwarr_cpua_ram; required_shared_ptr<uint16_t> m_cyclwarr_cpub_ram; - required_shared_ptr<uint16_t> m_cyclwarr_videoram0; - required_shared_ptr<uint16_t> m_cyclwarr_videoram1; - - tilemap_t *m_layer0; - tilemap_t *m_layer1; - tilemap_t *m_layer2; - tilemap_t *m_layer3; + required_shared_ptr_array<uint16_t, 2> m_cyclwarr_videoram; + required_region_ptr<uint8_t> m_cyclwarr_tileclut; + + std::vector<uint8_t> m_mask; + tilemap_t *m_layer[4]; uint16_t m_bigfight_a20000[8]; uint16_t m_bigfight_a60000[2]; @@ -217,5 +222,6 @@ private: uint16_t m_bigfight_bank; uint16_t m_bigfight_last_bank; - void draw_bg(bitmap_rgb32 &dst, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, const uint16_t* tilemap_ram, int tile_bank, int xscroll_offset, int yscroll_offset, int xsize, int ysize); + void tile_expand(); + void draw_bg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, int xscroll_offset, int yscroll_offset); }; diff --git a/src/mame/machine/tatsumi.cpp b/src/mame/machine/tatsumi.cpp index 3b4a1dd5835..e861d47a2bb 100644 --- a/src/mame/machine/tatsumi.cpp +++ b/src/mame/machine/tatsumi.cpp @@ -2,7 +2,6 @@ // copyright-holders:Bryan McPhail #include "emu.h" #include "includes/tatsumi.h" -#include "sound/ym2151.h" #include "sound/okim6295.h" @@ -260,7 +259,7 @@ WRITE8_MEMBER(cyclwarr_state::cyclwarr_control_w) READ16_MEMBER(tatsumi_state::tatsumi_v30_68000_r) { - const uint16_t* rom=(uint16_t*)memregion("sub")->base(); + const uint16_t* rom=(uint16_t*)m_subregion->base(); //logerror("%s:68000_r(%04X),cw=%04X\n", m_maincpu->pc(), offset*2, m_control_word); /* Read from 68k RAM */ @@ -269,7 +268,7 @@ READ16_MEMBER(tatsumi_state::tatsumi_v30_68000_r) // hack to make roundup 5 boot if (m_maincpu->pc()==0xec575) { - uint8_t *dst = memregion("maincpu")->base(); + uint8_t *dst = m_mainregion->base(); dst[BYTE_XOR_LE(0xec57a)]=0x46; dst[BYTE_XOR_LE(0xec57b)]=0x46; @@ -304,7 +303,7 @@ WRITE16_MEMBER(tatsumi_state::tatsumi_v30_68000_w) // self-test in Tatsumi games. Needs fixed, but hack it here for now. READ8_MEMBER(tatsumi_state::tatsumi_hack_ym2151_r) { - int r=machine().device<ym2151_device>("ymsnd")->status_r(space,0); + int r=m_ym2151->status_r(space,0); if (m_audiocpu->pc()==0x2aca || m_audiocpu->pc()==0x29fe || m_audiocpu->pc()==0xf9721 diff --git a/src/mame/video/tatsumi.cpp b/src/mame/video/tatsumi.cpp index 1f9724392c0..71154bd763b 100644 --- a/src/mame/video/tatsumi.cpp +++ b/src/mame/video/tatsumi.cpp @@ -56,36 +56,6 @@ WRITE16_MEMBER(tatsumi_state::text_w) m_tx_layer->mark_tile_dirty(offset); } -READ16_MEMBER(cyclwarr_state::cyclwarr_videoram0_r) -{ - return m_cyclwarr_videoram0[offset]; -} - -READ16_MEMBER(cyclwarr_state::cyclwarr_videoram1_r) -{ - return m_cyclwarr_videoram1[offset]; -} - -WRITE16_MEMBER(cyclwarr_state::cyclwarr_videoram0_w) -{ - COMBINE_DATA(&m_cyclwarr_videoram0[offset]); - if (offset>=0x400) - { - m_layer0->mark_tile_dirty(offset-0x400); - m_layer1->mark_tile_dirty(offset-0x400); - } -} - -WRITE16_MEMBER(cyclwarr_state::cyclwarr_videoram1_w) -{ - COMBINE_DATA(&m_cyclwarr_videoram1[offset]); - if (offset>=0x400) - { - m_layer2->mark_tile_dirty(offset-0x400); - m_layer3->mark_tile_dirty(offset-0x400); - } -} - WRITE16_MEMBER(roundup5_state::roundup5_crt_w) { if (offset==0 && ACCESSING_BITS_0_7) @@ -101,26 +71,62 @@ WRITE16_MEMBER(roundup5_state::roundup5_crt_w) TILE_GET_INFO_MEMBER(tatsumi_state::get_text_tile_info) { - uint16_t *videoram = m_videoram; - int tile = videoram[tile_index]; + int tile = m_videoram[tile_index]; SET_TILE_INFO_MEMBER(1, tile & 0xfff, tile >> 12, 0); } -TILE_GET_INFO_MEMBER(cyclwarr_state::get_tile_info_bigfight_0) +template<int Bank> +TILE_GET_INFO_MEMBER(cyclwarr_state::get_tile_info_bigfight) { - int tile=m_cyclwarr_videoram0[(tile_index+0x400)%0x8000]; + int tile=m_cyclwarr_videoram[Bank][(tile_index+0x400)&0x7fff]; int bank = (m_bigfight_a40000[0] >> (((tile&0xc00)>>10)*4))&0xf; - SET_TILE_INFO_MEMBER(1,(tile&0x3ff)+(bank<<10),(tile>>12)&0xf,0); + SET_TILE_INFO_MEMBER(1,(tile&0x3ff)|(bank<<10),(tile>>12)&0xf,0); + tileinfo.mask_data = &m_mask[((tile&0x3ff)|(bank<<10))<<3]; } -TILE_GET_INFO_MEMBER(cyclwarr_state::get_tile_info_bigfight_1) +/********************************************************************/ + +void cyclwarr_state::tile_expand() { - int tile=m_cyclwarr_videoram1[(tile_index+0x400)%0x8000]; - int bank = (m_bigfight_a40000[0] >> (((tile&0xc00)>>10)*4))&0xf; - SET_TILE_INFO_MEMBER(1,(tile&0x3ff)+(bank<<10),(tile>>12)&0xf,0); + /* + Each tile (0x4000 of them) has a lookup table in ROM to build an individual 3-bit palette + from sets of 8 bit palettes! + */ + gfx_element *gx0 = m_gfxdecode->gfx(1); + m_mask.resize(gx0->elements() << 3,0); + uint8_t *srcdata, *dest; + + // allocate memory for the assembled data + srcdata = auto_alloc_array(machine(), uint8_t, gx0->elements() * gx0->width() * gx0->height()); + + // loop over elements + dest = srcdata; + for (int c = 0; c < gx0->elements(); c++) + { + const uint8_t *c0base = gx0->get_data(c); + + // loop over height + for (int y = 0; y < gx0->height(); y++) + { + const uint8_t *c0 = c0base; + + for (int x = 0; x < gx0->width(); x++) + { + uint8_t pix = (*c0++ & 7); + uint8_t respix = m_cyclwarr_tileclut[(c << 3)|pix]; + *dest++ = respix; + // Transparent pixels are set by both the tile pixel data==0 AND colour palette==0 + m_mask[(c << 3) | (y & 7)] |= ((pix != 0) || ((pix == 0) && (respix != 0))) ? (0x80 >> (x & 7)) : 0; + } + c0base += gx0->rowbytes(); + } + } + + gx0->set_raw_layout(srcdata, gx0->width(), gx0->height(), gx0->elements(), 8 * gx0->width(), 8 * gx0->width() * gx0->height()); + gx0->set_granularity(256); } /********************************************************************/ @@ -148,21 +154,23 @@ VIDEO_START_MEMBER(roundup5_state,roundup5) VIDEO_START_MEMBER(cyclwarr_state,cyclwarr) { - m_layer0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_0),this),TILEMAP_SCAN_ROWS,8,8,64,512); - //m_layer1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_0),this),TILEMAP_SCAN_ROWS,8,8,64,512); - m_layer1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_0),this),TILEMAP_SCAN_ROWS,8,8,128,256); - m_layer2 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_1),this),TILEMAP_SCAN_ROWS,8,8,64,512); - m_layer3 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_1),this),TILEMAP_SCAN_ROWS,8,8,64,512); + tile_expand(); + m_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,64,512); + //m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,64,512); + m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256); + m_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,64,512); + m_layer[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,64,512); m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192); } VIDEO_START_MEMBER(cyclwarr_state,bigfight) { - m_layer0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_0),this),TILEMAP_SCAN_ROWS,8,8,128,256); - m_layer1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_0),this),TILEMAP_SCAN_ROWS,8,8,128,256); - m_layer2 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_1),this),TILEMAP_SCAN_ROWS,8,8,128,256); - m_layer3 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight_1),this),TILEMAP_SCAN_ROWS,8,8,128,256); + tile_expand(); + m_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256); + m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256); + m_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,128,256); + m_layer[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,128,256); m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192); } @@ -170,9 +178,8 @@ VIDEO_START_MEMBER(cyclwarr_state,bigfight) /********************************************************************/ template<class _BitmapClass> -static inline void roundupt_drawgfxzoomrotate(tatsumi_state *state, - _BitmapClass &dest_bmp, const rectangle &clip, gfx_element *gfx, - uint32_t code,uint32_t color,int flipx,int flipy,uint32_t ssx,uint32_t ssy, +inline void tatsumi_state::roundupt_drawgfxzoomrotate( _BitmapClass &dest_bmp, const rectangle &clip, + gfx_element *gfx, uint32_t code,uint32_t color,int flipx,int flipy,uint32_t ssx,uint32_t ssy, int scalex, int scaley, int rotate, int write_priority_only ) { rectangle myclip; @@ -193,8 +200,8 @@ static inline void roundupt_drawgfxzoomrotate(tatsumi_state *state, { if( gfx ) { - const pen_t *pal = &state->m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); - const uint8_t *shadow_pens = state->m_shadow_pen_array.get() + (gfx->granularity() * (color % gfx->colors())); + const pen_t *pal = &m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); + const uint8_t *shadow_pens = m_shadow_pen_array.get() + (gfx->granularity() * (color % gfx->colors())); const uint8_t *code_base = gfx->get_data(code % gfx->elements()); int block_size = 8 * scalex; @@ -500,8 +507,8 @@ void tatsumi_state::draw_sprites(_BitmapClass &bitmap, const rectangle &cliprect if (index >= 0x4000) continue; - src1 = m_rom_sprite_lookup1 + (index * 4); - src2 = m_rom_sprite_lookup2 + (index * 4); + src1 = m_rom_sprite_lookup[0] + (index * 4); + src2 = m_rom_sprite_lookup[1] + (index * 4); lines = src1[2]; y_offset = src1[0]&0xf8; @@ -558,13 +565,13 @@ void tatsumi_state::draw_sprites(_BitmapClass &bitmap, const rectangle &cliprect for (w = 0; w < x_width; w++) { if (rotate) - roundupt_drawgfxzoomrotate(this, + roundupt_drawgfxzoomrotate( m_temp_bitmap,cliprect,m_gfxdecode->gfx(0), base, color,flip_x,flip_y,x_pos,render_y, scale,scale,0,write_priority_only); else - roundupt_drawgfxzoomrotate(this, + roundupt_drawgfxzoomrotate( bitmap,cliprect,m_gfxdecode->gfx(0), base, color,flip_x,flip_y,x_pos,render_y, @@ -864,8 +871,8 @@ void tatsumi_state::update_cluts(int fake_palette_offset, int object_base, int l draw routines. We also note down any uses of the 'shadow' pen (index 255). */ int i; - const uint8_t* bank1=m_rom_clut0; - const uint8_t* bank2=m_rom_clut1; + const uint8_t* bank1=m_rom_clut[0]; + const uint8_t* bank2=m_rom_clut[1]; for (i=0; i<length; i+=8) { m_palette->set_pen_color(fake_palette_offset+i+0,m_palette->pen_color(bank1[1]+object_base)); m_shadow_pen_array[i+0]=(bank1[1]==255); @@ -892,38 +899,19 @@ void tatsumi_state::update_cluts(int fake_palette_offset, int object_base, int l /**********************************************************************/ -void cyclwarr_state::draw_bg(bitmap_rgb32 &dst, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, const uint16_t* tilemap_ram, int tile_bank, int xscroll_offset, int yscroll_offset, int xsize, int ysize) +void cyclwarr_state::draw_bg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, int xscroll_offset, int yscroll_offset) { - /* - Each tile (0x4000 of them) has a lookup table in ROM to build an individual 3-bit palette - from sets of 8 bit palettes! - */ - const uint8_t* tile_cluts = machine().root_device().memregion("gfx4")->base(); - const bitmap_ind16 &src_bitmap = src->pixmap(); - int src_y_mask=ysize-1; - int src_x_mask=xsize-1; - int tile_y_mask=(ysize/8)-1; - int tile_x_mask=(xsize/8)-1; - int tiles_per_x_line=(xsize/8); - int x, y, p, pp, ppp; - - for (y=0; y<240; y++) + rectangle clip; + clip.min_x = cliprect.min_x; + clip.max_x = cliprect.max_x; + for (int y=cliprect.min_y; y<=cliprect.max_y; y++) { - for (x=0; x<320; x++) - { - int src_x = x + scrollx[y] + xscroll_offset; - int src_y = y + scrolly[y] + yscroll_offset; - int tile_index = (((src_x>>3)&tile_x_mask) + (((src_y>>3)&tile_y_mask) * tiles_per_x_line)); - int bank = (tile_bank >> (((tilemap_ram[(tile_index+0x400)&0x7fff]&0xc00)>>10)*4))&0xf; - int tile = (tilemap_ram[(tile_index+0x400)&0x7fff]&0x3ff) | (bank<<10); - - p=src_bitmap.pix16(src_y&src_y_mask, src_x&src_x_mask); - pp=tile_cluts[tile*8 + (p&0x7)]; - ppp=pp + ((p&0x78)<<5); - - if ((p&0x7)!=0 || ((p&0x7)==0 && (pp&0x7)!=0)) // Transparent pixels are set by both the tile pixel data==0 AND colour palette==0 - dst.pix32(y, x) = m_palette->pen(ppp); - } + clip.min_y = clip.max_y = y; + int src_x = scrollx[y] + xscroll_offset; + int src_y = scrolly[y] + yscroll_offset; + src->set_scrollx(0,src_x); + src->set_scrolly(0,src_y); + src->draw(screen, bitmap, clip, 0, 0); } } @@ -932,7 +920,6 @@ void apache3_state::draw_ground(bitmap_rgb32 &dst, const rectangle &cliprect) { if (0) { int x, y; - const uint8_t *lut = memregion("proms")->base(); uint16_t gva = 0x180; // TODO uint8_t sky_val = m_apache3_rotate_ctrl[1] & 0xff; @@ -941,7 +928,7 @@ if (0) { { uint16_t rgdb = 0;//m_apache3_road_x_ram[gva & 0xff]; uint16_t gha = 0xf60; // test - int ln = (((lut[gva & 0x7f] & 0x7f) + (m_apache3_road_z & 0x7f)) >> 5) & 3; + int ln = (((m_apache3_prom[gva & 0x7f] & 0x7f) + (m_apache3_road_z & 0x7f)) >> 5) & 3; if (gva & 0x100) { @@ -1033,21 +1020,21 @@ uint32_t cyclwarr_state::screen_update_cyclwarr(screen_device &screen, bitmap_rg m_bigfight_bank=m_bigfight_a40000[0]; if (m_bigfight_bank!=m_bigfight_last_bank) { - m_layer0->mark_all_dirty(); - m_layer1->mark_all_dirty(); - m_layer2->mark_all_dirty(); - m_layer3->mark_all_dirty(); + for (int i = 0; i < 4; i++) + { + m_layer[i]->mark_all_dirty(); + } m_bigfight_last_bank=m_bigfight_bank; } bitmap.fill(m_palette->pen(0), cliprect); - draw_bg(bitmap, m_layer3, &m_cyclwarr_videoram1[0x000], &m_cyclwarr_videoram1[0x100], m_cyclwarr_videoram1, m_bigfight_a40000[0], 8, -0x80, 512, 4096); - draw_bg(bitmap, m_layer2, &m_cyclwarr_videoram1[0x200], &m_cyclwarr_videoram1[0x300], m_cyclwarr_videoram1, m_bigfight_a40000[0], 8, -0x80, 512, 4096); - draw_bg(bitmap, m_layer1, &m_cyclwarr_videoram0[0x000], &m_cyclwarr_videoram0[0x100], m_cyclwarr_videoram0, m_bigfight_a40000[0], 8, -0x40, 1024, 2048); + draw_bg(screen, bitmap, cliprect, m_layer[3], &m_cyclwarr_videoram[1][0x000], &m_cyclwarr_videoram[1][0x100], 8, -0x80); + draw_bg(screen, bitmap, cliprect, m_layer[2], &m_cyclwarr_videoram[1][0x200], &m_cyclwarr_videoram[1][0x300], 8, -0x80); + draw_bg(screen, bitmap, cliprect, m_layer[1], &m_cyclwarr_videoram[0][0x000], &m_cyclwarr_videoram[0][0x100], 8, -0x40); update_cluts(8192, 4096, 8192); draw_sprites(bitmap,cliprect,0,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); - draw_bg(bitmap, m_layer0, &m_cyclwarr_videoram0[0x200], &m_cyclwarr_videoram0[0x300], m_cyclwarr_videoram0, m_bigfight_a40000[0], 0x10, -0x80, 512, 4096); + draw_bg(screen, bitmap, cliprect, m_layer[0], &m_cyclwarr_videoram[0][0x200], &m_cyclwarr_videoram[0][0x300], 0x10, -0x80); return 0; } @@ -1057,20 +1044,20 @@ uint32_t cyclwarr_state::screen_update_bigfight(screen_device &screen, bitmap_rg m_bigfight_bank=m_bigfight_a40000[0]; if (m_bigfight_bank!=m_bigfight_last_bank) { - m_layer0->mark_all_dirty(); - m_layer1->mark_all_dirty(); - m_layer2->mark_all_dirty(); - m_layer3->mark_all_dirty(); + for (int i = 0; i < 4; i++) + { + m_layer[i]->mark_all_dirty(); + } m_bigfight_last_bank=m_bigfight_bank; } bitmap.fill(m_palette->pen(0), cliprect); - draw_bg(bitmap, m_layer3, &m_cyclwarr_videoram1[0x000], &m_cyclwarr_videoram1[0x100], m_cyclwarr_videoram1, m_bigfight_a40000[0], 8, -0x40, 1024, 2048); - draw_bg(bitmap, m_layer2, &m_cyclwarr_videoram1[0x200], &m_cyclwarr_videoram1[0x300], m_cyclwarr_videoram1, m_bigfight_a40000[0], 8, -0x40, 1024, 2048); - draw_bg(bitmap, m_layer1, &m_cyclwarr_videoram0[0x000], &m_cyclwarr_videoram0[0x100], m_cyclwarr_videoram0, m_bigfight_a40000[0], 8, -0x40, 1024, 2048); + draw_bg(screen, bitmap, cliprect, m_layer[3], &m_cyclwarr_videoram[1][0x000], &m_cyclwarr_videoram[1][0x100], 8, -0x40); + draw_bg(screen, bitmap, cliprect, m_layer[2], &m_cyclwarr_videoram[1][0x200], &m_cyclwarr_videoram[1][0x300], 8, -0x40); + draw_bg(screen, bitmap, cliprect, m_layer[1], &m_cyclwarr_videoram[0][0x000], &m_cyclwarr_videoram[0][0x100], 8, -0x40); update_cluts(8192, 4096, 8192); draw_sprites(bitmap,cliprect,0,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); - draw_bg(bitmap, m_layer0, &m_cyclwarr_videoram0[0x200], &m_cyclwarr_videoram0[0x300], m_cyclwarr_videoram0, m_bigfight_a40000[0], 0x10, -0x40, 1024, 2048); + draw_bg(screen, bitmap, cliprect, m_layer[0], &m_cyclwarr_videoram[0][0x200], &m_cyclwarr_videoram[0][0x300], 0x10, -0x40); return 0; } |