blob: 30296e2967d3820930bb4906baae9c19c283fa7e (
plain) (
tree)
|
|
// license:BSD-3-Clause
// copyright-holders:Bryan McPhail
/***************************************************************************
decrmc3.h
Data East custom palette device.
****************************************************************************
Data East RM-C3 is a custom resistor pack used to convert a digital
palette to an analog output. The conversion is non-linear with high bits
weighted a little more than low bits compared to linear.
******************************************************************************/
#ifndef MAME_VIDEO_DECORMC3_H
#define MAME_VIDEO_DECORMC3_H
#pragma once
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// device type definition
DECLARE_DEVICE_TYPE(DECO_RMC3, deco_rmc3_device)
typedef device_delegate<void (deco_rmc3_device &)> deco_rmc3_palette_init_delegate;
class deco_rmc3_device : public device_t, public device_palette_interface
{
public:
// construction/destruction
deco_rmc3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, u32 entries)
: deco_rmc3_device(mconfig, tag, owner, clock)
{
set_entries(entries);
}
deco_rmc3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// configuration
template <typename... T> void set_init(T &&... args) { m_init.set(std::forward<T>(args)...); }
// void set_membits(int membits);
// void set_endianness(endianness_t endianness);
void set_entries(u32 entries) { m_entries = entries; }
void set_indirect_entries(u32 entries) { m_indirect_entries = entries; }
void set_prom_region(const char *region) { m_prom_region.set_tag(region); }
template <typename T> void set_prom_region(T &&tag) { m_prom_region.set_tag(std::forward<T>(tag)); }
// palette RAM accessors
memory_array &basemem() { return m_paletteram; }
memory_array &extmem() { return m_paletteram_ext; }
// raw entry reading
u32 read_entry(pen_t pen) const
{
u32 data = m_paletteram.read(pen);
if (m_paletteram_ext.base() != nullptr)
data |= m_paletteram_ext.read(pen) << (8 * m_paletteram.bytes_per_entry());
return data;
}
// generic read/write handlers
DECLARE_READ8_MEMBER(read8);
DECLARE_WRITE8_MEMBER(write8);
DECLARE_WRITE8_MEMBER(write8_ext);
DECLARE_WRITE8_MEMBER(write_indirect);
DECLARE_WRITE8_MEMBER(write_indirect_ext);
DECLARE_READ16_MEMBER(read16);
DECLARE_WRITE16_MEMBER(write16);
DECLARE_WRITE16_MEMBER(write16_ext);
DECLARE_READ32_MEMBER(read32);
DECLARE_WRITE32_MEMBER(write32);
void palette_init_proms(deco_rmc3_device &palette);
// helper to update palette when data changed
void update() { if (!m_init.isnull()) m_init(*this); }
protected:
// device-level overrides
virtual void device_start() override;
// device_palette_interface overrides
virtual u32 palette_entries() const override { return m_entries; }
virtual u32 palette_indirect_entries() const override { return m_indirect_entries; }
private:
void update_for_write(offs_t byte_offset, int bytes_modified, bool indirect = false);
rgb_t deco_rgb_decoder(u32 raw);
// configuration state
u32 m_entries; // number of entries in the palette
u32 m_indirect_entries; // number of indirect colors in the palette
// bool m_enable_shadows; // are shadows enabled?
// bool m_enable_hilights; // are hilights enabled?
// int m_membits; // width of palette RAM, if different from native
// bool m_membits_supplied; // true if membits forced in static config
// endianness_t m_endianness; // endianness of palette RAM, if different from native
// bool m_endianness_supplied; // true if endianness forced in static config
optional_memory_region m_prom_region; // region where the color PROMs are
deco_rmc3_palette_init_delegate m_init;
// palette RAM
memory_array m_paletteram; // base memory
memory_array m_paletteram_ext; // extended memory
};
#endif // MAME_VIDEO_DECORMC3_H
|