Merge pull request #5305 from cam900/dooyong_args

dooyong.cpp : Updates
This commit is contained in:
R. Belmont 2019-07-04 12:54:00 -04:00 committed by GitHub
commit 59f3d063f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 418 additions and 362 deletions

File diff suppressed because it is too large Load Diff

View File

@ -26,7 +26,7 @@ dooyong_tilemap_device_base::dooyong_tilemap_device_base(
device_type type, device_type type,
char const *tag, char const *tag,
device_t *owner, device_t *owner,
uint32_t clock) u32 clock)
: device_t(mconfig, type, tag, owner, clock) : device_t(mconfig, type, tag, owner, clock)
, m_gfxdecode(*this, finder_base::DUMMY_TAG) , m_gfxdecode(*this, finder_base::DUMMY_TAG)
, m_gfxnum(0) , m_gfxnum(0)
@ -35,12 +35,12 @@ dooyong_tilemap_device_base::dooyong_tilemap_device_base(
{ {
} }
void dooyong_tilemap_device_base::draw(screen_device &screen, bitmap_ind16 &dest, rectangle const &cliprect, uint32_t flags, uint8_t priority) void dooyong_tilemap_device_base::draw(screen_device &screen, bitmap_ind16 &dest, rectangle const &cliprect, u32 flags, u8 priority, u8 priority_mask)
{ {
m_tilemap->draw(screen, dest, cliprect, flags, priority); m_tilemap->draw(screen, dest, cliprect, flags, priority, priority_mask);
} }
void dooyong_tilemap_device_base::set_palette_bank(uint16_t bank) void dooyong_tilemap_device_base::set_palette_bank(u16 bank)
{ {
if (bank != m_palette_bank) if (bank != m_palette_bank)
{ {
@ -49,8 +49,7 @@ void dooyong_tilemap_device_base::set_palette_bank(uint16_t bank)
} }
} }
dooyong_rom_tilemap_device::dooyong_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
dooyong_rom_tilemap_device::dooyong_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
: dooyong_rom_tilemap_device(mconfig, DOOYONG_ROM_TILEMAP, tag, owner, clock) : dooyong_rom_tilemap_device(mconfig, DOOYONG_ROM_TILEMAP, tag, owner, clock)
{ {
} }
@ -60,23 +59,21 @@ dooyong_rom_tilemap_device::dooyong_rom_tilemap_device(
device_type type, device_type type,
char const *tag, char const *tag,
device_t *owner, device_t *owner,
uint32_t clock) u32 clock)
: dooyong_tilemap_device_base(mconfig, type, tag, owner, clock) : dooyong_tilemap_device_base(mconfig, type, tag, owner, clock)
, m_rows(8) , m_rows(8)
, m_tilerom(*this, finder_base::DUMMY_TAG) , m_tilerom(*this, finder_base::DUMMY_TAG)
, m_tilerom_offset(0) , m_tilerom_offset(0)
, m_tilerom_length(~0U)
, m_transparent_pen(~0U) , m_transparent_pen(~0U)
, m_primella_code_mask(0x03ff)
, m_primella_color_mask(0x3c00)
, m_primella_color_shift(10)
, m_registers{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , m_registers{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
{ {
} }
WRITE8_MEMBER(dooyong_rom_tilemap_device::ctrl_w) void dooyong_rom_tilemap_device::ctrl_w(offs_t offset, u8 data)
{ {
offset &= 0x07U; offset &= 0x07U;
uint8_t const old = m_registers[offset]; const u8 old = m_registers[offset];
if (old != data) if (old != data)
{ {
m_registers[offset] = data; m_registers[offset] = data;
@ -111,6 +108,8 @@ void dooyong_rom_tilemap_device::device_start()
if (!m_gfxdecode->started()) if (!m_gfxdecode->started())
throw device_missing_dependencies(); throw device_missing_dependencies();
m_tmap_cb.bind_relative_to(*owner());
m_tilemap = &machine().tilemap().create( m_tilemap = &machine().tilemap().create(
*m_gfxdecode, *m_gfxdecode,
tilemap_get_info_delegate(FUNC(dooyong_rom_tilemap_device::tile_info), this), tilemap_get_info_delegate(FUNC(dooyong_rom_tilemap_device::tile_info), this),
@ -125,6 +124,9 @@ void dooyong_rom_tilemap_device::device_start()
if (0 > m_tilerom_offset) if (0 > m_tilerom_offset)
m_tilerom_offset = m_tilerom.length() + m_tilerom_offset; m_tilerom_offset = m_tilerom.length() + m_tilerom_offset;
if (m_tilerom_length < 0)
m_tilerom_length = m_tilerom.length();
std::fill(std::begin(m_registers), std::end(m_registers), 0U); std::fill(std::begin(m_registers), std::end(m_registers), 0U);
m_palette_bank = 0U; m_palette_bank = 0U;
@ -134,8 +136,9 @@ void dooyong_rom_tilemap_device::device_start()
TILE_GET_INFO_MEMBER(dooyong_rom_tilemap_device::tile_info) TILE_GET_INFO_MEMBER(dooyong_rom_tilemap_device::tile_info)
{ {
unsigned const attr = m_tilerom[m_tilerom_offset + adjust_tile_index(tile_index)]; const int tile_index_tile = adjust_tile_index(tile_index) & (m_tilerom_length - 1);
unsigned code, color, flags; const u16 attr = m_tilerom[m_tilerom_offset + tile_index_tile];
u32 code = 0, color = 0, flags;
if (BIT(m_registers[6], 5)) if (BIT(m_registers[6], 5))
{ // lastday/gulfstrm/pollux/flytiger { // lastday/gulfstrm/pollux/flytiger
// Tiles take one word in ROM: // Tiles take one word in ROM:
@ -146,13 +149,14 @@ TILE_GET_INFO_MEMBER(dooyong_rom_tilemap_device::tile_info)
// X = x flip // X = x flip
// Y = y flip // Y = y flip
code = (BIT(attr, 15) << 9) | (attr & 0x01ff); code = (BIT(attr, 15) << 9) | (attr & 0x01ff);
color = m_palette_bank | ((attr >> 11) & 0x0fU); color = (attr >> 11) & 0x0fU;
flags = TILE_FLIPYX((attr >> 9) & 0x03U); flags = TILE_FLIPYX((attr >> 9) & 0x03U);
} }
else else
{ // primella/popbingo { // bluehawk/primella/popbingo
// Tiles take one word in ROM: // Tiles take one word in ROM:
// MSB LSB // MSB LSB
// bluehawk YXCC CCcc cccc cccc (Y flip, X flip, bits 3-0 of color code, bits 9-0 of gfx code)
// primella YXCC CCcc cccc cccc (Y flip, X flip, bits 3-0 of color code, bits 9-0 of gfx code) // primella YXCC CCcc cccc cccc (Y flip, X flip, bits 3-0 of color code, bits 9-0 of gfx code)
// popbingo YX?? ?ccc cccc cccc (Y flip, X flip, bits 3-0 of color code, bits 10-0 of gfx code) // popbingo YX?? ?ccc cccc cccc (Y flip, X flip, bits 3-0 of color code, bits 10-0 of gfx code)
// rshark YX?c cccc cccc cccc (Y flip, X flip, bits 3-0 of color code, bits 12-0 of gfx code) // rshark YX?c cccc cccc cccc (Y flip, X flip, bits 3-0 of color code, bits 12-0 of gfx code)
@ -161,19 +165,27 @@ TILE_GET_INFO_MEMBER(dooyong_rom_tilemap_device::tile_info)
// X = x flip // X = x flip
// Y = y flip // Y = y flip
// ? = unused? // ? = unused?
color = m_palette_bank | ((attr & m_primella_color_mask) >> m_primella_color_shift); if (!m_tmap_cb.isnull())
flags = TILE_FLIPYX((attr >> 14) & 0x03U); m_tmap_cb(attr & 0x3fff, code, color);
code = attr & m_primella_code_mask; else // just mimic old driver behavior (default configuration)
{
code = attr & 0x3ff;
color = (attr & 0x3c00) >> 10;
} }
flags = TILE_FLIPYX((attr >> 14) & 0x03U);
}
color |= m_palette_bank;
tileinfo.set(m_gfxnum, code, color, flags); tileinfo.set(m_gfxnum, code, color, flags);
} }
rshark_rom_tilemap_device::rshark_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) rshark_rom_tilemap_device::rshark_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
: dooyong_rom_tilemap_device(mconfig, RSHARK_ROM_TILEMAP, tag, owner, clock) : dooyong_rom_tilemap_device(mconfig, RSHARK_ROM_TILEMAP, tag, owner, clock)
, m_colorrom(*this, finder_base::DUMMY_TAG) , m_colorrom(*this, finder_base::DUMMY_TAG)
, m_colorrom_offset(0) , m_colorrom_offset(0)
, m_colorrom_length(0)
{ {
m_rows = 32; m_rows = 32;
} }
@ -184,27 +196,31 @@ void rshark_rom_tilemap_device::device_start()
if (0 > m_colorrom_offset) if (0 > m_colorrom_offset)
m_colorrom_offset = m_colorrom.length() + m_colorrom_offset; m_colorrom_offset = m_colorrom.length() + m_colorrom_offset;
if (m_colorrom_length < 0)
m_colorrom_length = m_colorrom.length();
} }
TILE_GET_INFO_MEMBER(rshark_rom_tilemap_device::tile_info) TILE_GET_INFO_MEMBER(rshark_rom_tilemap_device::tile_info)
{ {
dooyong_rom_tilemap_device::tile_info(tilemap, tileinfo, tile_index); dooyong_rom_tilemap_device::tile_info(tilemap, tileinfo, tile_index);
uint8_t const color = m_colorrom[m_colorrom_offset + adjust_tile_index(tile_index)] & 0x0fU; const int tile_index_color = adjust_tile_index(tile_index) & (m_colorrom_length - 1);
const u16 color = m_palette_bank | (m_colorrom[m_colorrom_offset + tile_index_color] & 0x0fU);
tileinfo.palette_base = gfx().colorbase() + (gfx().granularity() * (color % gfx().colors())); tileinfo.palette_base = gfx().colorbase() + (gfx().granularity() * (color % gfx().colors()));
} }
dooyong_ram_tilemap_device::dooyong_ram_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) dooyong_ram_tilemap_device::dooyong_ram_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
: dooyong_tilemap_device_base(mconfig, DOOYONG_RAM_TILEMAP, tag, owner, clock) : dooyong_tilemap_device_base(mconfig, DOOYONG_RAM_TILEMAP, tag, owner, clock)
, m_tileram() , m_tileram()
{ {
} }
WRITE16_MEMBER(dooyong_ram_tilemap_device::tileram_w) void dooyong_ram_tilemap_device::tileram_w(offs_t offset, u16 data, u16 mem_mask)
{ {
offset &= (64U * 32U) - 1U; offset &= (64U * 32U) - 1U;
uint16_t value(m_tileram[offset]); u16 value(m_tileram[offset]);
COMBINE_DATA(&value); COMBINE_DATA(&value);
if (value != m_tileram[offset]) if (value != m_tileram[offset])
{ {
@ -228,7 +244,7 @@ void dooyong_ram_tilemap_device::device_start()
32); 32);
m_tilemap->set_transparent_pen(15); m_tilemap->set_transparent_pen(15);
m_tileram.reset(new uint16_t[64 * 32]); m_tileram.reset(new u16[64 * 32]);
std::fill(m_tileram.get(), m_tileram.get() + (64 * 32), 0U); std::fill(m_tileram.get(), m_tileram.get() + (64 * 32), 0U);
m_palette_bank = 0U; m_palette_bank = 0U;
@ -243,6 +259,6 @@ TILE_GET_INFO_MEMBER(dooyong_ram_tilemap_device::tile_info)
// CCCC cccc cccc cccc (bits 3-0 of color code, bits 11-0 of gfx code) // CCCC cccc cccc cccc (bits 3-0 of color code, bits 11-0 of gfx code)
// c = gfx code // c = gfx code
// C = color code // C = color code
unsigned const attr(m_tileram[tile_index]); const u16 attr(m_tileram[tile_index]);
tileinfo.set(m_gfxnum, attr & 0x0fffU, m_palette_bank | ((attr >> 12) & 0x0fU), 0); tileinfo.set(m_gfxnum, attr & 0x0fffU, m_palette_bank | ((attr >> 12) & 0x0fU), 0);
} }

View File

@ -18,9 +18,9 @@ public:
template <typename T> void set_gfxdecode_tag(T &&cpu_tag) { m_gfxdecode.set_tag(std::forward<T>(cpu_tag)); } template <typename T> void set_gfxdecode_tag(T &&cpu_tag) { m_gfxdecode.set_tag(std::forward<T>(cpu_tag)); }
void set_gfxnum(int gfxnum) { m_gfxnum = gfxnum; } void set_gfxnum(int gfxnum) { m_gfxnum = gfxnum; }
void draw(screen_device &screen, bitmap_ind16 &dest, rectangle const &cliprect, uint32_t flags, uint8_t priority); void draw(screen_device &screen, bitmap_ind16 &dest, rectangle const &cliprect, u32 flags, u8 priority, u8 priority_mask = 0xff);
void set_palette_bank(uint16_t bank); void set_palette_bank(u16 bank);
protected: protected:
dooyong_tilemap_device_base( dooyong_tilemap_device_base(
@ -28,7 +28,7 @@ protected:
device_type type, device_type type,
char const *tag, char const *tag,
device_t *owner, device_t *owner,
uint32_t clock); u32 clock);
gfx_element const &gfx() const { return *m_gfxdecode->gfx(m_gfxnum); } gfx_element const &gfx() const { return *m_gfxdecode->gfx(m_gfxnum); }
@ -36,35 +36,34 @@ protected:
int m_gfxnum; int m_gfxnum;
tilemap_t *m_tilemap; tilemap_t *m_tilemap;
uint16_t m_palette_bank; u16 m_palette_bank;
}; };
class dooyong_rom_tilemap_device : public dooyong_tilemap_device_base class dooyong_rom_tilemap_device : public dooyong_tilemap_device_base
{ {
public: public:
template <typename T, typename U> template <typename T, typename U>
dooyong_rom_tilemap_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&gfxdecode_tag, int gfxnum, U &&tilerom_tag, int tilerom_offset) dooyong_rom_tilemap_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&gfxdecode_tag, int gfxnum, U &&tilerom_tag, int tilerom_offset, int tilerom_length)
: dooyong_rom_tilemap_device(mconfig, tag, owner, 0) : dooyong_rom_tilemap_device(mconfig, tag, owner, 0)
{ {
set_gfxdecode_tag(std::forward<T>(gfxdecode_tag)); set_gfxdecode_tag(std::forward<T>(gfxdecode_tag));
set_gfxnum(gfxnum); set_gfxnum(gfxnum);
set_tilerom_tag(std::forward<U>(tilerom_tag)); set_tilerom_tag(std::forward<U>(tilerom_tag));
set_tilerom_offset(tilerom_offset); set_tilerom_offset(tilerom_offset);
set_tilerom_length(tilerom_length);
} }
dooyong_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); dooyong_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
template <typename U> void set_tilerom_tag(U &&tilerom_tag) { m_tilerom.set_tag(std::forward<U>(tilerom_tag)); } template <typename U> void set_tilerom_tag(U &&tilerom_tag) { m_tilerom.set_tag(std::forward<U>(tilerom_tag)); }
void set_tilerom_offset(int offset) { m_tilerom_offset = offset; } void set_tilerom_offset(int offset) { m_tilerom_offset = offset; }
void set_tilerom_length(int length) { m_tilerom_length = length; }
void set_transparent_pen(unsigned pen) { m_transparent_pen = pen; } void set_transparent_pen(unsigned pen) { m_transparent_pen = pen; }
void set_primella_code_bits(unsigned bits)
{
m_primella_code_mask = (1U << bits) - 1U;
m_primella_color_mask = ((1U << 14) - 1) & ~m_primella_code_mask;
m_primella_color_shift = bits;
}
DECLARE_WRITE8_MEMBER(ctrl_w); typedef device_delegate<void (u16 attr, u32 &code, u32 &color)> dooyong_tmap_cb_delegate;
void set_tile_callback(dooyong_tmap_cb_delegate cb) { m_tmap_cb = cb; }
void ctrl_w(offs_t offset, u8 data);
protected: protected:
dooyong_rom_tilemap_device( dooyong_rom_tilemap_device(
@ -72,7 +71,7 @@ protected:
device_type type, device_type type,
char const *tag, char const *tag,
device_t *owner, device_t *owner,
uint32_t clock); u32 clock);
virtual void device_start() override; virtual void device_start() override;
@ -84,36 +83,37 @@ protected:
int m_rows; int m_rows;
private: private:
required_region_ptr<uint16_t> m_tilerom; required_region_ptr<u16> m_tilerom;
int m_tilerom_offset; int m_tilerom_offset;
int m_tilerom_length;
unsigned m_transparent_pen; unsigned m_transparent_pen;
unsigned m_primella_code_mask;
unsigned m_primella_color_mask;
unsigned m_primella_color_shift;
uint8_t m_registers[0x10]; u8 m_registers[0x10];
dooyong_tmap_cb_delegate m_tmap_cb;
}; };
class rshark_rom_tilemap_device : public dooyong_rom_tilemap_device class rshark_rom_tilemap_device : public dooyong_rom_tilemap_device
{ {
public: public:
template <typename T, typename U, typename V> template <typename T, typename U, typename V>
rshark_rom_tilemap_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&gfxdecode_tag, int gfxnum, U &&tilerom_tag, int tilerom_offset, V &&colorrom_tag, int colorrom_offset) rshark_rom_tilemap_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&gfxdecode_tag, int gfxnum, U &&tilerom_tag, int tilerom_offset, int tilerom_length, V &&colorrom_tag, int colorrom_offset, int colorrom_length)
: rshark_rom_tilemap_device(mconfig, tag, owner, 0) : rshark_rom_tilemap_device(mconfig, tag, owner, 0)
{ {
set_gfxdecode_tag(std::forward<T>(gfxdecode_tag)); set_gfxdecode_tag(std::forward<T>(gfxdecode_tag));
set_gfxnum(gfxnum); set_gfxnum(gfxnum);
set_tilerom_tag(std::forward<U>(tilerom_tag)); set_tilerom_tag(std::forward<U>(tilerom_tag));
set_tilerom_offset(tilerom_offset); set_tilerom_offset(tilerom_offset);
set_tilerom_length(tilerom_length);
set_colorrom_tag(std::forward<V>(colorrom_tag)); set_colorrom_tag(std::forward<V>(colorrom_tag));
set_colorrom_offset(colorrom_offset); set_colorrom_offset(colorrom_offset);
set_primella_code_bits(13); set_colorrom_length(colorrom_length);
} }
rshark_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); rshark_rom_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
template <typename V> void set_colorrom_tag(V &&colorrom_tag) { m_colorrom.set_tag(std::forward<V>(colorrom_tag)); } template <typename V> void set_colorrom_tag(V &&colorrom_tag) { m_colorrom.set_tag(std::forward<V>(colorrom_tag)); }
void set_colorrom_offset(int offset) { m_colorrom_offset = offset; } void set_colorrom_offset(int offset) { m_colorrom_offset = offset; }
void set_colorrom_length(int length) { m_colorrom_length = length; }
protected: protected:
virtual void device_start() override; virtual void device_start() override;
@ -121,8 +121,9 @@ protected:
virtual TILE_GET_INFO_MEMBER(tile_info) override; virtual TILE_GET_INFO_MEMBER(tile_info) override;
private: private:
required_region_ptr<uint8_t> m_colorrom; required_region_ptr<u8> m_colorrom;
int m_colorrom_offset; int m_colorrom_offset;
int m_colorrom_length;
}; };
class dooyong_ram_tilemap_device : public dooyong_tilemap_device_base class dooyong_ram_tilemap_device : public dooyong_tilemap_device_base
@ -136,10 +137,10 @@ public:
set_gfxnum(gfxnum); set_gfxnum(gfxnum);
} }
dooyong_ram_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); dooyong_ram_tilemap_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
DECLARE_READ16_MEMBER(tileram_r) { return m_tileram[offset & ((64U * 32U) - 1)]; } u16 tileram_r(offs_t offset) { return m_tileram[offset & ((64U * 32U) - 1)]; }
DECLARE_WRITE16_MEMBER(tileram_w); void tileram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void set_scrolly(int value) { m_tilemap->set_scrolly(value); } void set_scrolly(int value) { m_tilemap->set_scrolly(value); }
protected: protected:
@ -148,7 +149,7 @@ protected:
private: private:
TILE_GET_INFO_MEMBER(tile_info); TILE_GET_INFO_MEMBER(tile_info);
std::unique_ptr<uint16_t[]> m_tileram; std::unique_ptr<u16[]> m_tileram;
}; };
#endif // MAME_VIDEO_DOOYONG_H #endif // MAME_VIDEO_DOOYONG_H