diff options
Diffstat (limited to 'src/devices/video/ims_cvc.h')
-rw-r--r-- | src/devices/video/ims_cvc.h | 89 |
1 files changed, 51 insertions, 38 deletions
diff --git a/src/devices/video/ims_cvc.h b/src/devices/video/ims_cvc.h index 82acfe5c6eb..dfe61f178c6 100644 --- a/src/devices/video/ims_cvc.h +++ b/src/devices/video/ims_cvc.h @@ -13,17 +13,17 @@ class ims_cvc_device , public device_palette_interface { public: - static constexpr feature_type imperfect_features() { return feature::GRAPHICS; } + static u32 const MASK24 = 0xffffffU; // configuration template <typename T> void set_screen(T &&tag) { m_screen.set_tag(std::forward<T>(tag)); } template <typename T> void set_vram(T &&tag) { m_vram.set_tag(std::forward<T>(tag)); } virtual void map(address_map &map) = 0; - virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) = 0; + virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect) = 0; protected: - ims_cvc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + ims_cvc_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); // device_t overrides virtual void device_start() override; @@ -32,39 +32,41 @@ protected: // device_palette_interface overrides virtual u32 palette_entries() const override { return 256; } - u32 colour_palette_r(const offs_t offset); - void colour_palette_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU); + virtual void boot_w(u32 data) { m_boot = data & MASK24; } + + // register read handlers u32 halfsync_r() { return m_halfsync; } - void halfsync_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_halfsync); } u32 backporch_r() { return m_backporch; } - void backporch_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_backporch); } u32 display_r() { return m_display; } - void display_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_display); } u32 shortdisplay_r() { return m_shortdisplay; } - void shortdisplay_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_shortdisplay); } u32 broadpulse_r() { return m_broadpulse; } - void broadpulse_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_broadpulse); } u32 vsync_r() { return m_vsync; } - void vsync_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vsync); } u32 vblank_r() { return m_vblank; } - void vblank_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vblank); } u32 vdisplay_r() { return m_vdisplay; } - void vdisplay_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vdisplay); } u32 linetime_r() { return m_linetime; } - void linetime_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_linetime); } - //u32 tos_r() { return m_tos; } - //void tos_w(const u32 data) { m_tos = data; } u32 meminit_r() { return m_meminit; } - void meminit_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_meminit); } u32 transferdelay_r() { return m_transferdelay; } - void transferdelay_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_transferdelay); } - u32 mask_r() { return m_mask; } - void mask_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_mask); } u32 tos_r() { return m_tos; } - void tos_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_tos); } - virtual void boot_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_boot); } + // register write handlers + void halfsync_w(u32 data) { m_halfsync = data & MASK24; } + void backporch_w(u32 data) { m_backporch = data & MASK24; } + void display_w(u32 data) { m_display = data & MASK24; } + void shortdisplay_w(u32 data) { m_shortdisplay = data & MASK24; } + void broadpulse_w(u32 data) { m_broadpulse = data & MASK24; } + void vsync_w(u32 data) { m_vsync = data & MASK24; } + void vblank_w(u32 data) { m_vblank = data & MASK24; } + void vdisplay_w(u32 data) { m_vdisplay = data & MASK24; } + void linetime_w(u32 data) { m_linetime = data & MASK24; } + void meminit_w(u32 data) { m_meminit = data & MASK24; } + void transferdelay_w(u32 data) { m_transferdelay = data & MASK24; } + void mask_w(u32 data) { m_mask = data & MASK24; } + void tos_w(u32 data) { m_tos = data & MASK24; } + + // colour palette handlers + u32 colour_palette_r(offs_t offset) { return u32(pen_color(offset >> 1)) & MASK24; } + void colour_palette_w(offs_t offset, u32 data) { set_pen_color(offset >> 1, data >> 16, data >> 8, data >> 0); } required_device<screen_device> m_screen; required_device<ram_device> m_vram; @@ -91,17 +93,17 @@ protected: class g300_device : public ims_cvc_device { public: - g300_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + g300_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); virtual void map(address_map &map) override; - virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; + virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect) override; protected: virtual void device_start() override; u32 control_r() { return m_control; } - void control_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_control); } + void control_w(u32 data) { m_control = data & MASK24; } private: u32 m_control; @@ -110,11 +112,11 @@ private: class g332_device : public ims_cvc_device { public: - g332_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + g332_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); virtual void map(address_map &map) override; - virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; + virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect) override; enum boot_mask : u32 { @@ -163,7 +165,7 @@ public: }; protected: - g332_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + g332_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); // device_t overrides virtual void device_add_mconfig(machine_config &config) override; @@ -175,21 +177,29 @@ protected: virtual void microport_map(address_map &map); - virtual void boot_w(offs_t offset, u32 data, u32 mem_mask = 0x00ffffffU) override; - - u32 cursor_palette_r(const offs_t offset); - void cursor_palette_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU); + virtual void boot_w(u32 data) override; + // register read handlers u32 vpreequalise_r() { return m_vpreequalise; } - void vpreequalise_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vpreequalise); } u32 vpostequalise_r() { return m_vpostequalise; } - void vpostequalise_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vpostequalise); } u32 linestart_r() { return m_linestart; } - void linestart_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_linestart); } u32 control_a_r() { return m_control_a; } - void control_a_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU); u32 control_b_r() { return m_control_b; } - void control_b_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_control_b); } + u32 cursor_start_r() { return m_cursor_start; } + + // register write handlers + void vpreequalise_w(u32 data) { m_vpreequalise = data & MASK24; } + void vpostequalise_w(u32 data) { m_vpostequalise = data & MASK24; } + void linestart_w(u32 data) { m_linestart = data & MASK24; } + void control_a_w(u32 data); + void control_b_w(u32 data) { m_control_b = data & MASK24; } + void cursor_start_w(u32 data) { m_cursor_start = data & MASK24; } + + // cursor handlers + u32 cursor_palette_r(offs_t offset) { return u32(pen_color(256 + (offset >> 1)))& MASK24; } + u32 cursor_store_r(offs_t offset) { return m_cursor_store[offset >> 1]; } + void cursor_palette_w(offs_t offset, u32 data) { set_pen_color(256 + (offset >> 1), data >> 16, data >> 8, data >> 0); } + void cursor_store_w(offs_t offset, u32 data) { m_cursor_store[offset >> 1] = u16(data); } private: required_device<address_map_bank_device> m_microport; @@ -199,12 +209,15 @@ private: u32 m_linestart; u32 m_control_a; u32 m_control_b; + u32 m_cursor_start; + + std::unique_ptr<u16[]> m_cursor_store; }; class g364_device : public g332_device { public: - g364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + g364_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); }; DECLARE_DEVICE_TYPE(G300, g300_device) |