diff options
Diffstat (limited to 'src/devices/video/bt450.cpp')
-rw-r--r-- | src/devices/video/bt450.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/devices/video/bt450.cpp b/src/devices/video/bt450.cpp new file mode 100644 index 00000000000..5cb922de923 --- /dev/null +++ b/src/devices/video/bt450.cpp @@ -0,0 +1,99 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +/* + * Brooktree Bt450 66MHz Monolithic CMOS 16x12 Color Palette RAMDAC + * + * Sources: + * - Product Databook 1991, Brooktree Corporation + * + */ + +#include "emu.h" +#include "bt450.h" + +#define LOG_READS (1U << 1) +#define LOG_WRITES (1U << 2) + +#define VERBOSE (LOG_WRITES) + +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(BT450, bt450_device, "bt450", "Brooktree Bt450 16x12 Color RAMDAC") + +bt450_device::bt450_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : device_t(mconfig, BT450, tag, owner, clock) + , device_palette_interface(mconfig, *this) + , m_address(0) + , m_address_rgb(0) + , m_color_ram(nullptr) +{ +} + +void bt450_device::device_start() +{ + m_color_ram = std::make_unique<std::array<u8, 3>[]>(palette_entries()); + + save_item(NAME(m_address)); + save_item(NAME(m_address_rgb)); + + save_pointer(NAME(m_color_ram), palette_entries()); +} + +u8 bt450_device::address_r() +{ + LOGMASKED(LOG_READS, "address_r 0x%02x (%s)\n", m_address, machine().describe_context()); + + if (!machine().side_effects_disabled()) + m_address_rgb = 0; + + return m_address; + +} + +void bt450_device::address_w(u8 data) +{ + LOGMASKED(LOG_WRITES, "address_w 0x%02x (%s)\n", data, machine().describe_context()); + + m_address_rgb = 0; + m_address = data; +} + +u8 bt450_device::palette_r(address_space &space) +{ + u8 const data = (m_address < palette_entries()) ? m_color_ram[m_address][m_address_rgb] : space.unmap(); + + LOGMASKED(LOG_READS, "palette_r 0x%02x (%s)\n", data, machine().describe_context()); + + if (!machine().side_effects_disabled()) + { + // increment component index and address register + m_address_rgb = (m_address_rgb + 1) % 3; + if (m_address_rgb == 0) + m_address++; + } + + return data; +} + +void bt450_device::palette_w(u8 data) +{ + LOGMASKED(LOG_WRITES, "palette_w 0x%02x (%s)\n", data, machine().describe_context()); + + if (m_address < palette_entries()) + { + m_color_ram[m_address][m_address_rgb] = data & 0x0f; + + // update the mame palette to match the device + if (m_address_rgb == 2) + set_pen_color(m_address, rgb_t( + m_color_ram[m_address][0] << 4, + m_color_ram[m_address][1] << 4, + m_color_ram[m_address][2] << 4)); + } + + // increment component index and address register + m_address_rgb = (m_address_rgb + 1) % 3; + if (m_address_rgb == 0) + m_address++; +} |