mirror of
https://github.com/holub/mame
synced 2025-07-03 00:56:03 +03:00
psi98: Add keyboard slot interface, create skeleton for keyboard
This commit is contained in:
parent
2aaf414bde
commit
147f1d89b0
@ -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
|
||||
|
@ -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
|
||||
|
108
src/devices/bus/psi_kbd/ergoline.cpp
Normal file
108
src/devices/bus/psi_kbd/ergoline.cpp
Normal 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);
|
||||
}
|
52
src/devices/bus/psi_kbd/ergoline.h
Normal file
52
src/devices/bus/psi_kbd/ergoline.h
Normal 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
|
110
src/devices/bus/psi_kbd/psi_kbd.cpp
Normal file
110
src/devices/bus/psi_kbd/psi_kbd.cpp
Normal 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
|
118
src/devices/bus/psi_kbd/psi_kbd.h
Normal file
118
src/devices/bus/psi_kbd/psi_kbd.h
Normal 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
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user