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