sol20: Add RS232 port

This commit is contained in:
AJR 2018-03-04 19:05:05 -05:00
parent 897f3c82f2
commit 2b59d06fb1

View File

@ -113,6 +113,7 @@
#include "emu.h"
#include "cpu/i8085/i8085.h"
#include "bus/rs232/rs232.h"
//#include "bus/s100/s100.h"
#include "imagedev/cassette.h"
#include "machine/ay31015.h"
@ -156,6 +157,7 @@ public:
, m_cass2(*this, "cassette2")
, m_uart(*this, "uart")
, m_uart_s(*this, "uart_s")
, m_rs232(*this, "rs232")
, m_p_videoram(*this, "videoram")
, m_p_chargen(*this, "chargen")
, m_iop_arrows(*this, "ARROWS")
@ -167,15 +169,11 @@ public:
{ }
DECLARE_READ8_MEMBER( sol20_f8_r );
DECLARE_READ8_MEMBER( sol20_f9_r );
DECLARE_READ8_MEMBER( sol20_fa_r );
DECLARE_READ8_MEMBER( sol20_fb_r );
DECLARE_READ8_MEMBER( sol20_fc_r );
DECLARE_READ8_MEMBER( sol20_fd_r );
DECLARE_WRITE8_MEMBER( sol20_f8_w );
DECLARE_WRITE8_MEMBER( sol20_f9_w );
DECLARE_WRITE8_MEMBER( sol20_fa_w );
DECLARE_WRITE8_MEMBER( sol20_fb_w );
DECLARE_WRITE8_MEMBER( sol20_fd_w );
DECLARE_WRITE8_MEMBER( sol20_fe_w );
void kbd_put(u8 data);
@ -203,6 +201,7 @@ private:
required_device<cassette_image_device> m_cass2;
required_device<ay31015_device> m_uart;
required_device<ay31015_device> m_uart_s;
required_device<rs232_port_device> m_rs232;
required_shared_ptr<uint8_t> m_p_videoram;
required_region_ptr<u8> m_p_chargen;
required_ioport m_iop_arrows;
@ -334,28 +333,22 @@ TIMER_CALLBACK_MEMBER(sol20_state::sol20_cassette_tc)
READ8_MEMBER( sol20_state::sol20_f8_r )
{
// d7 - TBMT; d6 - DAV; d5 - CTS; d4 - OE; d3 - PE; d2 - FE; d1 - DSR; d0 - CD
/* set unemulated bits (CTS/DSR/CD) high */
uint8_t data = 0x23;
uint8_t data = 0;
m_uart_s->write_swe(0);
data |= m_uart_s->tbmt_r() ? 0x80 : 0;
data |= m_uart_s->dav_r( ) ? 0x40 : 0;
data |= m_rs232->cts_r( ) ? 0x20 : 0;
data |= m_uart_s->or_r( ) ? 0x10 : 0;
data |= m_uart_s->pe_r( ) ? 0x08 : 0;
data |= m_uart_s->fe_r( ) ? 0x04 : 0;
data |= m_rs232->dsr_r( ) ? 0x02 : 0;
data |= m_rs232->dcd_r( ) ? 0x01 : 0;
m_uart_s->write_swe(1);
return data;
}
READ8_MEMBER( sol20_state::sol20_f9_r)
{
uint8_t data = m_uart_s->get_received_data();
m_uart_s->write_rdav(0);
m_uart_s->write_rdav(1);
return data;
}
READ8_MEMBER( sol20_state::sol20_fa_r )
{
/* set unused bits high */
@ -374,14 +367,6 @@ READ8_MEMBER( sol20_state::sol20_fa_r )
return data | (arrowkey & keydown);
}
READ8_MEMBER( sol20_state::sol20_fb_r)
{
uint8_t data = m_uart->get_received_data();
m_uart->write_rdav(0);
m_uart->write_rdav(1);
return data;
}
READ8_MEMBER( sol20_state::sol20_fc_r )
{
uint8_t data = m_iop_arrows->read();
@ -403,11 +388,7 @@ READ8_MEMBER( sol20_state::sol20_fd_r )
WRITE8_MEMBER( sol20_state::sol20_f8_w )
{
// The only function seems to be to send RTS from bit 4
}
WRITE8_MEMBER( sol20_state::sol20_f9_w )
{
m_uart_s->set_transmit_data(data);
m_rs232->write_rts(BIT(data, 4));
}
WRITE8_MEMBER( sol20_state::sol20_fa_w )
@ -433,11 +414,6 @@ WRITE8_MEMBER( sol20_state::sol20_fa_w )
m_uart->set_transmitter_clock((BIT(data, 5)) ? 4800.0 : 19200.0);
}
WRITE8_MEMBER( sol20_state::sol20_fb_w )
{
m_uart->set_transmit_data(data);
}
WRITE8_MEMBER( sol20_state::sol20_fd_w )
{
// Output a byte to parallel interface
@ -460,12 +436,12 @@ ADDRESS_MAP_END
ADDRESS_MAP_START(sol20_state::sol20_io)
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0xf8, 0xf8) AM_READWRITE(sol20_f8_r,sol20_f8_w)
AM_RANGE(0xf9, 0xf9) AM_READWRITE(sol20_f9_r,sol20_f9_w)
AM_RANGE(0xfa, 0xfa) AM_READWRITE(sol20_fa_r,sol20_fa_w)
AM_RANGE(0xfb, 0xfb) AM_READWRITE(sol20_fb_r,sol20_fb_w)
AM_RANGE(0xf8, 0xf8) AM_READWRITE(sol20_f8_r, sol20_f8_w)
AM_RANGE(0xf9, 0xf9) AM_DEVREADWRITE("uart", ay51013_device, receive, transmit)
AM_RANGE(0xfa, 0xfa) AM_READWRITE(sol20_fa_r, sol20_fa_w)
AM_RANGE(0xfb, 0xfb) AM_DEVREADWRITE("uart_s", ay51013_device, receive, transmit)
AM_RANGE(0xfc, 0xfc) AM_READ(sol20_fc_r)
AM_RANGE(0xfd, 0xfd) AM_READWRITE(sol20_fd_r,sol20_fd_w)
AM_RANGE(0xfd, 0xfd) AM_READWRITE(sol20_fd_r, sol20_fd_w)
AM_RANGE(0xfe, 0xfe) AM_WRITE(sol20_fe_w)
AM_RANGE(0xff, 0xff) AM_READ_PORT("S2")
/* AM_RANGE(0xf8, 0xf8) serial status in (bit 6=data av, bit 7=tmbe)
@ -624,6 +600,8 @@ void sol20_state::machine_reset()
// boot-bank
membank("boot")->set_entry(1);
timer_set(attotime::from_usec(9), TIMER_SOL20_BOOT);
m_rs232->write_rts(1);
}
DRIVER_INIT_MEMBER(sol20_state,sol20)
@ -770,12 +748,20 @@ MACHINE_CONFIG_START(sol20_state::sol20)
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
MCFG_CASSETTE_INTERFACE("sol20_cass")
MCFG_DEVICE_ADD("uart", AY31015, 0)
MCFG_AY31015_TX_CLOCK(4800.0)
MCFG_AY31015_RX_CLOCK(4800.0)
MCFG_DEVICE_ADD("uart_s", AY31015, 0)
MCFG_AY31015_TX_CLOCK(4800.0)
MCFG_AY31015_RX_CLOCK(4800.0)
MCFG_DEVICE_ADD("uart", AY51013, 0) // TMS6011NC
MCFG_AY51013_READ_SI_CB(DEVREADLINE("rs232", rs232_port_device, rxd_r))
MCFG_AY51013_WRITE_SO_CB(DEVWRITELINE("rs232", rs232_port_device, write_txd))
MCFG_AY51013_TX_CLOCK(4800.0)
MCFG_AY51013_RX_CLOCK(4800.0)
MCFG_AY51013_AUTO_RDAV(true) // ROD (pin 4) tied to RDD (pin 18)
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, nullptr)
MCFG_DEVICE_ADD("uart_s", AY51013, 0) // TMS6011NC
MCFG_AY51013_TX_CLOCK(4800.0)
MCFG_AY51013_RX_CLOCK(4800.0)
MCFG_AY51013_AUTO_RDAV(true) // ROD (pin 4) tied to RDD (pin 18)
MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(PUT(sol20_state, kbd_put))