summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video/bt450.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/video/bt450.cpp')
-rw-r--r--src/devices/video/bt450.cpp99
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++;
+}