summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/tilemap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/tilemap.cpp')
-rw-r--r--src/emu/tilemap.cpp122
1 files changed, 82 insertions, 40 deletions
diff --git a/src/emu/tilemap.cpp b/src/emu/tilemap.cpp
index 083b4b4ef5a..44360a2a486 100644
--- a/src/emu/tilemap.cpp
+++ b/src/emu/tilemap.cpp
@@ -336,7 +336,9 @@ inline void tilemap_t::scanline_draw_masked_rgb32_alpha(u32 *dest, const u16 *so
// tilemap_t - constructor
//-------------------------------------------------
-tilemap_t::tilemap_t()
+tilemap_t::tilemap_t(device_t &owner)
+ : m_mapper(owner)
+ , m_tile_get_info(owner)
{
// until init() is called, data is floating; this is deliberate
}
@@ -346,11 +348,18 @@ tilemap_t::tilemap_t()
// init - initialize the tilemap
//-------------------------------------------------
-tilemap_t &tilemap_t::init(tilemap_manager &manager, device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows)
+void tilemap_t::init_common(
+ tilemap_manager &manager,
+ device_gfx_interface &decoder,
+ tilemap_get_info_delegate tile_get_info,
+ u16 tilewidth,
+ u16 tileheight,
+ u32 cols,
+ u32 rows)
{
// populate managers and devices
m_manager = &manager;
- m_device = dynamic_cast<tilemap_device *>(this);
+ m_device = dynamic_cast<device_t *>(this);
m_palette = &decoder.palette();
m_next = nullptr;
m_user_data = nullptr;
@@ -363,9 +372,6 @@ tilemap_t &tilemap_t::init(tilemap_manager &manager, device_gfx_interface &decod
m_width = cols * tilewidth;
m_height = rows * tileheight;
- // populate logical <-> memory mappings
- m_mapper = mapper;
-
// initialize tile information geters
m_tile_get_info = tile_get_info;
@@ -426,6 +432,52 @@ tilemap_t &tilemap_t::init(tilemap_manager &manager, device_gfx_interface &decod
// reset everything after a load
machine().save().register_postload(save_prepost_delegate(FUNC(tilemap_t::postload), this));
+}
+
+tilemap_t &tilemap_t::init(
+ tilemap_manager &manager,
+ device_gfx_interface &decoder,
+ tilemap_get_info_delegate tile_get_info,
+ tilemap_mapper_delegate mapper,
+ u16 tilewidth,
+ u16 tileheight,
+ u32 cols,
+ u32 rows)
+{
+ // populate logical <-> memory mappings
+ m_mapper = mapper;
+
+ init_common(manager, decoder, tile_get_info, tilewidth, tileheight, cols, rows);
+
+ return *this;
+}
+
+tilemap_t &tilemap_t::init(
+ tilemap_manager &manager,
+ device_gfx_interface &decoder,
+ tilemap_get_info_delegate tile_get_info,
+ tilemap_standard_mapper mapper,
+ u16 tilewidth,
+ u16 tileheight,
+ u32 cols,
+ u32 rows)
+{
+ // populate logical <-> memory mappings
+ switch (mapper)
+ {
+ case TILEMAP_SCAN_ROWS: m_mapper.set(*this, FUNC(tilemap_t::scan_rows)); break;
+ case TILEMAP_SCAN_ROWS_FLIP_X: m_mapper.set(*this, FUNC(tilemap_t::scan_rows_flip_x)); break;
+ case TILEMAP_SCAN_ROWS_FLIP_Y: m_mapper.set(*this, FUNC(tilemap_t::scan_rows_flip_y)); break;
+ case TILEMAP_SCAN_ROWS_FLIP_XY: m_mapper.set(*this, FUNC(tilemap_t::scan_rows_flip_xy)); break;
+ case TILEMAP_SCAN_COLS: m_mapper.set(*this, FUNC(tilemap_t::scan_cols)); break;
+ case TILEMAP_SCAN_COLS_FLIP_X: m_mapper.set(*this, FUNC(tilemap_t::scan_cols_flip_x)); break;
+ case TILEMAP_SCAN_COLS_FLIP_Y: m_mapper.set(*this, FUNC(tilemap_t::scan_cols_flip_y)); break;
+ case TILEMAP_SCAN_COLS_FLIP_XY: m_mapper.set(*this, FUNC(tilemap_t::scan_cols_flip_xy)); break;
+ default: throw emu_fatalerror("Tilemap init unknown mapper %d", mapper);
+ }
+
+ init_common(manager, decoder, tile_get_info, tilewidth, tileheight, cols, rows);
+
return *this;
}
@@ -1529,14 +1581,13 @@ tilemap_manager::tilemap_manager(running_machine &machine)
tilemap_manager::~tilemap_manager()
{
- // detach all device tilemaps since they will be destroyed
- // as subdevices elsewhere
+ // detach all device tilemaps since they will be destroyed as subdevices elsewhere
bool found = true;
while (found)
{
found = false;
for (tilemap_t &tmap : m_tilemap_list)
- if (tmap.device() != nullptr)
+ if (tmap.m_device)
{
found = true;
m_tilemap_list.detach(tmap);
@@ -1553,28 +1604,16 @@ tilemap_manager::~tilemap_manager()
tilemap_t &tilemap_manager::create(device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows, tilemap_t *allocated)
{
- if (allocated == nullptr)
- allocated = global_alloc(tilemap_t);
+ if (!allocated)
+ allocated = global_alloc(tilemap_t)(machine().root_device());
return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, mapper, tilewidth, tileheight, cols, rows));
}
tilemap_t &tilemap_manager::create(device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_standard_mapper mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows, tilemap_t *allocated)
{
- if (allocated == nullptr)
- allocated = global_alloc(tilemap_t);
-
- switch (mapper)
- {
- case TILEMAP_SCAN_ROWS :return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows), allocated), tilewidth, tileheight, cols, rows));
- case TILEMAP_SCAN_ROWS_FLIP_X:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows_flip_x), allocated), tilewidth, tileheight, cols, rows));
- case TILEMAP_SCAN_ROWS_FLIP_Y:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows_flip_y), allocated), tilewidth, tileheight, cols, rows));
- case TILEMAP_SCAN_ROWS_FLIP_XY:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows_flip_xy),allocated), tilewidth, tileheight, cols, rows));
- case TILEMAP_SCAN_COLS:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols),allocated), tilewidth, tileheight, cols, rows));
- case TILEMAP_SCAN_COLS_FLIP_X:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols_flip_x),allocated), tilewidth, tileheight, cols, rows));
- case TILEMAP_SCAN_COLS_FLIP_Y:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols_flip_y),allocated), tilewidth, tileheight, cols, rows));
- case TILEMAP_SCAN_COLS_FLIP_XY:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols_flip_xy),allocated), tilewidth, tileheight, cols, rows));
- default: throw emu_fatalerror("Tilemap manager create unknown mapper %d", mapper);
- }
+ if (!allocated)
+ allocated = global_alloc(tilemap_t)(machine().root_device());
+ return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, mapper, tilewidth, tileheight, cols, rows));
}
@@ -1615,16 +1654,19 @@ DEFINE_DEVICE_TYPE(TILEMAP, tilemap_device, "tilemap", "Tilemap")
//-------------------------------------------------
tilemap_device::tilemap_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : device_t(mconfig, TILEMAP, tag, owner, clock),
- m_gfxdecode(*this, finder_base::DUMMY_TAG),
- m_standard_mapper(TILEMAP_STANDARD_COUNT),
- m_bytes_per_entry(0),
- m_tile_width(8),
- m_tile_height(8),
- m_num_columns(64),
- m_num_rows(64),
- m_transparent_pen_set(false),
- m_transparent_pen(0)
+ : device_t(mconfig, TILEMAP, tag, owner, clock)
+ , tilemap_t(static_cast<device_t &>(*this))
+ , m_gfxdecode(*this, finder_base::DUMMY_TAG)
+ , m_get_info(*this)
+ , m_standard_mapper(TILEMAP_STANDARD_COUNT)
+ , m_mapper(*this)
+ , m_bytes_per_entry(0)
+ , m_tile_width(8)
+ , m_tile_height(8)
+ , m_num_columns(64)
+ , m_num_rows(64)
+ , m_transparent_pen_set(false)
+ , m_transparent_pen(0)
{
}
@@ -1719,14 +1761,14 @@ void tilemap_device::device_start()
throw device_missing_dependencies();
// bind our callbacks
- m_get_info.bind_relative_to(*owner());
- m_mapper.bind_relative_to(*owner());
+ m_get_info.resolve();
+ m_mapper.resolve();
// allocate the tilemap
if (m_standard_mapper == TILEMAP_STANDARD_COUNT)
- machine().tilemap().create(*m_gfxdecode, m_get_info, m_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, this);
+ machine().tilemap().create(*m_gfxdecode, m_get_info, m_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, *this);
else
- machine().tilemap().create(*m_gfxdecode, m_get_info, m_standard_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, this);
+ machine().tilemap().create(*m_gfxdecode, m_get_info, m_standard_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, *this);
// find the memory, if present
const memory_share *share = memshare(tag());