From b260c3eaa0ce173e085a6ded4b232f44cea0a521 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 9 Mar 2015 22:28:11 -0500 Subject: (mess) m24: keyboard controller [Carl, Lord Nightmare, rfka01] --- src/mess/drivers/m24.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 4 deletions(-) diff --git a/src/mess/drivers/m24.c b/src/mess/drivers/m24.c index d6123e704db..a5a4fa9dbb0 100644 --- a/src/mess/drivers/m24.c +++ b/src/mess/drivers/m24.c @@ -1,9 +1,11 @@ #include "emu.h" #include "cpu/i86/i86.h" +#include "cpu/tms7000/tms7000.h" #include "bus/isa/isa.h" #include "bus/isa/isa_cards.h" #include "machine/pckeybrd.h" +#include "machine/mm58274c.h" #include "includes/genpc.h" class m24_state : public driver_device @@ -12,23 +14,85 @@ public: m24_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_mb(*this, "mb") + m_mb(*this, "mb"), + m_kbc(*this, "kbc") { } required_device m_maincpu; required_device m_mb; + required_device m_kbc; DECLARE_READ8_MEMBER(keyboard_r); DECLARE_WRITE8_MEMBER(keyboard_w); + DECLARE_READ8_MEMBER(pa_r); + DECLARE_WRITE8_MEMBER(pb_w); + DECLARE_READ8_MEMBER(kbcdata_r); + DECLARE_WRITE8_MEMBER(kbcdata_w); + DECLARE_WRITE8_MEMBER(kbcstat_w); + + UINT8 m_sysctl, m_pa, m_kbcstat, m_kbcdata; + bool m_kbcibf; }; READ8_MEMBER(m24_state::keyboard_r) { - return 0; + switch(offset) + { + case 0: + m_pa &= ~0x40; + m_mb->m_pic8259->ir1_w(0); + return m_kbcdata; + case 1: + return m_sysctl; + case 2: + return 0; + case 4: + return m_kbcibf ? 2 : 0; + } + return 0xff; } WRITE8_MEMBER(m24_state::keyboard_w) { + switch(offset) + { + case 0: + m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE); + m_kbcibf = true; + m_kbcdata = data; + break; + case 1: + m_sysctl = data; + m_mb->m_pit8253->write_gate2(BIT(data, 0)); + m_mb->pc_speaker_set_spkrdata(BIT(data, 1)); + if(BIT(data, 6)) + m_pa |= 2; + else + m_pa &= ~2; + break; + } +} + +READ8_MEMBER(m24_state::pa_r) +{ + return m_pa; +} + +WRITE8_MEMBER(m24_state::pb_w) +{ +} +READ8_MEMBER(m24_state::kbcdata_r) +{ + m_kbc->set_input_line(TMS7000_INT1_LINE, CLEAR_LINE); + m_kbcibf = false; + return m_kbcdata; +} + +WRITE8_MEMBER(m24_state::kbcdata_w) +{ + m_pa |= 0x40; + m_mb->m_pic8259->ir1_w(1); + m_kbcdata = data; } static ADDRESS_MAP_START( m24_map, AS_PROGRAM, 16, m24_state ) @@ -42,6 +106,18 @@ static ADDRESS_MAP_START(m24_io, AS_IO, 16, m24_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0060, 0x0065) AM_READWRITE8(keyboard_r, keyboard_w, 0xffff) AM_RANGE(0x0066, 0x0067) AM_READ_PORT("DSW0") + AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("mm58174an", mm58274c_device, read, write, 0xffff) +ADDRESS_MAP_END + +static ADDRESS_MAP_START(kbc_map, AS_PROGRAM, 8, m24_state) + AM_RANGE(0x8000, 0x8fff) AM_READ(kbcdata_r) + AM_RANGE(0xa000, 0xafff) AM_WRITE(kbcdata_w) + AM_RANGE(0xf800, 0xffff) AM_ROM AM_REGION("kbc", 0) +ADDRESS_MAP_END + +static ADDRESS_MAP_START(kbc_io, AS_IO, 8, m24_state) + AM_RANGE(TMS7000_PORTA, TMS7000_PORTA) AM_READ(pa_r) + AM_RANGE(TMS7000_PORTB, TMS7000_PORTB) AM_WRITE(pb_w) ADDRESS_MAP_END static INPUT_PORTS_START( m24 ) @@ -102,12 +178,18 @@ static MACHINE_CONFIG_START( olivetti, m24_state ) MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "lpt", false) MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, "com", false) - /* keyboard */ - MCFG_PC_KEYB_ADD("pc_keyboard", DEVWRITELINE("mb:pic8259", pic8259_device, ir1_w)) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("640K") + MCFG_CPU_ADD("kbc", TMS7000, XTAL_4MHz) + MCFG_CPU_PROGRAM_MAP(kbc_map) + MCFG_CPU_IO_MAP(kbc_io) + + MCFG_DEVICE_ADD("mm58174an", MM58274C, 0) + MCFG_MM58274C_MODE24(1) // ? + MCFG_MM58274C_DAY1(1) // ? + /* software lists */ MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150") MACHINE_CONFIG_END @@ -116,12 +198,19 @@ ROM_START( m24 ) ROM_REGION16_LE(0x8000,"maincpu", 0) ROMX_LOAD("olivetti_m24_version_1.43_high.bin",0x4001, 0x2000, CRC(04e697ba) SHA1(1066dcc849e6289b5ac6372c84a590e456d497a6), ROM_SKIP(1)) ROMX_LOAD("olivetti_m24_version_1.43_low.bin", 0x4000, 0x2000, CRC(ff7e0f10) SHA1(13423011a9bae3f3193e8c199f98a496cab48c0f), ROM_SKIP(1)) + + ROM_REGION(0x800, "kbc", 0) + ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) ROM_END ROM_START( m240 ) ROM_REGION16_LE(0x8000,"maincpu", 0) ROMX_LOAD("olivetti_m240_pch5_2.04_high.bin", 0x0001, 0x4000, CRC(ceb97b59) SHA1(84fabbeab355e0a4c9445910f2b7d1ec98886642), ROM_SKIP(1)) ROMX_LOAD("olivetti_m240_pch6_2.04_low.bin", 0x0000, 0x4000, CRC(c463aa94) SHA1(a30c763c1ace9f3ff79e7136b252d624108a50ae), ROM_SKIP(1)) + + // is this one the same? + ROM_REGION(0x800, "kbc", 0) + ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, BAD_DUMP CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) ROM_END COMP( 1983, m24, ibm5150, 0, olivetti, m24, driver_device, 0, "Olivetti", "M24", GAME_NOT_WORKING) -- cgit v1.2.3