1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     Victor 9000 / ACT Sirius 1 emulation
6 
7 **********************************************************************/
8 
9 /*
10 
11     TODO:
12 
13     - contrast
14     - MC6852
15     - codec sound
16     - expansion bus
17         - Z80 card
18         - Winchester DMA card (Xebec S1410 + Tandon TM502/TM603SE)
19         - RAM cards
20         - clock cards
21     - floppy 8048
22 
23 */
24 
25 #include "emu.h"
26 #include "bus/centronics/ctronics.h"
27 #include "bus/ieee488/ieee488.h"
28 #include "bus/rs232/rs232.h"
29 #include "cpu/i86/i86.h"
30 #include "formats/victor9k_dsk.h"
31 #include "imagedev/floppy.h"
32 #include "machine/6522via.h"
33 #include "machine/mc6852.h"
34 #include "machine/pit8253.h"
35 #include "machine/pic8259.h"
36 #include "machine/ram.h"
37 #include "machine/victor9k_kb.h"
38 #include "machine/victor9k_fdc.h"
39 #include "machine/z80sio.h"
40 #include "sound/hc55516.h"
41 #include "video/mc6845.h"
42 #include "emupal.h"
43 #include "screen.h"
44 #include "softlist.h"
45 #include "speaker.h"
46 
47 #define I8088_TAG       "8l"
48 #define I8253_TAG       "13h"
49 #define I8259A_TAG      "7l"
50 #define UPD7201_TAG     "16e"
51 #define HD46505S_TAG    "11a"
52 #define MC6852_TAG      "11b"
53 #define HC55516_TAG     "15c"
54 #define M6522_1_TAG     "m6522_1"
55 #define M6522_2_TAG     "m6522_2"
56 #define M6522_3_TAG     "14l"
57 #define DAC0808_0_TAG   "5b"
58 #define DAC0808_1_TAG   "5c"
59 #define RS232_A_TAG     "rs232a"
60 #define RS232_B_TAG     "rs232b"
61 #define SCREEN_TAG      "screen"
62 #define KB_TAG          "kb"
63 
64 class victor9k_state : public driver_device
65 {
66 public:
victor9k_state(const machine_config & mconfig,device_type type,const char * tag)67 	victor9k_state(const machine_config &mconfig, device_type type, const char *tag) :
68 		driver_device(mconfig, type, tag),
69 		m_maincpu(*this, I8088_TAG),
70 		m_ieee488(*this, IEEE488_TAG),
71 		m_pic(*this, I8259A_TAG),
72 		m_upd7201(*this, UPD7201_TAG),
73 		m_ssda(*this, MC6852_TAG),
74 		m_via1(*this, M6522_1_TAG),
75 		m_via2(*this, M6522_2_TAG),
76 		m_via3(*this, M6522_3_TAG),
77 		m_cvsd(*this, HC55516_TAG),
78 		m_crtc(*this, HD46505S_TAG),
79 		m_ram(*this, RAM_TAG),
80 		m_kb(*this, KB_TAG),
81 		m_fdc(*this, "fdc"),
82 		m_centronics(*this, "centronics"),
83 		m_rs232a(*this, RS232_A_TAG),
84 		m_rs232b(*this, RS232_B_TAG),
85 		m_palette(*this, "palette"),
86 		m_rom(*this, I8088_TAG),
87 		m_video_ram(*this, "video_ram"),
88 		m_brt(0),
89 		m_cont(0),
90 		m_via1_irq(CLEAR_LINE),
91 		m_via2_irq(CLEAR_LINE),
92 		m_via3_irq(CLEAR_LINE),
93 		m_fdc_irq(CLEAR_LINE),
94 		m_ssda_irq(CLEAR_LINE),
95 		m_kbrdy(1),
96 		m_kbackctl(0)
97 	{ }
98 
99 	void victor9k(machine_config &config);
100 
101 private:
102 	required_device<cpu_device> m_maincpu;
103 	required_device<ieee488_device> m_ieee488;
104 	required_device<pic8259_device> m_pic;
105 	required_device<upd7201_device> m_upd7201;
106 	required_device<mc6852_device> m_ssda;
107 	required_device<via6522_device> m_via1;
108 	required_device<via6522_device> m_via2;
109 	required_device<via6522_device> m_via3;
110 	required_device<hc55516_device> m_cvsd;
111 	required_device<mc6845_device> m_crtc;
112 	required_device<ram_device> m_ram;
113 	required_device<victor_9000_keyboard_device> m_kb;
114 	required_device<victor_9000_fdc_device> m_fdc;
115 	required_device<centronics_device> m_centronics;
116 	required_device<rs232_port_device> m_rs232a;
117 	required_device<rs232_port_device> m_rs232b;
118 	required_device<palette_device> m_palette;
119 	required_memory_region m_rom;
120 	required_shared_ptr<uint8_t> m_video_ram;
121 
122 	virtual void machine_start() override;
123 	virtual void machine_reset() override;
124 
125 	void via1_pa_w(uint8_t data);
126 	DECLARE_WRITE_LINE_MEMBER( write_nfrd );
127 	DECLARE_WRITE_LINE_MEMBER( write_ndac );
128 	void via1_pb_w(uint8_t data);
129 	DECLARE_WRITE_LINE_MEMBER( via1_irq_w );
130 	DECLARE_WRITE_LINE_MEMBER( codec_vol_w );
131 
132 	void via2_pa_w(uint8_t data);
133 	void via2_pb_w(uint8_t data);
134 	DECLARE_WRITE_LINE_MEMBER( via2_irq_w );
135 
136 	void via3_pb_w(uint8_t data);
137 	DECLARE_WRITE_LINE_MEMBER( via3_irq_w );
138 
139 	DECLARE_WRITE_LINE_MEMBER( fdc_irq_w );
140 
141 	DECLARE_WRITE_LINE_MEMBER( ssda_irq_w );
142 	DECLARE_WRITE_LINE_MEMBER( ssda_sm_dtr_w );
143 
144 	DECLARE_WRITE_LINE_MEMBER( kbrdy_w );
145 	DECLARE_WRITE_LINE_MEMBER( kbdata_w );
146 	DECLARE_WRITE_LINE_MEMBER( vert_w );
147 
148 	MC6845_UPDATE_ROW( crtc_update_row );
149 
150 	DECLARE_WRITE_LINE_MEMBER( mux_serial_b_w );
151 	DECLARE_WRITE_LINE_MEMBER( mux_serial_a_w );
152 
153 	void victor9k_palette(palette_device &palette) const;
154 
155 	// video state
156 	int m_brt;
157 	int m_cont;
158 	int m_hires;
159 
160 	// interrupts
161 	int m_via1_irq;
162 	int m_via2_irq;
163 	int m_via3_irq;
164 	int m_fdc_irq;
165 	int m_ssda_irq;
166 
167 	// keyboard
168 	int m_kbrdy;
169 	int m_kbackctl;
170 
171 	void update_kback();
172 
173 	void victor9k_mem(address_map &map);
174 };
175 
176 
177 
178 //**************************************************************************
179 //  MACROS / CONSTANTS
180 //**************************************************************************
181 
182 #define LOG 0
183 
184 
185 
186 //**************************************************************************
187 //  ADDRESS MAPS
188 //**************************************************************************
189 
190 //-------------------------------------------------
191 //  ADDRESS_MAP( victor9k_mem )
192 //-------------------------------------------------
193 
victor9k_mem(address_map & map)194 void victor9k_state::victor9k_mem(address_map &map)
195 {
196 	map(0x00000, 0x1ffff).ram();
197 	map(0x20000, 0xdffff).noprw();
198 	map(0xe0000, 0xe0001).mirror(0x7f00).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
199 	map(0xe0020, 0xe0023).mirror(0x7f00).rw(I8253_TAG, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
200 	map(0xe0040, 0xe0043).mirror(0x7f00).rw(m_upd7201, FUNC(upd7201_device::cd_ba_r), FUNC(upd7201_device::cd_ba_w));
201 	map(0xe8000, 0xe8000).mirror(0x7f00).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w));
202 	map(0xe8001, 0xe8001).mirror(0x7f00).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
203 	map(0xe8020, 0xe802f).mirror(0x7f00).m(m_via1, FUNC(via6522_device::map));
204 	map(0xe8040, 0xe804f).mirror(0x7f00).m(m_via2, FUNC(via6522_device::map));
205 	map(0xe8060, 0xe8061).mirror(0x7f00).rw(m_ssda, FUNC(mc6852_device::read), FUNC(mc6852_device::write));
206 	map(0xe8080, 0xe808f).mirror(0x7f00).m(m_via3, FUNC(via6522_device::map));
207 	map(0xe80a0, 0xe80af).mirror(0x7f00).rw(m_fdc, FUNC(victor_9000_fdc_device::cs5_r), FUNC(victor_9000_fdc_device::cs5_w));
208 	map(0xe80c0, 0xe80cf).mirror(0x7f00).rw(m_fdc, FUNC(victor_9000_fdc_device::cs6_r), FUNC(victor_9000_fdc_device::cs6_w));
209 	map(0xe80e0, 0xe80ef).mirror(0x7f00).rw(m_fdc, FUNC(victor_9000_fdc_device::cs7_r), FUNC(victor_9000_fdc_device::cs7_w));
210 	map(0xf0000, 0xf0fff).mirror(0x1000).ram().share("video_ram");
211 	map(0xf8000, 0xf9fff).mirror(0x6000).rom().region(I8088_TAG, 0);
212 }
213 
214 
215 
216 //**************************************************************************
217 //  INPUT PORTS
218 //**************************************************************************
219 
220 //-------------------------------------------------
221 //  INPUT_PORTS( victor9k )
222 //-------------------------------------------------
223 
INPUT_PORTS_START(victor9k)224 static INPUT_PORTS_START( victor9k )
225 	// defined in machine/victor9kb.c
226 INPUT_PORTS_END
227 
228 
229 
230 //**************************************************************************
231 //  DEVICE CONFIGURATION
232 //**************************************************************************
233 
234 //-------------------------------------------------
235 //  MC6845
236 //-------------------------------------------------
237 
238 #define DC_SECRET   0x1000
239 #define DC_UNDLN    0x2000
240 #define DC_LOWINT   0x4000
241 #define DC_RVS      0x8000
242 
243 MC6845_UPDATE_ROW( victor9k_state::crtc_update_row )
244 {
245 	int hires = BIT(ma, 13);
246 	int dot_addr = BIT(ma, 12);
247 	int width = hires ? 16 : 10;
248 
249 	if (m_hires != hires)
250 	{
251 		m_hires = hires;
252 		m_crtc->set_unscaled_clock(XTAL(30'000'000) / width);
253 		m_crtc->set_hpixels_per_column(width);
254 	}
255 
256 	address_space &program = m_maincpu->space(AS_PROGRAM);
257 	const rgb_t *palette = m_palette->palette()->entry_list_raw();
258 
259 	int x = hbp;
260 
261 	offs_t aa = (ma & 0x7ff) << 1;
262 
263 	for (int sx = 0; sx < x_count; sx++)
264 	{
265 		uint16_t dc = (m_video_ram[aa + 1] << 8) | m_video_ram[aa];
266 		offs_t ab = (dot_addr << 15) | ((dc & 0x7ff) << 4) | (ra & 0x0f);
267 		uint16_t dd = program.read_word(ab << 1);
268 
269 		int cursor = (sx == cursor_x) ? 1 : 0;
270 		int undln = !((dc & DC_UNDLN) && BIT(dd, 15)) ? 2 : 0;
271 		int rvs = (dc & DC_RVS) ? 4 : 0;
272 		int secret = (dc & DC_SECRET) ? 1 : 0;
273 		int lowint = (dc & DC_LOWINT) ? 1 : 0;
274 
275 		for (int bit = 0; bit < width; bit++)
276 		{
277 			int pixel = 0;
278 
279 			switch (rvs | undln | cursor)
280 			{
281 			case 0: case 5:
282 				pixel = 1;
283 				break;
284 
285 			case 1: case 4:
286 				pixel = 0;
287 				break;
288 
289 			case 2: case 7:
290 				pixel = !(!(BIT(dd, bit) && !secret));
291 				break;
292 
293 			case 3: case 6:
294 				pixel = !(BIT(dd, bit) && !secret);
295 				break;
296 			}
297 
298 			int color = 0;
299 
300 			if (pixel && de)
301 			{
302 				int pen = 1 + m_brt;
303 				if (!lowint) pen = 9;
304 				color = palette[pen];
305 			}
306 
307 			bitmap.pix(vbp + y, x++) = color;
308 		}
309 
310 		aa += 2;
311 		aa &= 0xfff;
312 	}
313 }
314 
WRITE_LINE_MEMBER(victor9k_state::vert_w)315 WRITE_LINE_MEMBER(victor9k_state::vert_w)
316 {
317 	m_via2->write_pa7(state);
318 	m_pic->ir7_w(state);
319 }
320 
321 
322 
WRITE_LINE_MEMBER(victor9k_state::mux_serial_b_w)323 WRITE_LINE_MEMBER(victor9k_state::mux_serial_b_w)
324 {
325 }
326 
WRITE_LINE_MEMBER(victor9k_state::mux_serial_a_w)327 WRITE_LINE_MEMBER(victor9k_state::mux_serial_a_w)
328 {
329 }
330 
331 //-------------------------------------------------
332 //  PIC8259
333 //-------------------------------------------------
334 
335 /*
336 
337     pin     signal      description
338 
339     IR0     SYN         sync detect
340     IR1     COMM        serial communications (7201)
341     IR2     TIMER       8253 timer
342     IR3     PARALLEL    all 6522 IRQ (including disk)
343     IR4     IR4         expansion IR4
344     IR5     IR5         expansion IR5
345     IR6     KBINT       keyboard data ready
346     IR7     VINT        vertical sync or nonspecific interrupt
347 
348 */
349 
350 //-------------------------------------------------
351 //  MC6852_INTERFACE( ssda_intf )
352 //-------------------------------------------------
353 
WRITE_LINE_MEMBER(victor9k_state::ssda_irq_w)354 WRITE_LINE_MEMBER( victor9k_state::ssda_irq_w )
355 {
356 	m_ssda_irq = state;
357 
358 	m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via3_irq || m_fdc_irq);
359 }
360 
361 
WRITE_LINE_MEMBER(victor9k_state::ssda_sm_dtr_w)362 WRITE_LINE_MEMBER( victor9k_state::ssda_sm_dtr_w )
363 {
364 	m_ssda->cts_w(state);
365 	m_ssda->dcd_w(!state);
366 	//m_cvsd->enc_dec_w(!state);
367 }
368 
369 
via1_pa_w(uint8_t data)370 void victor9k_state::via1_pa_w(uint8_t data)
371 {
372 	/*
373 
374 	    bit     description
375 
376 	    PA0     DIO1
377 	    PA1     DIO2
378 	    PA2     DIO3
379 	    PA3     DIO4
380 	    PA4     DIO5
381 	    PA5     DIO6
382 	    PA6     DIO7
383 	    PA7     DIO8
384 
385 	*/
386 
387 	// centronics
388 	m_centronics->write_data0(BIT(data, 0));
389 	m_centronics->write_data1(BIT(data, 1));
390 	m_centronics->write_data2(BIT(data, 2));
391 	m_centronics->write_data3(BIT(data, 3));
392 	m_centronics->write_data4(BIT(data, 4));
393 	m_centronics->write_data5(BIT(data, 5));
394 	m_centronics->write_data6(BIT(data, 6));
395 	m_centronics->write_data7(BIT(data, 7));
396 
397 	// IEEE-488
398 	m_ieee488->host_dio_w(data);
399 }
400 
DECLARE_WRITE_LINE_MEMBER(victor9k_state::write_nfrd)401 DECLARE_WRITE_LINE_MEMBER( victor9k_state::write_nfrd )
402 {
403 	m_via1->write_pb6(state);
404 	m_via1->write_ca1(state);
405 }
406 
DECLARE_WRITE_LINE_MEMBER(victor9k_state::write_ndac)407 DECLARE_WRITE_LINE_MEMBER( victor9k_state::write_ndac )
408 {
409 	m_via1->write_pb7(state);
410 	m_via1->write_ca2(state);
411 }
412 
via1_pb_w(uint8_t data)413 void victor9k_state::via1_pb_w(uint8_t data)
414 {
415 	/*
416 
417 	    bit     description
418 
419 	    PB0     STROBE/DAV
420 	    PB1     PI/EOI
421 	    PB2     REN
422 	    PB3     ATN
423 	    PB4     IFC
424 	    PB5     SRQ/BUSY SRQ
425 	    PB6     NRFD/ACK RFD
426 	    PB7     SEL/DAC
427 
428 	*/
429 
430 	// centronics
431 	m_centronics->write_strobe(BIT(data, 0));
432 
433 	// IEEE-488
434 	m_ieee488->host_dav_w(BIT(data, 0));
435 	m_ieee488->host_eoi_w(BIT(data, 1));
436 	m_ieee488->host_ren_w(BIT(data, 2));
437 	m_ieee488->host_atn_w(BIT(data, 3));
438 	m_ieee488->host_ifc_w(BIT(data, 4));
439 	m_ieee488->host_srq_w(BIT(data, 5));
440 	m_ieee488->host_nrfd_w(BIT(data, 6));
441 	m_ieee488->host_ndac_w(BIT(data, 7));
442 }
443 
WRITE_LINE_MEMBER(victor9k_state::codec_vol_w)444 WRITE_LINE_MEMBER( victor9k_state::codec_vol_w )
445 {
446 }
447 
WRITE_LINE_MEMBER(victor9k_state::via1_irq_w)448 WRITE_LINE_MEMBER( victor9k_state::via1_irq_w )
449 {
450 	m_via1_irq = state;
451 
452 	m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via3_irq || m_fdc_irq);
453 }
454 
via2_pa_w(uint8_t data)455 void victor9k_state::via2_pa_w(uint8_t data)
456 {
457 	/*
458 
459 	    bit     description
460 
461 	    PA0     _INT/EXTA
462 	    PA1     _INT/EXTB
463 	    PA2
464 	    PA3
465 	    PA4
466 	    PA5
467 	    PA6
468 	    PA7
469 
470 	*/
471 }
472 
update_kback()473 void victor9k_state::update_kback()
474 {
475 	int kback = !(!(m_kbrdy && !m_via2_irq) && !(m_kbackctl && m_via2_irq));
476 
477 	m_kb->kback_w(kback);
478 }
479 
via2_pb_w(uint8_t data)480 void victor9k_state::via2_pb_w(uint8_t data)
481 {
482 	/*
483 
484 	    bit     description
485 
486 	    PB0     TALK/LISTEN
487 	    PB1     KBACKCTL
488 	    PB2     BRT0
489 	    PB3     BRT1
490 	    PB4     BRT2
491 	    PB5     CONT0
492 	    PB6     CONT1
493 	    PB7     CONT2
494 
495 	*/
496 
497 	// keyboard acknowledge
498 	m_kbackctl = BIT(data, 1);
499 	update_kback();
500 
501 	// brightness
502 	m_brt = (data >> 2) & 0x07;
503 
504 	// contrast
505 	m_cont = data >> 5;
506 
507 	if (LOG) logerror("BRT %u CONT %u\n", m_brt, m_cont);
508 }
509 
WRITE_LINE_MEMBER(victor9k_state::via2_irq_w)510 WRITE_LINE_MEMBER( victor9k_state::via2_irq_w )
511 {
512 	m_via2_irq = state;
513 
514 	m_pic->ir6_w(m_via2_irq);
515 	update_kback();
516 }
517 
518 
519 /*
520     bit    description
521 
522     PA0    J5-16
523     PA1    J5-18
524     PA2    J5-20
525     PA3    J5-22
526     PA4    J5-24
527     PA5    J5-26
528     PA6    J5-28
529     PA7    J5-30
530     PB0    J5-32
531     PB1    J5-34
532     PB2    J5-36
533     PB3    J5-38
534     PB4    J5-40
535     PB5    J5-42
536     PB6    J5-44
537     PB7    J5-46
538     CA1    J5-12
539     CB1    J5-48
540     CA2    J5-14
541     CB2    J5-50
542 */
543 
via3_pb_w(uint8_t data)544 void victor9k_state::via3_pb_w(uint8_t data)
545 {
546 	// codec clock output
547 	m_ssda->rx_clk_w(!BIT(data, 7));
548 	m_ssda->tx_clk_w(!BIT(data, 7));
549 	m_cvsd->clock_w(!BIT(data, 7));
550 }
551 
WRITE_LINE_MEMBER(victor9k_state::via3_irq_w)552 WRITE_LINE_MEMBER( victor9k_state::via3_irq_w )
553 {
554 	m_via3_irq = state;
555 
556 	m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via3_irq || m_fdc_irq);
557 }
558 
559 
560 //-------------------------------------------------
561 //  VICTOR9K_KEYBOARD_INTERFACE( kb_intf )
562 //-------------------------------------------------
563 
WRITE_LINE_MEMBER(victor9k_state::kbrdy_w)564 WRITE_LINE_MEMBER( victor9k_state::kbrdy_w )
565 {
566 	if (LOG) logerror("KBRDY %u\n", state);
567 
568 	m_via2->write_cb1(state);
569 
570 	m_kbrdy = state;
571 	update_kback();
572 }
573 
WRITE_LINE_MEMBER(victor9k_state::kbdata_w)574 WRITE_LINE_MEMBER( victor9k_state::kbdata_w )
575 {
576 	if (LOG) logerror("KBDATA %u\n", state);
577 
578 	m_via2->write_cb2(state);
579 	m_via2->write_pa6(state);
580 }
581 
582 
WRITE_LINE_MEMBER(victor9k_state::fdc_irq_w)583 WRITE_LINE_MEMBER( victor9k_state::fdc_irq_w )
584 {
585 	m_fdc_irq = state;
586 
587 	m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via3_irq || m_fdc_irq);
588 }
589 
590 
591 //**************************************************************************
592 //  MACHINE INITIALIZATION
593 //**************************************************************************
594 
victor9k_palette(palette_device & palette) const595 void victor9k_state::victor9k_palette(palette_device &palette) const
596 {
597 	palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00));
598 
599 	// BRT0 82K
600 	// BRT1 39K
601 	// BRT2 20K
602 	// 12V 220K pullup
603 	palette.set_pen_color(1, rgb_t(0x00, 0x10, 0x00));
604 	palette.set_pen_color(2, rgb_t(0x00, 0x20, 0x00));
605 	palette.set_pen_color(3, rgb_t(0x00, 0x40, 0x00));
606 	palette.set_pen_color(4, rgb_t(0x00, 0x60, 0x00));
607 	palette.set_pen_color(5, rgb_t(0x00, 0x80, 0x00));
608 	palette.set_pen_color(6, rgb_t(0x00, 0xa0, 0x00));
609 	palette.set_pen_color(7, rgb_t(0x00, 0xc0, 0x00));
610 	palette.set_pen_color(8, rgb_t(0x00, 0xff, 0x00));
611 
612 	// CONT0 620R
613 	// CONT1 332R
614 	// CONT2 162R
615 	// 12V 110R pullup
616 	palette.set_pen_color(9, rgb_t(0xff, 0x00, 0x00));
617 }
618 
machine_start()619 void victor9k_state::machine_start()
620 {
621 	// state saving
622 	save_item(NAME(m_brt));
623 	save_item(NAME(m_cont));
624 	save_item(NAME(m_via1_irq));
625 	save_item(NAME(m_via2_irq));
626 	save_item(NAME(m_via3_irq));
627 	save_item(NAME(m_fdc_irq));
628 	save_item(NAME(m_ssda_irq));
629 	save_item(NAME(m_kbrdy));
630 	save_item(NAME(m_kbackctl));
631 
632 #ifndef USE_SCP
633 	// patch out SCP self test
634 	m_rom->base()[0x11ab] = 0xc3;
635 
636 	// patch out ROM checksum error
637 	m_rom->base()[0x1d51] = 0x90;
638 	m_rom->base()[0x1d52] = 0x90;
639 	m_rom->base()[0x1d53] = 0x90;
640 	m_rom->base()[0x1d54] = 0x90;
641 #endif
642 }
643 
machine_reset()644 void victor9k_state::machine_reset()
645 {
646 	m_maincpu->reset();
647 	m_upd7201->reset();
648 	m_ssda->reset();
649 	m_via1->reset();
650 	m_via2->reset();
651 	m_via3->reset();
652 	m_crtc->reset();
653 	m_fdc->reset();
654 }
655 
656 
657 
658 //**************************************************************************
659 //  MACHINE CONFIGURATION
660 //**************************************************************************
661 
662 //-------------------------------------------------
663 //  machine_config( victor9k )
664 //-------------------------------------------------
665 
victor9k(machine_config & config)666 void victor9k_state::victor9k(machine_config &config)
667 {
668 	// basic machine hardware
669 	I8088(config, m_maincpu, XTAL(30'000'000)/6);
670 	m_maincpu->set_addrmap(AS_PROGRAM, &victor9k_state::victor9k_mem);
671 	m_maincpu->set_irq_acknowledge_callback(I8259A_TAG, FUNC(pic8259_device::inta_cb));
672 
673 	// video hardware
674 	screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
675 	screen.set_color(rgb_t::green());
676 	screen.set_refresh_hz(50);
677 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
678 	screen.set_screen_update(HD46505S_TAG, FUNC(hd6845s_device::screen_update));
679 	screen.set_size(640, 480);
680 	screen.set_visarea(0, 640-1, 0, 480-1);
681 
682 	PALETTE(config, m_palette, FUNC(victor9k_state::victor9k_palette), 16);
683 
684 	HD6845S(config, m_crtc, XTAL(30'000'000)/10); // HD6845 == HD46505S
685 	m_crtc->set_screen(SCREEN_TAG);
686 	m_crtc->set_show_border_area(true);
687 	m_crtc->set_char_width(10);
688 	m_crtc->set_update_row_callback(FUNC(victor9k_state::crtc_update_row));
689 	m_crtc->out_vsync_callback().set(FUNC(victor9k_state::vert_w));
690 
691 	// sound hardware
692 	SPEAKER(config, "mono").front_center();
693 	HC55516(config, m_cvsd, 0);
694 	//MCFG_HC55516_DIG_OUT_CB(WRITELINE(MC6852_TAG, mc6852_device, rx_w))
695 	m_cvsd->add_route(ALL_OUTPUTS, "mono", 0.25);
696 
697 	// devices
698 	IEEE488(config, m_ieee488, 0);
699 
700 	m_ieee488->dav_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb0));
701 	m_ieee488->eoi_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb1));
702 	m_ieee488->ren_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb2));
703 	m_ieee488->atn_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb3));
704 	m_ieee488->ifc_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb4));
705 	m_ieee488->srq_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb5));
706 	m_ieee488->nrfd_callback().set(FUNC(victor9k_state::write_nfrd));
707 	m_ieee488->ndac_callback().set(FUNC(victor9k_state::write_ndac));
708 
709 	PIC8259(config, m_pic, 0);
710 	m_pic->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
711 
712 	pit8253_device &pit(PIT8253(config, I8253_TAG, 0));
713 	pit.set_clk<0>(2500000);
714 	pit.out_handler<0>().set(FUNC(victor9k_state::mux_serial_b_w));
715 	pit.set_clk<1>(2500000);
716 	pit.out_handler<1>().set(FUNC(victor9k_state::mux_serial_a_w));
717 	pit.set_clk<2>(100000);
718 	pit.out_handler<2>().set(I8259A_TAG, FUNC(pic8259_device::ir2_w));
719 
720 	UPD7201(config, m_upd7201, XTAL(30'000'000)/30);
721 	m_upd7201->out_txda_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_txd));
722 	m_upd7201->out_dtra_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_dtr));
723 	m_upd7201->out_rtsa_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_rts));
724 	m_upd7201->out_txdb_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_txd));
725 	m_upd7201->out_dtrb_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_dtr));
726 	m_upd7201->out_rtsb_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_rts));
727 	m_upd7201->out_int_callback().set(I8259A_TAG, FUNC(pic8259_device::ir1_w));
728 
729 	MC6852(config, m_ssda, XTAL(30'000'000)/30);
730 	m_ssda->tx_data_callback().set(HC55516_TAG, FUNC(hc55516_device::digit_w));
731 	m_ssda->sm_dtr_callback().set(FUNC(victor9k_state::ssda_sm_dtr_w));
732 	m_ssda->irq_callback().set(FUNC(victor9k_state::ssda_irq_w));
733 
734 	VIA6522(config, m_via1, XTAL(30'000'000)/30);
735 	m_via1->readpa_handler().set(IEEE488_TAG, FUNC(ieee488_device::dio_r));
736 	m_via1->writepa_handler().set(FUNC(victor9k_state::via1_pa_w));
737 	m_via1->writepb_handler().set(FUNC(victor9k_state::via1_pb_w));
738 	m_via1->cb2_handler().set(FUNC(victor9k_state::codec_vol_w));
739 	m_via1->irq_handler().set(FUNC(victor9k_state::via1_irq_w));
740 
741 	VIA6522(config, m_via2, XTAL(30'000'000)/30);
742 	m_via2->writepa_handler().set(FUNC(victor9k_state::via2_pa_w));
743 	m_via2->writepb_handler().set(FUNC(victor9k_state::via2_pb_w));
744 	m_via2->irq_handler().set(FUNC(victor9k_state::via2_irq_w));
745 
746 	VIA6522(config, m_via3, XTAL(30'000'000)/30);
747 	m_via3->writepb_handler().set(FUNC(victor9k_state::via3_pb_w));
748 	m_via3->irq_handler().set(FUNC(victor9k_state::via3_irq_w));
749 
750 	CENTRONICS(config, m_centronics, centronics_devices, "printer");
751 	m_centronics->busy_handler().set(M6522_1_TAG, FUNC(via6522_device::write_pb5));
752 	m_centronics->ack_handler().set(M6522_1_TAG, FUNC(via6522_device::write_pb6));
753 	m_centronics->select_handler().set(M6522_1_TAG, FUNC(via6522_device::write_pb7));
754 
755 	RS232_PORT(config, m_rs232a, default_rs232_devices, nullptr);
756 	m_rs232a->rxd_handler().set(m_upd7201, FUNC(upd7201_device::rxa_w));
757 	m_rs232a->dcd_handler().set(m_upd7201, FUNC(upd7201_device::dcda_w));
758 	m_rs232a->ri_handler().set(m_via2, FUNC(via6522_device::write_pa2));
759 	m_rs232a->cts_handler().set(m_upd7201, FUNC(upd7201_device::ctsa_w));
760 	m_rs232a->dsr_handler().set(m_via2, FUNC(via6522_device::write_pa3));
761 
762 	RS232_PORT(config, m_rs232b, default_rs232_devices, nullptr);
763 	m_rs232b->rxd_handler().set(m_upd7201, FUNC(upd7201_device::rxb_w));
764 	m_rs232b->dcd_handler().set(m_upd7201, FUNC(upd7201_device::dcdb_w));
765 	m_rs232b->ri_handler().set(m_via2, FUNC(via6522_device::write_pa4));
766 	m_rs232b->cts_handler().set(m_upd7201, FUNC(upd7201_device::ctsb_w));
767 	m_rs232b->dsr_handler().set(m_via2, FUNC(via6522_device::write_pa5));
768 
769 	VICTOR9K_KEYBOARD(config, m_kb, 0);
770 	m_kb->kbrdy_handler().set(FUNC(victor9k_state::kbrdy_w));
771 	m_kb->kbdata_handler().set(FUNC(victor9k_state::kbdata_w));
772 
773 	VICTOR_9000_FDC(config, m_fdc, 0);
774 	m_fdc->irq_wr_callback().set(FUNC(victor9k_state::fdc_irq_w));
775 	m_fdc->syn_wr_callback().set(I8259A_TAG, FUNC(pic8259_device::ir0_w)).invert();
776 	m_fdc->lbrdy_wr_callback().set_inputline(I8088_TAG, INPUT_LINE_TEST).invert();
777 
778 	RAM(config, m_ram).set_default_size("128K");
779 
780 	SOFTWARE_LIST(config, "flop_list").set_original("victor9k_flop");
781 }
782 
783 
784 
785 //**************************************************************************
786 //  ROMS
787 //**************************************************************************
788 
789 //-------------------------------------------------
790 //  ROM( victor9k )
791 //-------------------------------------------------
792 
793 ROM_START( victor9k )
794 	ROM_REGION( 0x2000, I8088_TAG, 0 )
795 	ROM_DEFAULT_BIOS( "univ" )
796 	ROM_SYSTEM_BIOS( 0, "old", "Older" )
797 	ROMX_LOAD( "102320.7j", 0x0000, 0x1000, CRC(3d615fd7) SHA1(b22f7e5d66404185395d8effbf57efded0079a92), ROM_BIOS(0) )
798 	ROMX_LOAD( "102322.8j", 0x1000, 0x1000, CRC(9209df0e) SHA1(3ee8e0c15186bbd5768b550ecc1fa3b6b1dbb928), ROM_BIOS(0) )
799 	ROM_SYSTEM_BIOS( 1, "univ", "Universal" )
800 	ROMX_LOAD( "v9000 univ. fe f3f7 13db.7j", 0x0000, 0x1000, CRC(25c7a59f) SHA1(8784e9aa7eb9439f81e18b8e223c94714e033911), ROM_BIOS(1) )
801 	ROMX_LOAD( "v9000 univ. ff f3f7 39fe.8j", 0x1000, 0x1000, CRC(496c7467) SHA1(eccf428f62ef94ab85f4a43ba59ae6a066244a66), ROM_BIOS(1) )
802 ROM_END
803 
804 
805 
806 //**************************************************************************
807 //  SYSTEM DRIVERS
808 //**************************************************************************
809 
810 //    YEAR  NAME      PARENT  COMPAT  MACHINE   INPUT     CLASS           INIT        COMPANY                     FULLNAME       FLAGS
811 COMP( 1982, victor9k, 0,      0,      victor9k, victor9k, victor9k_state, empty_init, "Victor Business Products", "Victor 9000", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
812