1 // license:BSD-3-Clause
2 // copyright-holders:Miodrag Milanovic,Karl-Ludwig Deisenhofer
3 /**********************************************************************
4 
5 DEC VT Terminal video emulation
6 [ DC012 and DC011 emulation ]
7 
8 01/05/2009 Initial implementation [Miodrag Milanovic]
9 
10 **********************************************************************/
11 
12 #ifndef MAME_VIDEO_VTVIDEO_H
13 #define MAME_VIDEO_VTVIDEO_H
14 
15 #pragma once
16 
17 #include "emupal.h"
18 
19 
20 class vt100_video_device : public device_t,
21 	public device_video_interface
22 {
23 public:
24 	vt100_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
25 
ram_rd_callback()26 	auto ram_rd_callback() { return m_read_ram.bind(); }
vert_freq_intr_wr_callback()27 	auto vert_freq_intr_wr_callback() { return m_write_vert_freq_intr.bind(); }
lba3_lba4_wr_callback()28 	auto lba3_lba4_wr_callback() { return m_write_lba3_lba4.bind(); }
lba7_wr_callback()29 	auto lba7_wr_callback() { return m_write_lba7.bind(); }
30 
set_chargen(T && tag)31 	template <typename T> void set_chargen(T &&tag) { m_char_rom.set_tag(std::forward<T>(tag)); }
32 
33 	DECLARE_READ_LINE_MEMBER(lba7_r);
34 	void dc012_w(offs_t offset, uint8_t data);
35 	void dc011_w(uint8_t data);
36 	void brightness_w(uint8_t data);
37 
38 	virtual void video_update(bitmap_ind16 &bitmap, const rectangle &cliprect);
39 
40 protected:
41 	vt100_video_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
42 
43 	// device-level overrides
44 	virtual void device_start() override;
45 	virtual void device_reset() override;
46 	virtual void device_add_mconfig(machine_config &config) override;
47 
48 	// internal state
49 	void recompute_parameters();
50 	void vblank_callback(screen_device &screen, bool state);
51 	void display_char(bitmap_ind16 &bitmap, uint8_t code, int x, int y, uint8_t scroll_region, uint8_t display_type, bool invert, bool bold, bool blink, bool underline, bool blank);
52 	TIMER_CALLBACK_MEMBER(lba3_change);
53 	TIMER_CALLBACK_MEMBER(lba7_change);
notify_vblank(bool choice)54 	virtual void notify_vblank(bool choice) { }
55 
56 	devcb_read8        m_read_ram;
57 	devcb_write_line   m_write_vert_freq_intr;
58 	devcb_write8       m_write_lba3_lba4;
59 	devcb_write_line   m_write_lba7;
60 
61 	int m_lba7;
62 
63 	bool MHFU_FLAG;
64 	int MHFU_counter;
65 
66 	// dc012 attributes
67 	uint8_t m_scroll_latch;
68 	bool m_scroll_latch_valid;
69 	uint8_t m_blink_flip_flop;
70 	uint8_t m_reverse_field;
71 	uint8_t m_basic_attribute;
72 	// dc011 attributes
73 	uint8_t m_columns;
74 	uint8_t m_height;
75 	uint8_t m_height_MAX;
76 	uint8_t m_fill_lines;
77 	bool m_is_50hz;
78 	bool m_interlaced;
79 	emu_timer *m_lba3_change_timer;
80 	emu_timer *m_lba7_change_timer;
81 
82 	required_region_ptr<uint8_t> m_char_rom; /* character rom region */
83 	required_device<palette_device> m_palette;
84 
85 	bool m_notify_vblank;
86 	int m_last_scroll;
87 
88 	bool m_linedoubler;
89 };
90 
91 
92 class rainbow_video_device : public vt100_video_device
93 {
94 public:
95 	rainbow_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
96 
97 	virtual void video_update(bitmap_ind16 &bitmap, const rectangle &cliprect) override;
98 	virtual void video_blanking(bitmap_ind16 &bitmap, const rectangle &cliprect);
99 
100 	int MHFU(int);
101 	void palette_select(int choice);
102 
103 protected:
104 	virtual void notify_vblank(bool choice) override;
105 	virtual void device_reset() override;
106 };
107 
108 DECLARE_DEVICE_TYPE(VT100_VIDEO, vt100_video_device)
109 DECLARE_DEVICE_TYPE(RAINBOW_VIDEO, rainbow_video_device)
110 
111 
112 #endif // MAME_VIDEO_VTVIDEO_H
113