mirror of
https://github.com/holub/mame
synced 2025-10-04 16:34:53 +03:00
EPC: Keyboard working, added leds and removed imperfect feature (#5832)
* i8251.cpp: required initial state to enable receiver of a 8251a and also to avoid sending start bit to diserial on reset and get framing error * eispc_kb.cpp: removed need for scheduler abuse as problem is fixed by correcting the init of the i8251 USART on host side instead * eispc.cpp: removed an obsolete TODO * eispc_kb.h: removed imperfect_features marking * epc: Added keyboard LEDs, Caps and Num lock works with current keyboard rom, scroll lock led needs a dump from a newer keyboard
This commit is contained in:
parent
fe1612aa81
commit
9582866bbf
@ -43,6 +43,7 @@
|
|||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
|
|
||||||
#include "machine/eispc_kb.h"
|
#include "machine/eispc_kb.h"
|
||||||
|
#include "epc.lh"
|
||||||
|
|
||||||
// Devices
|
// Devices
|
||||||
#include "cpu/i86/i86.h"
|
#include "cpu/i86/i86.h"
|
||||||
@ -113,6 +114,7 @@ public:
|
|||||||
, m_lpt(*this, "lpt")
|
, m_lpt(*this, "lpt")
|
||||||
, m_kbd8251(*this, "kbd8251")
|
, m_kbd8251(*this, "kbd8251")
|
||||||
, m_keyboard(*this, "keyboard")
|
, m_keyboard(*this, "keyboard")
|
||||||
|
, m_leds(*this, "kbled%u")
|
||||||
, m_pic8259(*this, "pic8259")
|
, m_pic8259(*this, "pic8259")
|
||||||
, m_pit8253(*this, "pit8253")
|
, m_pit8253(*this, "pit8253")
|
||||||
, m_speaker(*this, "speaker")
|
, m_speaker(*this, "speaker")
|
||||||
@ -170,6 +172,7 @@ private:
|
|||||||
emu_timer *m_kbdclk_timer;
|
emu_timer *m_kbdclk_timer;
|
||||||
TIMER_CALLBACK_MEMBER(rxtxclk_w);
|
TIMER_CALLBACK_MEMBER(rxtxclk_w);
|
||||||
int m_rxtx_clk_state;
|
int m_rxtx_clk_state;
|
||||||
|
output_finder<3> m_leds;
|
||||||
|
|
||||||
// Interrupt Controller
|
// Interrupt Controller
|
||||||
required_device<pic8259_device> m_pic8259;
|
required_device<pic8259_device> m_pic8259;
|
||||||
@ -475,6 +478,8 @@ void epc_state::machine_start()
|
|||||||
save_item(NAME(m_drq));
|
save_item(NAME(m_drq));
|
||||||
save_item(NAME(m_fdc_irq));
|
save_item(NAME(m_fdc_irq));
|
||||||
save_item(NAME(m_fdc_drq));
|
save_item(NAME(m_fdc_drq));
|
||||||
|
|
||||||
|
m_leds.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
void epc_state::machine_reset()
|
void epc_state::machine_reset()
|
||||||
@ -738,6 +743,8 @@ static void epc_sd_floppies(device_slot_interface &device)
|
|||||||
|
|
||||||
void epc_state::epc(machine_config &config)
|
void epc_state::epc(machine_config &config)
|
||||||
{
|
{
|
||||||
|
config.set_default_layout(layout_epc);
|
||||||
|
|
||||||
I8088(config, m_maincpu, XTAL(14'318'181) / 3.0); // TWE crystal marked X1 verified divided through a 82874
|
I8088(config, m_maincpu, XTAL(14'318'181) / 3.0); // TWE crystal marked X1 verified divided through a 82874
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &epc_state::epc_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &epc_state::epc_map);
|
||||||
m_maincpu->set_addrmap(AS_IO, &epc_state::epc_io);
|
m_maincpu->set_addrmap(AS_IO, &epc_state::epc_io);
|
||||||
@ -762,11 +769,15 @@ void epc_state::epc(machine_config &config)
|
|||||||
m_dma8237a->out_dack_callback<3>().set(FUNC(epc_state::epc_dack_w<3>));
|
m_dma8237a->out_dack_callback<3>().set(FUNC(epc_state::epc_dack_w<3>));
|
||||||
|
|
||||||
// TTL-level serial keyboard callback
|
// TTL-level serial keyboard callback
|
||||||
EISPC_KB(config, "keyboard").txd_cb().set([this](bool state)
|
EISPC_KB(config, m_keyboard);
|
||||||
|
m_keyboard->txd_cb().set([this](bool state)
|
||||||
{
|
{
|
||||||
LOGBITS("KBD->EPC: %d\n", state);
|
LOGBITS("KBD->EPC: %d\n", state);
|
||||||
m_kbd8251->write_rxd(state);
|
m_kbd8251->write_rxd(state);
|
||||||
});
|
});
|
||||||
|
m_keyboard->caps_cb().set( [this](bool state){ m_leds[0] = state; });
|
||||||
|
m_keyboard->num_cb().set( [this](bool state){ m_leds[1] = state; });
|
||||||
|
m_keyboard->scroll_cb().set([this](bool state){ m_leds[2] = state; });
|
||||||
|
|
||||||
// Keyboard USART
|
// Keyboard USART
|
||||||
I8251( config, m_kbd8251, XTAL(14'318'181) / 6.0 ); // TWE crystal marked X1 verified divided through a 82874
|
I8251( config, m_kbd8251, XTAL(14'318'181) / 6.0 ); // TWE crystal marked X1 verified divided through a 82874
|
||||||
|
34
src/mame/layout/epc.lay
Normal file
34
src/mame/layout/epc.lay
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
license:CC0
|
||||||
|
copyright-holders:Joakim Larsson Edstrom
|
||||||
|
LEDs for the Ericsson PC keyboard
|
||||||
|
-->
|
||||||
|
<mamelayout version="2">
|
||||||
|
<element name="text_caps"><text string="Caps Lock"><color red="0.7" green="0.7" blue="0.7" /></text></element>
|
||||||
|
<element name="text_num"><text string="Num Lock"><color red="0.7" green="0.7" blue="0.7" /></text></element>
|
||||||
|
<element name="text_scroll"><text string="Scroll Lock"><color red="0.7" green="0.7" blue="0.7" /></text></element>
|
||||||
|
<element name="led" defstate="0"><disk><color red="0.85" green="0.18" blue="0.16" /></disk></element>
|
||||||
|
|
||||||
|
<group name="caps">
|
||||||
|
<bezel element="led" name="kbled0"><bounds x="0" y="0" width="100" height="100" /></bezel>
|
||||||
|
<bezel element="text_caps"><bounds x="120" y="0" width="900" height="100" /></bezel>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group name="num">
|
||||||
|
<bezel element="led" name="kbled1"><bounds x="0" y="0" width="100" height="100" /></bezel>
|
||||||
|
<bezel element="text_num"><bounds x="120" y="0" width="800" height="100" /></bezel>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group name="scroll">
|
||||||
|
<bezel element="led" name="kbled2"><bounds x="0" y="0" width="100" height="100" /></bezel>
|
||||||
|
<bezel element="text_scroll"><bounds x="120" y="0" width="1000" height="100" /></bezel>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<view name="Default Layout">
|
||||||
|
<screen index="0"><bounds left="0" top="150" right="1000" bottom="900" /></screen>
|
||||||
|
<group ref="caps"> <bounds x="0" y="0" width="90" height="10" /></group>
|
||||||
|
<group ref="num"> <bounds x="110" y="0" width="80" height="10" /></group>
|
||||||
|
<group ref="scroll"><bounds x="210" y="0" width="100" height="10" /></group>
|
||||||
|
</view>
|
||||||
|
</mamelayout>
|
@ -85,8 +85,9 @@
|
|||||||
#define LOG_RESET (1U << 2)
|
#define LOG_RESET (1U << 2)
|
||||||
#define LOG_BITS (1U << 3)
|
#define LOG_BITS (1U << 3)
|
||||||
#define LOG_UI (1U << 4)
|
#define LOG_UI (1U << 4)
|
||||||
|
#define LOG_LEDS (1U << 5)
|
||||||
|
|
||||||
//#define VERBOSE (LOG_UI)
|
//#define VERBOSE (LOG_LEDS)
|
||||||
//#define LOG_OUTPUT_STREAM std::cout
|
//#define LOG_OUTPUT_STREAM std::cout
|
||||||
|
|
||||||
#include "logmacro.h"
|
#include "logmacro.h"
|
||||||
@ -95,6 +96,7 @@
|
|||||||
#define LOGRST(...) LOGMASKED(LOG_RESET, __VA_ARGS__)
|
#define LOGRST(...) LOGMASKED(LOG_RESET, __VA_ARGS__)
|
||||||
#define LOGBITS(...) LOGMASKED(LOG_BITS, __VA_ARGS__)
|
#define LOGBITS(...) LOGMASKED(LOG_BITS, __VA_ARGS__)
|
||||||
#define LOGUI(...) LOGMASKED(LOG_UI, __VA_ARGS__)
|
#define LOGUI(...) LOGMASKED(LOG_UI, __VA_ARGS__)
|
||||||
|
#define LOGLEDS(...) LOGMASKED(LOG_LEDS, __VA_ARGS__)
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
// MACROS / CONSTANTS
|
// MACROS / CONSTANTS
|
||||||
@ -249,6 +251,9 @@ eispc_keyboard_device::eispc_keyboard_device(
|
|||||||
, m_mcu(*this, M6801_TAG)
|
, m_mcu(*this, M6801_TAG)
|
||||||
, m_rows(*this, "P1%u", 0)
|
, m_rows(*this, "P1%u", 0)
|
||||||
, m_txd_cb(*this)
|
, m_txd_cb(*this)
|
||||||
|
, m_led_caps_cb(*this)
|
||||||
|
, m_led_num_cb(*this)
|
||||||
|
, m_led_scroll_cb(*this)
|
||||||
, m_rxd_high(true)
|
, m_rxd_high(true)
|
||||||
, m_txd_high(true)
|
, m_txd_high(true)
|
||||||
, m_hold(true)
|
, m_hold(true)
|
||||||
@ -288,6 +293,9 @@ WRITE_LINE_MEMBER(eispc_keyboard_device::rst_line_w)
|
|||||||
void eispc_keyboard_device::device_start()
|
void eispc_keyboard_device::device_start()
|
||||||
{
|
{
|
||||||
m_txd_cb.resolve_safe();
|
m_txd_cb.resolve_safe();
|
||||||
|
m_led_caps_cb.resolve_safe();
|
||||||
|
m_led_num_cb.resolve_safe();
|
||||||
|
m_led_scroll_cb.resolve_safe();
|
||||||
|
|
||||||
save_item(NAME(m_rxd_high));
|
save_item(NAME(m_rxd_high));
|
||||||
save_item(NAME(m_txd_high));
|
save_item(NAME(m_txd_high));
|
||||||
@ -330,6 +338,8 @@ void eispc_keyboard_device::device_add_mconfig(machine_config &config)
|
|||||||
m_mcu->out_p1_cb().set([this](uint8_t data)
|
m_mcu->out_p1_cb().set([this](uint8_t data)
|
||||||
{
|
{
|
||||||
LOGPORTS("Writing %02x PORT 1\n", data);
|
LOGPORTS("Writing %02x PORT 1\n", data);
|
||||||
|
LOGLEDS("Num: %d\n", BIT(data, 7));
|
||||||
|
m_led_num_cb(BIT(data, 7) ? 1 : 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
m_mcu->in_p2_cb().set([this]
|
m_mcu->in_p2_cb().set([this]
|
||||||
@ -343,6 +353,9 @@ void eispc_keyboard_device::device_add_mconfig(machine_config &config)
|
|||||||
m_mcu->out_p2_cb().set([this](uint8_t data)
|
m_mcu->out_p2_cb().set([this](uint8_t data)
|
||||||
{
|
{
|
||||||
LOGPORTS("Writing port 2: %02x\n", data);
|
LOGPORTS("Writing port 2: %02x\n", data);
|
||||||
|
LOGLEDS("Caps: %d Scroll: %d\n", BIT(data, 0), BIT(data, 2));
|
||||||
|
m_led_caps_cb(BIT(data, 0) ? 1 : 0);
|
||||||
|
m_led_scroll_cb(BIT(data, 2) ? 1 : 0); // Only working with "Roger Moore" roms
|
||||||
LOGBITS("KBD: writing bit: %02x\n", BIT(data, 4));
|
LOGBITS("KBD: writing bit: %02x\n", BIT(data, 4));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -13,11 +13,12 @@ class eispc_keyboard_device : public device_t
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
auto txd_cb() { return m_txd_cb.bind(); }
|
auto txd_cb() { return m_txd_cb.bind(); }
|
||||||
|
auto caps_cb() { return m_led_caps_cb.bind(); }
|
||||||
|
auto num_cb() { return m_led_num_cb.bind(); }
|
||||||
|
auto scroll_cb() { return m_led_scroll_cb.bind(); }
|
||||||
|
|
||||||
eispc_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
|
eispc_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
|
||||||
|
|
||||||
static constexpr feature_type imperfect_features() { return feature::KEYBOARD; }
|
|
||||||
|
|
||||||
DECLARE_INPUT_CHANGED_MEMBER(key);
|
DECLARE_INPUT_CHANGED_MEMBER(key);
|
||||||
DECLARE_WRITE_LINE_MEMBER(rxd_w);
|
DECLARE_WRITE_LINE_MEMBER(rxd_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(hold_w);
|
DECLARE_WRITE_LINE_MEMBER(hold_w);
|
||||||
@ -32,6 +33,9 @@ protected:
|
|||||||
required_device<m6801_cpu_device> m_mcu;
|
required_device<m6801_cpu_device> m_mcu;
|
||||||
required_ioport_array<6> m_rows;
|
required_ioport_array<6> m_rows;
|
||||||
devcb_write_line m_txd_cb; // Callback for KBD-> EPC
|
devcb_write_line m_txd_cb; // Callback for KBD-> EPC
|
||||||
|
devcb_write_line m_led_caps_cb; // Callback for Caps led -> layout
|
||||||
|
devcb_write_line m_led_num_cb; // Callback for Num led -> layout
|
||||||
|
devcb_write_line m_led_scroll_cb; // Callback for Scroll led -> layout
|
||||||
|
|
||||||
bool m_rxd_high; // state of Rx input line
|
bool m_rxd_high; // state of Rx input line
|
||||||
bool m_txd_high; // state of Tx output line
|
bool m_txd_high; // state of Tx output line
|
||||||
|
Loading…
Reference in New Issue
Block a user