summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video/bt459.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/video/bt459.h')
-rw-r--r--src/devices/video/bt459.h244
1 files changed, 244 insertions, 0 deletions
diff --git a/src/devices/video/bt459.h b/src/devices/video/bt459.h
new file mode 100644
index 00000000000..11c81cfc5b4
--- /dev/null
+++ b/src/devices/video/bt459.h
@@ -0,0 +1,244 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+#ifndef MAME_VIDEO_BT459_H
+#define MAME_VIDEO_BT459_H
+
+#pragma once
+
+class bt459_device : public device_t, public device_palette_interface
+{
+public:
+ bt459_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ static const u8 BT459_ID = 0x4a; // magic number found in the id register
+ static const u8 BT459_REV = 0xb0; // device revision B found in revision register
+
+ static const int BT459_PIXEL_COLORS = 256;
+ static const int BT459_OVERLAY_COLORS = 16;
+ static const int BT459_CURSOR_COLORS = 3;
+
+ enum control_input
+ {
+ ADDRESS_LO = 0x0,
+ ADDRESS_HI = 0x1,
+ REGISTERS = 0x2,
+ PALETTE = 0x3
+ };
+
+ enum address_mask
+ {
+ REG_OVERLAY_COLOR_0 = 0x0100,
+ REG_OVERLAY_COLOR_1 = 0x0101,
+ REG_OVERLAY_COLOR_2 = 0x0102,
+ REG_OVERLAY_COLOR_3 = 0x0103,
+ REG_OVERLAY_COLOR_4 = 0x0104,
+ REG_OVERLAY_COLOR_5 = 0x0105,
+ REG_OVERLAY_COLOR_6 = 0x0106,
+ REG_OVERLAY_COLOR_7 = 0x0107,
+ REG_OVERLAY_COLOR_8 = 0x0108,
+ REG_OVERLAY_COLOR_9 = 0x0109,
+ REG_OVERLAY_COLOR_10 = 0x010a,
+ REG_OVERLAY_COLOR_11 = 0x010b,
+ REG_OVERLAY_COLOR_12 = 0x010c,
+ REG_OVERLAY_COLOR_13 = 0x010d,
+ REG_OVERLAY_COLOR_14 = 0x010e,
+ REG_OVERLAY_COLOR_15 = 0x010f,
+
+ REG_CURSOR_COLOR_1 = 0x0181,
+ REG_CURSOR_COLOR_2 = 0x0182,
+ REG_CURSOR_COLOR_3 = 0x0183,
+
+ REG_ID = 0x0200,
+ REG_COMMAND_0 = 0x0201,
+ REG_COMMAND_1 = 0x0202,
+ REG_COMMAND_2 = 0x0203,
+ REG_PIXEL_READ_MASK = 0x0204,
+
+ REG_PIXEL_BLINK_MASK = 0x0206,
+
+ REG_OVERLAY_READ_MASK = 0x0208,
+ REG_OVERLAY_BLINK_MASK = 0x0209,
+ REG_INTERLEAVE = 0x020a,
+ REG_TEST = 0x020b,
+ REG_RED_SIGNATURE = 0x020c,
+ REG_GREEN_SIGNATURE = 0x020d,
+ REG_BLUE_SIGNATURE = 0x020e,
+
+ REG_REVISION = 0x0220,
+
+ REG_CURSOR_COMMAND = 0x0300,
+ REG_CURSOR_X_LO = 0x0301,
+ REG_CURSOR_X_HI = 0x0302,
+ REG_CURSOR_Y_LO = 0x0303,
+ REG_CURSOR_Y_HI = 0x0304,
+ REG_WINDOW_X_LO = 0x0305,
+ REG_WINDOW_X_HI = 0x0306,
+ REG_WINDOW_Y_LO = 0x0307,
+ REG_WINDOW_Y_HI = 0x0308,
+ REG_WINDOW_W_LO = 0x0309,
+ REG_WINDOW_W_HI = 0x030a,
+ REG_WINDOW_H_LO = 0x030b,
+ REG_WINDOW_H_HI = 0x030c,
+
+ CURSOR_RAM_START = 0x0400,
+ CURSOR_RAM_END = 0x07ff,
+ CURSOR_RAM_MASK = 0x03ff,
+
+ ADDRESS_LSB = 0x00ff,
+ ADDRESS_MSB = 0x0f00,
+ ADDRESS_MASK = 0x0fff
+ };
+
+ enum command_0_mask
+ {
+ CR0706 = 0xc0, // multiplex select
+ CR05 = 0x20, // overlay 0 enable
+ CR04 = 0x10, // reserved
+ CR0302 = 0x0c, // blink rate selection
+ CR0100 = 0x03 // block mode
+ };
+ enum cr0706_mask
+ {
+ CR0706_51MPX = 0xc0, // 5:1 multiplex
+ CR0706_11MPX = 0x80, // 1:1 multiplex
+ CR0706_41MPX = 0x40, // 4:1 multiplex
+ CR0706_RESERVED = 0x00 // reserved
+ };
+ enum cr0302_mask
+ {
+ CR0302_6464 = 0x0c, // 64 on 64 off, 50/50
+ CR0302_3232 = 0x08, // 32 on 32 off, 50/50
+ CR0302_1616 = 0x04, // 16 on 16 off, 50/50
+ CR0302_1648 = 0x00 // 16 on 48 off, 25/75
+ };
+ enum cr0100_mask
+ {
+ CR0100_1BPP = 0x03, // 1 bit per pixel
+ CR0100_2BPP = 0x02, // 2 bits per pixel
+ CR0100_4BPP = 0x01, // 4 bits per pixel
+ CR0100_8BPP = 0x00 // 8 bits per pixel
+ };
+
+ enum command_1_mask
+ {
+ CR1715 = 0xe0, // pan select
+ CR14 = 0x10, // reserved
+ CR1310 = 0x0f // zoom factor
+ };
+
+ enum command_2_mask
+ {
+ CR27 = 0x80, // sync enable
+ CR26 = 0x40, // pedestal enable
+ CR2524 = 0x30, // load palette RAM select
+ CR23 = 0x08, // PLL select
+ CR22 = 0x04, // X Windows overlay select
+ CR21 = 0x02, // X Windows cursor select
+ CR20 = 0x01 // test mode select
+ };
+ enum cr2524_mask
+ {
+ CR2524_BLUE = 0x30,
+ CR2524_GREEN = 0x20,
+ CR2524_RED = 0x10,
+ CR2524_NORMAL = 0x00
+ };
+
+ enum interleave_mask
+ {
+ CR3735 = 0xe0, // interleave select
+ CR3432 = 0x1c, // first pixel select
+ CR31 = 0x02, // overlay interleave enable
+ CR30 = 0x01 // underlay enable
+ };
+ enum cr3735_mask
+ {
+ CR3735_4PIX = 0x80, // 4 pixels
+ CR3735_3PIX = 0x60, // 3 pixels
+ CR3735_2PIX = 0x40, // 2 pixels
+ CR3735_1PIX = 0x20, // 1 pixel
+ CR3735_0PIX = 0x00 // 0 pixels
+ };
+ enum cr3432_mask
+ {
+ CR3432_PIX_E = 0x10, // pixel E
+ CR3432_PIX_D = 0x0c, // pixel D
+ CR3432_PIX_C = 0x08, // pixel C
+ CR3432_PIX_B = 0x04, // pixel B
+ CR3432_PIX_A = 0x00 // pixel A
+ };
+
+ enum cursor_command_mask
+ {
+ CR47 = 0x80, // 64x64 cursor plane 1 enable
+ CR46 = 0x40, // 64x64 cursor plane 0 enable
+ CR45 = 0x20, // cross hair plane 1 enable
+ CR44 = 0x10, // cross hair plane 0 enable
+ CR43 = 0x08, // cursor format
+ CR4241 = 0x06, // cross hair thickness
+ CR40 = 0x01 // cursor blink enable
+ };
+
+ enum cr4241_mask
+ {
+ CR4241_1PIX = 0x00, // cross hair thickness 1 pixel
+ CR4241_3PIX = 0x02, // cross hair thickness 3 pixels
+ CR4241_5PIX = 0x04, // cross hair thickness 5 pixels
+ CR4241_7PIX = 0x06 // cross hair thickness 7 pixels
+ };
+
+ DECLARE_READ8_MEMBER(read);
+ DECLARE_WRITE8_MEMBER(write);
+
+ void screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u8 *pixel_data);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual u32 palette_entries() const override { return BT459_PIXEL_COLORS + BT459_OVERLAY_COLORS + BT459_CURSOR_COLORS; }
+
+private:
+ // helper functions
+ u8 get_component(rgb_t *arr, int index);
+ void set_component(rgb_t *arr, int index, u8 data);
+ u32 get_rgb(u8 data) const { return m_palette_ram[data & m_pixel_read_mask]; }
+
+ // device state in memory map order
+ u16 m_address;
+ int m_address_rgb;
+
+ rgb_t m_overlay_color[BT459_OVERLAY_COLORS];
+ rgb_t m_cursor_color[BT459_CURSOR_COLORS];
+
+ // registers
+ const u8 m_id = BT459_ID;
+ u8 m_command_0;
+ u8 m_command_1;
+ u8 m_command_2;
+ u8 m_pixel_read_mask;
+ u8 m_pixel_blink_mask;
+ u8 m_overlay_read_mask;
+ u8 m_overlay_blink_mask;
+ u8 m_interleave;
+ u8 m_test;
+ u8 m_red_signature;
+ u8 m_green_signature;
+ u8 m_blue_signature;
+ const u8 m_revision = BT459_REV;
+ u8 m_cursor_command;
+
+ u16 m_cursor_x;
+ u16 m_cursor_y;
+ u16 m_window_x;
+ u16 m_window_y;
+ u16 m_window_w;
+ u16 m_window_h;
+
+ u8 m_cursor_ram[1024];
+ rgb_t m_palette_ram[BT459_PIXEL_COLORS];
+};
+
+DECLARE_DEVICE_TYPE(BT459, bt459_device)
+
+#endif // MAME_VIDEO_BT459_H