summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Ivan Vangelista <mesgnet@yahoo.it>2019-08-14 18:25:24 +0200
committer Ivan Vangelista <mesgnet@yahoo.it>2019-08-14 18:25:24 +0200
commit8e727a4abbe6783c2f919ddd2b41156c84ba37e4 (patch)
treec2271af3b5a2b82bc71a75a371bc68b26df1e50d /src
parentc25c3c79abd8464273e3f6359645be66a4873ad5 (diff)
thedeep.cpp: use decbac06 device instead of custom routines (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/thedeep.cpp25
-rw-r--r--src/mame/includes/thedeep.h24
-rw-r--r--src/mame/video/decbac06.cpp22
-rw-r--r--src/mame/video/decbac06.h5
-rw-r--r--src/mame/video/thedeep.cpp57
5 files changed, 55 insertions, 78 deletions
diff --git a/src/mame/drivers/thedeep.cpp b/src/mame/drivers/thedeep.cpp
index 9f9a77c1d17..eed9144504f 100644
--- a/src/mame/drivers/thedeep.cpp
+++ b/src/mame/drivers/thedeep.cpp
@@ -62,14 +62,6 @@ void thedeep_state::machine_start()
save_item(NAME(m_coin_result));
}
-void thedeep_state::machine_reset()
-{
- m_scroll[0] = 0;
- m_scroll[1] = 0;
- m_scroll[2] = 0;
- m_scroll[3] = 0;
-}
-
READ8_MEMBER(thedeep_state::protection_r)
{
m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
@@ -114,11 +106,12 @@ void thedeep_state::main_map(address_map &map)
map(0xe00b, 0xe00b).portr("e00b"); // DSW2
map(0xe00c, 0xe00c).w(m_soundlatch, FUNC(generic_latch_8_device::write)); // To Sound CPU
map(0xe100, 0xe100).w(FUNC(thedeep_state::e100_w)); // ?
- map(0xe210, 0xe213).writeonly().share("scroll"); // Scroll
- map(0xe400, 0xe7ff).ram().share("spriteram"); // Sprites
- map(0xe800, 0xefff).ram().w(FUNC(thedeep_state::vram_1_w)).share("vram_1"); // Text Layer
- map(0xf000, 0xf7ff).ram().w(FUNC(thedeep_state::vram_0_w)).share("vram_0"); // Background Layer
- map(0xf800, 0xf83f).ram().share("scroll2"); // Column Scroll
+ map(0xe200, 0xe207).w(m_tilegen, FUNC(deco_bac06_device::pf_control0_8bit_w));
+ map(0xe210, 0xe217).w(m_tilegen, FUNC(deco_bac06_device::pf_control1_8bit_swap_w));
+ map(0xe400, 0xe7ff).ram().share(m_spriteram); // Sprites
+ map(0xe800, 0xefff).ram().w(FUNC(thedeep_state::textram_w)).share(m_textram); // Text Layer
+ map(0xf000, 0xf7ff).rw(m_tilegen, FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); // Background Layer
+ map(0xf800, 0xf83f).rw(m_tilegen, FUNC(deco_bac06_device::pf_colscroll_8bit_swap_r), FUNC(deco_bac06_device::pf_colscroll_8bit_swap_w));
map(0xf840, 0xffff).ram();
}
@@ -166,6 +159,7 @@ void thedeep_state::mcu_p1_w(uint8_t data)
membank("bank1")->set_entry((data >> 1) & 0x03);
flip_screen_set(!BIT(data, 0));
+ m_tilegen->set_flip_screen(!BIT(data, 0));
m_spritegen->set_flip_screen(!BIT(data, 0));
}
@@ -370,6 +364,11 @@ void thedeep_state::thedeep(machine_config &config)
DECO_MXC06(config, m_spritegen, 0);
+ DECO_BAC06(config, m_tilegen, 0);
+ m_tilegen->set_gfx_region_wide(1, 1, 0);
+ m_tilegen->set_gfxdecode_tag(m_gfxdecode);
+ m_tilegen->set_thedeep_kludge(); // TODO: this game wants TILE_FLIPX always set. Investigate why.
+
/* sound hardware */
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/includes/thedeep.h b/src/mame/includes/thedeep.h
index 306dfd18052..992a2fc9182 100644
--- a/src/mame/includes/thedeep.h
+++ b/src/mame/includes/thedeep.h
@@ -8,6 +8,7 @@
#include "cpu/mcs51/mcs51.h"
#include "machine/gen_latch.h"
#include "machine/timer.h"
+#include "video/decbac06.h"
#include "video/decmxc06.h"
#include "emupal.h"
@@ -22,21 +23,18 @@ public:
m_mcu(*this, "mcu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
+ m_tilegen(*this, "tilegen"),
m_spritegen(*this, "spritegen"),
m_soundlatch(*this, "soundlatch"),
m_coins(*this, "COINS"),
m_spriteram(*this, "spriteram"),
- m_vram_0(*this, "vram_0"),
- m_vram_1(*this, "vram_1"),
- m_scroll(*this, "scroll"),
- m_scroll2(*this, "scroll2")
+ m_textram(*this, "textram")
{ }
void thedeep(machine_config &config);
protected:
virtual void machine_start() override;
- virtual void machine_reset() override;
virtual void video_start() override;
private:
@@ -45,19 +43,16 @@ private:
required_device<i8751_device> m_mcu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
+ required_device<deco_bac06_device> m_tilegen;
required_device<deco_mxc06_device> m_spritegen;
required_device<generic_latch_8_device> m_soundlatch;
required_ioport m_coins;
required_shared_ptr<uint8_t> m_spriteram;
- required_shared_ptr<uint8_t> m_vram_0;
- required_shared_ptr<uint8_t> m_vram_1;
- required_shared_ptr<uint8_t> m_scroll;
- required_shared_ptr<uint8_t> m_scroll2;
+ required_shared_ptr<uint8_t> m_textram;
int m_nmi_enable;
- tilemap_t *m_tilemap_0;
- tilemap_t *m_tilemap_1;
+ tilemap_t *m_text_tilemap;
// protection mcu
uint8_t mcu_p0_r();
@@ -78,12 +73,9 @@ private:
DECLARE_WRITE8_MEMBER(nmi_w);
DECLARE_WRITE8_MEMBER(e100_w);
- DECLARE_WRITE8_MEMBER(vram_0_w);
- DECLARE_WRITE8_MEMBER(vram_1_w);
+ DECLARE_WRITE8_MEMBER(textram_w);
- TILEMAP_MAPPER_MEMBER(tilemap_scan_rows_back);
- TILE_GET_INFO_MEMBER(get_tile_info_0);
- TILE_GET_INFO_MEMBER(get_tile_info_1);
+ TILE_GET_INFO_MEMBER(get_tile_info);
void thedeep_palette(palette_device &palette) const;
diff --git a/src/mame/video/decbac06.cpp b/src/mame/video/decbac06.cpp
index 137dbf730b5..9df7665f684 100644
--- a/src/mame/video/decbac06.cpp
+++ b/src/mame/video/decbac06.cpp
@@ -15,6 +15,7 @@
madmotor.cpp
stadhero.cpp
pcktgal.cpp
+ thedeep.cpp
Notes (from dec0.cpp)
@@ -94,6 +95,7 @@ deco_bac06_device::deco_bac06_device(const machine_config &mconfig, const char *
, m_bppmult_16x16(0)
, m_bppmask_16x16(0)
, m_gfxdecode(*this, finder_base::DUMMY_TAG)
+ , m_thedeep_kludge(0)
{
std::fill(std::begin(m_pf_control_0), std::end(m_pf_control_0), 0);
std::fill(std::begin(m_pf_control_1), std::end(m_pf_control_1), 0);
@@ -207,7 +209,7 @@ TILE_GET_INFO_MEMBER(deco_bac06_device::get_pf16x16_tile_info)
if (m_rambank & 1) tile_index += 0x1000;
int tile = m_pf_data[tile_index];
int colourpri = (tile >> 12);
- int flags = (m_pf_control_0[0] & 2) ? 0 : TILE_FLIPX;
+ int flags = (BIT(m_pf_control_0[0], 1) ^ m_thedeep_kludge) ? 0 : TILE_FLIPX;
SET_TILE_INFO_MEMBER(m_tile_region_16,tile & 0xfff,0,flags);
tileinfo.category = colourpri;
}
@@ -302,7 +304,7 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
Nb2: Real hardware exhibits a strange bug with column scroll on 'mode 2'
(256*1024) - the first column has a strange additional offset, but
curiously the first 'wrap' (at scroll offset 256) does not have this offset,
- it is displayed as expected. The bug is confimed to only affect this mode,
+ it is displayed as expected. The bug is confirmed to only affect this mode,
the other two modes work as expected. This bug is not emulated, as it
doesn't affect any games.
*/
@@ -601,6 +603,22 @@ void deco_bac06_device::pf_rowscroll_8bit_swap_w(offs_t offset, u8 data)
pf_rowscroll_w(offset / 2, data, 0x00ff);
}
+// used by thedeep
+u8 deco_bac06_device::pf_colscroll_8bit_swap_r(offs_t offset)
+{
+ if (offset & 1)
+ return pf_colscroll_r(offset / 2)>>8;
+ else
+ return pf_colscroll_r(offset / 2);
+}
+
+void deco_bac06_device::pf_colscroll_8bit_swap_w(offs_t offset, u8 data)
+{
+ if (offset & 1)
+ pf_colscroll_w(offset / 2, data << 8, 0xff00);
+ else
+ pf_colscroll_w(offset / 2, data, 0x00ff);
+}
/* used by hippodrm */
void deco_bac06_device::pf_control0_8bit_packed_w(offs_t offset, u8 data)
diff --git a/src/mame/video/decbac06.h b/src/mame/video/decbac06.h
index 264cd75daef..35b8a105098 100644
--- a/src/mame/video/decbac06.h
+++ b/src/mame/video/decbac06.h
@@ -21,6 +21,7 @@ public:
m_gfxregion16x16 = region16x16;
m_wide = wide;
}
+ void set_thedeep_kludge() { m_thedeep_kludge = 1; } // thedeep requires TILE_FLIPX always set, for reasons to be investigated
void disable_8x8() { m_supports_8x8 = false; }
void disable_16x16() { m_supports_16x16 = false; }
void disable_rc_scroll() { m_supports_rc_scroll = false; }
@@ -101,6 +102,8 @@ public:
void pf_data_8bit_swap_w(offs_t offset, u8 data);
u8 pf_rowscroll_8bit_swap_r(offs_t offset);
void pf_rowscroll_8bit_swap_w(offs_t offset, u8 data);
+ u8 pf_colscroll_8bit_swap_r(offs_t offset);
+ void pf_colscroll_8bit_swap_w(offs_t offset, u8 data);
protected:
virtual void device_start() override;
@@ -139,6 +142,8 @@ private:
TILE_GET_INFO_MEMBER(get_pf8x8_tile_info);
TILE_GET_INFO_MEMBER(get_pf16x16_tile_info);
required_device<gfxdecode_device> m_gfxdecode;
+
+ bool m_thedeep_kludge;
};
DECLARE_DEVICE_TYPE(DECO_BAC06, deco_bac06_device)
diff --git a/src/mame/video/thedeep.cpp b/src/mame/video/thedeep.cpp
index 28a06b5d713..8ca4fd02419 100644
--- a/src/mame/video/thedeep.cpp
+++ b/src/mame/video/thedeep.cpp
@@ -40,41 +40,20 @@
***************************************************************************/
-TILEMAP_MAPPER_MEMBER(thedeep_state::tilemap_scan_rows_back)
+TILE_GET_INFO_MEMBER(thedeep_state::get_tile_info)
{
- return (col & 0x0f) + ((col & 0x10) << 5) + (row << 4);
-}
-
-TILE_GET_INFO_MEMBER(thedeep_state::get_tile_info_0)
-{
- uint8_t code = m_vram_0[ tile_index * 2 + 0 ];
- uint8_t color = m_vram_0[ tile_index * 2 + 1 ];
- SET_TILE_INFO_MEMBER(1,
- code + (color << 8),
- (color & 0xf0) >> 4,
- TILE_FLIPX ); // why?
-}
-
-TILE_GET_INFO_MEMBER(thedeep_state::get_tile_info_1)
-{
- uint8_t code = m_vram_1[ tile_index * 2 + 0 ];
- uint8_t color = m_vram_1[ tile_index * 2 + 1 ];
+ uint8_t code = m_textram[ tile_index * 2 + 0 ];
+ uint8_t color = m_textram[ tile_index * 2 + 1 ];
SET_TILE_INFO_MEMBER(2,
code + (color << 8),
(color & 0xf0) >> 4,
0);
}
-WRITE8_MEMBER(thedeep_state::vram_0_w)
+WRITE8_MEMBER(thedeep_state::textram_w)
{
- m_vram_0[offset] = data;
- m_tilemap_0->mark_tile_dirty(offset / 2);
-}
-
-WRITE8_MEMBER(thedeep_state::vram_1_w)
-{
- m_vram_1[offset] = data;
- m_tilemap_1->mark_tile_dirty(offset / 2);
+ m_textram[offset] = data;
+ m_text_tilemap->mark_tile_dirty(offset / 2);
}
@@ -99,13 +78,9 @@ void thedeep_state::thedeep_palette(palette_device &palette) const
void thedeep_state::video_start()
{
- m_tilemap_0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(thedeep_state::get_tile_info_0),this),tilemap_mapper_delegate(FUNC(thedeep_state::tilemap_scan_rows_back),this),16,16,0x20,0x20);
- m_tilemap_1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(thedeep_state::get_tile_info_1),this),TILEMAP_SCAN_ROWS,8,8,0x20,0x20);
-
- m_tilemap_0->set_transparent_pen(0 );
- m_tilemap_1->set_transparent_pen(0 );
+ m_text_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(thedeep_state::get_tile_info), this), TILEMAP_SCAN_ROWS, 8, 8, 0x20, 0x20);
- m_tilemap_0->set_scroll_cols(0x20); // column scroll for the background
+ m_text_tilemap->set_transparent_pen(0);
}
/***************************************************************************
@@ -116,22 +91,10 @@ void thedeep_state::video_start()
uint32_t thedeep_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int scrollx = m_scroll[0] + (m_scroll[1]<<8);
- int scrolly = m_scroll[2] + (m_scroll[3]<<8);
- int x;
-
- m_tilemap_0->set_scrollx(0, scrollx);
-
- for (x = 0; x < 0x20; x++)
- {
- int y = m_scroll2[x*2+0] + (m_scroll2[x*2+1]<<8);
- m_tilemap_0->set_scrolly(x, y + scrolly);
- }
-
bitmap.fill(m_palette->black_pen(), cliprect);
- m_tilemap_0->draw(screen, bitmap, cliprect, 0,0);
+ m_tilegen->deco_bac06_pf_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00, 0);
m_spritegen->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(0), reinterpret_cast<uint16_t *>(m_spriteram.target()), 0x400/2);
- m_tilemap_1->draw(screen, bitmap, cliprect, 0,0);
+ m_text_tilemap->draw(screen, bitmap, cliprect, 0,0);
return 0;
}