1 // license:BSD-3-Clause 2 // copyright-holders:Ryan Holtz, David Haywood 3 /***************************************************************************** 4 5 SunPlus GCM394-series SoC peripheral emulation (Video) 6 7 **********************************************************************/ 8 9 #ifndef MAME_MACHINE_GENERALPLUS_GPL16250SOC_VIDEO_H 10 #define MAME_MACHINE_GENERALPLUS_GPL16250SOC_VIDEO_H 11 12 #pragma once 13 14 #include "spg_renderer.h" 15 #include "cpu/unsp/unsp.h" 16 #include "screen.h" 17 #include "emupal.h" 18 19 class gcm394_base_video_device : public device_t, public device_video_interface 20 { 21 public: 22 gcm394_base_video_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 23 24 uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 25 DECLARE_WRITE_LINE_MEMBER(vblank); 26 space_read_callback()27 auto space_read_callback() { return m_space_read_cb.bind(); } 28 29 void write_tmap_scroll(int tmap, uint16_t* regs, int offset, uint16_t data); 30 void write_tmap_extrascroll(int tmap, uint16_t* regs, int offset, uint16_t data); 31 32 void write_tmap_regs(int tmap, uint16_t* regs, int offset, uint16_t data); 33 34 //void set_paldisplaybank_high(int pal_displaybank_high) { m_pal_displaybank_high = pal_displaybank_high; } set_alt_tile_addressing(int alt_tile_addressing)35 void set_alt_tile_addressing(int alt_tile_addressing) { m_alt_tile_addressing = alt_tile_addressing; } set_alt_extrasprite(int alt_extrasprite_hack)36 void set_alt_extrasprite(int alt_extrasprite_hack) { m_alt_extrasprite_hack = alt_extrasprite_hack; } 37 38 set_video_spaces(address_space & cpuspace,address_space & cs_space,int csbase)39 void set_video_spaces(address_space& cpuspace, address_space& cs_space, int csbase) { m_cpuspace = &cpuspace; m_cs_space = &cs_space; m_csbase = csbase; } 40 41 //void set_pal_sprites(int pal_sprites) { m_pal_sprites = pal_sprites; } 42 //void set_pal_back(int pal_back) { m_pal_back = pal_back; } 43 44 uint16_t tmap0_regs_r(offs_t offset); 45 void tmap0_regs_w(offs_t offset, uint16_t data); 46 uint16_t tmap0_tilebase_lsb_r(); 47 uint16_t tmap0_tilebase_msb_r(); 48 void tmap0_tilebase_lsb_w(uint16_t data); 49 void tmap0_tilebase_msb_w(uint16_t data); 50 51 uint16_t tmap1_regs_r(offs_t offset); 52 void tmap1_regs_w(offs_t offset, uint16_t data); 53 uint16_t tmap1_tilebase_lsb_r(); 54 uint16_t tmap1_tilebase_msb_r(); 55 void tmap1_tilebase_lsb_w(uint16_t data); 56 void tmap1_tilebase_msb_w(uint16_t data); 57 58 uint16_t tmap2_regs_r(offs_t offset); 59 void tmap2_regs_w(offs_t offset, uint16_t data); 60 uint16_t tmap2_tilebase_lsb_r(); 61 uint16_t tmap2_tilebase_msb_r(); 62 void tmap2_tilebase_lsb_w(uint16_t data); 63 void tmap2_tilebase_msb_w(uint16_t data); 64 65 uint16_t tmap3_regs_r(offs_t offset); 66 void tmap3_regs_w(offs_t offset, uint16_t data); 67 uint16_t tmap3_tilebase_lsb_r(); 68 uint16_t tmap3_tilebase_msb_r(); 69 void tmap3_tilebase_lsb_w(uint16_t data); 70 void tmap3_tilebase_msb_w(uint16_t data); 71 72 void video_701c_w(uint16_t data); 73 void video_701d_w(uint16_t data); 74 void video_701e_w(uint16_t data); 75 76 uint16_t sprite_7022_gfxbase_lsb_r(); 77 uint16_t sprite_702d_gfxbase_msb_r(); 78 79 void sprite_7022_gfxbase_lsb_w(uint16_t data); 80 void sprite_702d_gfxbase_msb_w(uint16_t data); 81 uint16_t sprite_7042_extra_r(); 82 void sprite_7042_extra_w(uint16_t data); 83 84 void video_dma_source_w(uint16_t data); 85 void video_dma_dest_w(uint16_t data); 86 uint16_t video_dma_size_busy_r(); 87 void video_dma_size_trigger_w(address_space &space, uint16_t data); 88 void video_707e_spritebank_w(uint16_t data); 89 90 uint16_t video_703a_palettebank_r(); 91 void video_703a_palettebank_w(uint16_t data); 92 93 void update_raster_split_position(); 94 void split_irq_xpos_w(uint16_t data); 95 void split_irq_ypos_w(uint16_t data); 96 97 uint16_t videoirq_source_enable_r(); 98 void videoirq_source_enable_w(uint16_t data); 99 100 uint16_t video_7063_videoirq_source_r(); 101 void video_7063_videoirq_source_ack_w(uint16_t data); 102 103 void video_702a_w(uint16_t data); 104 uint16_t video_7030_brightness_r(); 105 void video_7030_brightness_w(uint16_t data); 106 uint16_t video_curline_r(); 107 108 uint16_t video_703c_tvcontrol1_r(); 109 void video_703c_tvcontrol1_w(uint16_t data); 110 111 uint16_t video_707c_r(); 112 113 uint16_t video_707f_r(); 114 void video_707f_w(uint16_t data); 115 116 void video_7080_w(uint16_t data); 117 void video_7081_w(uint16_t data); 118 void video_7082_w(uint16_t data); 119 void video_7083_w(uint16_t data); 120 void video_7084_w(uint16_t data); 121 void video_7085_w(uint16_t data); 122 void video_7086_w(uint16_t data); 123 void video_7087_w(uint16_t data); 124 void video_7088_w(uint16_t data); 125 126 uint16_t video_7083_r(); 127 128 uint16_t palette_r(offs_t offset); 129 void palette_w(offs_t offset, uint16_t data); 130 131 void spriteram_w(offs_t offset, uint16_t data); 132 uint16_t spriteram_r(offs_t offset); 133 134 uint16_t video_7051_r(); 135 uint16_t video_70e0_r(); 136 write_video_irq_callback()137 auto write_video_irq_callback() { return m_video_irq_cb.bind(); }; 138 139 virtual void device_add_mconfig(machine_config& config) override; 140 141 protected: 142 143 static const device_timer_id TIMER_SCREENPOS = 2; 144 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 145 146 inline void check_video_irq(); 147 148 149 virtual void device_start() override; 150 virtual void device_reset() override; 151 152 required_device<unsp_device> m_cpu; 153 required_device<screen_device> m_screen; 154 155 uint16_t m_page0_addr_lsb; 156 uint16_t m_page0_addr_msb; 157 158 uint16_t m_page1_addr_lsb; 159 uint16_t m_page1_addr_msb; 160 161 uint16_t m_707e_spritebank; 162 uint16_t m_videodma_size; 163 uint16_t m_videodma_dest; 164 uint16_t m_videodma_source; 165 166 devcb_write_line m_video_irq_cb; 167 168 169 // video 70xx 170 uint16_t m_tmap0_regs[0x4]; 171 uint16_t m_tmap1_regs[0x4]; 172 173 uint16_t m_tmap2_regs[0x4]; 174 uint16_t m_tmap3_regs[0x4]; 175 176 177 uint16_t m_tmap0_scroll[0x2]; 178 uint16_t m_tmap1_scroll[0x2]; 179 180 uint16_t m_tmap2_scroll[0x4]; 181 uint16_t m_tmap3_scroll[0x4]; 182 183 184 uint16_t m_707f; 185 uint16_t m_703a_palettebank; 186 uint16_t m_video_irq_enable; 187 uint16_t m_video_irq_status; 188 189 uint16_t m_702a; 190 uint16_t m_7030_brightness; 191 uint16_t m_xirqpos; 192 uint16_t m_yirqpos; 193 uint16_t m_703c_tvcontrol1; 194 195 uint16_t m_7042_sprite; 196 197 uint16_t m_7080; 198 uint16_t m_7081; 199 uint16_t m_7082; 200 uint16_t m_7083; 201 uint16_t m_7084; 202 uint16_t m_7085; 203 uint16_t m_7086; 204 uint16_t m_7087; 205 uint16_t m_7088; 206 207 uint16_t m_sprite_7022_gfxbase_lsb; 208 uint16_t m_sprite_702d_gfxbase_msb; 209 uint16_t m_page2_addr_lsb; 210 uint16_t m_page2_addr_msb; 211 uint16_t m_page3_addr_lsb; 212 uint16_t m_page3_addr_msb; 213 214 void unk_vid_regs_w(int which, int offset, uint16_t data); 215 216 emu_timer *m_screenpos_timer; 217 218 uint16_t m_spriteram[0x400*2]; 219 uint16_t m_paletteram[0x100*0x10]; 220 221 required_device<palette_device> m_palette; 222 required_device<gfxdecode_device> m_gfxdecode; 223 devcb_read16 m_space_read_cb; 224 225 required_shared_ptr<uint16_t> m_rowscroll; 226 required_shared_ptr<uint16_t> m_rowzoom; 227 228 int m_maxgfxelement; 229 void decodegfx(const char* tag); 230 231 //int m_pal_displaybank_high; 232 //int m_pal_sprites; 233 //int m_pal_back; 234 int m_alt_extrasprite_hack; 235 int m_alt_tile_addressing; 236 237 required_device<spg_renderer_device> m_renderer; 238 239 address_space* m_cpuspace; 240 address_space* m_cs_space; 241 int m_csbase; 242 }; 243 244 class gcm394_video_device : public gcm394_base_video_device 245 { 246 public: 247 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)248 gcm394_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag) 249 : gcm394_video_device(mconfig, tag, owner, clock) 250 { 251 m_cpu.set_tag(std::forward<T>(cpu_tag)); 252 m_screen.set_tag(std::forward<U>(screen_tag)); 253 } 254 255 gcm394_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 256 }; 257 258 DECLARE_DEVICE_TYPE(GCM394_VIDEO, gcm394_video_device) 259 260 #endif // MAME_MACHINE_GENERALPLUS_GPL16250SOC_VIDEO_H 261