// license:BSD-3-Clause // copyright-holders:Nicola Salmoria #ifndef MAME_VIDEO_TC0100SCN_H #define MAME_VIDEO_TC0100SCN_H #pragma once #include "emupal.h" #include "tilemap.h" enum { TC0100SCN_LAYOUT_DEFAULT = 0, TC0100SCN_LAYOUT_1BPP }; enum { TC0620SCC_LAYOUT_DEFAULT = 0 // default TC0620SCC layout is 6bpp }; #define TC0100SCN_CB_MEMBER(_name) void _name(u32 *code, u16 *color) class tc0100scn_base_device : public device_t, public device_gfx_interface { public: typedef device_delegate tc0100scn_cb_delegate; // configuration void set_gfxlayout(int layout) { m_gfxlayout = layout; } void set_color_base(u16 base) { m_col_base = base; } template void set_tile_callback(T &&... args) { m_tc0100scn_cb.set(std::forward(args)...); } void set_multiscr_xoffs(int xoffs) { m_multiscrn_xoffs = xoffs; } void set_multiscr_hack(int hack) { m_multiscrn_hack = hack; } void set_offsets(int x_offset, int y_offset) { m_x_offset = x_offset; m_y_offset = y_offset; } void set_offsets_flip(int x_offset, int y_offset) { m_flip_xoffs = x_offset; m_flip_yoffs = y_offset; } void set_offsets_fliptx(int x_offset, int y_offset) { m_flip_text_xoffs = x_offset; m_flip_text_yoffs = y_offset; } static constexpr unsigned SINGLE_VDU = 1024; // for set_multiscr_xoffs /* Function to set separate color banks for the three tilemapped layers. To change from the default (0,0,0) use after calling TC0100SCN_vh_start */ void set_colbanks(int bg0, int bg1, int tx); u16 ram_r(offs_t offset); void ram_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 ctrl_r(offs_t offset); void ctrl_w(offs_t offset, u16 data, u16 mem_mask = ~0); void tilemap_update(); int tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, u8 priority, u8 pmask = 0xff); void tilemap_set_dirty(); /* returns 0 or 1 depending on the lowest priority tilemap set in the internal register. Use this function to draw tilemaps in the correct order. */ int bottomlayer(); protected: tc0100scn_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); // device-level overrides virtual void device_start() override; virtual void device_reset() override; virtual void device_post_load() override; int m_gfxlayout; private: // internal state tc0100scn_cb_delegate m_tc0100scn_cb; u16 m_ctrl[8]; std::unique_ptr m_ram; u16 * m_bgscroll_ram; u16 * m_fgscroll_ram; u16 * m_colscroll_ram; int m_bgscrollx, m_bgscrolly, m_fgscrollx, m_fgscrolly; /* We keep two tilemaps for each of the 3 actual tilemaps: one at standard width, one double */ tilemap_t *m_tilemap[3][2]; s32 m_bg_colbank[2], m_tx_colbank; int m_dblwidth; bool m_dirty; int m_x_offset, m_y_offset; int m_flip_xoffs, m_flip_yoffs; int m_flip_text_xoffs, m_flip_text_yoffs; int m_multiscrn_xoffs; int m_multiscrn_hack; u16 m_col_base; template TILE_GET_INFO_MEMBER(get_bg_tile_info); template TILE_GET_INFO_MEMBER(get_tx_tile_info); void tilemap_draw_fg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t* tmap, int flags, u8 priority, u8 pmask = 0xff); void set_layer_ptrs(); void restore_scroll(); }; class tc0100scn_device : public tc0100scn_base_device { public: tc0100scn_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); protected: // device-level overrides virtual void device_start() override; private: // decoding info DECLARE_GFXDECODE_MEMBER(gfxinfo_default); DECLARE_GFXDECODE_MEMBER(gfxinfo_1bpp); }; class tc0620scc_device : public tc0100scn_base_device { public: tc0620scc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); protected: // device-level overrides virtual void device_start() override; private: // decoding info DECLARE_GFXDECODE_MEMBER(gfxinfo_6bpp); }; DECLARE_DEVICE_TYPE(TC0100SCN, tc0100scn_device) DECLARE_DEVICE_TYPE(TC0620SCC, tc0620scc_device) #endif // MAME_VIDEO_TC0100SCN_H