1 // license:BSD-3-Clause
2 // copyright-holders:Carl
3 #ifndef MAME_VIDEO_SCN2674_H
4 #define MAME_VIDEO_SCN2674_H
5 
6 #pragma once
7 
8 
9 #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)
10 
11 #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)
12 
13 
14 class scn2674_device : public device_t,
15 						public device_video_interface,
16 						public device_memory_interface
17 {
18 public:
19 	typedef device_delegate<void (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)> draw_character_delegate;
20 
21 	// static configuration
intr_callback()22 	auto intr_callback() { return m_intr_cb.bind(); }
breq_callback()23 	auto breq_callback() { return m_breq_cb.bind(); }
mbc_callback()24 	auto mbc_callback() { return m_mbc_cb.bind(); }
mbc_char_callback()25 	auto mbc_char_callback() { return m_mbc_char_cb.bind(); }
mbc_attr_callback()26 	auto mbc_attr_callback() { return m_mbc_attr_cb.bind(); }
set_character_width(int value)27 	void set_character_width(int value) { m_hpixels_per_column = value; }
28 
set_display_callback(T &&...args)29 	template <typename... T> void set_display_callback(T &&... args) { m_display_cb.set(std::forward<T>(args)...); }
30 
31 	scn2674_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
32 
33 	uint8_t read(offs_t offset);
34 	void write(offs_t offset, uint8_t data);
buffer_r()35 	uint8_t buffer_r() { return m_char_buffer; }
buffer_w(offs_t offset,uint8_t data)36 	void buffer_w(offs_t offset, uint8_t data) { m_char_buffer = data; }
attr_buffer_r()37 	uint8_t attr_buffer_r() { return m_attr_buffer; }
attr_buffer_w(offs_t offset,uint8_t data)38 	void attr_buffer_w(offs_t offset, uint8_t data) { m_attr_buffer = data; }
39 
40 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
41 
42 protected:
43 	scn2674_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool extend_addressing);
44 
45 	virtual void device_start() override;
46 	virtual void device_reset() override;
47 
48 	virtual space_config_vector memory_space_config() const override;
49 
50 	TIMER_CALLBACK_MEMBER(scanline_timer);
51 	TIMER_CALLBACK_MEMBER(breq_timer);
52 	TIMER_CALLBACK_MEMBER(vblank_timer);
53 
54 //protected:
55 	bitmap_rgb32 m_bitmap;
56 	devcb_write_line m_intr_cb;
57 	devcb_write_line m_breq_cb;
58 	devcb_write_line m_mbc_cb;
59 	devcb_read8 m_mbc_char_cb;
60 	devcb_read8 m_mbc_attr_cb;
61 
62 	uint8_t m_IR_pointer;
63 	uint16_t m_screen1_address;
64 	uint16_t m_screen2_address;
65 	uint16_t m_cursor_address;
66 	uint8_t m_irq_register;
67 	uint8_t m_status_register;
68 	uint8_t m_irq_mask;
69 	bool m_gfx_enabled;
70 	bool m_display_enabled;
71 	bool m_dadd_enabled;
72 	bool m_display_enabled_field;
73 	bool m_display_enabled_scanline;
74 	bool m_cursor_enabled;
75 	uint8_t m_hpixels_per_column;
76 	bool m_double_ht_wd;
77 	uint8_t m_scanline_per_char_row;
78 	bool m_csync_select;
79 	uint8_t m_buffer_mode_select;
80 	bool m_interlace_enable;
81 	uint8_t m_equalizing_constant;
82 	bool m_use_row_table;
83 	uint8_t m_horz_sync_width;
84 	uint8_t m_horz_back_porch;
85 	uint8_t m_vert_front_porch;
86 	uint8_t m_vert_back_porch;
87 	uint8_t m_rows_per_screen;
88 	uint8_t m_character_blink_rate_divisor;
89 	uint8_t m_character_per_row;
90 	uint8_t m_cursor_first_scanline;
91 	uint8_t m_cursor_last_scanline;
92 	uint8_t m_cursor_underline_position;
93 	uint8_t m_cursor_rate_divisor;
94 	bool m_cursor_blink;
95 	uint8_t m_vsync_width;
96 	uint16_t m_display_buffer_first_address;
97 	uint8_t m_display_buffer_last_address;
98 	uint16_t m_display_pointer_address;
99 	uint8_t m_reset_scanline_counter_on_scrollup;
100 	uint8_t m_reset_scanline_counter_on_scrolldown;
101 	bool m_scroll_start;
102 	bool m_scroll_end;
103 	uint8_t m_scroll_lines;
104 	uint8_t m_split_register[2];
105 	uint8_t m_double[2];
106 	bool m_spl[2];
107 	uint8_t m_dbl1;
108 	uint8_t m_char_buffer;
109 	uint8_t m_attr_buffer;
110 	int m_linecounter;
111 	uint16_t m_address;
112 	int m_start1change;
113 
114 	virtual void write_init_regs(uint8_t data);
115 	void set_gfx_enabled(bool enabled);
116 	void set_display_enabled(bool enabled, int n);
117 	void set_cursor_enabled(bool enabled);
118 	void reset_interrupt_status(uint8_t bits);
119 	void write_interrupt_mask(bool enabled, uint8_t bits);
120 	void write_delayed_command(uint8_t data);
121 	void write_command(uint8_t data);
122 	virtual void write_screen2_address(bool msb, uint8_t data);
123 
124 	void recompute_parameters();
125 
126 	void scn2674_vram(address_map &map);
127 
128 	draw_character_delegate m_display_cb;
129 	emu_timer *m_scanline_timer;
130 	emu_timer *m_breq_timer;
131 	emu_timer *m_vblank_timer;
132 	address_space *m_char_space;
133 	address_space *m_attr_space;
134 	const address_space_config m_char_space_config;
135 	const address_space_config m_attr_space_config;
136 };
137 
138 class scn2672_device : public scn2674_device
139 {
140 public:
141 	scn2672_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
142 
143 protected:
144 	virtual void write_init_regs(uint8_t data) override;
145 	virtual void write_screen2_address(bool msb, uint8_t data) override;
146 };
147 
148 
149 DECLARE_DEVICE_TYPE(SCN2672, scn2672_device)
150 DECLARE_DEVICE_TYPE(SCN2674, scn2674_device)
151 
152 #endif // MAME_VIDEO_SCN2674_H
153