v100: Add RS232 ports (nw)

This commit is contained in:
AJR 2019-01-17 22:20:41 -05:00
parent f5ca6f9e58
commit 26d9b02c5e

View File

@ -12,12 +12,14 @@
***********************************************************************************************************************************/
#include "emu.h"
#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "machine/com8116.h"
#include "machine/er1400.h"
#include "machine/i8214.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
#include "machine/input_merger.h"
#include "video/tms9927.h"
#include "screen.h"
@ -35,6 +37,7 @@ public:
, m_usart(*this, "usart%u", 1)
, m_earom(*this, "earom")
, m_picu(*this, "picu")
, m_modem(*this, "modem")
, m_p_chargen(*this, "chargen")
, m_videoram(*this, "videoram")
, m_key_row(*this, "ROW%u", 0)
@ -43,7 +46,7 @@ public:
void v100(machine_config &config);
private:
DECLARE_READ8_MEMBER(earom_r);
u8 status_r();
DECLARE_WRITE8_MEMBER(port30_w);
DECLARE_READ8_MEMBER(keyboard_r);
DECLARE_WRITE8_MEMBER(key_row_w);
@ -51,7 +54,7 @@ private:
DECLARE_WRITE8_MEMBER(picu_w);
template<int N> DECLARE_WRITE_LINE_MEMBER(picu_r_w);
IRQ_CALLBACK_MEMBER(irq_ack);
DECLARE_WRITE8_MEMBER(ppi_porta_w);
void ppi_porta_w(u8 data);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@ -66,16 +69,18 @@ private:
required_device_array<i8251_device, 2> m_usart;
required_device<er1400_device> m_earom;
required_device<i8214_device> m_picu;
required_device<rs232_port_device> m_modem;
required_region_ptr<u8> m_p_chargen;
required_shared_ptr<u8> m_videoram;
optional_ioport_array<16> m_key_row;
u8 m_active_row;
bool m_video_enable;
};
u32 v100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
if (m_vtac->screen_reset())
if (m_vtac->screen_reset() || !m_video_enable)
{
bitmap.fill(rgb_t::black(), cliprect);
return 0;
@ -145,17 +150,22 @@ void v100_state::machine_start()
{
m_picu->inte_w(1);
m_picu->etlg_w(1);
m_usart[0]->write_cts(0);
m_usart[1]->write_cts(0);
m_active_row = 0;
m_video_enable = false;
save_item(NAME(m_active_row));
save_item(NAME(m_video_enable));
}
READ8_MEMBER(v100_state::earom_r)
u8 v100_state::status_r()
{
return m_earom->data_r();
u8 status = 0xc0;
status |= m_earom->data_r();
status |= m_modem->dcd_r() << 1;
status |= m_modem->si_r() << 2; // SCCD (pin 12)
status |= m_modem->ri_r() << 3;
return status;
}
WRITE8_MEMBER(v100_state::port30_w)
@ -198,11 +208,13 @@ IRQ_CALLBACK_MEMBER(v100_state::irq_ack)
return (m_picu->a_r() << 1) | 0xf0;
}
WRITE8_MEMBER(v100_state::ppi_porta_w)
void v100_state::ppi_porta_w(u8 data)
{
m_vtac->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0);
m_screen->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0);
m_video_enable = !BIT(data, 7);
//logerror("Writing %02X to PPI port A\n", data);
}
@ -221,7 +233,7 @@ void v100_state::io_map(address_map &map)
map(0x12, 0x13).rw("usart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x14, 0x15).rw("usart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x16, 0x16).w("brg2", FUNC(com8116_device::stt_str_w));
map(0x20, 0x20).r(FUNC(v100_state::earom_r));
map(0x20, 0x20).r(FUNC(v100_state::status_r));
map(0x30, 0x30).w(FUNC(v100_state::port30_w));
map(0x40, 0x40).rw(FUNC(v100_state::keyboard_r), FUNC(v100_state::key_row_w));
map(0x48, 0x48).w(FUNC(v100_state::port48_w));
@ -351,12 +363,22 @@ void v100_state::v100(machine_config &config)
m_maincpu->set_irq_acknowledge_callback(FUNC(v100_state::irq_ack));
I8251(config, m_usart[0], 47.736_MHz_XTAL / 20);
m_usart[0]->txd_handler().set(m_modem, FUNC(rs232_port_device::write_txd));
m_usart[0]->dtr_handler().set(m_modem, FUNC(rs232_port_device::write_dtr));
m_usart[0]->rts_handler().set(m_modem, FUNC(rs232_port_device::write_rts));
//m_usart[0]->rxrdy_handler().set(FUNC(v100_state::picu_r_w<4>)).invert();
input_merger_device &acts(INPUT_MERGER_ALL_HIGH(config, "acts"));
acts.output_handler().set(m_usart[0], FUNC(i8251_device::write_cts));
com8116_device &brg1(COM8116_020(config, "brg1", 1.8432_MHz_XTAL));
brg1.fr_handler().set(m_usart[0], FUNC(i8251_device::write_rxc));
brg1.ft_handler().set(m_usart[0], FUNC(i8251_device::write_txc));
I8251(config, m_usart[1], 47.736_MHz_XTAL / 20);
m_usart[1]->txd_handler().set("aux", FUNC(rs232_port_device::write_txd));
m_usart[1]->dtr_handler().set("aux", FUNC(rs232_port_device::write_dtr));
//m_usart[1]->txrdy_handler().set(FUNC(v100_state::picu_r_w<2>)).invert();
com8116_device &brg2(COM8116_020(config, "brg2", 1.8432_MHz_XTAL));
brg2.fr_handler().set(m_usart[1], FUNC(i8251_device::write_rxc));
@ -383,8 +405,19 @@ void v100_state::v100(machine_config &config)
ppi.out_pb_callback().append(m_earom, FUNC(er1400_device::c1_w)).bit(4).invert();
ppi.out_pc_callback().set(m_earom, FUNC(er1400_device::data_w)).bit(6).invert();
ppi.out_pc_callback().append(m_earom, FUNC(er1400_device::clock_w)).bit(0).invert();
ppi.out_pc_callback().append(m_modem, FUNC(rs232_port_device::write_spds)).bit(4);
ppi.out_pc_callback().append("acts", FUNC(input_merger_device::in_w<1>)).bit(7);
ER1400(config, m_earom);
RS232_PORT(config, m_modem, default_rs232_devices, "loopback"); // EIA port
m_modem->rxd_handler().set(m_usart[0], FUNC(i8251_device::write_rxd));
m_modem->cts_handler().set("acts", FUNC(input_merger_device::in_w<0>));
m_modem->dcd_handler().set(m_usart[0], FUNC(i8251_device::write_dsr));
rs232_port_device &aux(RS232_PORT(config, "aux", default_rs232_devices, nullptr)); // optional printer port
aux.rxd_handler().set(m_usart[1], FUNC(i8251_device::write_rxd));
aux.dcd_handler().set(m_usart[1], FUNC(i8251_device::write_dsr)); // printer busy
}