1 // license:BSD-3-Clause 2 // copyright-holders:Patrick Mackinlay 3 #ifndef MAME_VIDEO_BT45X_H 4 #define MAME_VIDEO_BT45X_H 5 6 #pragma once 7 8 class bt45x_device_base : public device_t 9 { 10 public: 11 enum address_mask : u8 12 { 13 REG_READ_MASK = 0x04, 14 REG_BLINK_MASK = 0x05, 15 REG_COMMAND = 0x06, 16 REG_CONTROL = 0x07 17 }; 18 enum command_mask : u8 19 { 20 CR7 = 0x80, // multiplex select 21 CR6 = 0x40, // ram enable 22 CR54 = 0x30, // blink rate selection 23 CR3 = 0x08, // OL1 blink enable 24 CR2 = 0x04, // OL0 blink enable 25 CR1 = 0x02, // OL1 display enable 26 CR0 = 0x01, // OL0 display enable 27 }; 28 enum control_mask : u8 29 { 30 D3 = 0x08, // low nibble 31 D2 = 0x04, // blue channel enable 32 D1 = 0x02, // green channel enable 33 D0 = 0x01, // red channel enable 34 35 RGB = 0x07 // rgb mode enable 36 }; 37 enum cr54_mask : u8 38 { 39 CR54_6464 = 0x30, // 64 on 64 off, 50/50 40 CR54_3232 = 0x20, // 32 on 32 off, 50/50 41 CR54_1616 = 0x10, // 16 on 16 off, 50/50 42 CR54_1648 = 0x00 // 16 on 48 off, 25/75 43 }; 44 45 virtual void map(address_map &map); 46 47 protected: 48 bt45x_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const u32 palette_colors, const u32 overlay_colors); 49 50 virtual void device_start() override; 51 virtual void device_reset() override; 52 53 u8 address_r(); 54 void address_w(u8 data); 55 virtual u8 palette_r(address_space &space) = 0; 56 virtual void palette_w(u8 data) = 0; 57 u8 register_r(address_space &space); 58 void register_w(u8 data); 59 virtual u8 overlay_r(address_space &space) = 0; 60 virtual void overlay_w(u8 data) = 0; 61 62 // helpers 63 virtual void increment_address(const bool side_effects = false); get_mask()64 virtual u8 get_mask() const { return m_palette_colors - 1; } 65 66 // device state 67 u8 m_address; 68 u8 m_address_rgb; 69 u8 m_read_mask; 70 u8 m_blink_mask; 71 u8 m_command; 72 u8 m_control; 73 74 // internal state 75 const u32 m_palette_colors; 76 const u32 m_overlay_colors; 77 u64 m_blink_start; 78 }; 79 80 class bt45x_rgb_device_base : public bt45x_device_base, public device_palette_interface 81 { 82 protected: 83 bt45x_rgb_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const u32 palette_colors, const u32 overlay_colors); 84 85 virtual void device_start() override; 86 palette_entries()87 virtual u32 palette_entries() const override { return m_palette_colors + m_overlay_colors; } 88 89 virtual u8 palette_r(address_space &space) override; 90 virtual void palette_w(u8 data) override; 91 virtual u8 overlay_r(address_space &space) override; 92 virtual void overlay_w(u8 data) override; 93 94 std::unique_ptr<std::array<u8, 3>[]> m_color_ram; 95 }; 96 97 class bt45x_mono_device_base : public bt45x_device_base 98 { 99 public: 100 // helper instead of device_palette_interface 101 u8 lookup(u8 pixel, u8 overlay = 0) const 102 { 103 if (overlay & 3) 104 return m_color_ram[m_palette_colors + (overlay & (m_command & (CR1|CR0)))]; 105 else 106 return (m_command & CR6) ? m_color_ram[pixel & m_read_mask] : m_color_ram[m_palette_colors + 0]; 107 } 108 109 protected: 110 bt45x_mono_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const u32 palette_colors, const u32 overlay_colors); 111 112 virtual void device_start() override; 113 114 virtual u8 palette_r(address_space &space) override; 115 virtual void palette_w(u8 data) override; 116 virtual u8 overlay_r(address_space &space) override; 117 virtual void overlay_w(u8 data) override; 118 119 std::unique_ptr<u8[]> m_color_ram; 120 }; 121 122 class bt451_device : public bt45x_rgb_device_base 123 { 124 public: 125 bt451_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 126 127 protected: 128 /* 129 * The Bt451 is different in having an 8 bit data bus, but 4 bit DACs. The 130 * lower 4 bits are masked off when reading or writing colour data. 131 */ get_mask()132 virtual u8 get_mask() const override { return 0xf0; } 133 }; 134 135 class bt453_device : public bt45x_rgb_device_base 136 { 137 public: 138 bt453_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 139 140 virtual void map(address_map &map) override; 141 }; 142 143 class bt454_device : public bt45x_rgb_device_base 144 { 145 public: 146 bt454_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 147 148 virtual void map(address_map &map) override; 149 }; 150 151 class bt455_device : public bt45x_mono_device_base 152 { 153 public: 154 bt455_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 155 156 virtual void map(address_map &map) override; 157 }; 158 159 class bt457_device : public bt45x_mono_device_base 160 { 161 public: 162 bt457_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 163 164 protected: 165 virtual u8 palette_r(address_space &space) override; 166 virtual void palette_w(u8 data) override; 167 virtual u8 overlay_r(address_space &space) override; 168 virtual void overlay_w(u8 data) override; 169 170 virtual void increment_address(const bool side_effects = false) override; 171 }; 172 173 class bt458_device : public bt45x_rgb_device_base 174 { 175 public: 176 bt458_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 177 178 protected: 179 bt458_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 180 }; 181 182 class bt467_device : public bt458_device 183 { 184 public: 185 bt467_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 186 }; 187 188 DECLARE_DEVICE_TYPE(BT451, bt451_device) 189 DECLARE_DEVICE_TYPE(BT453, bt453_device) 190 DECLARE_DEVICE_TYPE(BT454, bt454_device) 191 DECLARE_DEVICE_TYPE(BT455, bt455_device) 192 DECLARE_DEVICE_TYPE(BT457, bt457_device) 193 DECLARE_DEVICE_TYPE(BT458, bt458_device) 194 DECLARE_DEVICE_TYPE(BT467, bt467_device) 195 196 #endif // MAME_VIDEO_BT45X_H 197