// license:BSD-3-Clause // copyright-holders:Carl #ifndef MAME_VIDEO_SCN2674_H #define MAME_VIDEO_SCN2674_H #pragma once #define SCN2672_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink) #define SCN2674_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t attrcode, uint16_t address, bool cursor, bool dw, bool lg, bool ul, bool blink) class scn2674_device : public device_t, public device_video_interface, public device_memory_interface { public: typedef device_delegate draw_character_delegate; // static configuration auto intr_callback() { return m_intr_cb.bind(); } auto breq_callback() { return m_breq_cb.bind(); } auto mbc_callback() { return m_mbc_cb.bind(); } auto mbc_char_callback() { return m_mbc_char_cb.bind(); } auto mbc_attr_callback() { return m_mbc_attr_cb.bind(); } void set_character_width(int value) { m_hpixels_per_column = value; } template void set_display_callback(T &&... args) { m_display_cb.set(std::forward(args)...); } scn2674_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); uint8_t read(offs_t offset); void write(offs_t offset, uint8_t data); uint8_t buffer_r() { return m_char_buffer; } void buffer_w(offs_t offset, uint8_t data) { m_char_buffer = data; } uint8_t attr_buffer_r() { return m_attr_buffer; } void attr_buffer_w(offs_t offset, uint8_t data) { m_attr_buffer = data; } uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); protected: scn2674_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool extend_addressing); virtual void device_start() override; virtual void device_reset() override; virtual space_config_vector memory_space_config() const override; TIMER_CALLBACK_MEMBER(scanline_timer); TIMER_CALLBACK_MEMBER(breq_timer); TIMER_CALLBACK_MEMBER(vblank_timer); //protected: bitmap_rgb32 m_bitmap; devcb_write_line m_intr_cb; devcb_write_line m_breq_cb; devcb_write_line m_mbc_cb; devcb_read8 m_mbc_char_cb; devcb_read8 m_mbc_attr_cb; uint8_t m_IR_pointer; uint16_t m_screen1_address; uint16_t m_screen2_address; uint16_t m_cursor_address; uint8_t m_irq_register; uint8_t m_status_register; uint8_t m_irq_mask; bool m_gfx_enabled; bool m_display_enabled; bool m_dadd_enabled; bool m_display_enabled_field; bool m_display_enabled_scanline; bool m_cursor_enabled; uint8_t m_hpixels_per_column; bool m_double_ht_wd; uint8_t m_scanline_per_char_row; bool m_csync_select; uint8_t m_buffer_mode_select; bool m_interlace_enable; uint8_t m_equalizing_constant; bool m_use_row_table; uint8_t m_horz_sync_width; uint8_t m_horz_back_porch; uint8_t m_vert_front_porch; uint8_t m_vert_back_porch; uint8_t m_rows_per_screen; uint8_t m_character_blink_rate_divisor; uint8_t m_character_per_row; uint8_t m_cursor_first_scanline; uint8_t m_cursor_last_scanline; uint8_t m_cursor_underline_position; uint8_t m_cursor_rate_divisor; bool m_cursor_blink; uint8_t m_vsync_width; uint16_t m_display_buffer_first_address; uint8_t m_display_buffer_last_address; uint16_t m_display_pointer_address; uint8_t m_reset_scanline_counter_on_scrollup; uint8_t m_reset_scanline_counter_on_scrolldown; bool m_scroll_start; bool m_scroll_end; uint8_t m_scroll_lines; uint8_t m_split_register[2]; uint8_t m_double[2]; bool m_spl[2]; uint8_t m_dbl1; uint8_t m_char_buffer; uint8_t m_attr_buffer; int m_linecounter; uint16_t m_address; int m_start1change; virtual void write_init_regs(uint8_t data); void set_gfx_enabled(bool enabled); void set_display_enabled(bool enabled, int n); void set_cursor_enabled(bool enabled); void reset_interrupt_status(uint8_t bits); void write_interrupt_mask(bool enabled, uint8_t bits); void write_delayed_command(uint8_t data); void write_command(uint8_t data); void recompute_parameters(); void scn2674_vram(address_map &map); draw_character_delegate m_display_cb; emu_timer *m_scanline_timer; emu_timer *m_breq_timer; emu_timer *m_vblank_timer; address_space *m_char_space; address_space *m_attr_space; const address_space_config m_char_space_config; const address_space_config m_attr_space_config; }; class scn2672_device : public scn2674_device { public: scn2672_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual void write_init_regs(uint8_t data) override; }; DECLARE_DEVICE_TYPE(SCN2672, scn2672_device) DECLARE_DEVICE_TYPE(SCN2674, scn2674_device) #endif // MAME_VIDEO_SCN2674_H