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