1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     SMC CRT9021 Video Attributes Controller (VAC) emulation
6 
7 **********************************************************************/
8 
9 /*
10 
11     TODO:
12 
13     - attributes
14         - character blink
15         - underline
16         - full/half intensity
17     - operation modes
18         - wide graphics
19         - thin graphics
20         - character mode w/o underline
21         - character mode w/underline
22     - double height characters
23     - double width characters
24     - serial scan line
25     - cursor
26         - underline
27         - blinking underline
28         - reverse video
29         - blinking reverse video
30     - programmable character blink rate (75/25 duty)
31     - programmable cursor blink rate (50/50 duty)
32     - attribute latches
33 
34 */
35 
36 #include "emu.h"
37 #include "crt9021.h"
38 
39 #include "screen.h"
40 
41 //#define VERBOSE 1
42 #include "logmacro.h"
43 
44 
45 
46 //**************************************************************************
47 //  DEVICE DEFINITIONS
48 //**************************************************************************
49 
50 DEFINE_DEVICE_TYPE(CRT9021, crt9021_device, "crt9021", "SMC CRT9021 VAC")
51 
52 
53 
54 //**************************************************************************
55 //  LIVE DEVICE
56 //**************************************************************************
57 
58 //-------------------------------------------------
59 //  crt9021_device - constructor
60 //-------------------------------------------------
61 
crt9021_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)62 crt9021_device::crt9021_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
63 	device_t(mconfig, CRT9021, tag, owner, clock),
64 	device_video_interface(mconfig, *this),
65 	m_display_cb(*this),
66 	m_data(0),
67 	m_ms0(0),
68 	m_ms1(0),
69 	m_revid(0),
70 	m_chabl(0),
71 	m_blink(0),
72 	m_intin(0),
73 	m_atten(0),
74 	m_cursor(0),
75 	m_retbl(0),
76 	m_ld_sh(1),
77 	m_sld(1),
78 	m_slg(0),
79 	m_blc(0),
80 	m_bkc(0),
81 	m_sl0(0),
82 	m_sl1(0),
83 	m_sl2(0),
84 	m_sl3(0),
85 	m_vsync(0),
86 	m_sr(0),
87 	m_intout(0)
88 {
89 }
90 
91 
92 //-------------------------------------------------
93 //  device_start - device-specific startup
94 //-------------------------------------------------
95 
device_start()96 void crt9021_device::device_start()
97 {
98 	m_display_cb.resolve();
99 
100 	// register bitmap
101 	screen().register_screen_bitmap(m_bitmap);
102 
103 	// state saving
104 	save_item(NAME(m_data));
105 	save_item(NAME(m_ms0));
106 	save_item(NAME(m_ms1));
107 	save_item(NAME(m_revid));
108 	save_item(NAME(m_chabl));
109 	save_item(NAME(m_blink));
110 	save_item(NAME(m_intin));
111 	save_item(NAME(m_atten));
112 	save_item(NAME(m_cursor));
113 	save_item(NAME(m_retbl));
114 	save_item(NAME(m_ld_sh));
115 	save_item(NAME(m_sld));
116 	save_item(NAME(m_slg));
117 	save_item(NAME(m_blc));
118 	save_item(NAME(m_bkc));
119 	save_item(NAME(m_sl0));
120 	save_item(NAME(m_sl1));
121 	save_item(NAME(m_sl2));
122 	save_item(NAME(m_sl3));
123 	save_item(NAME(m_vsync));
124 	save_item(NAME(m_sr));
125 	save_item(NAME(m_intout));
126 	save_item(NAME(m_sl));
127 }
128 
129 
130 //-------------------------------------------------
131 //  ld_sh_w - load/shift
132 //-------------------------------------------------
133 
ld_sh_w(int state)134 void crt9021_device::ld_sh_w(int state)
135 {
136 	LOG("CRT9021 LD/SH: %u\n", state);
137 
138 	if (!m_ld_sh && state)
139 	{
140 		// shift in scanline data
141 		if (!m_slg)
142 		{
143 			m_sl >>= 1;
144 			m_sl |= m_sld << 3;
145 		}
146 
147 		// latch data
148 		if (m_retbl)
149 		{
150 			m_sr = 0;
151 		}
152 		else
153 		{
154 			m_sr = m_chabl ? 0 : m_data;
155 
156 			if (m_revid) m_sr ^= 0xff;
157 		}
158 
159 		// latch attributes
160 		if (m_atten)
161 		{
162 			// TODO
163 		}
164 
165 		m_display_cb(m_bitmap, screen().vpos(), screen().hpos(), m_sr, m_intout);
166 	}
167 }
168 
169 
170 //-------------------------------------------------
171 //  vsync_w - vertical sync
172 //-------------------------------------------------
173 
vsync_w(int state)174 void crt9021_device::vsync_w(int state)
175 {
176 	LOG("CRT9021 VSYNC: %u\n", state);
177 }
178 
179 
180 //-------------------------------------------------
181 //  screen_update - update screen
182 //-------------------------------------------------
183 
screen_update(screen_device & screen,bitmap_rgb32 & bitmap,const rectangle & cliprect)184 uint32_t crt9021_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
185 {
186 	m_bitmap.fill(rgb_t::black(), cliprect);
187 
188 	return 0;
189 }
190