summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/sunplus_gcm394_video.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/sunplus_gcm394_video.h')
-rw-r--r--src/devices/machine/sunplus_gcm394_video.h201
1 files changed, 201 insertions, 0 deletions
diff --git a/src/devices/machine/sunplus_gcm394_video.h b/src/devices/machine/sunplus_gcm394_video.h
new file mode 100644
index 00000000000..05a703f9f47
--- /dev/null
+++ b/src/devices/machine/sunplus_gcm394_video.h
@@ -0,0 +1,201 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+/*****************************************************************************
+
+ SunPlus GCM394-series SoC peripheral emulation (Video)
+
+**********************************************************************/
+
+#ifndef MAME_MACHINE_GCM394_VIDEO_H
+#define MAME_MACHINE_GCM394_VIDEO_H
+
+#pragma once
+
+#include "cpu/unsp/unsp.h"
+#include "screen.h"
+
+class gcm394_base_video_device : public device_t
+{
+public:
+ gcm394_base_video_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ DECLARE_WRITE_LINE_MEMBER(vblank);
+
+// DECLARE_READ16_MEMBER(video_r);
+// DECLARE_WRITE16_MEMBER(video_w);
+
+ void write_tmap_regs(int tmap, uint16_t* regs, int offset, uint16_t data);
+
+ DECLARE_READ16_MEMBER(tmap0_regs_r);
+ DECLARE_WRITE16_MEMBER(tmap0_regs_w);
+ DECLARE_WRITE16_MEMBER(tmap0_unk0_w);
+ DECLARE_WRITE16_MEMBER(tmap0_unk1_w);
+
+ DECLARE_READ16_MEMBER(tmap1_regs_r);
+ DECLARE_WRITE16_MEMBER(tmap1_regs_w);
+ DECLARE_WRITE16_MEMBER(tmap1_unk0_w);
+ DECLARE_WRITE16_MEMBER(tmap1_unk1_w);
+
+ DECLARE_WRITE16_MEMBER(unknown_video_device0_regs_w);
+ DECLARE_WRITE16_MEMBER(unknown_video_device0_unk0_w);
+ DECLARE_WRITE16_MEMBER(unknown_video_device0_unk1_w);
+
+ DECLARE_WRITE16_MEMBER(unknown_video_device1_regs_w);
+ DECLARE_WRITE16_MEMBER(unknown_video_device1_unk0_w);
+ DECLARE_WRITE16_MEMBER(unknown_video_device1_unk1_w);
+
+ DECLARE_WRITE16_MEMBER(unknown_video_device2_unk0_w);
+ DECLARE_WRITE16_MEMBER(unknown_video_device2_unk1_w);
+ DECLARE_WRITE16_MEMBER(unknown_video_device2_unk2_w);
+
+ DECLARE_WRITE16_MEMBER(video_dma_source_w);
+ DECLARE_WRITE16_MEMBER(video_dma_dest_w);
+ DECLARE_READ16_MEMBER(video_dma_size_r);
+ DECLARE_WRITE16_MEMBER(video_dma_size_w);
+ DECLARE_WRITE16_MEMBER(video_dma_unk_w);
+
+ DECLARE_READ16_MEMBER(video_703a_r);
+ DECLARE_WRITE16_MEMBER(video_703a_w);
+
+ DECLARE_READ16_MEMBER(video_7062_r);
+ DECLARE_WRITE16_MEMBER(video_7062_w);
+
+ DECLARE_WRITE16_MEMBER(video_7063_w);
+
+ DECLARE_WRITE16_MEMBER(video_702a_w);
+ DECLARE_READ16_MEMBER(video_7030_r);
+ DECLARE_WRITE16_MEMBER(video_7030_w);
+ DECLARE_WRITE16_MEMBER(video_703c_w);
+
+
+ DECLARE_READ16_MEMBER(video_707f_r);
+ DECLARE_WRITE16_MEMBER(video_707f_w);
+
+ DECLARE_WRITE16_MEMBER(video_7080_w);
+ DECLARE_WRITE16_MEMBER(video_7081_w);
+ DECLARE_WRITE16_MEMBER(video_7082_w);
+ DECLARE_WRITE16_MEMBER(video_7083_w);
+ DECLARE_WRITE16_MEMBER(video_7084_w);
+ DECLARE_WRITE16_MEMBER(video_7085_w);
+ DECLARE_WRITE16_MEMBER(video_7086_w);
+ DECLARE_WRITE16_MEMBER(video_7087_w);
+ DECLARE_WRITE16_MEMBER(video_7088_w);
+
+ DECLARE_READ16_MEMBER(video_7083_r);
+
+
+ auto write_video_irq_callback() { return m_video_irq_cb.bind(); };
+
+protected:
+
+ enum
+ {
+ PAGE_ENABLE_MASK = 0x0008,
+ PAGE_WALLPAPER_MASK = 0x0004,
+
+ SPRITE_ENABLE_MASK = 0x0001,
+ SPRITE_COORD_TL_MASK = 0x0002,
+
+ PAGE_PRIORITY_FLAG_MASK = 0x3000,
+ PAGE_PRIORITY_FLAG_SHIFT = 12,
+ PAGE_TILE_HEIGHT_MASK = 0x00c0,
+ PAGE_TILE_HEIGHT_SHIFT = 6,
+ PAGE_TILE_WIDTH_MASK = 0x0030,
+ PAGE_TILE_WIDTH_SHIFT = 4,
+ TILE_X_FLIP = 0x0004,
+ TILE_Y_FLIP = 0x0008
+ };
+
+
+ inline void check_video_irq();
+
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ enum blend_enable_t : bool
+ {
+ BlendOff = false,
+ BlendOn = true
+ };
+
+ enum rowscroll_enable_t : bool
+ {
+ RowScrollOff = false,
+ RowScrollOn = true
+ };
+
+ enum flipx_t : bool
+ {
+ FlipXOff = false,
+ FlipXOn = true
+ };
+
+ template<blend_enable_t Blend, rowscroll_enable_t RowScroll, flipx_t FlipX>
+ void draw(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t bitmap_addr, uint16_t tile, int32_t h, int32_t w, uint8_t bpp, uint32_t yflipmask, uint32_t palette_offset);
+ void draw_page(const rectangle &cliprect, uint32_t scanline, int priority, uint32_t bitmap_addr, uint16_t *regs);
+
+ uint32_t m_screenbuf[320 * 240];
+ uint8_t m_rgb5_to_rgb8[32];
+ uint32_t m_rgb555_to_rgb888[0x8000];
+
+ required_device<unsp_device> m_cpu;
+ required_device<screen_device> m_screen;
+// required_shared_ptr<uint16_t> m_scrollram;
+ required_shared_ptr<uint16_t> m_paletteram;
+// required_shared_ptr<uint16_t> m_spriteram;
+
+ uint16_t m_page1_addr;
+ uint16_t m_page2_addr;
+
+
+ devcb_write_line m_video_irq_cb;
+
+
+ // video 70xx
+ uint16_t m_tmap0_regs[0x6];
+ uint16_t m_tmap1_regs[0x6];
+
+ uint16_t m_707f;
+ uint16_t m_703a;
+ uint16_t m_7062;
+ uint16_t m_7063;
+
+ uint16_t m_702a;
+ uint16_t m_7030;
+ uint16_t m_703c;
+
+
+ uint16_t m_7080;
+ uint16_t m_7081;
+ uint16_t m_7082;
+ uint16_t m_7083;
+ uint16_t m_7084;
+ uint16_t m_7085;
+ uint16_t m_7086;
+ uint16_t m_7087;
+ uint16_t m_7088;
+
+ uint16_t m_video_irq_status;
+
+ uint16_t read_data(uint32_t offset);
+};
+
+class gcm394_video_device : public gcm394_base_video_device
+{
+public:
+ template <typename T, typename U>
+ gcm394_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
+ : gcm394_video_device(mconfig, tag, owner, clock)
+ {
+ m_cpu.set_tag(std::forward<T>(cpu_tag));
+ m_screen.set_tag(std::forward<U>(screen_tag));
+ }
+
+ gcm394_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+DECLARE_DEVICE_TYPE(GCM394_VIDEO, gcm394_video_device)
+
+#endif // MAME_MACHINE_GCM394_VIDEO_H