summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/v100.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/v100.cpp')
-rw-r--r--src/mame/drivers/v100.cpp51
1 files changed, 42 insertions, 9 deletions
diff --git a/src/mame/drivers/v100.cpp b/src/mame/drivers/v100.cpp
index 82f840cc00b..6a58c9d1a09 100644
--- a/src/mame/drivers/v100.cpp
+++ b/src/mame/drivers/v100.cpp
@@ -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
}