psi98: Add keyboard slot interface, create skeleton for keyboard

This commit is contained in:
Dirk Best 2017-08-10 01:41:14 +02:00
parent 2aaf414bde
commit 147f1d89b0
7 changed files with 417 additions and 9 deletions

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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