1 // license:BSD-3-Clause
2 // copyright-holders:Miodrag Milanovic, Robbbert, Sergey Svishchev
3 /***************************************************************************
4 
5         Robotron PC-1715
6 
7         10/06/2008 Preliminary driver.
8 
9     Notes:
10     - keyboard connected to sio channel a
11     - sio channel a clock output connected to ctc trigger 0
12     - memory map not 100% clear
13     - rt1715w: SCP3 boot loops while executing PROFILE.SUB
14 
15     Docs:
16     - http://www.robotrontechnik.de/html/computer/pc1715w.htm
17     - https://www.tiffe.de/Robotron/PC1715/ -- scanned PDFs
18       https://www.tiffe.de/Robotron/PC1715/MANUAL_PC_1715.pdf
19     - http://www.sax.de/~zander/pc1715/pc_bw.html -- typeset PDFs
20       http://www.sax.de/~zander/pc1715/doku/pc_manu.pdf
21     - http://xepb.org/robotron/
22 
23 ****************************************************************************/
24 
25 #include "emu.h"
26 #include "cpu/z80/z80.h"
27 #include "imagedev/floppy.h"
28 #include "machine/ram.h"
29 #include "machine/upd765.h"
30 #include "machine/z80ctc.h"
31 #include "machine/z80sio.h"
32 #include "machine/z80dma.h"
33 #include "machine/z80pio.h"
34 #include "video/i8275.h"
35 
36 #include "bus/rs232/rs232.h"
37 #include "machine/keyboard.h"
38 
39 #include "emupal.h"
40 #include "screen.h"
41 
42 
43 #define LOG_BANK    (1U <<  1)
44 
45 #define VERBOSE (LOG_GENERAL)
46 //#define LOG_OUTPUT_FUNC osd_printf_info
47 #include "logmacro.h"
48 
49 #define LOGBANK(format, ...)    LOGMASKED(LOG_BANK,   "%11.6f at %s: " format, machine().time().as_double(), machine().describe_context(), __VA_ARGS__)
50 
51 
52 class rt1715_state : public driver_device
53 {
54 public:
rt1715_state(const machine_config & mconfig,device_type type,const char * tag)55 	rt1715_state(const machine_config &mconfig, device_type type, const char *tag)
56 		: driver_device(mconfig, type, tag)
57 		, m_maincpu(*this, "maincpu")
58 		, m_ram(*this, RAM_TAG)
59 		, m_sio0(*this, "sio0")
60 		, m_ctc0(*this, "ctc0")
61 		, m_printer(*this, "printer")
62 		, m_rs232(*this, "rs232")
63 		, m_fdc(*this, "i8272")
64 		, m_floppy(*this, "i8272:%u", 0U)
65 		, m_dma(*this, "z80dma")
66 		, m_ctc2(*this, "ctc2")
67 		, m_screen(*this, "screen")
68 		, m_palette(*this, "palette")
69 		, m_crtc(*this, "i8275")
70 		, m_p_chargen(*this, "gfx")
71 		, m_videoram(*this, "videoram")
72 		, m_p_cas(*this, "prom")
73 	{
74 	}
75 
76 	void rt1715(machine_config &config);
77 	void rt1715w(machine_config &config);
78 
79 private:
80 	uint8_t memory_read_byte(offs_t offset);
81 	void memory_write_byte(offs_t offset, uint8_t data);
82 	uint8_t io_read_byte(offs_t offset);
83 	void io_write_byte(offs_t offset, uint8_t data);
84 	DECLARE_WRITE_LINE_MEMBER(busreq_w);
85 	DECLARE_WRITE_LINE_MEMBER(tc_w);
86 	void rt1715_floppy_enable(uint8_t data);
87 	uint8_t k7658_led1_r();
88 	uint8_t k7658_led2_r();
89 	uint8_t k7658_data_r(offs_t offset);
90 	void k7658_data_w(uint8_t data);
91 	void rt1715_rom_disable(uint8_t data);
92 	void rt1715w_set_bank(uint8_t data);
93 	void rt1715w_floppy_motor(uint8_t data);
94 	void rt1715w_krfd_w(uint8_t data);
95 	void rt1715_palette(palette_device &palette) const;
96 	I8275_DRAW_CHARACTER_MEMBER(crtc_display_pixels);
97 	DECLARE_WRITE_LINE_MEMBER(crtc_drq_w);
98 
99 	void k7658_io(address_map &map);
100 	void k7658_mem(address_map &map);
101 	void rt1715_base_io(address_map &map);
102 	void rt1715_io(address_map &map);
103 	void rt1715w_io(address_map &map);
104 	void rt1715_mem(address_map &map);
105 	void rt1715w_mem(address_map &map);
106 
107 	DECLARE_MACHINE_START(rt1715);
108 	DECLARE_MACHINE_RESET(rt1715);
109 	DECLARE_MACHINE_START(rt1715w);
110 	DECLARE_MACHINE_RESET(rt1715w);
111 
112 	required_device<z80_device> m_maincpu;
113 	required_device<ram_device> m_ram;
114 	required_device<z80sio_device> m_sio0;
115 	required_device<z80ctc_device> m_ctc0;
116 	required_device<rs232_port_device> m_printer;
117 	required_device<rs232_port_device> m_rs232;
118 	optional_device<i8272a_device> m_fdc;
119 	optional_device_array<floppy_connector, 2> m_floppy;
120 	optional_device<z80dma_device> m_dma;
121 	optional_device<z80ctc_device> m_ctc2;
122 	required_device<screen_device> m_screen;
123 	required_device<palette_device> m_palette;
124 	required_device<i8275_device> m_crtc;
125 	required_region_ptr<uint8_t> m_p_chargen;
126 	optional_device<ram_device> m_videoram;
127 	optional_region_ptr<uint8_t> m_p_cas;
128 
129 	int m_led1_val;
130 	int m_led2_val;
131 	u8 m_krfd;
132 	uint16_t m_dma_adr;
133 	int m_r, m_w;
134 };
135 
136 
137 /***************************************************************************
138     FLOPPY
139 ***************************************************************************/
140 
rt1715_floppy_enable(uint8_t data)141 void rt1715_state::rt1715_floppy_enable(uint8_t data)
142 {
143 	LOG("%s: rt1715_floppy_enable %02x\n", machine().describe_context(), data);
144 }
145 
rt1715w_floppy_motor(uint8_t data)146 void rt1715_state::rt1715w_floppy_motor(uint8_t data)
147 {
148 	LOG("%s: rt1715w_floppy_motor %02x\n", machine().describe_context(), data);
149 
150 	if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(data & 0x80 ? 1 : 0);
151 	if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(data & 0x08 ? 1 : 0);
152 }
153 
rt1715w_krfd_w(uint8_t data)154 void rt1715_state::rt1715w_krfd_w(uint8_t data)
155 {
156 	LOG("%s: rt1715w_krfd_w %02x\n", machine().describe_context(), data);
157 	m_krfd = data;
158 }
159 
WRITE_LINE_MEMBER(rt1715_state::tc_w)160 WRITE_LINE_MEMBER(rt1715_state::tc_w)
161 {
162 	m_fdc->tc_w(state & BIT(m_krfd, 7));
163 }
164 
165 /***************************************************************************
166     KEYBOARD
167 ***************************************************************************/
168 
169 /* si/so led */
k7658_led1_r()170 uint8_t rt1715_state::k7658_led1_r()
171 {
172 	m_led1_val ^= 1;
173 	LOG("%s: k7658_led1_r %02x\n", machine().describe_context(), m_led1_val);
174 	return 0xff;
175 }
176 
177 /* caps led */
k7658_led2_r()178 uint8_t rt1715_state::k7658_led2_r()
179 {
180 	m_led2_val ^= 1;
181 	LOG("%s: k7658_led2_r %02x\n", machine().describe_context(), m_led2_val);
182 	return 0xff;
183 }
184 
185 /* read key state */
k7658_data_r(offs_t offset)186 uint8_t rt1715_state::k7658_data_r(offs_t offset)
187 {
188 	uint8_t result = 0xff;
189 
190 	if (BIT(offset,  0)) result &= ioport("row_00")->read();
191 	if (BIT(offset,  1)) result &= ioport("row_10")->read();
192 	if (BIT(offset,  2)) result &= ioport("row_20")->read();
193 	if (BIT(offset,  3)) result &= ioport("row_30")->read();
194 	if (BIT(offset,  4)) result &= ioport("row_40")->read();
195 	if (BIT(offset,  5)) result &= ioport("row_50")->read();
196 	if (BIT(offset,  6)) result &= ioport("row_60")->read();
197 	if (BIT(offset,  7)) result &= ioport("row_70")->read();
198 	if (BIT(offset,  8)) result &= ioport("row_08")->read();
199 	if (BIT(offset,  9)) result &= ioport("row_18")->read();
200 	if (BIT(offset, 10)) result &= ioport("row_28")->read();
201 	if (BIT(offset, 11)) result &= ioport("row_38")->read();
202 	if (BIT(offset, 12)) result &= ioport("row_48")->read();
203 
204 	return result;
205 }
206 
207 /* serial output on D0 */
k7658_data_w(uint8_t data)208 void rt1715_state::k7658_data_w(uint8_t data)
209 {
210 	LOG("%s: k7658_data_w %d\n", machine().describe_context(), BIT(data, 0));
211 	m_sio0->rxa_w(BIT(data, 0));
212 	m_sio0->rxca_w(0);
213 	m_sio0->rxca_w(1);
214 }
215 
216 
217 /***************************************************************************
218     MEMORY HANDLING
219 ***************************************************************************/
220 
MACHINE_START_MEMBER(rt1715_state,rt1715)221 MACHINE_START_MEMBER(rt1715_state, rt1715)
222 {
223 	membank("bank2")->set_base(m_ram->pointer() + 0x0800);
224 	membank("bank3")->set_base(m_ram->pointer());
225 }
226 
MACHINE_RESET_MEMBER(rt1715_state,rt1715)227 MACHINE_RESET_MEMBER(rt1715_state, rt1715)
228 {
229 	/* on reset, enable ROM */
230 	membank("bank1")->set_base(memregion("ipl")->base());
231 }
232 
rt1715_rom_disable(uint8_t data)233 void rt1715_state::rt1715_rom_disable(uint8_t data)
234 {
235 	LOGBANK("%s: rt1715_set_bank %02x\n", machine().describe_context(), data);
236 
237 	/* disable ROM, enable RAM */
238 	membank("bank1")->set_base(m_ram->pointer());
239 }
240 
MACHINE_START_MEMBER(rt1715_state,rt1715w)241 MACHINE_START_MEMBER(rt1715_state, rt1715w)
242 {
243 }
244 
MACHINE_RESET_MEMBER(rt1715_state,rt1715w)245 MACHINE_RESET_MEMBER(rt1715_state, rt1715w)
246 {
247 	m_dma->rdy_w(1);
248 	m_krfd = 0;
249 	m_dma_adr = 0;
250 	m_r = 0;
251 	m_w = 0;
252 }
253 
254 /*
255    BR (A62, A63)
256 
257    b2..0 = AB18..16
258 
259    0 - Hintergrundbank (Bildschirm, Zeichengeneratoren)
260    1 - Systembank (gebanktes BIOS, BDOS)
261    2 - Anwenderbank (TPA)
262    3 - RAM-Disk
263    4 - RAM-Disk
264    5 - RAM-Disk
265 */
rt1715w_set_bank(uint8_t data)266 void rt1715_state::rt1715w_set_bank(uint8_t data)
267 {
268 	int w = (data >> 4) & 7;
269 	int r = data & 7;
270 
271 	LOGBANK("%s: rt1715w_set_bank target %x source %x%s\n", machine().describe_context(), w, r, r == w ? "" : " DIFF");
272 
273 	m_r = r;
274 	m_w = w;
275 }
276 
memory_read_byte(offs_t offset)277 uint8_t rt1715_state::memory_read_byte(offs_t offset)
278 {
279 	uint8_t data = 0;
280 
281 	switch (m_r)
282 	{
283 	case 0:
284 		switch (offset >> 12)
285 		{
286 		case 0:
287 			data = memregion("ipl")->base()[offset & 0x7ff];
288 			break;
289 
290 		case 1:
291 			break;
292 
293 		case 2:
294 			data = m_p_chargen[offset & 0xfff];
295 			break;
296 
297 		case 3:
298 			data = m_videoram->pointer()[offset & 0xfff];
299 			break;
300 
301 		default:
302 			data = m_ram->pointer()[offset];
303 			break;
304 		}
305 		LOGBANK("mem r %04x bank %d == %02x\n", offset, m_r, data);
306 		break;
307 
308 	default:
309 		uint8_t cas_addr = 128 + (m_r << 4) + ((offset >> 12) & 15);
310 		uint8_t cas_data = m_p_cas[cas_addr] ^ 15;
311 		switch (cas_data)
312 		{
313 		case 1:
314 			data = m_ram->pointer()[offset];
315 			break;
316 
317 		case 2:
318 			data = m_ram->pointer()[offset + 0x10000];
319 			break;
320 
321 		case 4:
322 			data = m_ram->pointer()[offset + 0x20000];
323 			break;
324 
325 		case 8:
326 			data = m_ram->pointer()[offset + 0x30000];
327 			break;
328 
329 		default:
330 			break;
331 		}
332 		LOGBANK("mem r %04x bank %d cas %d(%02x) == %02x\n", offset, m_r, cas_data, cas_addr, data);
333 		break;
334 	}
335 	return data;
336 }
337 
memory_write_byte(offs_t offset,uint8_t data)338 void rt1715_state::memory_write_byte(offs_t offset, uint8_t data)
339 {
340 	switch (m_w)
341 	{
342 	case 0:
343 		switch (offset >> 12)
344 		{
345 		case 0:
346 		case 1:
347 			break;
348 
349 		case 2:
350 			m_p_chargen[offset & 0xfff] = data;
351 			break;
352 
353 		case 3:
354 			m_videoram->pointer()[offset & 0xfff] = data;
355 			break;
356 
357 		default:
358 			m_ram->pointer()[offset] = data;
359 			break;
360 		}
361 		LOGBANK("mem w %04x bank %d <- %02x\n", offset, m_w, data);
362 		break;
363 
364 	default:
365 		uint8_t cas_addr = 128 + (m_w << 4) + ((offset >> 12) & 15);
366 		uint8_t cas_data = m_p_cas[cas_addr] ^ 15;
367 		switch (cas_data)
368 		{
369 		case 1:
370 			m_ram->pointer()[offset] = data;
371 			break;
372 
373 		case 2:
374 			m_ram->pointer()[offset + 0x10000] = data;
375 			break;
376 
377 		case 4:
378 			m_ram->pointer()[offset + 0x20000] = data;
379 			break;
380 
381 		case 8:
382 			m_ram->pointer()[offset + 0x30000] = data;
383 			break;
384 
385 		default:
386 			break;
387 		}
388 		LOGBANK("mem w %04x bank %d cas %d(%02x) <- %02x\n", offset, m_w, cas_data, cas_addr, data);
389 		break;
390 	}
391 }
392 
io_read_byte(offs_t offset)393 uint8_t rt1715_state::io_read_byte(offs_t offset)
394 {
395 	address_space &prog_space = m_maincpu->space(AS_IO);
396 	return prog_space.read_byte(offset);
397 }
398 
io_write_byte(offs_t offset,uint8_t data)399 void rt1715_state::io_write_byte(offs_t offset, uint8_t data)
400 {
401 	address_space &prog_space = m_maincpu->space(AS_IO);
402 	prog_space.write_byte(offset, data);
403 }
404 
WRITE_LINE_MEMBER(rt1715_state::busreq_w)405 WRITE_LINE_MEMBER(rt1715_state::busreq_w)
406 {
407 	// since our Z80 has no support for BUSACK, we assume it is granted immediately
408 	m_maincpu->set_input_line(INPUT_LINE_HALT, state);
409 	m_dma->bai_w(state); // tell dma that bus has been granted
410 }
411 
412 /***************************************************************************
413     VIDEO EMULATION
414 ***************************************************************************/
415 
WRITE_LINE_MEMBER(rt1715_state::crtc_drq_w)416 WRITE_LINE_MEMBER(rt1715_state::crtc_drq_w)
417 {
418 	if (state)
419 	{
420 		m_crtc->dack_w(m_videoram->pointer()[m_dma_adr++]);
421 		m_dma_adr %= (80 * 24);
422 	}
423 }
424 
I8275_DRAW_CHARACTER_MEMBER(rt1715_state::crtc_display_pixels)425 I8275_DRAW_CHARACTER_MEMBER(rt1715_state::crtc_display_pixels)
426 {
427 	rgb_t const *const palette = m_palette->palette()->entry_list_raw();
428 	u8 gfx = (lten) ? 0xff : 0;
429 
430 	if (!vsp)
431 		gfx = m_p_chargen[((gpa & 1) << 11) | (linecount << 7) | charcode];
432 
433 	if (rvv)
434 		gfx ^= 0xff;
435 
436 	for (u8 i=0; i<8; i++)
437 		bitmap.pix(y, x + i) = palette[BIT(gfx, 7-i) ? (hlgt ? 2 : 1) : 0];
438 }
439 
440 /* F4 Character Displayer */
441 static const gfx_layout rt1715_charlayout =
442 {
443 	8, 16,                  /* 8 x 16 characters */
444 	128,                    /* 128 characters */
445 	1,                  /* 1 bits per pixel */
446 	{ 0 },                  /* no bitplanes */
447 	/* x offsets */
448 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
449 	/* y offsets */
450 	{ 0*128, 1*128*8, 2*128*8, 3*128*8, 4*128*8, 5*128*8, 6*128*8, 7*128*8, 8*128*8, 9*128*8, 10*128*8, 11*128*8, 12*128*8, 13*128*8, 14*128*8, 15*128*8 },
451 	8                   /* every char takes 1 x 16 bytes */
452 };
453 
454 static GFXDECODE_START( gfx_rt1715 )
455 	GFXDECODE_ENTRY("gfx", 0x0000, rt1715_charlayout, 0, 1)
456 	GFXDECODE_ENTRY("gfx", 0x0800, rt1715_charlayout, 0, 1)
457 GFXDECODE_END
458 
459 
460 /***************************************************************************
461     PALETTE
462 ***************************************************************************/
463 
rt1715_palette(palette_device & palette) const464 void rt1715_state::rt1715_palette(palette_device &palette) const
465 {
466 	palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00)); // black
467 	palette.set_pen_color(1, rgb_t(0x00, 0x7f, 0x00)); // low intensity
468 	palette.set_pen_color(2, rgb_t(0x00, 0xff, 0x00)); // high intensity
469 }
470 
471 
472 /***************************************************************************
473     ADDRESS MAPS
474 ***************************************************************************/
475 
rt1715_mem(address_map & map)476 void rt1715_state::rt1715_mem(address_map &map)
477 {
478 	map(0x0000, 0x07ff).bankr("bank1").bankw("bank3");
479 	map(0x0800, 0xffff).bankrw("bank2");
480 }
481 
rt1715_base_io(address_map & map)482 void rt1715_state::rt1715_base_io(address_map &map)
483 {
484 	map.unmap_value_high();
485 	map.global_mask(0xff);
486 	map(0x08, 0x0b).rw(m_ctc0, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
487 	map(0x0c, 0x0f).rw(m_sio0, FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w));
488 	map(0x10, 0x17).noprw();
489 //  map(0x10, 0x13).rw(m_ctc1, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
490 //  map(0x14, 0x17).rw(m_sio1, FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w));
491 	map(0x18, 0x19).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write));
492 //  map(0x2c, 0x2f) // LT107CS -- serial DSR?
493 //  map(0x30, 0x33) // LT111CS -- serial SEL? (data rate selector)
494 }
495 
rt1715_io(address_map & map)496 void rt1715_state::rt1715_io(address_map &map)
497 {
498 	rt1715_base_io(map);
499 
500 	map(0x00, 0x03).rw("a71", FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); // floppy data
501 	map(0x04, 0x07).rw("a72", FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); // floppy control/status
502 	map(0x20, 0x20).w(FUNC(rt1715_state::rt1715_floppy_enable));
503 //  map(0x24, 0x27).w(FUNC(rt1715_state::rt1715_rom_enable)); // MEMCS0
504 	map(0x28, 0x2b).w(FUNC(rt1715_state::rt1715_rom_disable)); // MEMCS1
505 //  map(0x34, 0x37) // BWSCS (read: memory start address, write: switch chargen)
506 }
507 
rt1715w_mem(address_map & map)508 void rt1715_state::rt1715w_mem(address_map &map)
509 {
510 	map(0x0000, 0xffff).rw(FUNC(rt1715_state::memory_read_byte), FUNC(rt1715_state::memory_write_byte));
511 }
512 
513 // rt1715w -- decoders A13, A14, page C
rt1715w_io(address_map & map)514 void rt1715_state::rt1715w_io(address_map &map)
515 {
516 	rt1715_base_io(map);
517 
518 	map(0x00, 0x00).rw(m_dma, FUNC(z80dma_device::read), FUNC(z80dma_device::write)); // A2
519 	map(0x04, 0x07).rw(m_ctc2, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); // A4
520 //  map(0x1a, 0x1b) // chargen write protection
521 	map(0x1c, 0x1d).m(m_fdc, FUNC(i8272a_device::map));
522 	map(0x20, 0x23).w(FUNC(rt1715_state::rt1715w_krfd_w)); // KRFD -- FD-Steuerregister (A45)
523 	map(0x24, 0x27).w(FUNC(rt1715_state::rt1715w_set_bank)); // BR (A62, A63)
524 	map(0x28, 0x2b).w(FUNC(rt1715_state::rt1715w_floppy_motor)); // MOS
525 	map(0x34, 0x37).portr("S8"); // KON -- Konfigurations-schalter FD (config switch -- A114, DIP S8)
526 //  map(0x38, 0x3b) // SR (RST1) -- Ru:cksetzen von Flip-Flops im FD
527 //  map(0x3c, 0x3f) // RST (RST2) -- Ru:cksetzen von Flip-Flops in V.24 (Pru:ftechnik)
528 	// used via DMA only
529 	map(0x40, 0x40).r(m_fdc, FUNC(i8272a_device::msr_r));
530 	map(0x41, 0x41).rw(m_fdc, FUNC(i8272a_device::dma_r), FUNC(i8272a_device::dma_w));
531 }
532 
k7658_mem(address_map & map)533 void rt1715_state::k7658_mem(address_map &map)
534 {
535 	map(0x0000, 0x07ff).mirror(0xf800).rom();
536 }
537 
k7658_io(address_map & map)538 void rt1715_state::k7658_io(address_map &map)
539 {
540 	map(0x0000, 0x1fff).w(FUNC(rt1715_state::k7658_data_w)).nopr();
541 	map(0x2000, 0x2000).mirror(0x8000).r(FUNC(rt1715_state::k7658_led1_r));
542 	map(0x4000, 0x4000).mirror(0x8000).r(FUNC(rt1715_state::k7658_led2_r));
543 	map(0x8000, 0x9fff).r(FUNC(rt1715_state::k7658_data_r));
544 }
545 
546 
547 /***************************************************************************
548     INPUT PORTS
549 ***************************************************************************/
550 
551 static INPUT_PORTS_START( k7658 )
552 	PORT_START("row_00")
553 	// D04 A54 E04 B54 B04 C04 D54 C54
554 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
555 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad S *1")
556 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
557 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad S *3")
558 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
559 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
560 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad CE") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
561 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
562 
563 	PORT_START("row_10")
564 	// D03 A53 E03 B53 B03 C03 D53 C53
565 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
566 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
567 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
568 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
569 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
570 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
571 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
572 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
573 
574 	PORT_START("row_20")
575 	// D02 A52 E02 B52 B02 C02 D52 C52
576 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
577 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 00") PORT_CODE(KEYCODE_ASTERISK)
578 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
579 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
580 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
581 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
582 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
583 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
584 
585 	PORT_START("row_30")
586 	// D11 --- E11 A15 A10 C11 --- A16
587 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('@') PORT_CHAR('`')
588 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
589 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
590 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad New-Line") PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD)
591 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r')
592 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
593 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
594 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
595 
596 	PORT_START("row_40")
597 	// D10 --- E10 --- B10 C10 E52 E51
598 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
599 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
600 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
601 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
602 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
603 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
604 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
605 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
606 
607 	PORT_START("row_50")
608 	// D12 --- E12 B16 B01 C12 D16 C16
609 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
610 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
611 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') PORT_CHAR('~')
612 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME))
613 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
614 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
615 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
616 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t')
617 
618 	PORT_START("row_60")
619 	// D07 A17 E07 B17 B07 C07 D17 C17
620 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
621 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("A17 8E")
622 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
623 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
624 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
625 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
626 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
627 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("rechter Rand") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END))
628 
629 	PORT_START("row_70")
630 	// D01 A51 E01 B51 B00 C01 D51 C51
631 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
632 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
633 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
634 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
635 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
636 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
637 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
638 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
639 
640 	PORT_START("row_08")
641 	// D00 B99 E00 --- B11 C00 E15 E16
642 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
643 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
644 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
645 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
646 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
647 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
648 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
649 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SI/SO") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT))
650 
651 	PORT_START("row_18")
652 	// D08 A56 E08 B56 B08 C08 D56 C56
653 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
654 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad SQ (F14)")
655 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
656 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad PS (F13)")
657 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
658 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
659 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11))
660 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12))
661 
662 	PORT_START("row_28")
663 	// D09 E53 E09 E54 B09 C09 E55 E56
664 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
665 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
666 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
667 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
668 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
669 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
670 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
671 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
672 
673 	PORT_START("row_38")
674 	// D05 A55 E05 B55 B05 C05 D55 C55
675 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
676 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
677 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
678 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
679 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
680 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
681 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
682 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
683 
684 	PORT_START("row_48")
685 	// D06 A05 E06 B15 B06 C06 D15 C15
686 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
687 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
688 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
689 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
690 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
691 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
692 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
693 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("linker Rand")
694 INPUT_PORTS_END
695 
696 static INPUT_PORTS_START( rt1715w )
697 	PORT_INCLUDE(k7658)
698 	PORT_START("S8")
699 	PORT_DIPNAME( 0x01, 0x01, "Floppy drive type" )
700 	PORT_DIPSETTING(    0x01, "5.25\"-FD" )
701 	PORT_DIPSETTING(    0x00, "8\"-FD" )
702 	PORT_BIT( 0x7e, IP_ACTIVE_HIGH, IPT_UNUSED )
703 INPUT_PORTS_END
704 
705 
706 /***************************************************************************
707     MACHINE DRIVERS
708 ***************************************************************************/
709 
710 /* verify priority -- p. 14 of PC-1715-Servicemanual.pdf */
711 static const z80_daisy_config rt1715_daisy_chain[] =
712 {
713 	{ "a71" },
714 	{ "a72" },
715 	{ "ctc0" },
716 	{ "sio0" },
717 	{ nullptr }
718 };
719 
720 static const z80_daisy_config rt1715w_daisy_chain[] =
721 {
722 	{ "sio0" },
723 	{ nullptr }
724 };
725 
rt1715w_floppies(device_slot_interface & device)726 static void rt1715w_floppies(device_slot_interface &device)
727 {
728 	device.option_add("525qd", FLOPPY_525_QD);
729 }
730 
rt1715(machine_config & config)731 void rt1715_state::rt1715(machine_config &config)
732 {
733 	/* basic machine hardware */
734 	Z80(config, m_maincpu, 9.832_MHz_XTAL / 4);
735 	m_maincpu->set_addrmap(AS_PROGRAM, &rt1715_state::rt1715_mem);
736 	m_maincpu->set_addrmap(AS_IO, &rt1715_state::rt1715_io);
737 	m_maincpu->set_daisy_config(rt1715_daisy_chain);
738 
739 	MCFG_MACHINE_START_OVERRIDE(rt1715_state, rt1715)
740 	MCFG_MACHINE_RESET_OVERRIDE(rt1715_state, rt1715)
741 
742 	/* keyboard */
743 	z80_device &keyboard(Z80(config, "keyboard", 683000));
744 	keyboard.set_addrmap(AS_PROGRAM, &rt1715_state::k7658_mem);
745 	keyboard.set_addrmap(AS_IO, &rt1715_state::k7658_io);
746 
747 	/* video hardware */
748 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
749 	m_screen->set_screen_update("i8275", FUNC(i8275_device::screen_update));
750 	m_screen->set_raw(13.824_MHz_XTAL, 864, 0, 624, 320, 0, 300); // ?
751 
752 	GFXDECODE(config, "gfxdecode", "palette", gfx_rt1715);
753 	PALETTE(config, "palette", FUNC(rt1715_state::rt1715_palette), 3);
754 
755 	I8275(config, m_crtc, 13.824_MHz_XTAL / 8);
756 	m_crtc->set_character_width(8);
757 	m_crtc->set_display_callback(FUNC(rt1715_state::crtc_display_pixels));
758 	m_crtc->set_screen(m_screen);
759 
760 	Z80SIO(config, m_sio0, 9.832_MHz_XTAL / 4);
761 	m_sio0->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
762 	m_sio0->out_txda_callback().set(m_printer, FUNC(rs232_port_device::write_txd));
763 	m_sio0->out_txdb_callback().set(m_rs232, FUNC(rs232_port_device::write_txd));
764 	m_sio0->out_dtrb_callback().set(m_rs232, FUNC(rs232_port_device::write_dtr));
765 	m_sio0->out_rtsb_callback().set(m_rs232, FUNC(rs232_port_device::write_rts));
766 
767 	Z80CTC(config, m_ctc0, 15.9744_MHz_XTAL / 4);
768 	m_ctc0->zc_callback<0>().set(m_sio0, FUNC(z80sio_device::txca_w));
769 	m_ctc0->zc_callback<2>().set(m_sio0, FUNC(z80sio_device::rxtxcb_w));
770 
771 	// X4 connector -- printer
772 	RS232_PORT(config, m_printer, default_rs232_devices, "printer");
773 	m_printer->cts_handler().set(m_sio0, FUNC(z80sio_device::ctsa_w));
774 
775 	// X5 connector -- V24 port
776 	RS232_PORT(config, m_rs232, default_rs232_devices, "null_modem");
777 	m_rs232->rxd_handler().set(m_sio0, FUNC(z80sio_device::rxb_w));
778 	m_rs232->cts_handler().set(m_sio0, FUNC(z80sio_device::ctsb_w));
779 	m_rs232->dsr_handler().set(m_sio0, FUNC(z80sio_device::syncb_w));
780 
781 	/* floppy */
782 	Z80PIO(config, "a71", 9.832_MHz_XTAL / 4);
783 	Z80PIO(config, "a72", 9.832_MHz_XTAL / 4);
784 
785 	/* internal ram */
786 	RAM(config, m_ram).set_default_size("64K").set_default_value(0x00);
787 }
788 
rt1715w(machine_config & config)789 void rt1715_state::rt1715w(machine_config &config)
790 {
791 	rt1715(config);
792 
793 	m_maincpu->set_clock(15.9744_MHz_XTAL / 4);
794 	m_maincpu->set_addrmap(AS_PROGRAM, &rt1715_state::rt1715w_mem);
795 	m_maincpu->set_addrmap(AS_IO, &rt1715_state::rt1715w_io);
796 	m_maincpu->set_daisy_config(rt1715w_daisy_chain);
797 
798 	MCFG_MACHINE_START_OVERRIDE(rt1715_state, rt1715w)
799 	MCFG_MACHINE_RESET_OVERRIDE(rt1715_state, rt1715w)
800 
801 	config.device_remove("a71");
802 	config.device_remove("a72");
803 
804 	m_crtc->drq_wr_callback().set(FUNC(rt1715_state::crtc_drq_w));
805 
806 	// operates in polled mode
807 	I8272A(config, m_fdc, 8'000'000 / 4, false);
808 	m_fdc->drq_wr_callback().set(m_dma, FUNC(z80dma_device::rdy_w)).invert();
809 	FLOPPY_CONNECTOR(config, "i8272:0", rt1715w_floppies, "525qd", floppy_image_device::default_floppy_formats);
810 	FLOPPY_CONNECTOR(config, "i8272:1", rt1715w_floppies, "525qd", floppy_image_device::default_floppy_formats);
811 
812 	Z80DMA(config, m_dma, 15.9744_MHz_XTAL / 4);
813 	m_dma->out_busreq_callback().set(FUNC(rt1715_state::busreq_w));
814 	m_dma->out_int_callback().set(FUNC(rt1715_state::tc_w));
815 	m_dma->in_mreq_callback().set(FUNC(rt1715_state::memory_read_byte));
816 	m_dma->out_mreq_callback().set(FUNC(rt1715_state::memory_write_byte));
817 	m_dma->in_iorq_callback().set(FUNC(rt1715_state::io_read_byte));
818 	m_dma->out_iorq_callback().set(FUNC(rt1715_state::io_write_byte));
819 
820 	Z80CTC(config, m_ctc2, 15.9744_MHz_XTAL / 4);
821 
822 	m_ram->set_default_size("256K");
823 	RAM(config, m_videoram).set_default_size("4K").set_default_value(0x00);
824 }
825 
826 
827 /***************************************************************************
828     ROM DEFINITIONS
829 ***************************************************************************/
830 
831 ROM_START( rt1715 )
832 	ROM_REGION(0x0800, "ipl", 0)
833 	ROM_LOAD("s500.a25.3", 0x0000, 0x0800, NO_DUMP) // CCITT 90e7
834 	ROM_LOAD("s501.a25.3", 0x0000, 0x0800, NO_DUMP) // CCITT 68da
835 	ROM_LOAD("s502.a25.3", 0x0000, 0x0800, CRC(7b6302e1) SHA1(e8f61763ff8841078a1939aa5e85a17f2af42163))
836 
837 	ROM_REGION(0x1000, "gfx", 0)
838 	ROM_LOAD("s619.a25.2", 0x0000, 0x0800, CRC(98647763) SHA1(93fba51ed26392ec3eff1037886576fa12443fe5))
839 	ROM_LOAD("s602.a25.1", 0x0800, 0x0800, NO_DUMP) // CCITT fd67
840 
841 	ROM_REGION(0x0800, "keyboard", 0)
842 	ROM_LOAD("s600.ic8", 0x0000, 0x0800, CRC(b7070122) SHA1(687056b822086ef0eee1e9b27e5b031bdbcade61))
843 
844 	ROM_REGION(0x0800, "floppy", 0)
845 	ROM_LOAD("068.a8.2", 0x0000, 0x0400, CRC(5306d57b) SHA1(a12d025717b039a8a760eb9961365402f1f501f5)) // "read rom"
846 	ROM_LOAD("069.a8.1", 0x0400, 0x0400, CRC(319fa72c) SHA1(5f26af1e36339a934760a63e5975e9db09abeaaf)) // "write rom"
847 ROM_END
848 
849 ROM_START( rt1715lc )
850 	ROM_REGION(0x0800, "ipl", 0)
851 	ROM_LOAD("s500.a25.3", 0x0000, 0x0800, NO_DUMP) // CCITT 90e7
852 	ROM_LOAD("s501.a25.3", 0x0000, 0x0800, NO_DUMP) // CCITT 68da
853 	ROM_LOAD("s502.a25.3", 0x0000, 0x0800, CRC(7b6302e1) SHA1(e8f61763ff8841078a1939aa5e85a17f2af42163))
854 
855 	ROM_REGION(0x1000, "gfx", 0)
856 	ROM_LOAD("s643.a25.2", 0x0000, 0x0800, CRC(ea37f0e6) SHA1(357760974d944b9782734504b9820771e7e37645))
857 	ROM_LOAD("s605.a25.1", 0x0800, 0x0800, CRC(38062024) SHA1(798f62d4adeb7098b7dcbfe6caf28302853ee97d))
858 
859 	ROM_REGION(0x0800, "keyboard", 0)
860 	ROM_LOAD("s642.ic8", 0x0000, 0x0800, NO_DUMP) // CCITT 962e
861 
862 	ROM_REGION(0x0800, "floppy", 0)
863 	ROM_LOAD("068.a8.2", 0x0000, 0x0400, CRC(5306d57b) SHA1(a12d025717b039a8a760eb9961365402f1f501f5)) // "read rom"
864 	ROM_LOAD("069.a8.1", 0x0400, 0x0400, CRC(319fa72c) SHA1(5f26af1e36339a934760a63e5975e9db09abeaaf)) // "write rom"
865 ROM_END
866 
867 ROM_START( rt1715w )
868 	ROM_REGION(0x0800, "ipl", 0)
869 	ROM_LOAD("s550.bin", 0x0000, 0x0800, CRC(0a96c754) SHA1(4d9ad5b877353d91ba355044d2847e1d621e2b01))
870 
871 	// loaded from floppy on startup
872 	ROM_REGION(0x1000, "gfx", ROMREGION_ERASEFF)
873 
874 	ROM_REGION(0x0800, "keyboard", 0)
875 	ROM_LOAD("s600.ic8", 0x0000, 0x0800, CRC(b7070122) SHA1(687056b822086ef0eee1e9b27e5b031bdbcade61))
876 
877 	ROM_REGION(0x0100, "prom", 0)
878 	ROM_LOAD("287.bin", 0x0000, 0x0100, CRC(8508360c) SHA1(d262a8c3cf2d284c67f23b853e0d59ae5cc1d4c8)) // /CAS decoder prom, 74S287
879 ROM_END
880 
881 
882 /***************************************************************************
883     GAME DRIVERS
884 ***************************************************************************/
885 
886 //    YEAR  NAME      PARENT  COMPAT  MACHINE  INPUT  CLASS         INIT        COMPANY     FULLNAME                             FLAGS
887 COMP( 1986, rt1715,   0,      0,      rt1715,  k7658, rt1715_state, empty_init, "Robotron", "Robotron PC-1715",                  MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
888 COMP( 1986, rt1715lc, rt1715, 0,      rt1715,  k7658, rt1715_state, empty_init, "Robotron", "Robotron PC-1715 (latin/cyrillic)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
889 COMP( 1986, rt1715w,  rt1715, 0,      rt1715w, rt1715w, rt1715_state, empty_init, "Robotron", "Robotron PC-1715W",                 MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
890