1 // license:BSD-3-Clause
2 // copyright-holders:Ryan Holtz
3 
4 /***************************************************************************
5 
6   Netlist (hazelvid) included from hazeltin.cpp
7 
8 ***************************************************************************/
9 
10 #include "netlist/devices/net_lib.h"
11 
12 #ifndef __PLIB_PREPROCESSOR__
13 #endif
14 
15 NETLIST_START(hazelvid)
16 
17 	SOLVER(Solver, 48000)
18 	PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
19 	PARAM(Solver.ACCURACY, 1e-4) // works and is sufficient
20 	PARAM(NETLIST.USE_DEACTIVATE, 1)
21 
22 	ANALOG_INPUT(V5, 5)
23 	ALIAS(VCC, V5) // no-ttl-dip devices need VCC!
24 
25 	ALIAS(VSS, V5)  // CMOS/MOS default +
26 	ALIAS(VDD, GND) // CMOS/MOS default -
27 
28 	TTL_INPUT(high, 1)
29 	TTL_INPUT(low, 0)
30 
31 	MAINCLOCK(video_clk, 16632000.0)
32 
33 	/* Character line counter, divide-by-9 */
34 	TTL_74161_FIXME(u88, high, high, high, low, high, u87_6.Q, video_clk, high, high)
35 
36 	TTL_7404_INVERT(u87_6, u88.RC)
37 
38 	TTL_74175(u81, video_clk, u88.RC, u81.Q1, low, u88.QC, high)
39 
40 	TTL_7404_INVERT(u87_5, u81.Q1)
41 	ALIAS(ndot, u87_5.Q)
42 	TTL_7404_INVERT(u59_4, u81.Q1Q)
43 	ALIAS(dot, u59_4.Q)
44 
45 	/* Character bucket counter */
46 
47 	/* least significant 4 bits */
48 	TTL_74161_FIXME(u70, low, low, low, low, high, u59_5.Q, u81.Q2Q, high, high)
49 
50 	/* most significant 4 bits */
51 	TTL_74161_FIXME(u69, low, low, low, low, high, u59_5.Q, u81.Q2Q, u70.RC, u70.RC)
52 	/* Horizontal/Vertical timing signals */
53 
54 	/* signal lookup PROM */
55 	PROM_82S126(u71, low, low, u70.QA, u70.QB, u70.QC, u70.QD, u69.QA, u69.QB, u69.QC, low)
56 	PARAM(u71.ROM, "u90_702128_82s129.bin")
57 	// The prom is always enabled and outputs are only connected to logic inputs
58 	PARAM(u71.FORCE_TRISTATE_LOGIC, 1)
59 
60 	/* signal decoding */
61 	TTL_9334(u72, high, u81.Q1Q, u71.O4, u71.O1, u71.O2, u71.O3)
62 	ALIAS(hms, u72.Q1)
63 	ALIAS(hmsd, u72.Q2)
64 	ALIAS(hblank, u72.Q3)
65 	ALIAS(vstrobe, u72.Q4)
66 	ALIAS(hdriveq, u72.Q5)
67 	ALIAS(vidbus, u72.Q6)
68 	TTL_7404_INVERT(u59_5, u72.Q7)
69 
70 	TTL_7400_NAND(u83_1, high, vstrobe)
71 	ALIAS(char_line_clk, u83_1.Q)
72 
73 	/* Character line counter */
74 	TTL_74161_FIXME(u84, low, low, low, low, high, u83_3.Q, char_line_clk, high, high)
75 	ALIAS(lc20, u84.QA)
76 	ALIAS(lc21, u84.QB)
77 	ALIAS(lc22, u84.QC)
78 	ALIAS(lc23, u84.QD)
79 	TTL_7400_NAND(u83_3, u84.QB, u84.QD)
80 	TTL_7404_INVERT(u92_5, u90.QD)
81 
82 	TTL_7410_NAND(u89_3, u90.QD, u90.QC, u90.QA)
83 
84 	/* Character row counter */
85 	TTL_74161_FIXME(u90, low, low, low, low, high, u89_3.Q, u92_3.Q, high, high)
86 	TTL_7404_INVERT(u92_3, u84.QD)
87 	TTL_7404_INVERT(u92_1, u90.QB)
88 
89 	TTL_7474(u95_2, u92_5.Q, u95_2.QQ, high, high)
90 
91 	TTL_7411_AND(u91_3, u84.QA, u84.QD, u90.QB)
92 	TTL_7411_AND(u91_1, u92_1.Q, u90.QA, u84.QC)
93 
94 	TTL_7404_INVERT(u92_2, u90.QC)
95 	TTL_7411_AND(u91_2, u95_2.QQ, u92_2.Q, u92_5.Q)
96 	TTL_7404_INVERT(u92_6, u91_2.Q)
97 
98 	/* Vertical blanking and drive */
99 	TTL_7473(u85_vdrive, char_line_clk, u91_1.Q, u91_3.Q, u85_vblankq.QQ)
100 	TTL_7473(u85_vblankq, char_line_clk, u92_6.Q, u91_2.Q, high)
101 
102 	/* Outgoing signals */
103 	TTL_7404_INVERT(u73_4, hdriveq)
104 	ALIAS(hdrive, u73_4.Q)
105 
106 	TTL_7404_INVERT(u61_6, hmsd)
107 	TTL_7402_NOR(u60_1, u61_6.Q, u81.Q4)
108 	ALIAS(lbc, u60_1.Q)
109 
110 	TTL_7404_INVERT(u74_1, u84.QB)
111 	TTL_7410_NAND(u89_2, vidbus, vidbus, u82_2.Q)
112 	ALIAS(ncntbenq, u89_2.Q)
113 
114 	TTL_7410_NAND(u89_1, u81.Q2, hmsd, u82_2.Q)
115 	TTL_7400_NAND(u83_4, u89_1.Q, high)
116 	ALIAS(cntclk, u83_4.Q)
117 
118 	TTL_7402_NOR(u60_2, hblank, u85_vblankq.QQ)
119 	ALIAS(clr_vid_sr, u60_2.Q)
120 
121 	TTL_7404_INVERT(u92_4, u84.QB)
122 	TTL_74260_NOR(u82_2, u85_vblankq.QQ, u92_3.Q, u84.QC, u92_4.Q, u84.QA)
123 	TTL_7400_NAND(u83_2, vstrobe, u82_2.Q)
124 	ALIAS(sync_bus_disable_q, u83_2.Q)
125 
126 	ALIAS(vdrive, u85_vdrive.Q)
127 	TTL_7404_INVERT(u73_5, vdrive)
128 	ALIAS(vdriveq, u73_5.Q)
129 
130 	TTL_7474(u95_1, u84.QD, u85_vblankq.QQ, high, high)
131 	ALIAS(vblank, u95_1.Q)
132 
133 	TTL_74260_NOR(u82_1, u85_vblankq.QQ, u92_4.Q, u84.QD, u84.QC, low)
134 	TTL_7404_INVERT(u61_3, u82_1.Q)
135 	ALIAS(tvinterq, u61_3.Q)
136 
137 	TTL_INPUT(cpu_iowq, 1)
138 	TTL_INPUT(cpu_ba4, 1)
139 	TTL_7432_OR(u36_1, cpu_iowq, cpu_ba4)
140 
141 	/* Character address counter */
142 	TTL_74193(u7, low,   low,   low,   low,   low, u36_1.Q, cntclk, high)
143 	TTL_74193(u5, cpu_db0, cpu_db1, cpu_db2, cpu_db3, low, u36_1.Q, u7.CARRYQ, u7.BORROWQ)
144 	TTL_74193(u3, cpu_db4, cpu_db5, cpu_db6, cpu_db7, low, u36_1.Q, u5.CARRYQ, u5.BORROWQ)
145 
146 	TTL_74365(u6, low, ncntbenq, u7.QA, u7.QB, u7.QC, u7.QD, u5.QA, u5.QB)
147 	TTL_74365(u4, low, ncntbenq, u5.QC, u5.QD, u3.QA, u3.QB, u3.QC, low)
148 	ALIAS(ba0, u6.Y1)
149 	ALIAS(ba1, u6.Y2)
150 	ALIAS(ba2, u6.Y3)
151 	ALIAS(ba3, u6.Y4)
152 	ALIAS(ba4, u6.Y5)
153 	ALIAS(ba5, u6.Y6)
154 	ALIAS(ba6, u4.Y1)
155 	ALIAS(ba7, u4.Y2)
156 	ALIAS(ba8, u4.Y3)
157 	ALIAS(ba9, u4.Y4)
158 	ALIAS(ba10, u4.Y5)
159 
160 	/* Video RAM */
161 	TTL_INPUT(memwq, 1)
162 	TTL_INPUT(mrq, 1)
163 	TTL_INPUT(ba13, 0)
164 
165 	TTL_7432_OR(u36_2, memwq, memwq)
166 	TTL_7400_NAND(u37_2, u36_2.Q, mrq)
167 	TTL_7400_NAND(u37_3, u37_2.Q, ba13)
168 	TTL_7400_NAND(u37_4, u37_3.Q, ncntbenq)
169 	TTL_7404_INVERT(u17_2, u4.Y5)
170 	TTL_7400_NAND(u30_2, u17_2.Q, u37_4.Q)
171 	TTL_7400_NAND(u37_1, u4.Y5, u37_4.Q)
172 	TTL_INPUT(rwq, 1)
173 
174 	/* Lower 1K */
175 	RAM_2102A(u22, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u22.DO)
176 	RAM_2102A(u23, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u23.DO)
177 	RAM_2102A(u24, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u24.DO)
178 	RAM_2102A(u25, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u25.DO)
179 	RAM_2102A(u26, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u26.DO)
180 	RAM_2102A(u27, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u27.DO)
181 	RAM_2102A(u28, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u28.DO)
182 	RAM_2102A(u29, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u29.DO)
183 
184 	/* Upper 1K */
185 	RAM_2102A(u9,  u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u9.DO)
186 	RAM_2102A(u10, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u10.DO)
187 	RAM_2102A(u11, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u11.DO)
188 	RAM_2102A(u12, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u12.DO)
189 	RAM_2102A(u13, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u13.DO)
190 	RAM_2102A(u14, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u14.DO)
191 	RAM_2102A(u15, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u15.DO)
192 	RAM_2102A(u16, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u16.DO)
193 
194 	TTL_INPUT(cpu_db0, 0)
195 	TTL_INPUT(cpu_db1, 0)
196 	TTL_INPUT(cpu_db2, 0)
197 	TTL_INPUT(cpu_db3, 0)
198 	TTL_INPUT(cpu_db4, 0)
199 	TTL_INPUT(cpu_db5, 0)
200 	TTL_INPUT(cpu_db6, 0)
201 	TTL_INPUT(cpu_db7, 0)
202 
203 	TTL_TRISTATE(db0, u30_2.Q, u29.DO, u37_1.Q, u16.DO)
204 	TTL_TRISTATE(db1, u30_2.Q, u28.DO, u37_1.Q, u15.DO)
205 	TTL_TRISTATE(db2, u30_2.Q, u27.DO, u37_1.Q, u14.DO)
206 	TTL_TRISTATE(db3, u30_2.Q, u26.DO, u37_1.Q, u13.DO)
207 	TTL_TRISTATE(db4, u30_2.Q, u25.DO, u37_1.Q, u12.DO)
208 	TTL_TRISTATE(db5, u30_2.Q, u24.DO, u37_1.Q, u11.DO)
209 	TTL_TRISTATE(db6, u30_2.Q, u23.DO, u37_1.Q, u10.DO)
210 	TTL_TRISTATE(db7, u30_2.Q, u22.DO, u37_1.Q, u9.DO)
211 
212 	/* Character generation */
213 	TTL_74175(u68, dot, db0.Q, db1.Q, db2.Q, db3.Q, high) // least significant 4 bits of each character
214 	TTL_AM2847(u67, lbc, u68.Q1, u68.Q2, u68.Q3, u68.Q4, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q)
215 
216 	TTL_74175(u58, dot, db4.Q, db5.Q, db6.Q, db7.Q, high) // most signifcant 4 bits of each character
217 	TTL_AM2847(u57, lbc, u58.Q1, u58.Q2, u58.Q3, u58.Q4, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q)
218 
219 	TTL_74174(u66, ndot, u67.OUTA, u67.OUTB, u67.OUTC, u67.OUTD, u57.OUTA, u57.OUTB, high)
220 	TTL_74175(u56, ndot, u57.OUTC, clr_vid_sr, u79_1.Q, u57.OUTD, high)
221 	TTL_7400_NAND(u79_1, u56.Q4, clr_vid_sr)
222 	ALIAS(fgbit_q, u56.Q3Q)
223 
224 	EPROM_2716(u78, low, low, lc20, lc21, lc22, lc23, u66.Q1, u66.Q2, u66.Q3, u66.Q4, u66.Q5, u66.Q6, u56.Q1)
225 	PARAM(u78.ROM, "u83_chr.bin")
226 
227 	// The eprom is always enabled and outputs are only connected to logic inputs
228 	PARAM(u78.FORCE_TRISTATE_LOGIC, 1)
229 
230 	TTL_74166(u77, video_clk, low, ndot, low, u78.O0, u78.O1, u78.O2, u78.O3, u78.O4, u78.O5, u78.O6, low, clr_vid_sr)
231 	ALIAS(raw_dot, u77.QH)
232 
233 	TTL_7400_NAND(u79_4, fgbit_q, fgbit_q)
234 	ALIAS(highlight, u79_4.Q)
235 
236 	ALIAS(video_out, raw_dot)
237 
238 	/* Highlight and contrast - not yet hooked up */
239 	RES(R40, 160)
240 	RES(R41, 270)
241 	POT(R21_POT, 500)
242 
243 	NET_C(R40.1, V5)
244 	NET_C(R40.2, R21_POT.1)
245 	NET_C(raw_dot, R21_POT.1)
246 	NET_C(highlight, R41.1)
247 	NET_C(R41.2, R21_POT.1)
248 
249 	NET_C(R21_POT.3, GND)
250 	NET_C(R21_POT.2, GND)
251 
252 	NET_C(VCC, high.VCC, low.VCC, cpu_ba4.VCC, cpu_iowq.VCC, ba13.VCC, memwq.VCC, rwq.VCC, mrq.VCC,
253 		cpu_db0.VCC, cpu_db1.VCC, cpu_db2.VCC, cpu_db3.VCC, cpu_db4.VCC, cpu_db5.VCC, cpu_db6.VCC, cpu_db7.VCC)
254 	NET_C(GND, high.GND, low.GND, cpu_ba4.GND, cpu_iowq.GND, ba13.GND, memwq.GND, rwq.GND, mrq.GND,
255 		cpu_db0.GND, cpu_db1.GND, cpu_db2.GND, cpu_db3.GND, cpu_db4.GND, cpu_db5.GND, cpu_db6.GND, cpu_db7.GND)
256 
257 NETLIST_END()
258