diff options
Diffstat (limited to 'src/mame/drivers/tv955.cpp')
-rw-r--r-- | src/mame/drivers/tv955.cpp | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/src/mame/drivers/tv955.cpp b/src/mame/drivers/tv955.cpp index 8023ab87bf1..722d0d167ea 100644 --- a/src/mame/drivers/tv955.cpp +++ b/src/mame/drivers/tv955.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders:AJR /*********************************************************************************************************************************** Skeleton driver for "third generation" TeleVideo terminals (905, 955, 9220). @@ -7,9 +7,9 @@ Skeleton driver for "third generation" TeleVideo terminals (905, 955, 9220). ************************************************************************************************************************************/ #include "emu.h" +#include "machine/tv955kb.h" #include "bus/rs232/rs232.h" #include "cpu/m6502/m65c02.h" -#include "cpu/mcs48/mcs48.h" #include "machine/input_merger.h" #include "machine/mos6551.h" #include "machine/nvram.h" @@ -24,6 +24,8 @@ public: , m_maincpu(*this, "maincpu") , m_crtc(*this, "crtc") , m_hostuart(*this, "hostuart") + , m_printuart(*this, "printuart") + , m_keybuart(*this, "keybuart") , m_mainport(*this, "mainport") , m_printer(*this, "printer") , m_chargen(*this, "chargen") @@ -38,6 +40,7 @@ private: SCN2674_DRAW_CHARACTER_MEMBER(draw_character); void control_latch_w(u8 data); + DECLARE_WRITE_LINE_MEMBER(system_reset_w); void mem_map(address_map &map); void char_map(address_map &map); @@ -46,6 +49,8 @@ private: required_device<cpu_device> m_maincpu; required_device<scn2674_device> m_crtc; required_device<mos6551_device> m_hostuart; + required_device<mos6551_device> m_printuart; + required_device<mos6551_device> m_keybuart; required_device<rs232_port_device> m_mainport; required_device<rs232_port_device> m_printer; required_region_ptr<u8> m_chargen; @@ -55,16 +60,24 @@ void tv955_state::machine_reset() { m_printer->write_rts(0); m_printer->write_dtr(0); + + m_printuart->write_cts(0); + m_keybuart->write_cts(0); } SCN2674_DRAW_CHARACTER_MEMBER(tv955_state::draw_character) { u16 dots = m_chargen[charcode << 4 | linecount] << 1; - dots |= (BIT(dots, 1) && BIT(charcode, 7) ? 1 : 0) | (dots & 0x100) << 1; + if (BIT(dots, 1) && BIT(charcode, 7)) + dots |= 1; + + // TODO: attribute logic + if (cursor) + dots = ~dots; for (int i = 0; i < 9; i++) { - bitmap.pix32(y, x++) = BIT(dots, 9) ? rgb_t::white() : rgb_t::black(); + bitmap.pix32(y, x++) = BIT(dots, 8) ? rgb_t::white() : rgb_t::black(); dots <<= 1; } } @@ -89,14 +102,19 @@ void tv955_state::control_latch_w(u8 data) } } +WRITE_LINE_MEMBER(tv955_state::system_reset_w) +{ + // TODO +} + void tv955_state::mem_map(address_map &map) { // verified from maintenance manual (131968-00-C) map(0x0000, 0x07ff).mirror(0x0800).ram().share("nvram"); map(0x1100, 0x1100).mirror(0x00ff).w(FUNC(tv955_state::control_latch_w)); - map(0x1200, 0x1203).mirror(0x00fc).rw("keybuart", FUNC(mos6551_device::read), FUNC(mos6551_device::write)); - map(0x1400, 0x1403).mirror(0x00fc).rw("printuart", FUNC(mos6551_device::read), FUNC(mos6551_device::write)); - map(0x1800, 0x1803).mirror(0x00fc).rw("hostuart", FUNC(mos6551_device::read), FUNC(mos6551_device::write)); + map(0x1200, 0x1203).mirror(0x00fc).rw(m_keybuart, FUNC(mos6551_device::read), FUNC(mos6551_device::write)); + map(0x1400, 0x1403).mirror(0x00fc).rw(m_printuart, FUNC(mos6551_device::read), FUNC(mos6551_device::write)); + map(0x1800, 0x1803).mirror(0x00fc).rw(m_hostuart, FUNC(mos6551_device::read), FUNC(mos6551_device::write)); map(0x2000, 0x2007).mirror(0x0ff8).rw("crtc", FUNC(scn2674_device::read), FUNC(scn2674_device::write)); map(0x3000, 0x3fff).rom().region("option", 0); map(0x4000, 0x7fff).ram().share("attrram"); @@ -124,7 +142,9 @@ void tv955_state::tv955(machine_config &config) INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE); - I8049(config, "keyboard", 5.7143_MHz_XTAL); + tv955kb_device &keyboard(TV955_KEYBOARD(config, "keyboard")); + keyboard.txd_cb().set("keybuart", FUNC(mos6551_device::write_rxd)); + keyboard.reset_cb().set(FUNC(tv955_state::system_reset_w)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // HM6116LP-4 + 3.2V battery @@ -151,16 +171,17 @@ void tv955_state::tv955(machine_config &config) m_hostuart->rts_handler().set(m_mainport, FUNC(rs232_port_device::write_rts)); m_hostuart->dtr_handler().set(m_mainport, FUNC(rs232_port_device::write_dtr)); - mos6551_device &printuart(MOS6551(config, "printuart", 0)); - printuart.set_xtal(3.6864_MHz_XTAL / 2); - printuart.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<1>)); - printuart.txd_handler().set(m_printer, FUNC(rs232_port_device::write_txd)); + MOS6551(config, m_printuart, 0); + m_printuart->set_xtal(3.6864_MHz_XTAL / 2); + m_printuart->irq_handler().set("mainirq", FUNC(input_merger_device::in_w<1>)); + m_printuart->txd_handler().set(m_printer, FUNC(rs232_port_device::write_txd)); - mos6551_device &keybuart(MOS6551(config, "keybuart", 0)); - keybuart.set_xtal(3.6864_MHz_XTAL / 2); - keybuart.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<2>)); + MOS6551(config, m_keybuart, 0); + m_keybuart->set_xtal(3.6864_MHz_XTAL / 2); + m_keybuart->irq_handler().set("mainirq", FUNC(input_merger_device::in_w<2>)); + m_keybuart->txd_handler().set("keyboard", FUNC(tv955kb_device::write_rxd)); - RS232_PORT(config, m_mainport, default_rs232_devices, nullptr); // DTE + RS232_PORT(config, m_mainport, default_rs232_devices, "loopback"); // DTE m_mainport->rxd_handler().set(m_hostuart, FUNC(mos6551_device::write_rxd)); m_mainport->cts_handler().set(m_hostuart, FUNC(mos6551_device::write_cts)); m_mainport->dsr_handler().set(m_hostuart, FUNC(mos6551_device::write_dsr)); @@ -190,9 +211,6 @@ ROM_START( tv955 ) ROM_REGION(0x1000, "chargen", 0) ROM_LOAD( "t180002-26b.u45", 0x0000, 0x1000, CRC(69c9ebc7) SHA1(32282c816ec597a7c45e939acb7a4155d35ea584) ) - - ROM_REGION(0x0800, "keyboard", 0) - ROM_LOAD( "8049.kbd", 0x0000, 0x0800, CRC(bc86e349) SHA1(0b62003ab7931822f1bcac8370517c685849f62c) ) ROM_END COMP( 1985, tv955, 0, 0, tv955, tv955, tv955_state, empty_init, "TeleVideo Systems", "TeleVideo 955", MACHINE_IS_SKELETON ) |