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(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(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 static devcb_base &set_rx_handler(device_t &device, Object &&cb) + { return downcast(device).m_rx_handler.set_callback(std::forward(cb)); } + + template static devcb_base &set_key_strobe_handler(device_t &device, Object &&cb) + { return downcast(device).m_key_strobe_handler.set_callback(std::forward(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