trunk/src/mess/drivers/m24.c
r244960 | r244961 | |
4 | 4 | #include "cpu/tms7000/tms7000.h" |
5 | 5 | #include "bus/isa/isa.h" |
6 | 6 | #include "bus/isa/isa_cards.h" |
7 | | #include "machine/pckeybrd.h" |
| 7 | #include "machine/m24_kbd.h" |
8 | 8 | #include "machine/mm58274c.h" |
9 | 9 | #include "includes/genpc.h" |
10 | 10 | |
r244960 | r244961 | |
15 | 15 | driver_device(mconfig, type, tag), |
16 | 16 | m_maincpu(*this, "maincpu"), |
17 | 17 | m_mb(*this, "mb"), |
18 | | m_kbc(*this, "kbc") |
| 18 | m_kbc(*this, "kbc"), |
| 19 | m_keyboard(*this, "keyboard") |
19 | 20 | { } |
20 | 21 | required_device<cpu_device> m_maincpu; |
21 | 22 | required_device<pc_noppi_mb_device> m_mb; |
22 | 23 | required_device<cpu_device> m_kbc; |
| 24 | required_device<m24_keyboard_device> m_keyboard; |
23 | 25 | |
24 | 26 | DECLARE_READ8_MEMBER(keyboard_r); |
25 | 27 | DECLARE_WRITE8_MEMBER(keyboard_w); |
r244960 | r244961 | |
27 | 29 | DECLARE_WRITE8_MEMBER(pb_w); |
28 | 30 | DECLARE_READ8_MEMBER(kbcdata_r); |
29 | 31 | DECLARE_WRITE8_MEMBER(kbcdata_w); |
| 32 | DECLARE_WRITE_LINE_MEMBER(kbcin_w); |
30 | 33 | |
31 | | UINT8 m_sysctl, m_pa, m_kbcdata; |
32 | | bool m_kbcibf; |
| 34 | void machine_reset(); |
| 35 | |
| 36 | UINT8 m_sysctl, m_pa, m_kbcin, m_kbcout; |
| 37 | bool m_kbcibf, m_kbdata; |
33 | 38 | }; |
34 | 39 | |
| 40 | void m24_state::machine_reset() |
| 41 | { |
| 42 | m_sysctl = 0; |
| 43 | m_pa = 0x40; |
| 44 | m_kbcibf = false; |
| 45 | m_kbdata = true; |
| 46 | } |
| 47 | |
35 | 48 | READ8_MEMBER(m24_state::keyboard_r) |
36 | 49 | { |
37 | 50 | switch(offset) |
38 | 51 | { |
39 | 52 | case 0: |
40 | | m_pa &= ~0x40; |
| 53 | m_pa |= 0x40; |
41 | 54 | m_mb->m_pic8259->ir1_w(0); |
42 | | return m_kbcdata; |
| 55 | return m_kbcout; |
43 | 56 | case 1: |
44 | 57 | return m_sysctl; |
45 | 58 | case 2: |
r244960 | r244961 | |
57 | 70 | case 0: |
58 | 71 | m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE); |
59 | 72 | m_kbcibf = true; |
60 | | m_kbcdata = data; |
| 73 | m_kbcin = data; |
61 | 74 | break; |
62 | 75 | case 1: |
63 | 76 | m_sysctl = data; |
64 | 77 | m_mb->m_pit8253->write_gate2(BIT(data, 0)); |
65 | 78 | m_mb->pc_speaker_set_spkrdata(BIT(data, 1)); |
66 | 79 | if(BIT(data, 6)) |
67 | | m_pa |= 2; |
| 80 | m_pa |= 4; |
68 | 81 | else |
69 | | m_pa &= ~2; |
| 82 | m_pa &= ~4; |
70 | 83 | break; |
71 | 84 | } |
72 | 85 | } |
73 | 86 | |
74 | 87 | READ8_MEMBER(m24_state::pa_r) |
75 | 88 | { |
76 | | return m_pa; |
| 89 | return m_pa & (m_kbdata ? 0xff : 0xfd); |
77 | 90 | } |
78 | 91 | |
79 | 92 | WRITE8_MEMBER(m24_state::pb_w) |
80 | 93 | { |
| 94 | m_keyboard->clock_w(!BIT(data, 0)); |
| 95 | m_keyboard->data_w(!BIT(data, 1)); |
| 96 | m_pa = (m_pa & ~3) | (~data & 3); |
81 | 97 | } |
82 | 98 | |
83 | 99 | READ8_MEMBER(m24_state::kbcdata_r) |
84 | 100 | { |
85 | 101 | m_kbc->set_input_line(TMS7000_INT1_LINE, CLEAR_LINE); |
86 | 102 | m_kbcibf = false; |
87 | | return m_kbcdata; |
| 103 | return m_kbcin; |
88 | 104 | } |
89 | 105 | |
90 | 106 | WRITE8_MEMBER(m24_state::kbcdata_w) |
91 | 107 | { |
92 | | m_pa |= 0x40; |
| 108 | m_pa &= ~0x40; |
93 | 109 | m_mb->m_pic8259->ir1_w(1); |
94 | | m_kbcdata = data; |
| 110 | m_kbcout = data; |
95 | 111 | } |
96 | 112 | |
| 113 | WRITE_LINE_MEMBER(m24_state::kbcin_w) |
| 114 | { |
| 115 | m_kbdata = state; |
| 116 | } |
| 117 | |
97 | 118 | static ADDRESS_MAP_START( m24_map, AS_PROGRAM, 16, m24_state ) |
98 | 119 | ADDRESS_MAP_UNMAP_HIGH |
99 | 120 | AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10") |
r244960 | r244961 | |
159 | 180 | PORT_DIPSETTING( 0x4000, "2" ) |
160 | 181 | PORT_DIPSETTING( 0x8000, "3" ) |
161 | 182 | PORT_DIPSETTING( 0xc000, "4" ) |
162 | | |
163 | | PORT_INCLUDE(pc_keyboard) |
164 | 183 | INPUT_PORTS_END |
165 | 184 | |
166 | 185 | static MACHINE_CONFIG_START( olivetti, m24_state ) |
r244960 | r244961 | |
185 | 204 | MCFG_CPU_PROGRAM_MAP(kbc_map) |
186 | 205 | MCFG_CPU_IO_MAP(kbc_io) |
187 | 206 | |
| 207 | MCFG_DEVICE_ADD("keyboard", M24_KEYBOARD, 0) |
| 208 | MCFG_M24_KEYBOARD_OUT_DATA_HANDLER(WRITELINE(m24_state, kbcin_w)) |
| 209 | |
188 | 210 | MCFG_DEVICE_ADD("mm58174an", MM58274C, 0) |
189 | 211 | MCFG_MM58274C_MODE24(1) // ? |
190 | 212 | MCFG_MM58274C_DAY1(1) // ? |
r244960 | r244961 | |
199 | 221 | ROMX_LOAD("olivetti_m24_version_1.43_low.bin", 0x4000, 0x2000, CRC(ff7e0f10) SHA1(13423011a9bae3f3193e8c199f98a496cab48c0f), ROM_SKIP(1)) |
200 | 222 | |
201 | 223 | ROM_REGION(0x800, "kbc", 0) |
202 | | ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
| 224 | ROM_LOAD("pdbd.tms2516.keyboardmcureplacementdaughterboard_10u", 0x000, 0x800, CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
203 | 225 | ROM_END |
204 | 226 | |
205 | 227 | ROM_START( m240 ) |
r244960 | r244961 | |
209 | 231 | |
210 | 232 | // is this one the same? |
211 | 233 | ROM_REGION(0x800, "kbc", 0) |
212 | | ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, BAD_DUMP CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
| 234 | ROM_LOAD("pdbd.tms2516.keyboardmcureplacementdaughterboard_10u", 0x000, 0x800, BAD_DUMP CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
213 | 235 | ROM_END |
214 | 236 | |
215 | 237 | COMP( 1983, m24, ibm5150, 0, olivetti, m24, driver_device, 0, "Olivetti", "M24", GAME_NOT_WORKING) |
trunk/src/mess/machine/m24_kbd.c
r0 | r244961 | |
| 1 | #include "m24_kbd.h" |
| 2 | |
| 3 | const device_type M24_KEYBOARD = &device_creator<m24_keyboard_device>; |
| 4 | |
| 5 | ROM_START( m24_keyboard ) |
| 6 | ROM_REGION(0x800, "mcu", 0) |
| 7 | ROM_LOAD("m24_8049_int.bin", 0x0000, 0x800, CRC(ef26ca15) SHA1(b5076d40c255e17dc93478e2254ea19aff4918b3)) |
| 8 | ROM_END |
| 9 | |
| 10 | |
| 11 | const rom_entry *m24_keyboard_device::device_rom_region() const |
| 12 | { |
| 13 | return ROM_NAME( m24_keyboard ); |
| 14 | } |
| 15 | |
| 16 | static ADDRESS_MAP_START( m24_keyboard_io, AS_IO, 8, m24_keyboard_device ) |
| 17 | AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(bus_w) |
| 18 | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(p1_r, p1_w) |
| 19 | AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READ(p2_r) AM_WRITENOP |
| 20 | AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_r) |
| 21 | AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(t1_r) |
| 22 | ADDRESS_MAP_END |
| 23 | |
| 24 | static MACHINE_CONFIG_FRAGMENT( m24_keyboard ) |
| 25 | MCFG_CPU_ADD("mcu", I8049, XTAL_6MHz) |
| 26 | MCFG_CPU_IO_MAP(m24_keyboard_io) |
| 27 | MACHINE_CONFIG_END |
| 28 | |
| 29 | machine_config_constructor m24_keyboard_device::device_mconfig_additions() const |
| 30 | { |
| 31 | return MACHINE_CONFIG_NAME( m24_keyboard ); |
| 32 | } |
| 33 | |
| 34 | INPUT_PORTS_START( m24_keyboard ) |
| 35 | PORT_START("ROW.0") |
| 36 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 37 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') |
| 38 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') |
| 39 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') |
| 40 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 41 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) |
| 42 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 43 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) |
| 44 | |
| 45 | PORT_START("ROW.1") |
| 46 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') |
| 47 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') |
| 48 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') |
| 49 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') |
| 50 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 51 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) |
| 52 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 53 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) |
| 54 | |
| 55 | PORT_START("ROW.2") |
| 56 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 57 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| 58 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') |
| 59 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') |
| 60 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 61 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) |
| 62 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 63 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) |
| 64 | |
| 65 | PORT_START("ROW.3") |
| 66 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 67 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') |
| 68 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') |
| 69 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') |
| 70 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 71 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) |
| 72 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 73 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) |
| 74 | |
| 75 | PORT_START("ROW.4") |
| 76 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
| 77 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') |
| 78 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') |
| 79 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') |
| 80 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 81 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) |
| 82 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 83 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) |
| 84 | |
| 85 | PORT_START("ROW.5") |
| 86 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') |
| 87 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') |
| 88 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') |
| 89 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') |
| 90 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 91 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) |
| 92 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 93 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) |
| 94 | |
| 95 | PORT_START("ROW.6") |
| 96 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') |
| 97 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') |
| 98 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') |
| 99 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') |
| 100 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 101 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) |
| 102 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 103 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) |
| 104 | |
| 105 | PORT_START("ROW.7") |
| 106 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') |
| 107 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') |
| 108 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') |
| 109 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 110 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 111 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) |
| 112 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 113 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) |
| 114 | |
| 115 | PORT_START("ROW.8") |
| 116 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') |
| 117 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') |
| 118 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') |
| 119 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
| 120 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 121 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) |
| 122 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 123 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) |
| 124 | |
| 125 | PORT_START("ROW.9") |
| 126 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') |
| 127 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') |
| 128 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') |
| 129 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('?') PORT_CHAR('/') |
| 130 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 131 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) |
| 132 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 133 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) |
| 134 | |
| 135 | PORT_START("ROW.10") |
| 136 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') |
| 137 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') |
| 138 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') |
| 139 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') |
| 140 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 141 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) |
| 142 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 143 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 144 | |
| 145 | PORT_START("ROW.11") |
| 146 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') |
| 147 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') |
| 148 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') |
| 149 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) |
| 150 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 151 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 152 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 153 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 154 | |
| 155 | PORT_START("ROW.12") |
| 156 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) |
| 157 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') |
| 158 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) |
| 159 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') |
| 160 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 161 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 162 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 163 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 164 | |
| 165 | PORT_START("ROW.13") |
| 166 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 167 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 168 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 169 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 170 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 171 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 172 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 173 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 174 | |
| 175 | PORT_START("ROW.14") |
| 176 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 177 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) |
| 178 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) |
| 179 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) |
| 180 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 181 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 182 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 183 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 184 | |
| 185 | PORT_START("ROW.15") |
| 186 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x2A") |
| 187 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 188 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 189 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) |
| 190 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) |
| 191 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) |
| 192 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) |
| 193 | |
| 194 | PORT_START("MOUSEBTN") |
| 195 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 196 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 197 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 198 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 199 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Btn") PORT_CODE(MOUSECODE_BUTTON1) |
| 200 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Middle Btn") PORT_CODE(MOUSECODE_BUTTON3) |
| 201 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Btn") PORT_CODE(MOUSECODE_BUTTON2) |
| 202 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 203 | INPUT_PORTS_END |
| 204 | |
| 205 | |
| 206 | ioport_constructor m24_keyboard_device::device_input_ports() const |
| 207 | { |
| 208 | return INPUT_PORTS_NAME( m24_keyboard ); |
| 209 | } |
| 210 | |
| 211 | m24_keyboard_device::m24_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 212 | : device_t(mconfig, M24_KEYBOARD, "Olivetti M24 Keyboard", tag, owner, clock, "m24_kbd", __FILE__), |
| 213 | m_rows(*this, "ROW"), |
| 214 | m_mousebtn(*this, "MOUSEBTN"), |
| 215 | m_out_data(*this), |
| 216 | m_mcu(*this, "mcu") |
| 217 | { |
| 218 | } |
| 219 | |
| 220 | void m24_keyboard_device::device_start() |
| 221 | { |
| 222 | m_out_data.resolve_safe(); |
| 223 | m_out_data(1); |
| 224 | m_reset_timer = timer_alloc(); |
| 225 | } |
| 226 | |
| 227 | void m24_keyboard_device::device_reset() |
| 228 | { |
| 229 | m_kbcdata = true; |
| 230 | } |
| 231 | |
| 232 | void m24_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 233 | { |
| 234 | m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| 235 | m_out_data(1); |
| 236 | } |
| 237 | |
| 238 | READ8_MEMBER( m24_keyboard_device::p1_r ) |
| 239 | { |
| 240 | return m_p1 | (m_kbcdata ? 0 : 2); |
| 241 | } |
| 242 | |
| 243 | WRITE8_MEMBER( m24_keyboard_device::p1_w ) |
| 244 | { |
| 245 | // bit 3 and 4 are leds and bits 6 and 7 are jumpers to ground |
| 246 | m_p1 = data & ~0xc0; |
| 247 | if(m_p1 & 4) |
| 248 | m_p1 |= 2; |
| 249 | else |
| 250 | m_p1 &= ~2; |
| 251 | m_out_data(!BIT(data, 2)); |
| 252 | } |
| 253 | |
| 254 | READ8_MEMBER( m24_keyboard_device::p2_r ) |
| 255 | { |
| 256 | return (m_keypress << 7) | m_mousebtn->read(); |
| 257 | } |
| 258 | |
| 259 | READ8_MEMBER( m24_keyboard_device::t0_r ) |
| 260 | { |
| 261 | return 0; |
| 262 | } |
| 263 | |
| 264 | READ8_MEMBER( m24_keyboard_device::t1_r ) |
| 265 | { |
| 266 | return 0; |
| 267 | } |
| 268 | |
| 269 | WRITE8_MEMBER( m24_keyboard_device::bus_w ) |
| 270 | { |
| 271 | UINT8 col = m_rows[(data >> 3) & 0xf]->read(); |
| 272 | m_keypress = (col & (1 << (data & 7))) ? 1 : 0; |
| 273 | } |
| 274 | |
| 275 | WRITE_LINE_MEMBER( m24_keyboard_device::clock_w ) |
| 276 | { |
| 277 | m_mcu->set_input_line(MCS48_INPUT_IRQ, !state); |
| 278 | if(!state) |
| 279 | m_reset_timer->adjust(attotime::from_msec(50)); |
| 280 | else |
| 281 | { |
| 282 | m_reset_timer->adjust(attotime::never); |
| 283 | m_mcu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); |
| 284 | } |
| 285 | } |
| 286 | |
| 287 | WRITE_LINE_MEMBER( m24_keyboard_device::data_w ) |
| 288 | { |
| 289 | m_kbcdata = state; |
| 290 | } |