mirror of
https://github.com/holub/mame
synced 2025-04-16 13:34:55 +03:00
Merge pull request #5754 from 68bit/ie15-rework-rs232
IE15 terminal: rework the RS232 interfaces
This commit is contained in:
commit
96086b540f
@ -5,26 +5,22 @@
|
||||
#include "ie15.h"
|
||||
|
||||
ie15_terminal_device::ie15_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: ie15_device(mconfig, SERIAL_TERMINAL_IE15, tag, owner, clock)
|
||||
: device_t(mconfig, SERIAL_TERMINAL_IE15, tag, owner, clock)
|
||||
, device_rs232_port_interface(mconfig, *this)
|
||||
, m_rs232_txbaud(*this, "RS232_TXBAUD")
|
||||
, m_rs232_rxbaud(*this, "RS232_RXBAUD")
|
||||
, m_rs232_startbits(*this, "RS232_STARTBITS")
|
||||
, m_rs232_databits(*this, "RS232_DATABITS")
|
||||
, m_rs232_parity(*this, "RS232_PARITY")
|
||||
, m_rs232_stopbits(*this, "RS232_STOPBITS")
|
||||
, m_ie15(*this, "ie15")
|
||||
{
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START(ie15_terminal)
|
||||
PORT_INCLUDE(ie15)
|
||||
void ie15_terminal_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
IE15(config, m_ie15, 0);
|
||||
|
||||
PORT_RS232_BAUD("RS232_TXBAUD", RS232_BAUD_9600, "TX Baud", ie15_terminal_device, update_serial)
|
||||
PORT_RS232_BAUD("RS232_RXBAUD", RS232_BAUD_9600, "RX Baud", ie15_terminal_device, update_serial)
|
||||
PORT_RS232_STARTBITS("RS232_STARTBITS", RS232_STARTBITS_1, "Start Bits", ie15_terminal_device, update_serial)
|
||||
PORT_RS232_DATABITS("RS232_DATABITS", RS232_DATABITS_8, "Data Bits", ie15_terminal_device, update_serial)
|
||||
PORT_RS232_PARITY("RS232_PARITY", RS232_PARITY_NONE, "Parity", ie15_terminal_device, update_serial)
|
||||
PORT_RS232_STOPBITS("RS232_STOPBITS", RS232_STOPBITS_1, "Stop Bits", ie15_terminal_device, update_serial)
|
||||
m_ie15->rs232_conn_txd_handler().set(FUNC(ie15_terminal_device::output_rxd));
|
||||
//m_ie15->rs232_conn_rts_handler().set(FUNC(ie15_terminal_device::route_term_rts));
|
||||
//m_ie15->rs232_conn_dtr_handler().set(FUNC(ie15_terminal_device::route_term_dtr));
|
||||
}
|
||||
|
||||
INPUT_PORTS_START(ie15_terminal)
|
||||
INPUT_PORTS_END
|
||||
|
||||
ioport_constructor ie15_terminal_device::device_input_ports() const
|
||||
@ -32,21 +28,17 @@ ioport_constructor ie15_terminal_device::device_input_ports() const
|
||||
return INPUT_PORTS_NAME(ie15_terminal);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(ie15_terminal_device::update_serial)
|
||||
WRITE_LINE_MEMBER(ie15_terminal_device::input_txd)
|
||||
{
|
||||
int startbits = convert_startbits(m_rs232_startbits->read());
|
||||
int databits = convert_databits(m_rs232_databits->read());
|
||||
parity_t parity = convert_parity(m_rs232_parity->read());
|
||||
stop_bits_t stopbits = convert_stopbits(m_rs232_stopbits->read());
|
||||
m_ie15->rs232_conn_rxd_w(state);
|
||||
}
|
||||
|
||||
set_data_frame(startbits, databits, parity, stopbits);
|
||||
|
||||
int txbaud = convert_baud(m_rs232_txbaud->read());
|
||||
set_tra_rate(txbaud);
|
||||
|
||||
int rxbaud = convert_baud(m_rs232_rxbaud->read());
|
||||
set_rcv_rate(rxbaud);
|
||||
void ie15_terminal_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
void ie15_terminal_device::device_reset()
|
||||
{
|
||||
output_rxd(1);
|
||||
|
||||
// TODO: make this configurable
|
||||
@ -55,36 +47,4 @@ WRITE_LINE_MEMBER(ie15_terminal_device::update_serial)
|
||||
output_cts(0);
|
||||
}
|
||||
|
||||
void ie15_terminal_device::tra_callback()
|
||||
{
|
||||
output_rxd(transmit_register_get_data_bit());
|
||||
}
|
||||
|
||||
void ie15_terminal_device::tra_complete()
|
||||
{
|
||||
ie15_device::tra_complete();
|
||||
}
|
||||
|
||||
void ie15_terminal_device::rcv_complete()
|
||||
{
|
||||
receive_register_extract();
|
||||
term_write(get_received_char());
|
||||
}
|
||||
|
||||
void ie15_terminal_device::device_start()
|
||||
{
|
||||
ie15_device::device_start();
|
||||
}
|
||||
|
||||
void ie15_terminal_device::device_reset()
|
||||
{
|
||||
update_serial(0);
|
||||
ie15_device::device_reset();
|
||||
}
|
||||
|
||||
void ie15_terminal_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
ie15_device::device_timer(timer, id, param, ptr);
|
||||
}
|
||||
|
||||
DEFINE_DEVICE_TYPE(SERIAL_TERMINAL_IE15, ie15_terminal_device, "ie15_terminal", "IE15 Terminal")
|
||||
|
@ -10,33 +10,21 @@
|
||||
#include "machine/ie15.h"
|
||||
|
||||
|
||||
class ie15_terminal_device : public ie15_device,
|
||||
public device_rs232_port_interface
|
||||
class ie15_terminal_device : public device_t, public device_rs232_port_interface
|
||||
{
|
||||
public:
|
||||
ie15_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override { ie15_device::serial_rx_callback(state); }
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(update_serial);
|
||||
virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override;
|
||||
|
||||
protected:
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
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;
|
||||
|
||||
virtual void tra_callback() override;
|
||||
virtual void tra_complete() override;
|
||||
virtual void rcv_complete() override;
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
|
||||
private:
|
||||
required_ioport m_rs232_txbaud;
|
||||
required_ioport m_rs232_rxbaud;
|
||||
required_ioport m_rs232_startbits;
|
||||
required_ioport m_rs232_databits;
|
||||
required_ioport m_rs232_parity;
|
||||
required_ioport m_rs232_stopbits;
|
||||
required_device<ie15_device> m_ie15;
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(SERIAL_TERMINAL_IE15, ie15_terminal_device)
|
||||
|
@ -39,10 +39,18 @@ ie15_device::ie15_device(const machine_config &mconfig, device_type type, const
|
||||
, m_p_videoram(*this, "video")
|
||||
, m_p_chargen(*this, "chargen")
|
||||
, m_beeper(*this, "beeper")
|
||||
, m_rs232(*this, "rs232")
|
||||
, m_screen(*this, "screen")
|
||||
, m_keyboard(*this, "keyboard")
|
||||
, m_io_keyboard(*this, "io_keyboard")
|
||||
, m_rs232_conn_txd_handler(*this)
|
||||
, m_rs232_conn_dtr_handler(*this)
|
||||
, m_rs232_conn_rts_handler(*this)
|
||||
// Until the UART is implemented
|
||||
, m_rs232_txbaud(*this, "RS232_TXBAUD")
|
||||
, m_rs232_rxbaud(*this, "RS232_RXBAUD")
|
||||
, m_rs232_databits(*this, "RS232_DATABITS")
|
||||
, m_rs232_parity(*this, "RS232_PARITY")
|
||||
, m_rs232_stopbits(*this, "RS232_STOPBITS")
|
||||
{
|
||||
}
|
||||
|
||||
@ -228,7 +236,7 @@ void ie15_device::device_timer(emu_timer &timer, device_timer_id id, int param,
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(ie15_device::serial_rx_callback)
|
||||
WRITE_LINE_MEMBER(ie15_device::rs232_conn_rxd_w)
|
||||
{
|
||||
device_serial_interface::rx_w(state);
|
||||
}
|
||||
@ -243,7 +251,7 @@ void ie15_device::rcv_complete()
|
||||
void ie15_device::tra_callback()
|
||||
{
|
||||
uint8_t bit = transmit_register_get_data_bit();
|
||||
m_rs232->write_txd(bit);
|
||||
m_rs232_conn_txd_handler(bit);
|
||||
}
|
||||
|
||||
void ie15_device::tra_complete()
|
||||
@ -284,6 +292,24 @@ WRITE8_MEMBER(ie15_device::serial_speed_w)
|
||||
return;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(ie15_device::update_serial)
|
||||
{
|
||||
int startbits = 1;
|
||||
int databits = m_rs232_databits->read();
|
||||
parity_t parity_table[] = { PARITY_NONE, PARITY_ODD, PARITY_EVEN, PARITY_MARK, PARITY_SPACE };
|
||||
parity_t parity = parity_table[m_rs232_parity->read()];
|
||||
stop_bits_t stopbits_table[] = { STOP_BITS_1, STOP_BITS_2 };
|
||||
stop_bits_t stopbits = stopbits_table[m_rs232_stopbits->read()];
|
||||
|
||||
set_data_frame(startbits, databits, parity, stopbits);
|
||||
|
||||
int txbaud = m_rs232_txbaud->read();
|
||||
set_tra_rate(txbaud);
|
||||
|
||||
int rxbaud = m_rs232_rxbaud->read();
|
||||
set_rcv_rate(rxbaud);
|
||||
}
|
||||
|
||||
READ8_MEMBER(ie15_device::flag_r)
|
||||
{
|
||||
switch (offset)
|
||||
@ -375,6 +401,46 @@ INPUT_PORTS_START( ie15 )
|
||||
PORT_DIPNAME(ie15_keyboard_device::IE_KB_LIN, ie15_keyboard_device::IE_KB_LIN, "LIN (Online)")
|
||||
PORT_DIPSETTING(0x00, "Off")
|
||||
PORT_DIPSETTING(ie15_keyboard_device::IE_KB_LIN, "On")
|
||||
|
||||
// Until the UART is implemented
|
||||
PORT_START("RS232_RXBAUD")
|
||||
PORT_CONFNAME(0xffff, 9600, "RX Baud") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, ie15_device, update_serial)
|
||||
PORT_CONFSETTING(300, "300")
|
||||
PORT_CONFSETTING(600, "600")
|
||||
PORT_CONFSETTING(1200, "1200")
|
||||
PORT_CONFSETTING(2400, "2400")
|
||||
PORT_CONFSETTING(4800, "4800")
|
||||
PORT_CONFSETTING(9600, "9600")
|
||||
PORT_CONFSETTING(19200, "19200")
|
||||
|
||||
PORT_START("RS232_TXBAUD")
|
||||
PORT_CONFNAME(0xffff, 9600, "TX Baud") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, ie15_device, update_serial)
|
||||
PORT_CONFSETTING(300, "300")
|
||||
PORT_CONFSETTING(600, "600")
|
||||
PORT_CONFSETTING(1200, "1200")
|
||||
PORT_CONFSETTING(2400, "2400")
|
||||
PORT_CONFSETTING(4800, "4800")
|
||||
PORT_CONFSETTING(9600, "9600")
|
||||
PORT_CONFSETTING(19200, "19200")
|
||||
|
||||
PORT_START("RS232_DATABITS")
|
||||
PORT_CONFNAME(0xf, 8, "Data Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, ie15_device, update_serial)
|
||||
PORT_CONFSETTING(7, "7")
|
||||
PORT_CONFSETTING(8, "8")
|
||||
|
||||
PORT_START("RS232_PARITY")
|
||||
PORT_CONFNAME(0x7, 0, "Parity") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, ie15_device, update_serial)
|
||||
PORT_CONFSETTING(0, "None")
|
||||
PORT_CONFSETTING(1, "Odd")
|
||||
PORT_CONFSETTING(2, "Even")
|
||||
PORT_CONFSETTING(3, "Mark")
|
||||
PORT_CONFSETTING(4, "Space")
|
||||
|
||||
PORT_START("RS232_STOPBITS")
|
||||
PORT_CONFNAME(0x3, 1, "Stop Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, ie15_device, update_serial)
|
||||
PORT_CONFSETTING(1, "1")
|
||||
PORT_CONFSETTING(2, "2")
|
||||
|
||||
INPUT_PORTS_END
|
||||
|
||||
WRITE16_MEMBER( ie15_device::kbd_put )
|
||||
@ -390,6 +456,13 @@ WRITE16_MEMBER( ie15_device::kbd_put )
|
||||
}
|
||||
}
|
||||
|
||||
void ie15_device::device_resolve_objects()
|
||||
{
|
||||
//m_rs232_conn_dtr_handler.resolve_safe();
|
||||
//m_rs232_conn_rts_handler.resolve_safe();
|
||||
m_rs232_conn_txd_handler.resolve_safe();
|
||||
}
|
||||
|
||||
void ie15_device::device_start()
|
||||
{
|
||||
m_hblank_timer = timer_alloc(TIMER_HBLANK);
|
||||
@ -402,6 +475,8 @@ void ie15_device::device_start()
|
||||
|
||||
void ie15_device::device_reset()
|
||||
{
|
||||
update_serial(0);
|
||||
|
||||
memset(&m_video, 0, sizeof(m_video));
|
||||
m_kb_ruslat = m_long_beep = m_kb_control = m_kb_data = m_kb_flag0 = 0;
|
||||
m_kb_flag = IE_TRUE;
|
||||
@ -580,9 +655,6 @@ void ie15_device::ie15core(machine_config &config)
|
||||
/* Devices */
|
||||
IE15_KEYBOARD(config, m_keyboard, 0).keyboard_cb().set(FUNC(ie15_device::kbd_put));
|
||||
|
||||
RS232_PORT(config, m_rs232, default_rs232_devices, "null_modem");
|
||||
m_rs232->rxd_handler().set(FUNC(ie15_device::serial_rx_callback));
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
BEEP(config, m_beeper, 2400);
|
||||
m_beeper->add_route(ALL_OUTPUTS, "mono", 0.15);
|
||||
|
@ -39,13 +39,22 @@ class ie15_device : public device_t, public device_serial_interface
|
||||
public:
|
||||
ie15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
DECLARE_WRITE8_MEMBER(write) { term_write(data); }
|
||||
// Interface to a RS232 connection.
|
||||
auto rs232_conn_txd_handler() { return m_rs232_conn_txd_handler.bind(); }
|
||||
auto rs232_conn_dtr_handler() { return m_rs232_conn_dtr_handler.bind(); }
|
||||
auto rs232_conn_rts_handler() { return m_rs232_conn_rts_handler.bind(); }
|
||||
DECLARE_WRITE_LINE_MEMBER(rs232_conn_dcd_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(rs232_conn_dsr_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(rs232_conn_ri_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(rs232_conn_cts_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(rs232_conn_rxd_w);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(serial_rx_callback);
|
||||
DECLARE_WRITE_LINE_MEMBER(update_serial);
|
||||
|
||||
protected:
|
||||
ie15_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
virtual void device_resolve_objects() override;
|
||||
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;
|
||||
@ -58,8 +67,6 @@ protected:
|
||||
virtual void tra_callback() override;
|
||||
virtual void tra_complete() override;
|
||||
|
||||
void term_write(uint8_t data) { m_serial_rx_char = data; m_serial_rx_ready = IE_FALSE; }
|
||||
|
||||
private:
|
||||
static const device_timer_id TIMER_HBLANK = 0;
|
||||
void scanline_callback();
|
||||
@ -129,10 +136,20 @@ private:
|
||||
required_region_ptr<u8> m_p_videoram;
|
||||
required_region_ptr<u8> m_p_chargen;
|
||||
required_device<beep_device> m_beeper;
|
||||
required_device<rs232_port_device> m_rs232;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<ie15_keyboard_device> m_keyboard;
|
||||
required_ioport m_io_keyboard;
|
||||
|
||||
devcb_write_line m_rs232_conn_txd_handler;
|
||||
devcb_write_line m_rs232_conn_dtr_handler;
|
||||
devcb_write_line m_rs232_conn_rts_handler;
|
||||
|
||||
// Until the UART is implemented
|
||||
required_ioport m_rs232_txbaud;
|
||||
required_ioport m_rs232_rxbaud;
|
||||
required_ioport m_rs232_databits;
|
||||
required_ioport m_rs232_parity;
|
||||
required_ioport m_rs232_stopbits;
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(IE15, ie15_device)
|
||||
|
@ -15,26 +15,40 @@
|
||||
#include "emu.h"
|
||||
#include "machine/ie15_kbd.h"
|
||||
#include "machine/ie15.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
|
||||
class ie15_state : public driver_device
|
||||
{
|
||||
public:
|
||||
ie15_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_ie15(*this, "ie15")
|
||||
driver_device(mconfig, type, tag)
|
||||
, m_ie15(*this, "ie15")
|
||||
, m_rs232(*this, "rs232")
|
||||
{ }
|
||||
|
||||
void ie15(machine_config &config);
|
||||
|
||||
private:
|
||||
required_device<ie15_device> m_ie15;
|
||||
required_device<rs232_port_device> m_rs232;
|
||||
};
|
||||
|
||||
|
||||
void ie15_state::ie15(machine_config &config)
|
||||
{
|
||||
IE15(config, m_ie15, 0);
|
||||
|
||||
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
|
||||
//rs232.dcd_handler().set("ie15", FUNC(ie15_device::rs232_conn_dcd_w));
|
||||
//rs232.dsr_handler().set("ie15", FUNC(ie15_device::rs232_conn_dsr_w));
|
||||
//rs232.ri_handler().set("ie15", FUNC(ie15_device::rs232_conn_ri_w));
|
||||
//rs232.cts_handler().set("ie15", FUNC(ie15_device::rs232_conn_cts_w));
|
||||
rs232.rxd_handler().set("ie15", FUNC(ie15_device::rs232_conn_rxd_w));
|
||||
|
||||
m_ie15->rs232_conn_txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
|
||||
m_ie15->rs232_conn_dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr));
|
||||
m_ie15->rs232_conn_rts_handler().set("rs232", FUNC(rs232_port_device::write_rts));
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user