sunkbd: split up HLE into proper type 3, type 4 and type 5, hook up sun3 family keyboard, set default keyboard appropriately for different families [Vas Crabb]

This commit is contained in:
Vas Crabb 2016-07-22 15:21:40 +10:00
parent 4c68e0924a
commit e2774ba254
7 changed files with 911 additions and 275 deletions

View File

@ -2580,8 +2580,8 @@ end
if (BUSES["SUNKBD"]~=null) then
files {
MAME_DIR .. "src/devices/bus/sunkbd/sparckbd.cpp",
MAME_DIR .. "src/devices/bus/sunkbd/sparckbd.h",
MAME_DIR .. "src/devices/bus/sunkbd/hlekbd.cpp",
MAME_DIR .. "src/devices/bus/sunkbd/hlekbd.h",
MAME_DIR .. "src/devices/bus/sunkbd/sunkbd.cpp",
MAME_DIR .. "src/devices/bus/sunkbd/sunkbd.h",
}

View File

@ -0,0 +1,186 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
#ifndef MAME_DEVICES_SUNKBD_SPARCKBD_H
#define MAME_DEVICES_SUNKBD_SPARCKBD_H
#pragma once
#include "sunkbd.h"
#include "sound/beep.h"
extern device_type const SUN_TYPE3_HLE_KEYBOARD;
extern device_type const SUN_TYPE4_HLE_KEYBOARD;
extern device_type const SUN_TYPE5_HLE_KEYBOARD;
namespace bus { namespace sunkbd {
class hle_device_base : public device_t, public device_serial_interface, public device_sun_keyboard_port_interface
{
public:
virtual machine_config_constructor device_mconfig_additions() const override;
virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override;
protected:
// constructor/destructor
hle_device_base(
machine_config const &mconfig,
char const *tag,
device_t *owner,
UINT32 clock);
hle_device_base(
machine_config const &mconfig,
device_type type, char const *name,
char const *tag,
device_t *owner,
UINT32 clock,
char const *shortname,
char const *source);
virtual ~hle_device_base() override;
// device overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_serial_interface overrides
virtual void tra_callback() override;
virtual void tra_complete() override;
virtual void rcv_complete() override;
required_ioport m_dips;
required_ioport m_key_inputs[8];
private:
// device_serial_interface uses 10'000 range
enum {
SCAN_TIMER_ID = 20'000,
CLICK_TIMER_ID
};
// TODO: ensure these don't clash with diagnostic LEDs on host computer
enum : int {
LED_NUM = 0,
LED_COMPOSE,
LED_SCROLL,
LED_CAPS
};
enum : UINT8 {
BEEPER_BELL = 0x01U,
BEEPER_CLICK = 0x02U
};
enum : UINT8 {
RX_IDLE,
RX_LED
};
enum : UINT8 {
COMMAND_RESET = 0x01U,
COMMAND_BELL_ON = 0x02U,
COMMAND_BELL_OFF = 0x03U,
COMMAND_CLICK_ON = 0x0aU,
COMMAND_CLICK_OFF = 0x0bU,
COMMAND_LED = 0x0eU,
COMMAND_LAYOUT = 0x0fU
};
virtual UINT8 ident_byte() = 0;
void scan_row();
void send_byte(UINT8 code);
emu_timer *m_scan_timer;
emu_timer *m_click_timer;
required_device<beep_device> m_beeper;
UINT16 m_current_keys[8];
UINT8 m_next_row;
UINT8 m_fifo[16];
UINT8 m_head, m_tail;
UINT8 m_empty;
UINT8 m_rx_state;
UINT8 m_keyclick;
UINT8 m_beeper_state;
};
class hle_type3_device : public hle_device_base
{
public:
hle_type3_device(
machine_config const &mconfig,
char const *tag,
device_t *owner,
UINT32 clock);
hle_type3_device(
machine_config const &mconfig,
device_type type, char const *name,
char const *tag,
device_t *owner,
UINT32 clock,
char const *shortname,
char const *source);
virtual ioport_constructor device_input_ports() const override;
private:
virtual UINT8 ident_byte() override;
};
class hle_type4_device : public hle_device_base
{
public:
hle_type4_device(
machine_config const &mconfig,
char const *tag,
device_t *owner,
UINT32 clock);
hle_type4_device(
machine_config const &mconfig,
device_type type, char const *name,
char const *tag,
device_t *owner,
UINT32 clock,
char const *shortname,
char const *source);
virtual ioport_constructor device_input_ports() const override;
private:
virtual UINT8 ident_byte() override;
};
class hle_type5_device : public hle_device_base
{
public:
hle_type5_device(
machine_config const &mconfig,
char const *tag,
device_t *owner,
UINT32 clock);
hle_type5_device(
machine_config const &mconfig,
device_type type, char const *name,
char const *tag,
device_t *owner,
UINT32 clock,
char const *shortname,
char const *source);
virtual ioport_constructor device_input_ports() const override;
private:
virtual UINT8 ident_byte() override;
};
} } // namespace bus::sunkbd
#endif // MAME_DEVICES_SUNKBD_SPARCKBD_H

View File

@ -1,93 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
#ifndef MAME_DEVICES_SUNKBD_SPARCKBD_H
#define MAME_DEVICES_SUNKBD_SPARCKBD_H
#pragma once
#include "sunkbd.h"
#include "sound/beep.h"
class sparc_keyboard_device : public device_t, public device_serial_interface, public device_sun_keyboard_port_interface
{
public:
sparc_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, UINT32 clock);
sparc_keyboard_device(machine_config const &mconfig, device_type type, char const *name, char const *tag, device_t *owner, UINT32 clock, char const *shortname, char const *source);
virtual machine_config_constructor device_mconfig_additions() const override;
virtual ioport_constructor device_input_ports() const override;
virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override;
protected:
// device overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_serial_interface overrides
virtual void tra_callback() override;
virtual void tra_complete() override;
virtual void rcv_complete() override;
private:
// device_serial_interface uses 10'000 range
enum {
SCAN_TIMER_ID = 20'000,
CLICK_TIMER_ID
};
// TODO: ensure these don't clash with diagnostic LEDs on host computer
enum : int {
LED_NUM = 0,
LED_COMPOSE,
LED_SCROLL,
LED_CAPS
};
enum : UINT8 {
BEEPER_BELL = 0x01U,
BEEPER_CLICK = 0x02U
};
enum : UINT8 {
RX_IDLE,
RX_LED
};
enum : UINT8 {
COMMAND_RESET = 0x01U,
COMMAND_BELL_ON = 0x02U,
COMMAND_BELL_OFF = 0x03U,
COMMAND_CLICK_ON = 0x0aU,
COMMAND_CLICK_OFF = 0x0bU,
COMMAND_LED = 0x0eU,
COMMAND_LAYOUT = 0x0fU
};
void scan_row();
void send_byte(UINT8 code);
emu_timer *m_scan_timer;
emu_timer *m_click_timer;
required_ioport m_dips;
required_ioport m_key_inputs[8];
required_device<beep_device> m_beeper;
UINT16 m_current_keys[8];
UINT8 m_next_row;
UINT8 m_fifo[16];
UINT8 m_head, m_tail;
UINT8 m_empty;
UINT8 m_rx_state;
UINT8 m_keyclick;
UINT8 m_beeper_state;
};
extern const device_type SPARC_KEYBOARD;
#endif // MAME_DEVICES_SUNKBD_SPARCKBD_H

View File

@ -87,9 +87,10 @@ device_sun_keyboard_port_interface::~device_sun_keyboard_port_interface()
#include "sparckbd.h"
#include "hlekbd.h"
SLOT_INTERFACE_START( default_sun_keyboard_devices )
SLOT_INTERFACE("sparckbd", SPARC_KEYBOARD)
SLOT_INTERFACE("type3hle", SUN_TYPE3_HLE_KEYBOARD)
SLOT_INTERFACE("type4hle", SUN_TYPE4_HLE_KEYBOARD)
SLOT_INTERFACE("type5hle", SUN_TYPE5_HLE_KEYBOARD)
SLOT_INTERFACE_END

View File

@ -186,12 +186,14 @@ fefc34a - start of mem_size, which queries ECC registers for each memory board
#include "machine/bankdev.h"
#include "machine/nvram.h"
#include "bus/rs232/rs232.h"
#include "bus/sunkbd/sunkbd.h"
#define TIMEKEEPER_TAG "timekpr"
#define SCC1_TAG "scc1"
#define SCC2_TAG "scc2"
#define RS232A_TAG "rs232a"
#define RS232B_TAG "rs232b"
#define KEYBOARD_TAG "keyboard"
// page table entry constants
#define PM_VALID (0x80000000) // page is valid
@ -992,6 +994,11 @@ static MACHINE_CONFIG_START( sun3, sun3_state )
MCFG_TIMER_DRIVER_ADD_PERIODIC("timer", sun3_state, sun3_timer, attotime::from_hz(100))
MCFG_SCC8530_ADD(SCC1_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, sun_keyboard_port_device, write_txd))
MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle")
MCFG_SUNKBD_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w))
MCFG_SCC8530_ADD(SCC2_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(RS232A_TAG, rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE(RS232B_TAG, rs232_port_device, write_txd))
@ -1089,6 +1096,11 @@ static MACHINE_CONFIG_START( sun3_50, sun3_state )
MCFG_ADDRESS_MAP_BANK_STRIDE(0x80000000)
MCFG_SCC8530_ADD(SCC1_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, sun_keyboard_port_device, write_txd))
MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle")
MCFG_SUNKBD_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w))
MCFG_SCC8530_ADD(SCC2_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(RS232A_TAG, rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE(RS232B_TAG, rs232_port_device, write_txd))

View File

@ -1988,7 +1988,7 @@ static MACHINE_CONFIG_START( sun4, sun4_state )
MCFG_Z80SCC_OUT_INT_CB(WRITELINE(sun4_state, scc1_int))
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, sun_keyboard_port_device, write_txd))
MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "sparckbd")
MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "type4hle")
MCFG_SUNKBD_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w))
// RS232 serial ports
@ -2053,7 +2053,7 @@ static MACHINE_CONFIG_START( sun4c, sun4_state )
MCFG_Z80SCC_OUT_INT_CB(WRITELINE(sun4_state, scc1_int))
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, sun_keyboard_port_device, write_txd))
MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "sparckbd")
MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "type5hle")
MCFG_SUNKBD_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w))
// RS232 serial ports