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