trunk/src/mess/drivers/hh_tms1k.c
r244961 | r244962 | |
15 | 15 | @MP0905B TMS0970 1977, Parker Brothers Codename Sector |
16 | 16 | *MP0168 TMS1000? 1979, Conic Basketball |
17 | 17 | @MP0914 TMS1000 1979, Entex Baseball 1 |
18 | | *MP0923 TMS1000? 1979, Entex Baseball 2 |
19 | 18 | @MP1030 TMS1100 1980, APF Mathemagician |
20 | | *MP1133 ? 1979, Kosmos Astro |
21 | 19 | @MP1204 TMS1100 1980, Entex Baseball 3 |
22 | 20 | *MP1221 TMS1100 1980, Entex Raise The Devil |
23 | | *MP1312 TMS1100 198?, Tandy/RadioShack Science Fair Microcomputer Trainer |
24 | 21 | *MP2139 ? 1982, Gakken Galaxy Invader 1000 |
25 | 22 | *MP2788 ? 1980, Bandai Flight Time |
26 | 23 | @MP3226 TMS1000 1978, Milton Bradley Simon |
27 | 24 | *MP3320A TMS1000 1979, Coleco Head to Head Basketball |
28 | | MP3403 TMS1100 1978, Marx Electronic Bowling -> elecbowl.c |
| 25 | MP3403 TMS1100 1978, Marx Electronic Bowling |
29 | 26 | @MP3404 TMS1100 1978, Parker Brothers Merlin |
30 | 27 | @MP3405 TMS1100 1979, Coleco Amaze-A-Tron |
31 | 28 | @MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command |
r244961 | r244962 | |
35 | 32 | MP3457 TMS1100 1979, MicroVision cartridge: Mindbuster |
36 | 33 | MP3474 TMS1100 1979, MicroVision cartridge: Vegas Slots |
37 | 34 | MP3475 TMS1100 1979, MicroVision cartridge: Bowling |
38 | | *MP3476 TMS1100 1979, Milton Bradley Super Simon |
39 | 35 | MP3479 TMS1100 1980, MicroVision cartridge: Baseball |
40 | 36 | MP3481 TMS1100 1979, MicroVision cartridge: Connect Four |
41 | 37 | MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel |
42 | | M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders (note: MP3498, MP3499, M34000, ..) |
43 | | M34017 TMS1100 1981, MicroVision cartridge: Cosmic Hunter |
44 | | M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster |
45 | 38 | @MP6100A TMS0980 1979, Ideal Electronic Detective |
46 | 39 | @MP6101B TMS0980 1979, Parker Brothers Stop Thief |
47 | 40 | *MP6361 ? 1983, Defender Strikes |
r244961 | r244962 | |
53 | 46 | |
54 | 47 | inconsistent: |
55 | 48 | |
56 | | @CD7282SL TMS1100 1981, Tandy/RadioShack Tandy-12 (serial is similar to TI Speak & Spell series?) |
| 49 | M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders |
| 50 | M34017 TMS1100 1981, MicroVision cartridge: Cosmic Hunter |
| 51 | M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster |
57 | 52 | |
| 53 | @CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?) |
| 54 | |
58 | 55 | (* denotes not yet emulated by MESS, @ denotes it's in this driver) |
59 | 56 | |
60 | 57 | |
r244961 | r244962 | |
2361 | 2358 | CONS( 1979, ebball, 0, 0, ebball, ebball, driver_device, 0, "Entex", "Electronic Baseball (Entex)", GAME_SUPPORTS_SAVE ) |
2362 | 2359 | CONS( 1980, ebball3, 0, 0, ebball3, ebball3, driver_device, 0, "Entex", "Electronic Baseball 3 (Entex)", GAME_SUPPORTS_SAVE ) |
2363 | 2360 | |
2364 | | CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE ) // *** |
| 2361 | CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE ) // unplayable without game cards |
2365 | 2362 | |
2366 | 2363 | CONS( 1979, starwbc, 0, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command", GAME_SUPPORTS_SAVE ) |
2367 | 2364 | CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command (prototype)", GAME_SUPPORTS_SAVE ) |
r244961 | r244962 | |
2369 | 2366 | CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) |
2370 | 2367 | CONS( 1978, simon, 0, 0, simon, simon, driver_device, 0, "Milton Bradley", "Simon (Rev. A)", GAME_SUPPORTS_SAVE ) |
2371 | 2368 | |
2372 | | CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // *** |
| 2369 | CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // unplayable without writing board |
2373 | 2370 | CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin - The Electronic Wizard", GAME_SUPPORTS_SAVE ) |
2374 | | CONS( 1979, stopthie, 0, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner)", GAME_SUPPORTS_SAVE ) // *** |
| 2371 | CONS( 1979, stopthie, 0, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner)", GAME_SUPPORTS_SAVE ) // unplayable without game board |
2375 | 2372 | CONS( 1979, stopthiep, stopthie, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner) (prototype)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) |
2376 | 2373 | CONS( 1980, bankshot, 0, 0, bankshot, bankshot, driver_device, 0, "Parker Brothers", "Bank Shot - Electronic Pool", GAME_SUPPORTS_SAVE ) |
2377 | 2374 | CONS( 1980, splitsec, 0, 0, splitsec, splitsec, driver_device, 0, "Parker Brothers", "Split Second", GAME_SUPPORTS_SAVE ) |
2378 | 2375 | |
2379 | | CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE ) // some of the minigames: *** |
2380 | | |
2381 | | // ***: As far as MESS is concerned, the game is emulated fine. But for it to be playable, it requires interaction |
2382 | | // with other, unemulatable, things eg. game board/pieces, playing cards, pen & paper, etc. |
| 2376 | CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE ) // partially unplayable without cards/dice/.. |
trunk/src/mess/drivers/m24.c
r244961 | r244962 | |
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/m24_kbd.h" |
| 7 | #include "machine/pckeybrd.h" |
8 | 8 | #include "machine/mm58274c.h" |
9 | 9 | #include "includes/genpc.h" |
10 | 10 | |
r244961 | r244962 | |
15 | 15 | driver_device(mconfig, type, tag), |
16 | 16 | m_maincpu(*this, "maincpu"), |
17 | 17 | m_mb(*this, "mb"), |
18 | | m_kbc(*this, "kbc"), |
19 | | m_keyboard(*this, "keyboard") |
| 18 | m_kbc(*this, "kbc") |
20 | 19 | { } |
21 | 20 | required_device<cpu_device> m_maincpu; |
22 | 21 | required_device<pc_noppi_mb_device> m_mb; |
23 | 22 | required_device<cpu_device> m_kbc; |
24 | | required_device<m24_keyboard_device> m_keyboard; |
25 | 23 | |
26 | 24 | DECLARE_READ8_MEMBER(keyboard_r); |
27 | 25 | DECLARE_WRITE8_MEMBER(keyboard_w); |
r244961 | r244962 | |
29 | 27 | DECLARE_WRITE8_MEMBER(pb_w); |
30 | 28 | DECLARE_READ8_MEMBER(kbcdata_r); |
31 | 29 | DECLARE_WRITE8_MEMBER(kbcdata_w); |
32 | | DECLARE_WRITE_LINE_MEMBER(kbcin_w); |
33 | 30 | |
34 | | void machine_reset(); |
35 | | |
36 | | UINT8 m_sysctl, m_pa, m_kbcin, m_kbcout; |
37 | | bool m_kbcibf, m_kbdata; |
| 31 | UINT8 m_sysctl, m_pa, m_kbcdata; |
| 32 | bool m_kbcibf; |
38 | 33 | }; |
39 | 34 | |
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 | | |
48 | 35 | READ8_MEMBER(m24_state::keyboard_r) |
49 | 36 | { |
50 | 37 | switch(offset) |
51 | 38 | { |
52 | 39 | case 0: |
53 | | m_pa |= 0x40; |
| 40 | m_pa &= ~0x40; |
54 | 41 | m_mb->m_pic8259->ir1_w(0); |
55 | | return m_kbcout; |
| 42 | return m_kbcdata; |
56 | 43 | case 1: |
57 | 44 | return m_sysctl; |
58 | 45 | case 2: |
r244961 | r244962 | |
70 | 57 | case 0: |
71 | 58 | m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE); |
72 | 59 | m_kbcibf = true; |
73 | | m_kbcin = data; |
| 60 | m_kbcdata = data; |
74 | 61 | break; |
75 | 62 | case 1: |
76 | 63 | m_sysctl = data; |
77 | 64 | m_mb->m_pit8253->write_gate2(BIT(data, 0)); |
78 | 65 | m_mb->pc_speaker_set_spkrdata(BIT(data, 1)); |
79 | 66 | if(BIT(data, 6)) |
80 | | m_pa |= 4; |
| 67 | m_pa |= 2; |
81 | 68 | else |
82 | | m_pa &= ~4; |
| 69 | m_pa &= ~2; |
83 | 70 | break; |
84 | 71 | } |
85 | 72 | } |
86 | 73 | |
87 | 74 | READ8_MEMBER(m24_state::pa_r) |
88 | 75 | { |
89 | | return m_pa & (m_kbdata ? 0xff : 0xfd); |
| 76 | return m_pa; |
90 | 77 | } |
91 | 78 | |
92 | 79 | WRITE8_MEMBER(m24_state::pb_w) |
93 | 80 | { |
94 | | m_keyboard->clock_w(!BIT(data, 0)); |
95 | | m_keyboard->data_w(!BIT(data, 1)); |
96 | | m_pa = (m_pa & ~3) | (~data & 3); |
97 | 81 | } |
98 | 82 | |
99 | 83 | READ8_MEMBER(m24_state::kbcdata_r) |
100 | 84 | { |
101 | 85 | m_kbc->set_input_line(TMS7000_INT1_LINE, CLEAR_LINE); |
102 | 86 | m_kbcibf = false; |
103 | | return m_kbcin; |
| 87 | return m_kbcdata; |
104 | 88 | } |
105 | 89 | |
106 | 90 | WRITE8_MEMBER(m24_state::kbcdata_w) |
107 | 91 | { |
108 | | m_pa &= ~0x40; |
| 92 | m_pa |= 0x40; |
109 | 93 | m_mb->m_pic8259->ir1_w(1); |
110 | | m_kbcout = data; |
| 94 | m_kbcdata = data; |
111 | 95 | } |
112 | 96 | |
113 | | WRITE_LINE_MEMBER(m24_state::kbcin_w) |
114 | | { |
115 | | m_kbdata = state; |
116 | | } |
117 | | |
118 | 97 | static ADDRESS_MAP_START( m24_map, AS_PROGRAM, 16, m24_state ) |
119 | 98 | ADDRESS_MAP_UNMAP_HIGH |
120 | 99 | AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10") |
r244961 | r244962 | |
180 | 159 | PORT_DIPSETTING( 0x4000, "2" ) |
181 | 160 | PORT_DIPSETTING( 0x8000, "3" ) |
182 | 161 | PORT_DIPSETTING( 0xc000, "4" ) |
| 162 | |
| 163 | PORT_INCLUDE(pc_keyboard) |
183 | 164 | INPUT_PORTS_END |
184 | 165 | |
185 | 166 | static MACHINE_CONFIG_START( olivetti, m24_state ) |
r244961 | r244962 | |
204 | 185 | MCFG_CPU_PROGRAM_MAP(kbc_map) |
205 | 186 | MCFG_CPU_IO_MAP(kbc_io) |
206 | 187 | |
207 | | MCFG_DEVICE_ADD("keyboard", M24_KEYBOARD, 0) |
208 | | MCFG_M24_KEYBOARD_OUT_DATA_HANDLER(WRITELINE(m24_state, kbcin_w)) |
209 | | |
210 | 188 | MCFG_DEVICE_ADD("mm58174an", MM58274C, 0) |
211 | 189 | MCFG_MM58274C_MODE24(1) // ? |
212 | 190 | MCFG_MM58274C_DAY1(1) // ? |
r244961 | r244962 | |
221 | 199 | ROMX_LOAD("olivetti_m24_version_1.43_low.bin", 0x4000, 0x2000, CRC(ff7e0f10) SHA1(13423011a9bae3f3193e8c199f98a496cab48c0f), ROM_SKIP(1)) |
222 | 200 | |
223 | 201 | ROM_REGION(0x800, "kbc", 0) |
224 | | ROM_LOAD("pdbd.tms2516.keyboardmcureplacementdaughterboard_10u", 0x000, 0x800, CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
| 202 | ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
225 | 203 | ROM_END |
226 | 204 | |
227 | 205 | ROM_START( m240 ) |
r244961 | r244962 | |
231 | 209 | |
232 | 210 | // is this one the same? |
233 | 211 | ROM_REGION(0x800, "kbc", 0) |
234 | | ROM_LOAD("pdbd.tms2516.keyboardmcureplacementdaughterboard_10u", 0x000, 0x800, BAD_DUMP CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
| 212 | ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, BAD_DUMP CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) |
235 | 213 | ROM_END |
236 | 214 | |
237 | 215 | COMP( 1983, m24, ibm5150, 0, olivetti, m24, driver_device, 0, "Olivetti", "M24", GAME_NOT_WORKING) |
trunk/src/mess/machine/m24_kbd.c
r244961 | r244962 | |
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 | | } |