1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /******************************************************************************************
4 
5     Kyocera Kyotronics 85 (and similar laptop computers)
6 
7     2009/04 Very Preliminary Driver (video emulation courtesy of very old code by
8             Hamish Coleman)
9 
10     Comments about bit usage from Tech References and Virtual T source.
11 
12     Supported systems:
13       - Kyosei Kyotronic 85
14       - Olivetti M10 (slightly diff hw, BIOS is shifted by 2 words)
15       - NEC PC-8201A (slightly diff hw)
16       - TRS-80 Model 100
17       - Tandy Model 102 (slightly diff hw)
18       - Tandy Model 200 (diff video & rtc)
19 
20     To Do:
21       - Find dumps of systems which could easily be added:
22         * Olivetti M10 Modem (US) (diff BIOS than the European version)
23         * NEC PC-8201 (original Japanese version of PC-8201A)
24         * NEC PC-8300 (similar hardware to PC-8201)
25         * NEC PC-8300 w/BradyWriter II ROMs
26 
27     - bar code reader (!RxDB -> RST5.5, Hewlett-Packard HREDS-3050 interface)
28     - un-Y2K-hack tandy200
29     - keyboard is unresponsive for couple of seconds after boot, and rather slow thereafter
30     - soft power on/off
31     - pc8201 48K RAM option
32     - pc8201 NEC PC-8241A video interface (TMS9918, 16K videoRAM, 8K ROM)
33     - pc8201 NEC PC-8233 floppy controller
34     - pc8201 NEC floppy disc drives (PC-8031-1W, PC-8031-2W, PC-80S31)
35     - trsm100 Tandy Portable Disk Drive (TPDD: 100k 3?", TPDD2: 200k 3?") (undumped HD63A01V1 MCU + full custom uPD65002, serial comms via IM6042)
36     - trsm100 Chipmunk disk drive (384k 3?") (full custom logic, not going to happen)
37     - trsm100 RS232/modem select
38     - tandy200 RTC alarm
39     - tandy200 TCM5089 DTMF sound
40     - international keyboard option ROMs
41     - cassette is not working on pc8201, pc8201a, npc8300
42     - natural keyboard is far too slow to be usable; paste is useless
43 
44     10 FOR A=0 TO 255
45     20 PRINT CHR$(A);
46     30 NEXT A
47 
48 
49                           * PC-8201/8300 HARDWARE PORT DEFINITIONS *
50 
51                 -Port-
52     Name       Hex  Dec   Notes
53     --------   ---  ---   -----------------------------------------
54     A8255      070  112   Video interface port A (8255)
55     B8255      071  113   Video interface port B (8255)
56     C8255      072  114   Video interface port C (8255)
57     CW8255     073  115   Video interface command/mode port (8255)
58 
59 ******************************************************************************************/
60 
61 
62 #include "emu.h"
63 #include "includes/kyocera.h"
64 #include "speaker.h"
65 
66 /* Read/Write Handlers */
67 
bank_r()68 uint8_t pc8201_state::bank_r()
69 {
70 	/*
71 
72 	    bit     signal      description
73 
74 	    0       LADR1       select address 0 to 7fff
75 	    1       LADR2       select address 0 to 7fff
76 	    2       HADR1       select address 8000 to ffff
77 	    3       HADR2       select address 8000 to ffff
78 	    4
79 	    5
80 	    6       SELB        serial interface status bit 1
81 	    7       SELA        serial interface status bit 0
82 
83 	*/
84 
85 	return (m_iosel << 5) | m_bank;
86 }
87 
bankswitch(uint8_t data)88 void pc8201_state::bankswitch(uint8_t data)
89 {
90 	address_space &program = m_maincpu->space(AS_PROGRAM);
91 
92 	int rom_bank = data & 0x03;
93 	int ram_bank = (data >> 2) & 0x03;
94 
95 	m_bank = data & 0x0f;
96 
97 	if (rom_bank > 1)
98 	{
99 		/* RAM */
100 		program.install_readwrite_bank(0x0000, 0x7fff, "bank1");
101 	}
102 	else
103 	{
104 		/* ROM */
105 		program.install_read_bank(0x0000, 0x7fff, "bank1");
106 		program.unmap_write(0x0000, 0x7fff);
107 	}
108 
109 	membank("bank1")->set_entry(rom_bank);
110 
111 	switch (ram_bank)
112 	{
113 	case 0:
114 		if (m_ram->size() > 16 * 1024)
115 		{
116 			program.install_readwrite_bank(0x8000, 0xffff, "bank2");
117 		}
118 		else
119 		{
120 			program.unmap_readwrite(0x8000, 0xbfff);
121 			program.install_readwrite_bank(0xc000, 0xffff, "bank2");
122 		}
123 		break;
124 
125 	case 1:
126 		program.unmap_readwrite(0x8000, 0xffff);
127 		break;
128 
129 	case 2:
130 		if (m_ram->size() > 32 * 1024)
131 			program.install_readwrite_bank(0x8000, 0xffff, "bank2");
132 		else
133 			program.unmap_readwrite(0x8000, 0xffff);
134 		break;
135 
136 	case 3:
137 		if (m_ram->size() > 64 * 1024)
138 			program.install_readwrite_bank(0x8000, 0xffff, "bank2");
139 		else
140 			program.unmap_readwrite(0x8000, 0xffff);
141 		break;
142 	}
143 
144 	membank("bank2")->set_entry(ram_bank);
145 }
146 
bank_w(uint8_t data)147 void pc8201_state::bank_w(uint8_t data)
148 {
149 	/*
150 
151 	    bit     signal      description
152 
153 	    0       LADR1       select address 0 to 7fff
154 	    1       LADR2       select address 0 to 7fff
155 	    2       HADR1       select address 8000 to ffff
156 	    3       HADR2       select address 8000 to ffff
157 	    4
158 	    5
159 	    6
160 	    7
161 
162 	*/
163 //printf("bank %02x\n",data);
164 	bankswitch(data);
165 }
166 
scp_w(uint8_t data)167 void pc8201_state::scp_w(uint8_t data)
168 {
169 	/*
170 
171 	    bit     signal      description
172 
173 	    0
174 	    1
175 	    2
176 	    3       REMOTE      cassette motor
177 	    4       TSTB        RTC strobe
178 	    5       PSTB        printer strobe
179 	    6       SELB        serial interface select bit 1
180 	    7       SELA        serial interface select bit 0
181 
182 	*/
183 
184 	/* cassette motor */
185 	m_cassette->change_state(BIT(data,3) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
186 
187 	/* RTC strobe */
188 	m_rtc->stb_w(BIT(data, 4));
189 
190 	/* printer strobe */
191 	m_centronics->write_strobe(BIT(data, 5));
192 
193 	/* serial interface select */
194 	m_iosel = data >> 5;
195 }
196 
uart_r()197 uint8_t kc85_state::uart_r()
198 {
199 	if (!machine().side_effects_disabled())
200 	{
201 		m_uart->drr_w(0);
202 		m_uart->drr_w(1);
203 	}
204 
205 	return m_uart->read();
206 }
207 
uart_ctrl_w(uint8_t data)208 void kc85_state::uart_ctrl_w(uint8_t data)
209 {
210 	/*
211 
212 	    bit     signal      description
213 
214 	    0       SBS         stop bit select
215 	    1       EPE         even parity enable
216 	    2       PI          parity inhibit
217 	    3       CLS1        character length select bit 1
218 	    4       CLS2        character length select bit 2
219 	    5
220 	    6
221 	    7
222 
223 	*/
224 
225 	m_uart->sbs_w(BIT(data, 0));
226 	m_uart->epe_w(BIT(data, 1));
227 	m_uart->pi_w(BIT(data, 2));
228 	m_uart->cls1_w(BIT(data, 3));
229 	m_uart->cls2_w(BIT(data, 4));
230 
231 	m_uart->crl_w(1);
232 }
233 
uart_status_r()234 uint8_t kc85_state::uart_status_r()
235 {
236 	/*
237 
238 	    bit     signal      description
239 
240 	    0       CD          carrier detect
241 	    1       OE          overrun error
242 	    2       FE          framing error
243 	    3       PE          parity error
244 	    4       TBRE        transmit buffer register empty
245 	    5       RP
246 	    6       +5V
247 	    7       _LPS        low power sensor
248 
249 	*/
250 
251 	uint8_t data = 0x40;
252 
253 	// carrier detect
254 	data |= m_rs232->dcd_r();
255 
256 	// overrun error
257 	data |= m_uart->oe_r() << 1;
258 
259 	// framing error
260 	data |= m_uart->fe_r() << 2;
261 
262 	// parity error
263 	data |= m_uart->pe_r() << 3;
264 
265 	// transmit buffer register empty
266 	data |= m_uart->tbre_r() << 4;
267 
268 	// rp TODO
269 	data |= 0x20;
270 
271 	// low power sensor
272 	data |= BIT(m_battery->read(), 0) << 7;
273 
274 	return data;
275 }
276 
uart_status_r()277 uint8_t pc8201_state::uart_status_r()
278 {
279 	/*
280 
281 	    bit     signal      description
282 
283 	    0       _DCD/_RD    data carrier detect / ring detect
284 	    1       OE          overrun error
285 	    2       FE          framing error
286 	    3       PE          parity error
287 	    4       TBRE        transmit buffer register empty
288 	    5       RP
289 	    6       +5V
290 	    7       _LPS        low power signal
291 
292 	*/
293 
294 	uint8_t data = 0x40;
295 
296 	// data carrier detect / ring detect
297 	data |= m_rs232->dcd_r();
298 
299 	// overrun error
300 	data |= m_uart->oe_r() << 1;
301 
302 	// framing error
303 	data |= m_uart->fe_r() << 2;
304 
305 	// parity error
306 	data |= m_uart->pe_r() << 3;
307 
308 	// transmit buffer register empty
309 	data |= m_uart->tbre_r() << 4;
310 
311 	// rp TODO
312 	data |= 0x20;
313 
314 	// low power sensor
315 	data |= BIT(m_battery->read(), 0) << 7;
316 
317 	return data;
318 }
319 
romah_w(uint8_t data)320 void pc8201_state::romah_w(uint8_t data)
321 {
322 	/*
323 
324 	    bit     signal
325 
326 	    0       A16
327 	    1       ROM SEL
328 	    2
329 	    3
330 	    4
331 	    5
332 	    6
333 	    7
334 
335 	*/
336 
337 	// ROM address bit 16
338 	m_rom_addr = (BIT(data, 0) << 16) | (m_rom_addr & 0xffff);
339 
340 	// ROM select
341 	m_rom_sel = BIT(data, 1);
342 }
343 
romal_w(uint8_t data)344 void pc8201_state::romal_w(uint8_t data)
345 {
346 	/*
347 
348 	    bit     signal
349 
350 	    0       A0
351 	    1       A1
352 	    2       A2
353 	    3       A3
354 	    4       A4
355 	    5       A5
356 	    6       A6
357 	    7       A7
358 
359 	*/
360 
361 	m_rom_addr = (m_rom_addr & 0x1ff00) | data;
362 }
363 
romam_w(uint8_t data)364 void pc8201_state::romam_w(uint8_t data)
365 {
366 	/*
367 
368 	    bit     signal
369 
370 	    0       A8
371 	    1       A9
372 	    2       A10
373 	    3       A11
374 	    4       A12
375 	    5       A13
376 	    6       A14
377 	    7       A15
378 
379 	*/
380 
381 	m_rom_addr = (m_rom_addr & 0x100ff) | (data << 8);
382 }
383 
romrd_r()384 uint8_t pc8201_state::romrd_r()
385 {
386 	uint8_t data = 0xff;
387 
388 	if (m_rom_sel)
389 		data = m_cas_cart->read_rom(m_rom_addr & 0x1ffff);
390 
391 	return data;
392 }
393 
modem_w(uint8_t data)394 void kc85_state::modem_w(uint8_t data)
395 {
396 	/*
397 
398 	    bit     signal      description
399 
400 	    0                   telephone line signal selection relay output
401 	    1       EN          MC14412 enable output
402 	    2
403 	    3
404 	    4
405 	    5
406 	    6
407 	    7
408 
409 	*/
410 
411 	//m_modem->en_w(BIT(data, 1));
412 }
413 
ctrl_w(uint8_t data)414 void kc85_state::ctrl_w(uint8_t data)
415 {
416 	/*
417 
418 	    bit     signal      description
419 
420 	    0       _STROM      ROM selection (0=standard, 1=option)
421 	    1       _STROBE     printer strobe output
422 	    2       STB         RTC strobe output
423 	    3       _REMOTE     cassette motor
424 	    4
425 	    5
426 	    6
427 	    7
428 
429 	*/
430 
431 	/* ROM bank selection */
432 	membank("bank1")->set_entry(BIT(data, 0));
433 
434 	/* printer strobe */
435 	m_centronics->write_strobe(BIT(data, 1));
436 
437 	/* RTC strobe */
438 	m_rtc->stb_w(BIT(data, 2));
439 
440 	/* cassette motor */
441 	m_cassette->change_state(BIT(data,3) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
442 }
443 
keyboard_r()444 uint8_t kc85_state::keyboard_r()
445 {
446 	uint8_t data = 0xff;
447 
448 	for (u8 i = 0; i < 9; i++)
449 		if (!BIT(m_keylatch, i)) data &= m_y[i]->read();
450 
451 	return data;
452 }
453 
bankswitch(uint8_t data)454 void tandy200_state::bankswitch(uint8_t data)
455 {
456 	address_space &program = m_maincpu->space(AS_PROGRAM);
457 
458 	int rom_bank = data & 0x03;
459 	int ram_bank = (data >> 2) & 0x03;
460 
461 	m_bank = data & 0x0f;
462 
463 	if (rom_bank == 3)
464 	{
465 		/* invalid ROM bank */
466 		program.unmap_readwrite(0x0000, 0x7fff);
467 	}
468 	else
469 	{
470 		program.install_read_bank(0x0000, 0x7fff, "bank1");
471 		program.unmap_write(0x0000, 0x7fff);
472 		membank("bank1")->set_entry(rom_bank);
473 	}
474 
475 	if (m_ram->size() < ((ram_bank + 1) * 24 * 1024))
476 	{
477 		/* invalid RAM bank */
478 		program.unmap_readwrite(0xa000, 0xffff);
479 	}
480 	else
481 	{
482 		program.install_readwrite_bank(0xa000, 0xffff, "bank2");
483 		membank("bank2")->set_entry(ram_bank);
484 	}
485 }
486 
bank_r()487 uint8_t tandy200_state::bank_r()
488 {
489 	return m_bank;
490 }
491 
bank_w(uint8_t data)492 void tandy200_state::bank_w(uint8_t data)
493 {
494 	bankswitch(data);
495 }
496 
stbk_r()497 uint8_t tandy200_state::stbk_r()
498 {
499 	uint8_t data = 0xff;
500 
501 	for (u8 i = 0; i < 9; i++)
502 		if (!BIT(m_keylatch, i)) data &= m_y[i]->read();
503 
504 	return data;
505 }
506 
stbk_w(uint8_t data)507 void tandy200_state::stbk_w(uint8_t data)
508 {
509 	/*
510 
511 	    bit     signal  description
512 
513 	    0       _PSTB   printer strobe output
514 	    1       REMOTE  cassette motor
515 	    2
516 	    3
517 	    4
518 	    5
519 	    6
520 	    7
521 
522 	*/
523 
524 	/* printer strobe */
525 	m_centronics->write_strobe(BIT(data, 0));
526 
527 	/* cassette motor */
528 	m_cassette->change_state(BIT(data,1) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
529 }
530 
lcd_r(offs_t offset)531 uint8_t kc85_state::lcd_r(offs_t offset)
532 {
533 	uint8_t data = 0;
534 
535 	for (uint8_t i = 0; i < 10; i++)
536 		data |= m_lcdc[i]->read(offset);
537 
538 	return data;
539 }
540 
lcd_w(offs_t offset,uint8_t data)541 void kc85_state::lcd_w(offs_t offset, uint8_t data)
542 {
543 	for (uint8_t i = 0; i < 10; i++)
544 		m_lcdc[i]->write(offset, data);
545 }
546 
547 /* Memory Maps */
548 
kc85_mem(address_map & map)549 void kc85_state::kc85_mem(address_map &map)
550 {
551 	map.unmap_value_high();
552 	map(0x0000, 0x7fff).bankr("bank1");
553 	map(0x8000, 0xffff).bankrw("bank2");
554 }
555 
pc8201_mem(address_map & map)556 void pc8201_state::pc8201_mem(address_map &map)
557 {
558 	map.unmap_value_high();
559 	map(0x0000, 0x7fff).bankrw("bank1");
560 	map(0x8000, 0xffff).bankrw("bank2");
561 }
562 
tandy200_mem(address_map & map)563 void tandy200_state::tandy200_mem(address_map &map)
564 {
565 	map.unmap_value_high();
566 	map(0x0000, 0x7fff).bankr("bank1");
567 	map(0x8000, 0x9fff).rom();
568 	map(0xa000, 0xffff).bankrw("bank2");
569 }
570 
kc85_io(address_map & map)571 void kc85_state::kc85_io(address_map &map)
572 {
573 	map.unmap_value_high();
574 //  map(0x70, 0x70).mirror(0x0f); optional RAM unit
575 //  map(0x80, 0x80).mirror(0x0f); optional I/O controller unit
576 //  map(0x90, 0x90).mirror(0x0f); optional answering telephone unit
577 //  map(0xa0, 0xa0).mirror(0x0f); optional modem
578 	map(0xb0, 0xb7).mirror(0x08).rw(I8155_TAG, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
579 	map(0xc0, 0xc0).mirror(0x0f).r(FUNC(kc85_state::uart_r)).w(m_uart, FUNC(im6402_device::write));
580 	map(0xd0, 0xd0).mirror(0x0f).rw(FUNC(kc85_state::uart_status_r), FUNC(kc85_state::uart_ctrl_w));
581 	map(0xe0, 0xe0).mirror(0x0f).rw(FUNC(kc85_state::keyboard_r), FUNC(kc85_state::ctrl_w));
582 	map(0xf0, 0xf1).mirror(0x0e).rw(FUNC(kc85_state::lcd_r), FUNC(kc85_state::lcd_w));
583 }
584 
trsm100_io(address_map & map)585 void kc85_state::trsm100_io(address_map &map)
586 {
587 	kc85_io(map);
588 	map(0xa0, 0xa0).mirror(0x0f).w(FUNC(kc85_state::modem_w));
589 }
590 
pc8201_io(address_map & map)591 void pc8201_state::pc8201_io(address_map &map)
592 {
593 	map.unmap_value_high();
594 //  map(0x70, 0x70).mirror(0x0f); optional video interface 8255
595 	map(0x80, 0x80).mirror(0x03).w(FUNC(pc8201_state::romah_w));
596 	map(0x84, 0x84).mirror(0x03).w(FUNC(pc8201_state::romal_w));
597 	map(0x88, 0x88).mirror(0x03).w(FUNC(pc8201_state::romam_w));
598 	map(0x8c, 0x8c).mirror(0x03).r(FUNC(pc8201_state::romrd_r));
599 	map(0x90, 0x90).mirror(0x0f).w(FUNC(pc8201_state::scp_w));
600 	map(0xa0, 0xa0).mirror(0x0f).rw(FUNC(pc8201_state::bank_r), FUNC(pc8201_state::bank_w));
601 	map(0xb0, 0xb7).mirror(0x08).rw(I8155_TAG, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
602 	map(0xc0, 0xc0).mirror(0x0f).r(FUNC(pc8201_state::uart_r)).w(m_uart, FUNC(im6402_device::write));
603 	map(0xd0, 0xd0).mirror(0x0f).r(FUNC(pc8201_state::uart_status_r)).w(FUNC(pc8201_state::uart_ctrl_w));
604 	map(0xe0, 0xe0).mirror(0x0f).r(FUNC(pc8201_state::keyboard_r));
605 	map(0xf0, 0xf1).mirror(0x0e).rw(FUNC(pc8201_state::lcd_r), FUNC(pc8201_state::lcd_w));
606 }
607 
tandy200_io(address_map & map)608 void tandy200_state::tandy200_io(address_map &map)
609 {
610 	map.unmap_value_high();
611 	map(0x90, 0x9f).rw(m_rtc, FUNC(rp5c01_device::read), FUNC(rp5c01_device::write));
612 //  map(0xa0, 0xa0).mirror(0x0f).w(TCM5089_TAG, FUNC(tcm5089_device::write));
613 	map(0xb0, 0xb7).mirror(0x08).rw(I8155_TAG, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
614 	map(0xc0, 0xc1).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
615 	map(0xd0, 0xd0).mirror(0x0f).rw(FUNC(tandy200_state::bank_r), FUNC(tandy200_state::bank_w));
616 	map(0xe0, 0xe0).mirror(0x0f).rw(FUNC(tandy200_state::stbk_r), FUNC(tandy200_state::stbk_w));
617 	map(0xf0, 0xf0).mirror(0x0e).rw(m_lcdc, FUNC(hd61830_device::data_r), FUNC(hd61830_device::data_w));
618 	map(0xf1, 0xf1).mirror(0x0e).rw(m_lcdc, FUNC(hd61830_device::status_r), FUNC(hd61830_device::control_w));
619 }
620 
621 /* Input Ports */
622 
623 static INPUT_PORTS_START( kc85 )
624 	PORT_START("Y0")
PORT_CODE(KEYCODE_L)625 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
626 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
627 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
628 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
629 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
630 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
631 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
632 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
633 
634 	PORT_START("Y1")
635 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
636 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
637 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
638 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
639 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
640 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
641 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
642 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
643 
644 	PORT_START("Y2")
645 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
646 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
647 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
648 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
649 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
650 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
651 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
652 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
653 
654 	PORT_START("Y3")
655 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
656 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
657 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
658 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
659 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
660 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR(']')
661 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
662 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
663 
664 	PORT_START("Y4")
665 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
666 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
667 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
668 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
669 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
670 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
671 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
672 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
673 
674 	PORT_START("Y5")
675 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
676 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
677 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
678 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
679 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
680 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
681 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
682 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
683 
684 	PORT_START("Y6")
685 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
686 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PRINT") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11))
687 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LABEL") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
688 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PASTE") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
689 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
690 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x92|") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t')
691 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("DEL BKSP") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
692 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
693 
694 	PORT_START("Y7")
695 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
696 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
697 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
698 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
699 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
700 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
701 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
702 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
703 
704 	PORT_START("Y8")
705 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PAUSE BREAK") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12))
706 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
707 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
708 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NUM") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL))
709 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CODE") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT))
710 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("GRAPH") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
711 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
712 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
713 
714 	PORT_START("BATTERY")
715 	PORT_CONFNAME( 0x01, 0x01, "Battery Status" )
716 	PORT_CONFSETTING( 0x01, DEF_STR( Normal ) )
717 	PORT_CONFSETTING( 0x00, "Low Battery" )
718 INPUT_PORTS_END
719 
720 static INPUT_PORTS_START( pc8201 )
721 	PORT_INCLUDE( kc85 )
722 
723 	PORT_MODIFY("Y3")
724 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR('^') PORT_CHAR('_')
725 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
726 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
727 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
728 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(165) PORT_CHAR(']')
729 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('[')
730 
731 	PORT_MODIFY("Y4")
732 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
733 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
734 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
735 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
736 
737 	PORT_MODIFY("Y5")
738 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("DEL  BS") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
739 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PAST  INS") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
740 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
741 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
742 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
743 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
744 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
745 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
746 
747 	PORT_MODIFY("Y6")
748 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
749 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
750 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)
751 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
752 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
753 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
754 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
755 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
756 
757 	PORT_MODIFY("Y7")
758 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("STOP") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
759 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
760 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
761 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
762 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
763 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
764 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
765 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
766 
767 	PORT_MODIFY("Y8")
768 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
769 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
770 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
771 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
772 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("JIS") PORT_CODE(KEYCODE_0_PAD)
773 INPUT_PORTS_END
774 
775 static INPUT_PORTS_START( pc8201a )
776 	PORT_INCLUDE( kc85 )
777 
778 	PORT_MODIFY("Y3")
779 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(']') PORT_CHAR('}')
780 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
781 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
782 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
783 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\\') PORT_CHAR('|')
784 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('^')
785 
786 	PORT_MODIFY("Y4")
787 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
788 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
789 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
790 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
791 
792 	PORT_MODIFY("Y5")
793 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PAST INS") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
794 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
795 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RALT) PORT_CHAR('[') PORT_CHAR('{')
796 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
797 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
798 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
799 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('_')
800 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
801 
802 	PORT_MODIFY("Y6")
803 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC)
804 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x92|") PORT_CODE(KEYCODE_TAB)
805 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
806 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
807 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
808 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
809 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("DEL BKSP") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
810 
811 	PORT_MODIFY("Y7")
812 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("STOP") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
813 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
814 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
815 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
816 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
817 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
818 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
819 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("f.1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
820 
821 	PORT_MODIFY("Y8")
822 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
823 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
824 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
825 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
826 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
827 INPUT_PORTS_END
828 
829 /* There's more than one keyboard layout for the m10. A quick search showed
830 - QWERTZ with +* (in top left corner) [Germany?]
831 - QWERTY with [{ [UK and US versions]
832 - QZERTY with $& [Italy?]
833 but our machine is different again, unable to find a specific photo of it. Could be French. */
834 static INPUT_PORTS_START( olivm10 )
835 	PORT_START("Y0")
836 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('(') PORT_CHAR('5')
837 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('\'') PORT_CHAR('4')
838 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('"') PORT_CHAR('3')
839 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR(233) PORT_CHAR('2')
840 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR(163) PORT_CHAR('1')
841 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('$') PORT_CHAR('*')
842 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('z') PORT_CHAR('Z')
843 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('a') PORT_CHAR('A')
844 
845 	PORT_START("Y1")
846 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
847 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(')') PORT_CHAR(176)
848 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR(224) PORT_CHAR('0')
849 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR(199) PORT_CHAR('9')
850 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('_') PORT_CHAR('8')
851 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR(232) PORT_CHAR('7')
852 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('-') PORT_CHAR('6')
853 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
854 
855 	PORT_START("Y2")
856 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR(',') PORT_CHAR('?')
857 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(';') PORT_CHAR('.')
858 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR(':') PORT_CHAR('/')
859 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('!') PORT_CHAR(167)
860 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(249) PORT_CHAR('%')
861 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR('m') PORT_CHAR('M')
862 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('^') PORT_CHAR(168)
863 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('`') PORT_CHAR('&')
864 
865 	PORT_START("Y3")
866 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
867 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
868 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
869 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
870 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
871 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('w') PORT_CHAR('W')
872 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('<') PORT_CHAR('>')
873 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('q') PORT_CHAR('Q')
874 
875 	PORT_START("Y4")
876 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
877 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
878 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
879 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
880 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
881 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
882 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
883 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
884 
885 	PORT_START("Y5")
886 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
887 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
888 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
889 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
890 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
891 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
892 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
893 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
894 
895 	PORT_START("Y6")
896 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PASTE") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
897 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
898 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x92|") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
899 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("DEL BS") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
900 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
901 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
902 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
903 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
904 
905 	PORT_START("Y7")
906 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
907 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
908 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
909 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
910 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
911 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
912 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
913 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
914 
915 	PORT_START("Y8")
916 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PAUSE BREAK") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12))
917 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
918 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NUM") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT))
919 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("GRAPH") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
920 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
921 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
922 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PRINT") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11))
923 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LABEL") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
924 
925 	PORT_START("BATTERY")
926 	PORT_CONFNAME( 0x01, 0x01, "Battery Status" )
927 	PORT_CONFSETTING( 0x01, DEF_STR( Normal ) )
928 	PORT_CONFSETTING( 0x00, "Low Battery" )
929 INPUT_PORTS_END
930 
931 
932 /* 8155 Interface */
933 
934 void kc85_state::i8155_pa_w(uint8_t data)
935 {
936 	/*
937 
938 	    bit     description
939 
940 	    0       LCD chip select 0, key scan 0, RTC C0
941 	    1       LCD chip select 1, key scan 1, RTC C1
942 	    2       LCD chip select 2, key scan 2, RTC C2
943 	    3       LCD chip select 3, key scan 3, RTC CLK
944 	    4       LCD chip select 4, key scan 4, RTC DATA IN
945 	    5       LCD chip select 5, key scan 5
946 	    6       LCD chip select 6, key scan 6
947 	    7       LCD chip select 7, key scan 7
948 
949 	*/
950 
951 	/* keyboard */
952 	m_keylatch = (m_keylatch & 0x100) | data;
953 
954 	/* LCD */
955 	for (uint8_t i = 0; i < 8; i++)
956 		m_lcdc[i]->cs2_w(BIT(data, i));
957 
958 	/* RTC */
959 	m_rtc->c0_w(BIT(data, 0));
960 	m_rtc->c1_w(BIT(data, 1));
961 	m_rtc->c2_w(BIT(data, 2));
962 	m_rtc->clk_w(BIT(data, 3));
963 	m_rtc->data_in_w(BIT(data, 4));
964 }
965 
i8155_pb_w(uint8_t data)966 void kc85_state::i8155_pb_w(uint8_t data)
967 {
968 	/*
969 
970 	    bit     signal      description
971 
972 	    0                   LCD chip select 8, key scan 8
973 	    1                   LCD chip select 9
974 	    2       _MC         melody control output
975 	    3       DCD/_RD     RS232 DCD/_RD select (0=RS232, 1=modem)
976 	    4       APO         auto power off output
977 	    5       BELL        buzzer output (0=ring, 1=not ring)
978 	    6       _DTR        RS232 data terminal ready output
979 	    7       _RTS        RS232 request to send output
980 
981 	*/
982 
983 	/* keyboard */
984 	m_keylatch = (BIT(data, 0) << 8) | (m_keylatch & 0xff);
985 
986 	/* LCD */
987 	m_lcdc[8]->cs2_w(BIT(data, 0));
988 	m_lcdc[9]->cs2_w(BIT(data, 1));
989 
990 	/* beeper */
991 	m_buzzer = BIT(data, 2);
992 	m_bell = BIT(data, 5);
993 
994 	if (m_buzzer) m_speaker->level_w(m_bell);
995 
996 	// RS-232
997 	m_rs232->write_dtr(BIT(data, 6));
998 	m_rs232->write_rts(BIT(data, 7));
999 }
1000 
WRITE_LINE_MEMBER(kc85_state::write_centronics_busy)1001 WRITE_LINE_MEMBER( kc85_state::write_centronics_busy )
1002 {
1003 	m_centronics_busy = state;
1004 }
1005 
WRITE_LINE_MEMBER(kc85_state::write_centronics_select)1006 WRITE_LINE_MEMBER( kc85_state::write_centronics_select )
1007 {
1008 	m_centronics_select = state;
1009 }
1010 
i8155_pc_r()1011 uint8_t kc85_state::i8155_pc_r()
1012 {
1013 	/*
1014 
1015 	    bit     description
1016 
1017 	    0       CDI         clock data input
1018 	    1       SLCT        _BUSY signal from printer
1019 	    2       BUSY        BUSY signal from printer
1020 	    3       BCR         bar code reader data input
1021 	    4       _CTS        RS232 clear to send input
1022 	    5       _DSR        RS232 DSR input
1023 
1024 	*/
1025 
1026 	uint8_t data = 0;
1027 
1028 	// clock data input
1029 	data |= m_rtc->data_out_r();
1030 
1031 	// centronics busy
1032 	data |= m_centronics_select << 1;
1033 	data |= m_centronics_busy << 2;
1034 
1035 	// RS-232
1036 	data |= m_rs232->cts_r() << 4;
1037 	data |= m_rs232->dsr_r() << 5;
1038 
1039 	return data;
1040 }
1041 
WRITE_LINE_MEMBER(kc85_state::i8155_to_w)1042 WRITE_LINE_MEMBER( kc85_state::i8155_to_w )
1043 {
1044 	if (!m_buzzer && m_bell)
1045 	{
1046 		m_speaker->level_w(state);
1047 	}
1048 
1049 	m_uart->trc_w(state);
1050 	m_uart->rrc_w(state);
1051 }
1052 
i8155_pa_w(uint8_t data)1053 void tandy200_state::i8155_pa_w(uint8_t data)
1054 {
1055 	/*
1056 
1057 	    bit     description
1058 
1059 	    0       print data 0, key scan 0
1060 	    1       print data 1, key scan 1
1061 	    2       print data 2, key scan 2
1062 	    3       print data 3, key scan 3
1063 	    4       print data 4, key scan 4
1064 	    5       print data 5, key scan 5
1065 	    6       print data 6, key scan 6
1066 	    7       print data 7, key scan 7
1067 
1068 	*/
1069 
1070 	m_cent_data_out->write(data);
1071 
1072 	m_keylatch = (m_keylatch & 0x100) | data;
1073 }
1074 
i8155_pb_w(uint8_t data)1075 void tandy200_state::i8155_pb_w(uint8_t data)
1076 {
1077 	/*
1078 
1079 	    bit     signal      description
1080 
1081 	    0                   key scan 8
1082 	    1       ORIG/ANS    (1=ORIG, 0=ANS)
1083 	    2       _BUZZER     (0=data from 8155 TO, 1=data from PB2)
1084 	    3       _RS232C     (1=modem, 0=RS-232)
1085 	    4       PCS         power cut signal
1086 	    5       BELL        buzzer data output
1087 	    6       MEN         modem enable output
1088 	    7       CALL        connects and disconnects the phone line
1089 
1090 	*/
1091 
1092 	/* keyboard */
1093 	m_keylatch = (BIT(data, 0) << 8) | (m_keylatch & 0xff);
1094 
1095 	/* beeper */
1096 	m_buzzer = BIT(data, 2);
1097 	m_bell = BIT(data, 5);
1098 
1099 	if (m_buzzer) m_speaker->level_w(m_bell);
1100 }
1101 
WRITE_LINE_MEMBER(tandy200_state::write_centronics_busy)1102 WRITE_LINE_MEMBER( tandy200_state::write_centronics_busy )
1103 {
1104 	m_centronics_busy = state;
1105 }
1106 
WRITE_LINE_MEMBER(tandy200_state::write_centronics_select)1107 WRITE_LINE_MEMBER( tandy200_state::write_centronics_select )
1108 {
1109 	m_centronics_select = state;
1110 }
1111 
i8155_pc_r()1112 uint8_t tandy200_state::i8155_pc_r()
1113 {
1114 	/*
1115 
1116 	    bit     signal  description
1117 
1118 	    0       _LPS    low power sense input
1119 	    1       _BUSY   not busy input
1120 	    2       BUSY    busy input
1121 	    3       BCR     bar code reader data input
1122 	    4       CD      carrier detect input
1123 	    5       CDBD    carrier detect break down input
1124 
1125 	*/
1126 
1127 	uint8_t data = 0x01;
1128 
1129 	// centronics
1130 	data |= m_centronics_select << 1;
1131 	data |= m_centronics_busy << 2;
1132 
1133 	// RS-232
1134 	data |= m_rs232->dcd_r() << 4;
1135 
1136 	return data;
1137 }
1138 
WRITE_LINE_MEMBER(tandy200_state::i8155_to_w)1139 WRITE_LINE_MEMBER( tandy200_state::i8155_to_w )
1140 {
1141 	if (!m_buzzer && m_bell)
1142 	{
1143 		m_speaker->level_w(state);
1144 	}
1145 }
1146 
1147 /* Machine Drivers */
1148 
machine_start()1149 void kc85_state::machine_start()
1150 {
1151 	address_space &program = m_maincpu->space(AS_PROGRAM);
1152 
1153 	std::string region_tag;
1154 	m_opt_region = memregion(region_tag.assign(m_opt_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
1155 
1156 	/* initialize RTC */
1157 	m_rtc->cs_w(1);
1158 	m_rtc->oe_w(1);
1159 
1160 	/* configure ROM banking */
1161 	program.install_read_bank(0x0000, 0x7fff, "bank1");
1162 	program.unmap_write(0x0000, 0x7fff);
1163 	membank("bank1")->configure_entry(0, m_rom->base());
1164 	membank("bank1")->configure_entry(1, m_opt_region ? m_opt_region->base() : m_rom->base());
1165 	membank("bank1")->set_entry(0);
1166 
1167 	/* configure RAM banking */
1168 	switch (m_ram->size())
1169 	{
1170 	case 16 * 1024:
1171 		program.unmap_readwrite(0x8000, 0xbfff);
1172 		program.install_readwrite_bank(0xc000, 0xffff, "bank2");
1173 		break;
1174 
1175 	case 32 * 1024:
1176 		program.install_readwrite_bank(0x8000, 0xffff,"bank2");
1177 		break;
1178 	}
1179 
1180 	membank("bank2")->configure_entry(0, m_ram->pointer());
1181 	membank("bank2")->set_entry(0);
1182 
1183 	/* register for state saving */
1184 	save_item(NAME(m_bank));
1185 	save_item(NAME(m_keylatch));
1186 	save_item(NAME(m_buzzer));
1187 	save_item(NAME(m_bell));
1188 	save_item(NAME(m_centronics_busy));
1189 	save_item(NAME(m_centronics_select));
1190 }
1191 
machine_start()1192 void pc8201_state::machine_start()
1193 {
1194 	uint8_t *ram = m_ram->pointer();
1195 
1196 	std::string region_tag;
1197 	m_opt_region = memregion(region_tag.assign(m_opt_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
1198 
1199 	/* initialize RTC */
1200 	m_rtc->cs_w(1);
1201 	m_rtc->oe_w(1);
1202 
1203 	/* configure ROM banking */
1204 	membank("bank1")->configure_entry(0, m_rom->base());
1205 	membank("bank1")->configure_entry(1, m_opt_region ? m_opt_region->base() : m_rom->base());
1206 	membank("bank1")->configure_entries(2, 2, ram + 0x8000, 0x8000);
1207 	membank("bank1")->set_entry(0);
1208 
1209 	/* configure RAM banking */
1210 	membank("bank2")->configure_entry(0, ram);
1211 	membank("bank2")->configure_entries(2, 2, ram + 0x8000, 0x8000);
1212 	membank("bank2")->set_entry(0);
1213 
1214 	bankswitch(0);
1215 
1216 	/* register for state saving */
1217 	save_item(NAME(m_bank));
1218 	save_item(NAME(m_keylatch));
1219 	save_item(NAME(m_buzzer));
1220 	save_item(NAME(m_bell));
1221 	save_item(NAME(m_centronics_busy));
1222 	save_item(NAME(m_centronics_select));
1223 	save_item(NAME(m_rom_sel));
1224 	save_item(NAME(m_rom_addr));
1225 	save_item(NAME(m_iosel));
1226 }
1227 
machine_start()1228 void trsm100_state::machine_start()
1229 {
1230 	address_space &program = m_maincpu->space(AS_PROGRAM);
1231 
1232 	std::string region_tag;
1233 	m_opt_region = memregion(region_tag.assign(m_opt_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
1234 
1235 	/* initialize RTC */
1236 	m_rtc->cs_w(1);
1237 	m_rtc->oe_w(1);
1238 
1239 	/* configure ROM banking */
1240 	program.install_read_bank(0x0000, 0x7fff, "bank1");
1241 	program.unmap_write(0x0000, 0x7fff);
1242 	membank("bank1")->configure_entry(0, m_rom->base());
1243 	membank("bank1")->configure_entry(1, m_opt_region ? m_opt_region->base() : m_rom->base());
1244 	membank("bank1")->set_entry(0);
1245 
1246 	/* configure RAM banking */
1247 	switch (m_ram->size())
1248 	{
1249 	case 8 * 1024:
1250 		program.unmap_readwrite(0x8000, 0xcfff);
1251 		program.install_readwrite_bank(0xe000, 0xffff, "bank2");
1252 		break;
1253 
1254 	case 16 * 1024:
1255 		program.unmap_readwrite(0x8000, 0xbfff);
1256 		program.install_readwrite_bank(0xc000, 0xffff, "bank2");
1257 		break;
1258 
1259 	case 24 * 1024:
1260 		program.unmap_readwrite(0x8000, 0x9fff);
1261 		program.install_readwrite_bank(0xa000, 0xffff, "bank2");
1262 		break;
1263 
1264 	case 32 * 1024:
1265 		program.install_readwrite_bank(0x8000, 0xffff, "bank2");
1266 		break;
1267 	}
1268 
1269 	membank("bank2")->configure_entry(0, m_ram->pointer());
1270 	membank("bank2")->set_entry(0);
1271 
1272 	/* register for state saving */
1273 	save_item(NAME(m_bank));
1274 	save_item(NAME(m_keylatch));
1275 	save_item(NAME(m_buzzer));
1276 	save_item(NAME(m_bell));
1277 	save_item(NAME(m_centronics_busy));
1278 	save_item(NAME(m_centronics_select));
1279 }
1280 
machine_start()1281 void tandy200_state::machine_start()
1282 {
1283 	std::string region_tag;
1284 	m_opt_region = memregion(region_tag.assign(m_opt_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
1285 
1286 	/* configure ROM banking */
1287 	membank("bank1")->configure_entry(0, m_rom->base());
1288 	membank("bank1")->configure_entry(1, m_rom->base() + 0x10000);
1289 	membank("bank1")->configure_entry(2, m_opt_region ? m_opt_region->base() : m_rom->base());
1290 	membank("bank1")->set_entry(0);
1291 
1292 	/* configure RAM banking */
1293 	membank("bank2")->configure_entries(0, 3, m_ram->pointer(), 0x6000);
1294 	membank("bank2")->set_entry(0);
1295 
1296 	/* register for state saving */
1297 	save_item(NAME(m_bank));
1298 	save_item(NAME(m_keylatch));
1299 	save_item(NAME(m_buzzer));
1300 	save_item(NAME(m_bell));
1301 	save_item(NAME(m_centronics_busy));
1302 	save_item(NAME(m_centronics_select));
1303 	save_item(NAME(m_tp));
1304 }
1305 
WRITE_LINE_MEMBER(kc85_state::kc85_sod_w)1306 WRITE_LINE_MEMBER( kc85_state::kc85_sod_w )
1307 {
1308 	m_cassette->output(state ? +1.0 : -1.0);
1309 }
1310 
READ_LINE_MEMBER(kc85_state::kc85_sid_r)1311 READ_LINE_MEMBER( kc85_state::kc85_sid_r )
1312 {
1313 	return (m_cassette->input() > 0.04) ? 0 : 1;
1314 }
1315 
WRITE_LINE_MEMBER(tandy200_state::kc85_sod_w)1316 WRITE_LINE_MEMBER( tandy200_state::kc85_sod_w )
1317 {
1318 	m_cassette->output(state ? +1.0 : -1.0);
1319 }
1320 
READ_LINE_MEMBER(tandy200_state::kc85_sid_r)1321 READ_LINE_MEMBER( tandy200_state::kc85_sid_r )
1322 {
1323 	return (m_cassette->input() > 0.04) ? 0 : 1;
1324 }
1325 
TIMER_DEVICE_CALLBACK_MEMBER(tandy200_state::tandy200_tp_tick)1326 TIMER_DEVICE_CALLBACK_MEMBER(tandy200_state::tandy200_tp_tick)
1327 {
1328 	m_maincpu->set_input_line(I8085_RST75_LINE, m_tp);
1329 
1330 	m_tp = !m_tp;
1331 }
1332 
kc85(machine_config & config)1333 void kc85_state::kc85(machine_config &config)
1334 {
1335 	/* basic machine hardware */
1336 	I8085A(config, m_maincpu, XTAL(4'915'200));
1337 	m_maincpu->set_addrmap(AS_PROGRAM, &kc85_state::kc85_mem);
1338 	m_maincpu->set_addrmap(AS_IO, &kc85_state::kc85_io);
1339 	m_maincpu->in_sid_func().set(FUNC(kc85_state::kc85_sid_r));
1340 	m_maincpu->out_sod_func().set(FUNC(kc85_state::kc85_sod_w));
1341 
1342 	/* video hardware */
1343 	kc85_video(config);
1344 
1345 	/* sound hardware */
1346 	SPEAKER(config, "mono").front_center();
1347 	SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
1348 
1349 	/* devices */
1350 	i8155_device &i8155(I8155(config, I8155_TAG, XTAL(4'915'200)/2));
1351 	i8155.out_pa_callback().set(FUNC(kc85_state::i8155_pa_w));
1352 	i8155.out_pb_callback().set(FUNC(kc85_state::i8155_pb_w));
1353 	i8155.in_pc_callback().set(FUNC(kc85_state::i8155_pc_r));
1354 	i8155.out_to_callback().set(FUNC(kc85_state::i8155_to_w));
1355 
1356 	UPD1990A(config, m_rtc);
1357 	m_rtc->tp_callback().set_inputline(m_maincpu, I8085_RST75_LINE);
1358 
1359 	IM6402(config, m_uart, 0, 0);
1360 	m_uart->tro_callback().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
1361 	m_uart->dr_callback().set_inputline(m_maincpu, I8085_RST65_LINE);
1362 
1363 	rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
1364 	rs232.rxd_handler().set(m_uart, FUNC(im6402_device::write_rri));
1365 
1366 	CENTRONICS(config, m_centronics, centronics_devices, "printer");
1367 	m_centronics->busy_handler().set(FUNC(kc85_state::write_centronics_busy));
1368 	m_centronics->select_handler().set(FUNC(kc85_state::write_centronics_select));
1369 
1370 	CASSETTE(config, m_cassette);
1371 	m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
1372 	m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
1373 
1374 	/* option ROM cartridge */
1375 	GENERIC_CARTSLOT(config, m_opt_cart, generic_linear_slot, "trsm100_cart", "bin,rom");
1376 
1377 	/* software lists */
1378 	SOFTWARE_LIST(config, "cart_list").set_original("trsm100");
1379 
1380 	/* internal ram */
1381 	RAM(config, m_ram).set_default_size("16K").set_extra_options("32K");
1382 }
1383 
pc8201(machine_config & config)1384 void pc8201_state::pc8201(machine_config &config)
1385 {
1386 	/* basic machine hardware */
1387 	I8085A(config, m_maincpu, XTAL(4'915'200));
1388 	m_maincpu->set_addrmap(AS_PROGRAM, &pc8201_state::pc8201_mem);
1389 	m_maincpu->set_addrmap(AS_IO, &pc8201_state::pc8201_io);
1390 	m_maincpu->in_sid_func().set(FUNC(pc8201_state::kc85_sid_r));
1391 	m_maincpu->out_sod_func().set(FUNC(pc8201_state::kc85_sod_w));
1392 
1393 	/* video hardware */
1394 	kc85_video(config);
1395 
1396 	/* sound hardware */
1397 	SPEAKER(config, "mono").front_center();
1398 	SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
1399 
1400 	/* devices */
1401 	i8155_device &i8155(I8155(config, I8155_TAG, XTAL(4'915'200)/2));
1402 	i8155.out_pa_callback().set(FUNC(pc8201_state::i8155_pa_w));
1403 	i8155.out_pb_callback().set(FUNC(pc8201_state::i8155_pb_w));
1404 	i8155.in_pc_callback().set(FUNC(pc8201_state::i8155_pc_r));
1405 	i8155.out_to_callback().set(FUNC(pc8201_state::i8155_to_w));
1406 
1407 	UPD1990A(config, m_rtc);
1408 	m_rtc->tp_callback().set_inputline(m_maincpu, I8085_RST75_LINE);
1409 
1410 	IM6402(config, m_uart, 0, 0);
1411 	m_uart->tro_callback().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
1412 	m_uart->dr_callback().set_inputline(m_maincpu, I8085_RST65_LINE);
1413 
1414 	rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
1415 	rs232.rxd_handler().set(m_uart, FUNC(im6402_device::write_rri));
1416 
1417 	CENTRONICS(config, m_centronics, centronics_devices, "printer");
1418 	m_centronics->busy_handler().set(FUNC(pc8201_state::write_centronics_busy));
1419 	m_centronics->select_handler().set(FUNC(pc8201_state::write_centronics_select));
1420 
1421 	CASSETTE(config, m_cassette);
1422 	m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
1423 	m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
1424 
1425 	/* option ROM cartridge */
1426 	GENERIC_CARTSLOT(config, m_opt_cart, generic_linear_slot, "pc8201_cart", "bin,rom");
1427 
1428 	/* 128KB ROM cassette */
1429 	GENERIC_CARTSLOT(config, "cas_cartslot", generic_linear_slot, "pc8201_cart2", "bin,rom");
1430 
1431 	/* software lists */
1432 	SOFTWARE_LIST(config, "cart_list").set_original("pc8201");
1433 
1434 	/* internal ram */
1435 	RAM(config, m_ram).set_default_size("16K").set_extra_options("32K,64K,96K");
1436 }
1437 
pc8300(machine_config & config)1438 void pc8201_state::pc8300(machine_config &config)
1439 {
1440 	pc8201(config);
1441 	m_ram->set_default_size("32K").set_extra_options("64K,96K");
1442 }
1443 
trsm100(machine_config & config)1444 void trsm100_state::trsm100(machine_config &config)
1445 {
1446 	/* basic machine hardware */
1447 	I8085A(config, m_maincpu, XTAL(4'915'200));
1448 	m_maincpu->set_addrmap(AS_PROGRAM, &trsm100_state::kc85_mem);
1449 	m_maincpu->set_addrmap(AS_IO, &trsm100_state::trsm100_io);
1450 	m_maincpu->in_sid_func().set(FUNC(trsm100_state::kc85_sid_r));
1451 	m_maincpu->out_sod_func().set(FUNC(trsm100_state::kc85_sod_w));
1452 
1453 	/* video hardware */
1454 	kc85_video(config);
1455 
1456 	/* sound hardware */
1457 	SPEAKER(config, "mono").front_center();
1458 	SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
1459 
1460 	/* devices */
1461 	i8155_device &i8155(I8155(config, I8155_TAG, XTAL(4'915'200)/2));
1462 	i8155.out_pa_callback().set(FUNC(trsm100_state::i8155_pa_w));
1463 	i8155.out_pb_callback().set(FUNC(trsm100_state::i8155_pb_w));
1464 	i8155.in_pc_callback().set(FUNC(trsm100_state::i8155_pc_r));
1465 	i8155.out_to_callback().set(FUNC(trsm100_state::i8155_to_w));
1466 
1467 	UPD1990A(config, m_rtc);
1468 	m_rtc->tp_callback().set_inputline(m_maincpu, I8085_RST75_LINE);
1469 
1470 	IM6402(config, m_uart, 0, 0);
1471 	m_uart->tro_callback().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
1472 	m_uart->dr_callback().set_inputline(m_maincpu, I8085_RST65_LINE);
1473 
1474 	rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
1475 	rs232.rxd_handler().set(m_uart, FUNC(im6402_device::write_rri));
1476 
1477 	CENTRONICS(config, m_centronics, centronics_devices, "printer");
1478 
1479 	CASSETTE(config, m_cassette);
1480 	m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
1481 	m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
1482 
1483 //  MCFG_MC14412_ADD(MC14412_TAG, XTAL(1'000'000))
1484 
1485 	/* option ROM cartridge */
1486 	GENERIC_CARTSLOT(config, m_opt_cart, generic_linear_slot, "trsm100_cart", "bin,rom");
1487 
1488 	/* software lists */
1489 	SOFTWARE_LIST(config, "cart_list").set_original("trsm100");
1490 
1491 	/* internal ram */
1492 	RAM(config, m_ram).set_default_size("8K").set_extra_options("16K,24K,32K");
1493 }
1494 
tandy102(machine_config & config)1495 void trsm100_state::tandy102(machine_config &config)
1496 {
1497 	trsm100(config);
1498 	m_ram->set_default_size("24K").set_extra_options("32K");
1499 }
1500 
tandy200(machine_config & config)1501 void tandy200_state::tandy200(machine_config &config)
1502 {
1503 	/* basic machine hardware */
1504 	I8085A(config, m_maincpu, XTAL(4'915'200));
1505 	m_maincpu->set_addrmap(AS_PROGRAM, &tandy200_state::tandy200_mem);
1506 	m_maincpu->set_addrmap(AS_IO, &tandy200_state::tandy200_io);
1507 	m_maincpu->in_sid_func().set(FUNC(tandy200_state::kc85_sid_r));
1508 	m_maincpu->out_sod_func().set(FUNC(tandy200_state::kc85_sod_w));
1509 
1510 	/* video hardware */
1511 	tandy200_video(config);
1512 
1513 	/* TP timer */
1514 	TIMER(config, "tp").configure_periodic(FUNC(tandy200_state::tandy200_tp_tick), attotime::from_hz(XTAL(4'915'200)/2/8192));
1515 
1516 	/* sound hardware */
1517 	SPEAKER(config, "mono").front_center();
1518 	SPEAKER_SOUND(config, m_speaker);
1519 	m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
1520 
1521 //  TCM5089(config, TCM5089_TAG, XTAL(3'579'545));
1522 
1523 	/* devices */
1524 	i8155_device &i8155(I8155(config, I8155_TAG, XTAL(4'915'200)/2));
1525 	i8155.out_pa_callback().set(FUNC(tandy200_state::i8155_pa_w));
1526 	i8155.out_pb_callback().set(FUNC(tandy200_state::i8155_pb_w));
1527 	i8155.in_pc_callback().set(FUNC(tandy200_state::i8155_pc_r));
1528 	i8155.out_to_callback().set(FUNC(tandy200_state::i8155_to_w));
1529 
1530 	RP5C01(config, m_rtc, XTAL(32'768));
1531 
1532 	i8251_device &i8251(I8251(config, I8251_TAG, XTAL(4'915'200)/2));
1533 	i8251.txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
1534 	i8251.dtr_handler().set(RS232_TAG, FUNC(rs232_port_device::write_dtr));
1535 	i8251.rts_handler().set(RS232_TAG, FUNC(rs232_port_device::write_rts));
1536 	i8251.rxrdy_handler().set_inputline(m_maincpu, I8085_RST65_LINE);
1537 
1538 	rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
1539 	rs232.rxd_handler().set(I8251_TAG, FUNC(i8251_device::write_rxd));
1540 	rs232.dsr_handler().set(I8251_TAG, FUNC(i8251_device::write_dsr));
1541 
1542 //  MCFG_MC14412_ADD(MC14412_TAG, XTAL(1'000'000))
1543 	CENTRONICS(config, m_centronics, centronics_devices, "printer");
1544 	m_centronics->busy_handler().set(FUNC(tandy200_state::write_centronics_busy));
1545 	m_centronics->select_handler().set(FUNC(tandy200_state::write_centronics_select));
1546 
1547 	output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
1548 	m_centronics->set_output_latch(cent_data_out);
1549 
1550 	CASSETTE(config, m_cassette);
1551 	m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
1552 	m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
1553 
1554 	/* option ROM cartridge */
1555 	GENERIC_CARTSLOT(config, m_opt_cart, generic_linear_slot, "tandy200_cart", "bin,rom");
1556 
1557 	/* software lists */
1558 	SOFTWARE_LIST(config, "cart_list").set_original("tandy200");
1559 
1560 	/* internal ram */
1561 	RAM(config, m_ram).set_default_size("24K").set_extra_options("48K,72K");
1562 }
1563 
1564 /* ROMs */
1565 
1566 ROM_START( kc85 )
1567 	ROM_REGION( 0x8000, I8085_TAG, 0 )
1568 	ROM_LOAD( "kc85rom.bin", 0x0000, 0x8000, CRC(8a9ddd6b) SHA1(9d18cb525580c9e071e23bc3c472380aa46356c0) )
1569 ROM_END
1570 
1571 ROM_START( pc8201 )
1572 	ROM_REGION( 0x10000, I8085_TAG, 0 )
1573 	ROM_LOAD( "3256a41-3b1 n 82 basic.rom0", 0x0000, 0x8000, CRC(3dbaa484) SHA1(9886a973faa639ca9e0ba478790bab20e5163495) )
1574 ROM_END
1575 
1576 ROM_START( pc8201a )
1577 	ROM_REGION( 0x10000, I8085_TAG, 0 )
1578 	ROM_LOAD( "pc8201rom.rom", 0x0000, 0x8000, CRC(30555035) SHA1(96f33ff235db3028bf5296052acedbc94437c596) )
1579 ROM_END
1580 
1581 ROM_START( npc8300 )
1582 	ROM_REGION( 0x10000, I8085_TAG, 0 )
1583 	ROM_LOAD( "831000-438_n83a_basic_1986_microsoft_8716_z01.bin", 0x0000, 0x8000, CRC(a3c15dcb) SHA1(f0322dfe3f2e951de043bf6d0973e6ffc2c87181))
1584 ROM_END
1585 
1586 ROM_START( trsm100 )
1587 	/*
1588 	    Board Code  ROM type            ROM Code            Comment
1589 	    -------------------------------------------------------------------
1590 	    PLX110CH1X  custom              LH535618            early North America
1591 	    PLX110EH1X  27C256 compatible   3256C07-3J1/11US    late North America
1592 	    PLX120CH1X  27C256 compatible   3256C05-3E1/11EP    European/Italian
1593 	*/
1594 	ROM_REGION( 0x8000, I8085_TAG, 0 )
1595 	ROM_LOAD( "m100rom.m12",  0x0000, 0x8000, CRC(730a3611) SHA1(094dbc4ac5a4ea5cdf51a1ac581a40a9622bb25d) )
1596 ROM_END
1597 
1598 ROM_START( m10 )
1599 	// 3256C02-4B3/I        Italian
1600 	ROM_REGION( 0x8000, I8085_TAG, 0 )
1601 	ROM_LOAD( "m10rom.m12", 0x0000, 0x8000, CRC(f0e8447a) SHA1(d58867276213116a79f7074109b7d7ce02e8a3af) )
1602 ROM_END
1603 
1604 ROM_START( tandy102 )
1605 	ROM_REGION( 0x8000, I8085_TAG, 0 )
1606 	ROM_LOAD( "m102rom.m12", 0x0000, 0x8000, CRC(08e9f89c) SHA1(b6ede7735a361c80419f4c9c0e36e7d480c36d11) )
1607 ROM_END
1608 
1609 ROM_START( tandy200 )
1610 	ROM_REGION( 0x18000, I8085_TAG, 0 )
1611 	ROM_LOAD( "rom 1-1.m15", 0x00000, 0x8000, NO_DUMP )
1612 	ROM_LOAD( "rom 1-2.m13", 0x08000, 0x2000, NO_DUMP )
1613 	ROM_LOAD( "rom 2.m14",   0x10000, 0x8000, NO_DUMP )
1614 	ROM_LOAD( "t200rom.bin", 0x0000, 0xa000, BAD_DUMP CRC(e3358b38) SHA1(35d4e6a5fb8fc584419f57ec12b423f6021c0991) ) /* Y2K hacked */
1615 	ROM_CONTINUE(           0x10000, 0x8000 )
1616 ROM_END
1617 
1618 /* System Drivers */
1619 
1620 /*    YEAR  NAME      PARENT   COMPAT  MACHINE   INPUT    CLASS           INIT        COMPANY              FULLNAME */
1621 COMP( 1983, kc85,     0,       0,      kc85,     kc85,    kc85_state,     empty_init, "Kyosei",            "Kyotronic 85 (Japan)", MACHINE_SUPPORTS_SAVE )
1622 COMP( 1983, m10,      kc85,    0,      kc85,     olivm10, kc85_state,     empty_init, "Olivetti",          "M-10",                 MACHINE_SUPPORTS_SAVE )
1623 //COMP( 1983, m10m,     kc85,    0,      kc85,     olivm10, kc85_state,     empty_init, "Olivetti",          "M-10 Modem (US)",      MACHINE_SUPPORTS_SAVE )
1624 COMP( 1983, trsm100,  0,       0,      trsm100,  kc85,    trsm100_state,  empty_init, "Tandy Radio Shack", "TRS-80 Model 100",     MACHINE_SUPPORTS_SAVE )
1625 COMP( 1986, tandy102, trsm100, 0,      tandy102, kc85,    trsm100_state,  empty_init, "Tandy Radio Shack", "Tandy 102",            MACHINE_SUPPORTS_SAVE )
1626 COMP( 1983, pc8201,   0,       0,      pc8201,   pc8201,  pc8201_state,   empty_init, "NEC",               "PC-8201 (Japan)",      MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
1627 COMP( 1983, pc8201a,  pc8201,  0,      pc8201,   pc8201a, pc8201_state,   empty_init, "NEC",               "PC-8201A",             MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
1628 COMP( 1987, npc8300,  pc8201,  0,      pc8300,   pc8201a, pc8201_state,   empty_init, "NEC",               "PC-8300",              MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
1629 COMP( 1984, tandy200, 0,       0,      tandy200, kc85,    tandy200_state, empty_init, "Tandy Radio Shack", "Tandy 200",            MACHINE_SUPPORTS_SAVE )
1630