summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2018-03-19 12:54:56 +0900
committer ajrhacker <ajrhacker@users.noreply.github.com>2018-03-18 23:54:56 -0400
commit371de0c5c0793a72d5f09667917d496aa4096a99 (patch)
tree098e06d073960216c3fc36895e031ab687103f2a /src/mame
parent647ea55ea5fc93b00f48101aa959040910206dc1 (diff)
divebomb.cpp cleanups (#3350)
* divebomb.cpp : Minor cleanup, Add generic_latch_8_device for cpu comms, Add input_merger_any_high_device for fgcpu irq, Fix tags * divebomb.cpp : Minor cleanup
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/divebomb.cpp190
-rw-r--r--src/mame/includes/divebomb.h65
-rw-r--r--src/mame/video/divebomb.cpp53
3 files changed, 108 insertions, 200 deletions
diff --git a/src/mame/drivers/divebomb.cpp b/src/mame/drivers/divebomb.cpp
index e9bac91d43d..04c9adcc186 100644
--- a/src/mame/drivers/divebomb.cpp
+++ b/src/mame/drivers/divebomb.cpp
@@ -120,8 +120,8 @@ void divebomb_state::divebomb_fgcpu_iomap(address_map &map)
map(0x03, 0x03).w("sn3", FUNC(sn76489_device::write));
map(0x04, 0x04).w("sn4", FUNC(sn76489_device::write));
map(0x05, 0x05).w("sn5", FUNC(sn76489_device::write));
- map(0x10, 0x10).rw(this, FUNC(divebomb_state::fgcpu_roz_comm_r), FUNC(divebomb_state::fgcpu_roz_comm_w));
- map(0x20, 0x20).rw(this, FUNC(divebomb_state::fgcpu_spr_comm_r), FUNC(divebomb_state::fgcpu_spr_comm_w));
+ map(0x10, 0x10).r(m_roz2fg_latch, FUNC(generic_latch_8_device::read)).w("fg2roz", FUNC(generic_latch_8_device::write));
+ map(0x20, 0x20).r(m_spr2fg_latch, FUNC(generic_latch_8_device::read)).w("fg2spr", FUNC(generic_latch_8_device::write));
map(0x30, 0x30).portr("IN0");
map(0x31, 0x31).portr("IN1");
map(0x32, 0x32).portr("DSW1");
@@ -134,50 +134,19 @@ void divebomb_state::divebomb_fgcpu_iomap(address_map &map)
}
-READ8_MEMBER(divebomb_state::fgcpu_spr_comm_r)
-{
- has_fromsprite = false;
- update_irqs();
- return from_sprite;
-}
-
-
-WRITE8_MEMBER(divebomb_state::fgcpu_spr_comm_w)
-{
- m_spritecpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
- to_spritecpu = data;
-}
-
-
-READ8_MEMBER(divebomb_state::fgcpu_roz_comm_r)
-{
- has_fromroz = false;
- update_irqs();
- return from_roz;
-}
-
-
-WRITE8_MEMBER(divebomb_state::fgcpu_roz_comm_w)
-{
- m_rozcpucpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
- to_rozcpu = data;
-}
-
-
READ8_MEMBER(divebomb_state::fgcpu_comm_flags_r)
{
uint8_t result = 0;
- if (has_fromroz)
+ if (m_roz2fg_latch->pending_r())
result |= 1;
- if (has_fromsprite)
+ if (m_spr2fg_latch->pending_r())
result |= 2;
return result;
}
-
/*************************************
*
* Sprite CPU
@@ -197,22 +166,7 @@ void divebomb_state::divebomb_spritecpu_iomap(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).w(this, FUNC(divebomb_state::spritecpu_port00_w));
- map(0x80, 0x80).rw(this, FUNC(divebomb_state::spritecpu_comm_r), FUNC(divebomb_state::spritecpu_comm_w));
-}
-
-
-READ8_MEMBER(divebomb_state::spritecpu_comm_r)
-{
- m_spritecpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
- return to_spritecpu;
-}
-
-
-WRITE8_MEMBER(divebomb_state::spritecpu_comm_w)
-{
- from_sprite = data;
- has_fromsprite = true;
- update_irqs();
+ map(0x80, 0x80).r("spr2fg", FUNC(generic_latch_8_device::read)).w(m_spr2fg_latch, FUNC(generic_latch_8_device::write));
}
@@ -223,19 +177,32 @@ WRITE8_MEMBER(divebomb_state::spritecpu_port00_w)
}
-
/*************************************
*
* ROZ CPU
*
*************************************/
+template<int Chip>
+WRITE8_MEMBER(divebomb_state::rozcpu_wrap_enable_w)
+{
+ m_k051316[Chip]->wraparound_enable(!(data & 1));
+}
+
+
+template<int Chip>
+WRITE8_MEMBER(divebomb_state::rozcpu_enable_w)
+{
+ m_roz_enable[Chip] = !(data & 1);
+}
+
+
void divebomb_state::divebomb_rozcpu_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0x8000, 0xbfff).bankr("bank1");
- map(0xc000, 0xc7ff).ram().rw(m_k051316_1, FUNC(k051316_device::read), FUNC(k051316_device::write));
- map(0xd000, 0xd7ff).ram().rw(m_k051316_2, FUNC(k051316_device::read), FUNC(k051316_device::write));
+ map(0x8000, 0xbfff).bankr("rozbank");
+ map(0xc000, 0xc7ff).ram().rw(m_k051316[0], FUNC(k051316_device::read), FUNC(k051316_device::write));
+ map(0xd000, 0xd7ff).ram().rw(m_k051316[1], FUNC(k051316_device::read), FUNC(k051316_device::write));
map(0xe000, 0xffff).ram();
}
@@ -244,13 +211,13 @@ void divebomb_state::divebomb_rozcpu_iomap(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).w(this, FUNC(divebomb_state::rozcpu_bank_w));
- map(0x10, 0x10).w(this, FUNC(divebomb_state::rozcpu_wrap2_enable_w));
- map(0x12, 0x12).w(this, FUNC(divebomb_state::rozcpu_enable1_w));
- map(0x13, 0x13).w(this, FUNC(divebomb_state::rozcpu_enable2_w));
- map(0x14, 0x14).w(this, FUNC(divebomb_state::rozcpu_wrap1_enable_w));
- map(0x20, 0x2f).w(m_k051316_1, FUNC(k051316_device::ctrl_w));
- map(0x30, 0x3f).w(m_k051316_2, FUNC(k051316_device::ctrl_w));
- map(0x40, 0x40).rw(this, FUNC(divebomb_state::rozcpu_comm_r), FUNC(divebomb_state::rozcpu_comm_w));
+ map(0x10, 0x10).w(this, FUNC(divebomb_state::rozcpu_wrap_enable_w<1>));
+ map(0x12, 0x12).w(this, FUNC(divebomb_state::rozcpu_enable_w<0>));
+ map(0x13, 0x13).w(this, FUNC(divebomb_state::rozcpu_enable_w<1>));
+ map(0x14, 0x14).w(this, FUNC(divebomb_state::rozcpu_wrap_enable_w<0>));
+ map(0x20, 0x2f).w(m_k051316[0], FUNC(k051316_device::ctrl_w));
+ map(0x30, 0x3f).w(m_k051316[1], FUNC(k051316_device::ctrl_w));
+ map(0x40, 0x40).r("roz2fg", FUNC(generic_latch_8_device::read)).w(m_roz2fg_latch, FUNC(generic_latch_8_device::write));
map(0x50, 0x50).w(this, FUNC(divebomb_state::rozcpu_pal_w));
}
@@ -258,45 +225,13 @@ void divebomb_state::divebomb_rozcpu_iomap(address_map &map)
WRITE8_MEMBER(divebomb_state::rozcpu_bank_w)
{
uint32_t bank = bitswap<8>(data, 4, 5, 6, 7, 3, 2, 1, 0) >> 4;
- m_bank1->set_entry(bank);
+ m_rozbank->set_entry(bank);
if (data & 0x0f)
logerror("rozcpu_bank_w %02x\n", data);
}
-READ8_MEMBER(divebomb_state::rozcpu_comm_r)
-{
- m_rozcpucpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
- return to_rozcpu;
-}
-
-
-WRITE8_MEMBER(divebomb_state::rozcpu_comm_w)
-{
- from_roz = data;
- has_fromroz = true;
- update_irqs();
-}
-
-
-
-/*************************************
- *
- * IRQs
- *
- *************************************/
-
-void divebomb_state::update_irqs()
-{
- if (has_fromsprite || has_fromroz)
- m_fgcpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
- else
- m_fgcpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
-}
-
-
-
/*************************************
*
* Port definitions
@@ -420,9 +355,9 @@ static const gfx_layout tiles8x8_layout =
RGN_FRAC(1,1),
2,
{ 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 },
- 16*8
+ { STEP8(0,1) },
+ { STEP8(0,8*2) },
+ 8*8*2
};
@@ -432,15 +367,15 @@ static const gfx_layout tiles16x16_layout =
RGN_FRAC(1,1),
4,
{ 24,16,8,0 },
- { 0, 1, 2, 3, 4, 5, 6, 7, 32,33,34,35,36,37,38,39 },
- { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64,9*64,10*64,11*64,12*64,13*64,14*64,15*64 },
- 64*16
+ { STEP8(0,1), STEP8(4*8,1) },
+ { STEP16(0,4*16) },
+ 16*16*4
};
static GFXDECODE_START( divebomb )
- GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0x400+0x400, 16 )
- GFXDECODE_ENTRY( "gfx2", 0, tiles16x16_layout, 0x400+0x400+0x400, 16 )
+ GFXDECODE_ENTRY( "fgrom", 0, tiles8x8_layout, 0x400+0x400, 16 )
+ GFXDECODE_ENTRY( "sprites", 0, tiles16x16_layout, 0x400+0x400+0x400, 16 )
GFXDECODE_END
@@ -470,6 +405,21 @@ MACHINE_CONFIG_START(divebomb_state::divebomb)
MCFG_QUANTUM_PERFECT_CPU("fgcpu")
+ MCFG_INPUT_MERGER_ANY_HIGH("fgcpu_irq")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("fgcpu", INPUT_LINE_IRQ0))
+
+ MCFG_GENERIC_LATCH_8_ADD("fg2spr")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("spritecpu", INPUT_LINE_IRQ0))
+
+ MCFG_GENERIC_LATCH_8_ADD("fg2roz")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("rozcpu", INPUT_LINE_IRQ0))
+
+ MCFG_GENERIC_LATCH_8_ADD("spr2fg")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("fgcpu_irq", input_merger_any_high_device, in_w<0>))
+
+ MCFG_GENERIC_LATCH_8_ADD("roz2fg")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("fgcpu_irq", input_merger_any_high_device, in_w<1>))
+
MCFG_DEVICE_ADD("k051316_1", K051316, 0)
MCFG_GFX_PALETTE("palette")
MCFG_K051316_BPP(8)
@@ -545,11 +495,11 @@ ROM_START( divebomb )
ROM_LOAD( "u11.27512", 0x20000, 0x10000, CRC(8d46be7d) SHA1(7751df1f39b208169f04a5b904cb63e9fb53bba8) )
// u12 not populated
- ROM_REGION( 0x10000, "gfx1", 0 )
+ ROM_REGION( 0x10000, "fgrom", 0 )
ROM_LOAD16_BYTE( "u22.27256", 0x00000, 0x08000, CRC(f816f9c5) SHA1(b8e136463a1b4c81960c6b7350472d82af0fb1fb) )
ROM_LOAD16_BYTE( "u23.27256", 0x00001, 0x08000, CRC(d2600570) SHA1(a7f7e182670e7b95321c4ec8278ce915bbe2b5ca) )
- ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD32_BYTE( "u15.27c100", 0x00000, 0x20000, CRC(ccba7fa0) SHA1(5eb4c1e458e7810e0f9db92946474d6da65f1a1b) )
ROM_LOAD32_BYTE( "u16.27c100", 0x00001, 0x20000, CRC(16891fef) SHA1(a4723958509bccc73138306e58c355325ec342a3) )
ROM_LOAD32_BYTE( "u17.27c100", 0x00002, 0x20000, CRC(f4cbc97f) SHA1(1e13bc18db128575ca8e6998e9dd6f7dc37a99b8) )
@@ -601,30 +551,22 @@ ROM_END
MACHINE_START_MEMBER(divebomb_state, divebomb)
{
- m_bank1->configure_entries(0, 16, memregion("rozcpudata")->base(), 0x4000);
-
- save_item(NAME(roz1_enable));
- save_item(NAME(roz2_enable));
- save_item(NAME(roz1_wrap));
- save_item(NAME(roz2_wrap));
- save_item(NAME(to_spritecpu));
- save_item(NAME(to_rozcpu));
- save_item(NAME(has_fromsprite));
- save_item(NAME(has_fromroz));
- save_item(NAME(from_sprite));
- save_item(NAME(from_roz));
- save_item(NAME(roz_pal));
+ m_rozbank->configure_entries(0, 16, memregion("rozcpudata")->base(), 0x4000);
+
+ save_item(NAME(m_roz_enable));
+ save_item(NAME(m_roz_pal));
}
MACHINE_RESET_MEMBER(divebomb_state, divebomb)
{
- roz1_enable = false;
- roz2_enable = false;
- roz1_wrap = false;
- roz2_wrap = false;
- has_fromsprite = false;
- has_fromroz = false;
+ for (int chip = 0; chip < 2; chip++)
+ {
+ m_roz_enable[chip] = false;
+ m_k051316[chip]->wraparound_enable(false);
+ }
+ m_fgcpu_irq->in_w<0>(CLEAR_LINE);
+ m_fgcpu_irq->in_w<1>(CLEAR_LINE);
}
diff --git a/src/mame/includes/divebomb.h b/src/mame/includes/divebomb.h
index c82ee5aa097..4de581ddb39 100644
--- a/src/mame/includes/divebomb.h
+++ b/src/mame/includes/divebomb.h
@@ -7,6 +7,8 @@
*************************************************************************/
#include "cpu/z80/z80.h"
+#include "machine/gen_latch.h"
+#include "machine/input_merger.h"
#include "sound/sn76496.h"
#include "video/k051316.h"
@@ -16,50 +18,45 @@ class divebomb_state : public driver_device
{
public:
divebomb_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_spritecpu(*this, "spritecpu"),
- m_fgcpu(*this, "fgcpu"),
- m_rozcpucpu(*this, "rozcpu"),
- m_bank1(*this, "bank1"),
- m_fgram(*this, "fgram"),
- m_spriteram(*this, "spriteram"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_k051316_1(*this, "k051316_1"),
- m_k051316_2(*this, "k051316_2")
- { }
+ : driver_device(mconfig, type, tag)
+ , m_spritecpu(*this, "spritecpu")
+ , m_fgcpu(*this, "fgcpu")
+ , m_rozcpucpu(*this, "rozcpu")
+ , m_rozbank(*this, "rozbank")
+ , m_fgram(*this, "fgram")
+ , m_spriteram(*this, "spriteram")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palette(*this, "palette")
+ , m_k051316(*this, "k051316_%u", 1)
+ , m_fgcpu_irq(*this, "fgcpu_irq")
+ , m_spr2fg_latch(*this, "spr2fg")
+ , m_roz2fg_latch(*this, "roz2fg")
+ {
+ }
required_device<cpu_device> m_spritecpu;
required_device<cpu_device> m_fgcpu;
required_device<cpu_device> m_rozcpucpu;
- required_memory_bank m_bank1;
+ required_memory_bank m_rozbank;
required_shared_ptr<uint8_t> m_fgram;
required_shared_ptr<uint8_t> m_spriteram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- required_device<k051316_device> m_k051316_1;
- required_device<k051316_device> m_k051316_2;
+ required_device_array<k051316_device, 2> m_k051316;
+ required_device<input_merger_any_high_device> m_fgcpu_irq;
+ required_device<generic_latch_8_device> m_spr2fg_latch;
+ required_device<generic_latch_8_device> m_roz2fg_latch;
tilemap_t *m_fg_tilemap;
- uint8_t to_spritecpu;
- uint8_t to_rozcpu;
- uint8_t from_sprite;
- uint8_t from_roz;
- bool has_fromsprite;
- bool has_fromroz;
- uint8_t roz_pal;
- bool roz1_enable;
- bool roz2_enable;
- bool roz1_wrap;
- bool roz2_wrap;
+ uint8_t m_roz_pal;
+ bool m_roz_enable[2];
DECLARE_MACHINE_RESET(divebomb);
DECLARE_MACHINE_START(divebomb);
DECLARE_VIDEO_START(divebomb);
DECLARE_PALETTE_INIT(divebomb);
- void update_irqs();
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void decode_proms(const uint8_t* rgn, int size, int index, bool inv);
uint32_t screen_update_divebomb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -69,24 +66,14 @@ public:
TILE_GET_INFO_MEMBER(get_fg_tile_info);
- DECLARE_READ8_MEMBER(fgcpu_roz_comm_r);
- DECLARE_WRITE8_MEMBER(fgcpu_roz_comm_w);
- DECLARE_READ8_MEMBER(fgcpu_spr_comm_r);
- DECLARE_WRITE8_MEMBER(fgcpu_spr_comm_w);
DECLARE_READ8_MEMBER(fgcpu_comm_flags_r);
DECLARE_WRITE8_MEMBER(fgram_w);
DECLARE_WRITE8_MEMBER(spritecpu_port00_w);
- DECLARE_READ8_MEMBER(spritecpu_comm_r);
- DECLARE_WRITE8_MEMBER(spritecpu_comm_w);
DECLARE_WRITE8_MEMBER(rozcpu_bank_w);
- DECLARE_WRITE8_MEMBER(rozcpu_wrap1_enable_w);
- DECLARE_WRITE8_MEMBER(rozcpu_enable1_w);
- DECLARE_WRITE8_MEMBER(rozcpu_enable2_w);
- DECLARE_WRITE8_MEMBER(rozcpu_wrap2_enable_w);
- DECLARE_READ8_MEMBER(rozcpu_comm_r);
- DECLARE_WRITE8_MEMBER(rozcpu_comm_w);
+ template<int Chip> DECLARE_WRITE8_MEMBER(rozcpu_wrap_enable_w);
+ template<int Chip> DECLARE_WRITE8_MEMBER(rozcpu_enable_w);
DECLARE_WRITE8_MEMBER(rozcpu_pal_w);
void divebomb(machine_config &config);
void divebomb_fgcpu_iomap(address_map &map);
diff --git a/src/mame/video/divebomb.cpp b/src/mame/video/divebomb.cpp
index fe0afad9950..c1b58941930 100644
--- a/src/mame/video/divebomb.cpp
+++ b/src/mame/video/divebomb.cpp
@@ -40,14 +40,14 @@ TILE_GET_INFO_MEMBER(divebomb_state::get_fg_tile_info)
K051316_CB_MEMBER(divebomb_state::zoom_callback_1)
{
*code |= (*color & 0x03) << 8;
- *color = 0 + ((roz_pal >> 4) & 3);
+ *color = 0 + ((m_roz_pal >> 4) & 3);
}
K051316_CB_MEMBER(divebomb_state::zoom_callback_2)
{
*code |= (*color & 0x03) << 8;
- *color = 4 + (roz_pal & 3);
+ *color = 4 + (m_roz_pal & 3);
}
@@ -65,39 +65,19 @@ WRITE8_MEMBER(divebomb_state::fgram_w)
}
-WRITE8_MEMBER(divebomb_state::rozcpu_wrap1_enable_w)
-{
- roz1_wrap = !(data & 1);
-}
-
-
-WRITE8_MEMBER(divebomb_state::rozcpu_enable1_w)
-{
- roz1_enable = !(data & 1);
-}
-
-
-WRITE8_MEMBER(divebomb_state::rozcpu_enable2_w)
-{
- roz2_enable = !(data & 1);
-}
-
-
-WRITE8_MEMBER(divebomb_state::rozcpu_wrap2_enable_w)
-{
- roz2_wrap = !(data & 1);
-}
-
-
WRITE8_MEMBER(divebomb_state::rozcpu_pal_w)
{
//.... ..xx K051316 1 palette select
//..xx .... K051316 2 palette select
- roz_pal = data;
+ uint8_t old_pal = m_roz_pal;
+ m_roz_pal = data;
- m_k051316_2->mark_tmap_dirty();
- m_k051316_1->mark_tmap_dirty();
+ if ((old_pal & 0x03) != (data & 0x03))
+ m_k051316[1]->mark_tmap_dirty();
+
+ if ((old_pal & 0x30) != (data & 0x30))
+ m_k051316[0]->mark_tmap_dirty();
if (data & 0xcc)
logerror("rozcpu_port50_w %02x\n", data);
@@ -190,16 +170,15 @@ void divebomb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
uint32_t divebomb_state::screen_update_divebomb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- m_k051316_1->wraparound_enable(roz1_wrap);
- m_k051316_2->wraparound_enable(roz2_wrap);
-
bitmap.fill(m_palette->black_pen(), cliprect);
- if (roz2_enable)
- m_k051316_2->zoom_draw(screen, bitmap, cliprect, 0, 0);
-
- if (roz1_enable)
- m_k051316_1->zoom_draw(screen, bitmap, cliprect, 0, 0);
+ for (int chip = 1; chip >= 0; chip--)
+ {
+ if (m_roz_enable[chip])
+ {
+ m_k051316[chip]->zoom_draw(screen, bitmap, cliprect, 0, 0);
+ }
+ }
draw_sprites(bitmap, cliprect);