summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2017-08-10 01:41:14 +0200
committer Dirk Best <mail@dirk-best.de>2017-08-10 01:42:10 +0200
commit147f1d89b0a42ddd33c4f89abaed2765bc86dd8f (patch)
tree9f2230d8af5687f6c28c5f513b9fed68aebd29fb
parent2aaf414bde222aca9b7b1b67dbe6167bde19d57a (diff)
psi98: Add keyboard slot interface, create skeleton for keyboard
-rw-r--r--scripts/src/bus.lua14
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/bus/psi_kbd/ergoline.cpp108
-rw-r--r--src/devices/bus/psi_kbd/ergoline.h52
-rw-r--r--src/devices/bus/psi_kbd/psi_kbd.cpp110
-rw-r--r--src/devices/bus/psi_kbd/psi_kbd.h118
-rw-r--r--src/mame/drivers/kdt6.cpp23
7 files changed, 417 insertions, 9 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 5be1cad2277..c6143aea24b 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -3136,3 +3136,17 @@ if (BUSES["CBUS"]~=null) then
MAME_DIR .. "src/devices/bus/cbus/pc9801_cbus.h",
}
end
+
+---------------------------------------------------
+--
+--@src/devices/bus/psi_kbd/psi_kbd.h,BUSES["PSI_KEYBOARD"] = true
+---------------------------------------------------
+
+if (BUSES["PSI_KEYBOARD"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/bus/psi_kbd/psi_kbd.cpp",
+ MAME_DIR .. "src/devices/bus/psi_kbd/psi_kbd.h",
+ MAME_DIR .. "src/devices/bus/psi_kbd/ergoline.cpp",
+ MAME_DIR .. "src/devices/bus/psi_kbd/ergoline.h",
+ }
+end
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index c0ae0cbda0c..b64345cfff8 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -699,6 +699,7 @@ BUSES["PC_KBD"] = true
BUSES["PET"] = true
BUSES["PLUS4"] = true
BUSES["POFO"] = true
+BUSES["PSI_KEYBOARD"] = true
BUSES["PSX_CONTROLLER"] = true
BUSES["QL"] = true
BUSES["RS232"] = true
diff --git a/src/devices/bus/psi_kbd/ergoline.cpp b/src/devices/bus/psi_kbd/ergoline.cpp
new file mode 100644
index 00000000000..127c7412fb9
--- /dev/null
+++ b/src/devices/bus/psi_kbd/ergoline.cpp
@@ -0,0 +1,108 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Kontron Ergoline Keyboard
+
+***************************************************************************/
+
+#include "emu.h"
+#include "ergoline.h"
+#include "cpu/mcs51/mcs51.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ERGOLINE_KEYBOARD, ergoline_keyboard_device, "ergoline_kbd", "Ergoline Keyboard")
+
+
+//-------------------------------------------------
+// address_map - device-specific address maps
+//-------------------------------------------------
+
+ADDRESS_MAP_START( kbd_mem, AS_PROGRAM, 8, ergoline_keyboard_device )
+ AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION("firmware", 0)
+ADDRESS_MAP_END
+
+ADDRESS_MAP_START( kbd_io, AS_PROGRAM, 8, ergoline_keyboard_device )
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+static INPUT_PORTS_START( keyboard )
+INPUT_PORTS_END
+
+ioport_constructor ergoline_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( keyboard );
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+ROM_START( kbd_pcb )
+ ROM_REGION(0x1000, "firmware", 0)
+ ROM_LOAD("mcg_21_1035.ic10", 0x0000, 0x1000, CRC(cde2417e) SHA1(8a2e1a894fda3e92fd760b8523121ba171281206)) // SUM16: 06f0 (ok)
+ROM_END
+
+const tiny_rom_entry *ergoline_keyboard_device::device_rom_region() const
+{
+ return ROM_NAME(kbd_pcb);
+}
+
+MACHINE_CONFIG_MEMBER( ergoline_keyboard_device::device_add_mconfig )
+ MCFG_CPU_ADD("maincpu", I8031, XTAL_5_5296MHz)
+ MCFG_CPU_PROGRAM_MAP(kbd_mem)
+ MCFG_CPU_IO_MAP(kbd_io)
+MACHINE_CONFIG_END
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// ergoline_keyboard_device - constructor
+//-------------------------------------------------
+
+ergoline_keyboard_device::ergoline_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, ERGOLINE_KEYBOARD, tag, owner, clock),
+ device_psi_keyboard_interface(mconfig, *this)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void ergoline_keyboard_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void ergoline_keyboard_device::device_reset()
+{
+}
+
+
+//**************************************************************************
+// INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// tx_w - receive bit from host
+//-------------------------------------------------
+
+void ergoline_keyboard_device::tx_w(int state)
+{
+ logerror("tx_w: %d\n", state);
+}
diff --git a/src/devices/bus/psi_kbd/ergoline.h b/src/devices/bus/psi_kbd/ergoline.h
new file mode 100644
index 00000000000..bd88b29cfbb
--- /dev/null
+++ b/src/devices/bus/psi_kbd/ergoline.h
@@ -0,0 +1,52 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Kontron Ergo Line Keyboard
+
+ Sold with the PSI908/9C/98/980 systems
+
+***************************************************************************/
+
+#ifndef MAME_BUS_PSI_KBD_ERGOLINE_H
+#define MAME_BUS_PSI_KBD_ERGOLINE_H
+
+#pragma once
+
+#include "psi_kbd.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> ergoline_keyboard_device
+
+class ergoline_keyboard_device : public device_t, public device_psi_keyboard_interface
+{
+public:
+ // construction/destruction
+ ergoline_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ static constexpr feature_type unemulated_features() { return feature::KEYBOARD; }
+
+ // from host
+ virtual void tx_w(int state) override;
+
+protected:
+ // device_t overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(ERGOLINE_KEYBOARD, ergoline_keyboard_device)
+
+
+#endif // MAME_BUS_PSI_KBD_ERGOLINE_H
diff --git a/src/devices/bus/psi_kbd/psi_kbd.cpp b/src/devices/bus/psi_kbd/psi_kbd.cpp
new file mode 100644
index 00000000000..8ee0b838bf9
--- /dev/null
+++ b/src/devices/bus/psi_kbd/psi_kbd.cpp
@@ -0,0 +1,110 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Kontron PSI keyboard interface
+
+***************************************************************************/
+
+#include "emu.h"
+#include "psi_kbd.h"
+#include "ergoline.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(PSI_KEYBOARD_INTERFACE, psi_keyboard_bus_device, "psi_kbd", "PSI Keyboard Interface")
+
+
+//**************************************************************************
+// SLOT DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// psi_keyboard_bus_device - constructor
+//-------------------------------------------------
+
+psi_keyboard_bus_device::psi_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, PSI_KEYBOARD_INTERFACE, tag, owner, clock),
+ device_slot_interface(mconfig, *this),
+ m_kbd(nullptr),
+ m_rx_handler(*this),
+ m_key_strobe_handler(*this),
+ m_key_data(0xff)
+{
+}
+
+//-------------------------------------------------
+// psi_keyboard_bus_device - destructor
+//-------------------------------------------------
+
+psi_keyboard_bus_device::~psi_keyboard_bus_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void psi_keyboard_bus_device::device_start()
+{
+ // get connected keyboard
+ m_kbd = dynamic_cast<device_psi_keyboard_interface *>(get_card_device());
+
+ // resolve callbacks
+ m_rx_handler.resolve_safe();
+ m_key_strobe_handler.resolve_safe();
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void psi_keyboard_bus_device::device_reset()
+{
+ m_key_data = 0xff;
+}
+
+//-------------------------------------------------
+// host to module interface
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( psi_keyboard_bus_device::tx_w )
+{
+ if (m_kbd)
+ m_kbd->tx_w(state);
+}
+
+
+//**************************************************************************
+// KEYBOARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_psi_keyboard_interface - constructor
+//-------------------------------------------------
+
+device_psi_keyboard_interface::device_psi_keyboard_interface(const machine_config &mconfig, device_t &device) :
+ device_slot_card_interface(mconfig, device)
+{
+ m_host = dynamic_cast<psi_keyboard_bus_device *>(device.owner());
+}
+
+//-------------------------------------------------
+// ~device_psi_keyboard_interface - destructor
+//-------------------------------------------------
+
+device_psi_keyboard_interface::~device_psi_keyboard_interface()
+{
+}
+
+
+//**************************************************************************
+// SLOT INTERFACE
+//**************************************************************************
+
+SLOT_INTERFACE_START( psi_keyboard_devices )
+ SLOT_INTERFACE("ergoline", ERGOLINE_KEYBOARD)
+SLOT_INTERFACE_END
diff --git a/src/devices/bus/psi_kbd/psi_kbd.h b/src/devices/bus/psi_kbd/psi_kbd.h
new file mode 100644
index 00000000000..75c3973ca08
--- /dev/null
+++ b/src/devices/bus/psi_kbd/psi_kbd.h
@@ -0,0 +1,118 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Kontron PSI keyboard interface
+
+ This interface supports both a parallel and a serial keyboard
+
+ 9 KEY.D0
+ 8 KEY.D1
+ 7 KEY.D2
+ 6 KEY.D3
+ 5 KEY.D4
+ 4 KEY.D5
+ 3 KEY.D6
+ 2 KEY.D7
+ 11 KEY.STRB
+ 15 + KEY.TRANSM
+ 16 - KEY.TRANSM
+ 17 + KEY.REC
+ 18 + KEY.REC
+ 13 + 5V
+ 14 GND
+ 1 Shield
+
+***************************************************************************/
+
+#ifndef MAME_BUS_PSI_KBD_PSI_KBD_H
+#define MAME_BUS_PSI_KBD_PSI_KBD_H
+
+#pragma once
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_PSI_KEYBOARD_INTERFACE_ADD(_tag, _def_slot) \
+ MCFG_DEVICE_ADD(_tag, PSI_KEYBOARD_INTERFACE, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(psi_keyboard_devices, _def_slot, false)
+
+#define MCFG_PSI_KEYBOARD_RX_HANDLER(_devcb) \
+ devcb = &psi_keyboard_bus_device::set_rx_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_PSI_KEYBOARD_KEY_STROBE_HANDLER(_devcb) \
+ devcb = &psi_keyboard_bus_device::set_key_strobe_handler(*device, DEVCB_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class device_psi_keyboard_interface;
+
+// ======================> psi_keyboard_bus_device
+
+class psi_keyboard_bus_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ psi_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~psi_keyboard_bus_device();
+
+ // callbacks
+ template <class Object> static devcb_base &set_rx_handler(device_t &device, Object &&cb)
+ { return downcast<psi_keyboard_bus_device &>(device).m_rx_handler.set_callback(std::forward<Object>(cb)); }
+
+ template <class Object> static devcb_base &set_key_strobe_handler(device_t &device, Object &&cb)
+ { return downcast<psi_keyboard_bus_device &>(device).m_key_strobe_handler.set_callback(std::forward<Object>(cb)); }
+
+ // called from keyboard
+ DECLARE_WRITE_LINE_MEMBER( rx_w ) { m_rx_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER( key_strobe_w ) { m_key_strobe_handler(state); }
+ DECLARE_WRITE8_MEMBER( key_data_w ) { m_key_data = data; }
+
+ // called from host
+ DECLARE_WRITE_LINE_MEMBER( tx_w );
+ DECLARE_READ8_MEMBER( key_data_r ) { return m_key_data; }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ device_psi_keyboard_interface *m_kbd;
+
+ devcb_write_line m_rx_handler;
+ devcb_write_line m_key_strobe_handler;
+
+ uint8_t m_key_data;
+};
+
+// ======================> device_psi_keyboard_interface
+
+class device_psi_keyboard_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_psi_keyboard_interface();
+
+ virtual void tx_w(int state) {};
+
+protected:
+ device_psi_keyboard_interface(const machine_config &mconfig, device_t &device);
+
+ psi_keyboard_bus_device *m_host;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(PSI_KEYBOARD_INTERFACE, psi_keyboard_bus_device)
+
+// supported devices
+SLOT_INTERFACE_EXTERN( psi_keyboard_devices );
+
+
+#endif // MAME_BUS_PSI_KBD_PSI_KBD_H
diff --git a/src/mame/drivers/kdt6.cpp b/src/mame/drivers/kdt6.cpp
index c81b6f24747..4b53bc5d40e 100644
--- a/src/mame/drivers/kdt6.cpp
+++ b/src/mame/drivers/kdt6.cpp
@@ -21,6 +21,7 @@
#include "machine/upd1990a.h"
#include "video/mc6845.h"
#include "sound/beep.h"
+#include "bus/psi_kbd/psi_kbd.h"
#include "screen.h"
#include "speaker.h"
@@ -145,9 +146,7 @@ static ADDRESS_MAP_START( psi98_io, AS_IO, 8, kdt6_state )
AM_RANGE(0x18, 0x18) AM_DEVWRITE("crtc", mc6845_device, address_w)
AM_RANGE(0x19, 0x19) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
AM_RANGE(0x1c, 0x1c) AM_WRITE(status0_w)
-#if 0
- AM_RANGE(0x1d, 0x1d) KEYBOARD
-#endif
+ AM_RANGE(0x1d, 0x1d) AM_DEVREAD("kbd", psi_keyboard_bus_device, key_data_r)
AM_RANGE(0x1e, 0x1e) AM_DEVREADWRITE("fdc", upd765a_device, mdma_r, mdma_w)
AM_RANGE(0x1f, 0x1f) AM_WRITE(fdc_tc_w)
AM_RANGE(0x20, 0x2f) AM_READWRITE(mapper_r, mapper_w)
@@ -484,6 +483,7 @@ static MACHINE_CONFIG_START( psi98 )
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(8)
MCFG_MC6845_UPDATE_ROW_CB(kdt6_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(DEVWRITELINE("ctc2", z80ctc_device, trg2))
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -498,16 +498,20 @@ static MACHINE_CONFIG_START( psi98 )
MCFG_Z80DMA_IN_IORQ_CB(READ8(kdt6_state, io_r))
MCFG_Z80DMA_OUT_IORQ_CB(WRITE8(kdt6_state, io_w))
- MCFG_DEVICE_ADD("ctc1", Z80CTC, XTAL_16MHz / 4)
+ MCFG_DEVICE_ADD("ctc1", Z80CTC, XTAL_9_8304MHz / 8) // jumper J3 allows selection of 16MHz / 8 instead
MCFG_Z80CTC_INTR_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ MCFG_Z80CTC_ZC1_CB(DEVWRITELINE("sio", z80sio_device, rxtxcb_w))
+ MCFG_Z80CTC_ZC2_CB(DEVWRITELINE("sio", z80sio_device, rxca_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio", z80sio_device, txca_w))
- MCFG_DEVICE_ADD("ctc2", Z80CTC, XTAL_16MHz / 4)
+ MCFG_DEVICE_ADD("ctc2", Z80CTC, XTAL_16MHz / 8)
MCFG_Z80CTC_INTR_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
MCFG_Z80SIO_ADD("sio", 0, 0, 0, 0, 0)
MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("kbd", psi_keyboard_bus_device, tx_w))
- MCFG_DEVICE_ADD("pio", Z80PIO, XTAL_16MHz / 4)
+ MCFG_DEVICE_ADD("pio", Z80PIO, XTAL_16MHz / 8)
MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
MCFG_UPD765A_ADD("fdc", true, true)
@@ -516,6 +520,10 @@ static MACHINE_CONFIG_START( psi98 )
MCFG_FLOPPY_DRIVE_ADD("fdc:0", kdt6_floppies, "525qd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", kdt6_floppies, "525qd", floppy_image_device::default_floppy_formats)
+ MCFG_PSI_KEYBOARD_INTERFACE_ADD("kbd", "ergoline")
+ MCFG_PSI_KEYBOARD_RX_HANDLER(DEVWRITELINE("sio", z80sio_device, rxb_w))
+ MCFG_PSI_KEYBOARD_KEY_STROBE_HANDLER(DEVWRITELINE("ctc2", z80ctc_device, trg1))
+
// 6 ECB slots
MACHINE_CONFIG_END
@@ -532,9 +540,6 @@ ROM_START( psi98 )
ROM_REGION(0x1000, "gfx", 0)
ROM_LOAD("ch6_d-e.bin", 0x0000, 0x1000, CRC(e7bca335) SHA1(454ca3b8b8ac66464870e4bd5497050038d771c8)) // SUM16: 39b1 (file: 5f55)
- ROM_REGION(0x1000, "keyboard", 0)
- ROM_LOAD("mcg_21_1035.bin", 0x0000, 0x1000, CRC(cde2417e) SHA1(8a2e1a894fda3e92fd760b8523121ba171281206)) // SUM16: 06f0 (ok)
-
// PALs
// 1-FF5B 12L6 memory address decoder
// 2-0F61 12L8 i/o address decoder