trunk/src/mess/machine/abc99.c
r23295 | r23296 | |
66 | 66 | #define I8035_Z5_TAG "z5" |
67 | 67 | |
68 | 68 | |
69 | | enum |
70 | | { |
71 | | LED_1 = 0, |
72 | | LED_2, |
73 | | LED_3, |
74 | | LED_4, |
75 | | LED_5, |
76 | | LED_6, |
77 | | LED_7, |
78 | | LED_8, |
79 | | LED_INS, |
80 | | LED_ALT, |
81 | | LED_CAPS_LOCK |
82 | | }; |
83 | 69 | |
84 | | |
85 | | |
86 | 70 | //************************************************************************** |
87 | 71 | // DEVICE DEFINITIONS |
88 | 72 | //************************************************************************** |
r23295 | r23296 | |
191 | 175 | //------------------------------------------------- |
192 | 176 | |
193 | 177 | static ADDRESS_MAP_START( abc99_z5_io, AS_IO, 8, abc99_device ) |
194 | | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(z5_p1_r) |
| 178 | /* AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(z5_p1_r) |
195 | 179 | AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(z5_p2_w) |
196 | | AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_WRITE(z5_t0_w) |
197 | | AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(z5_t1_r) |
| 180 | AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_WRITENOP // Z2 CLK |
| 181 | AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(z5_t1_r)*/ |
198 | 182 | ADDRESS_MAP_END |
199 | 183 | |
200 | 184 | |
r23295 | r23296 | |
212 | 196 | MCFG_CPU_ADD(I8035_Z5_TAG, I8035, XTAL_6MHz) |
213 | 197 | MCFG_CPU_PROGRAM_MAP(abc99_z5_mem) |
214 | 198 | MCFG_CPU_IO_MAP(abc99_z5_io) |
| 199 | MCFG_DEVICE_DISABLE() // HACK fix for broken serial I/O |
215 | 200 | |
216 | 201 | // sound hardware |
217 | 202 | MCFG_SPEAKER_STANDARD_MONO("mono") |
r23295 | r23296 | |
237 | 222 | |
238 | 223 | INPUT_CHANGED_MEMBER( abc99_device::keyboard_reset ) |
239 | 224 | { |
240 | | m_mousecpu->set_input_line(INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE); |
| 225 | if (newval) |
| 226 | { |
| 227 | m_mousecpu->reset(); |
| 228 | } |
241 | 229 | } |
242 | 230 | |
243 | 231 | |
r23295 | r23296 | |
457 | 445 | |
458 | 446 | inline void abc99_device::serial_input() |
459 | 447 | { |
460 | | m_maincpu->set_input_line(MCS48_INPUT_IRQ, (m_si | m_si_en) ? CLEAR_LINE : ASSERT_LINE); |
| 448 | m_maincpu->set_input_line(MCS48_INPUT_IRQ, (m_si || m_si_en) ? CLEAR_LINE : ASSERT_LINE); |
461 | 449 | m_mousecpu->set_input_line(MCS48_INPUT_IRQ, m_si ? CLEAR_LINE : ASSERT_LINE); |
462 | 450 | } |
463 | 451 | |
464 | 452 | |
465 | 453 | //------------------------------------------------- |
466 | | // serial_output - |
467 | | //------------------------------------------------- |
468 | | |
469 | | inline void abc99_device::serial_output() |
470 | | { |
471 | | int so = m_so_z2 & m_so_z5; |
472 | | |
473 | | if (m_so != so) |
474 | | { |
475 | | m_so = so; |
476 | | } |
477 | | } |
478 | | |
479 | | |
480 | | //------------------------------------------------- |
481 | 454 | // serial_clock - |
482 | 455 | //------------------------------------------------- |
483 | 456 | |
r23295 | r23296 | |
529 | 502 | m_mouseb(*this, "MOUSEB"), |
530 | 503 | m_si(1), |
531 | 504 | m_si_en(1), |
532 | | m_so(1), |
533 | 505 | m_so_z2(1), |
534 | 506 | m_so_z5(1), |
535 | 507 | m_keydown(0), |
536 | 508 | m_t1_z2(0), |
537 | 509 | m_t1_z5(0), |
538 | 510 | m_led_en(0), |
539 | | m_reset(0) |
| 511 | m_reset(1) |
540 | 512 | { |
541 | 513 | } |
542 | 514 | |
r23295 | r23296 | |
560 | 532 | // state saving |
561 | 533 | save_item(NAME(m_si)); |
562 | 534 | save_item(NAME(m_si_en)); |
563 | | save_item(NAME(m_so)); |
564 | 535 | save_item(NAME(m_so_z2)); |
565 | 536 | save_item(NAME(m_so_z5)); |
566 | 537 | save_item(NAME(m_keydown)); |
r23295 | r23296 | |
643 | 614 | */ |
644 | 615 | |
645 | 616 | // serial output |
646 | | int so_z2 = BIT(data, 0); |
| 617 | m_so_z2 = BIT(data, 0); |
647 | 618 | |
648 | | if (m_so_z2 != so_z2) |
649 | | { |
650 | | m_so_z2 = so_z2; |
651 | | serial_output(); |
652 | | } |
653 | | |
654 | 619 | // key down |
655 | 620 | key_down(!BIT(data, 1)); |
656 | 621 | |
r23295 | r23296 | |
783 | 748 | // Z2 reset |
784 | 749 | int reset = BIT(data, 5); |
785 | 750 | |
786 | | if (m_reset != reset) |
| 751 | if (!m_reset && reset) |
787 | 752 | { |
788 | | m_reset = reset; |
789 | | m_maincpu->set_input_line(INPUT_LINE_RESET, m_reset ? CLEAR_LINE : ASSERT_LINE); |
| 753 | m_maincpu->reset(); |
790 | 754 | } |
791 | 755 | |
| 756 | m_reset = reset; |
| 757 | |
792 | 758 | // serial output |
793 | | int so_z5 = BIT(data, 6); |
| 759 | m_so_z5 = BIT(data, 6); |
794 | 760 | |
795 | | if (m_so_z5 != so_z5) |
796 | | { |
797 | | m_so_z5 = so_z5; |
798 | | serial_output(); |
799 | | } |
800 | | |
801 | 761 | // keyboard CPU T1 |
802 | 762 | m_t1_z2 = BIT(data, 7); |
803 | 763 | } |
804 | 764 | |
805 | 765 | |
806 | 766 | //------------------------------------------------- |
807 | | // z5_t0_w - |
808 | | //------------------------------------------------- |
809 | | |
810 | | WRITE8_MEMBER( abc99_device::z5_t0_w ) |
811 | | { |
812 | | // clock output to Z2, not necessary to emulate |
813 | | } |
814 | | |
815 | | |
816 | | //------------------------------------------------- |
817 | 767 | // z5_t1_r - |
818 | 768 | //------------------------------------------------- |
819 | 769 | |
r23295 | r23296 | |
832 | 782 | if (m_si != state) |
833 | 783 | { |
834 | 784 | m_si = state; |
835 | | |
836 | 785 | serial_input(); |
837 | 786 | } |
838 | 787 | } |
r23295 | r23296 | |
844 | 793 | |
845 | 794 | READ_LINE_MEMBER( abc99_device::txd_r ) |
846 | 795 | { |
847 | | return m_so; |
| 796 | return m_so_z2 && m_so_z5; |
848 | 797 | } |
849 | | |
850 | | |
851 | | //------------------------------------------------- |
852 | | // reset_w - |
853 | | //------------------------------------------------- |
854 | | |
855 | | WRITE_LINE_MEMBER( abc99_device::reset_w ) |
856 | | { |
857 | | m_mousecpu->set_input_line(INPUT_LINE_RESET, state ? CLEAR_LINE : ASSERT_LINE); |
858 | | } |
trunk/src/mess/machine/abc99.h
r23295 | r23296 | |
75 | 75 | DECLARE_READ8_MEMBER( z2_t1_r ); |
76 | 76 | DECLARE_READ8_MEMBER( z5_p1_r ); |
77 | 77 | DECLARE_WRITE8_MEMBER( z5_p2_w ); |
78 | | DECLARE_WRITE8_MEMBER( z5_t0_w ); |
79 | 78 | DECLARE_READ8_MEMBER( z5_t1_r ); |
80 | 79 | |
81 | 80 | DECLARE_WRITE_LINE_MEMBER( rxd_w ); |
82 | 81 | DECLARE_READ_LINE_MEMBER( txd_r ); |
83 | | DECLARE_WRITE_LINE_MEMBER( reset_w ); |
84 | 82 | |
85 | 83 | protected: |
86 | 84 | // device-level overrides |
r23295 | r23296 | |
90 | 88 | virtual void device_config_complete(); |
91 | 89 | |
92 | 90 | private: |
93 | | static const device_timer_id TIMER_SERIAL = 0; |
94 | | static const device_timer_id TIMER_MOUSE = 1; |
| 91 | enum |
| 92 | { |
| 93 | TIMER_SERIAL, |
| 94 | TIMER_MOUSE |
| 95 | }; |
| 96 | |
| 97 | enum |
| 98 | { |
| 99 | LED_1 = 0, |
| 100 | LED_2, |
| 101 | LED_3, |
| 102 | LED_4, |
| 103 | LED_5, |
| 104 | LED_6, |
| 105 | LED_7, |
| 106 | LED_8, |
| 107 | LED_INS, |
| 108 | LED_ALT, |
| 109 | LED_CAPS_LOCK |
| 110 | }; |
95 | 111 | |
96 | 112 | inline void serial_input(); |
97 | | inline void serial_output(); |
98 | 113 | inline void serial_clock(); |
99 | 114 | inline void key_down(int state); |
100 | 115 | inline void scan_mouse(); |
r23295 | r23296 | |
113 | 128 | |
114 | 129 | int m_si; |
115 | 130 | int m_si_en; |
116 | | int m_so; |
117 | 131 | int m_so_z2; |
118 | 132 | int m_so_z5; |
119 | 133 | int m_keydown; |