From bf4294d4a07606c0b6f7aeb4fa78909b3e232250 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 6 Sep 2019 03:23:59 +1000 Subject: (nw) poly88 : polyphase coded in, awaiting 8251 coming upgrade. --- src/mame/drivers/poly88.cpp | 4 +-- src/mame/includes/poly88.h | 4 +-- src/mame/machine/poly88.cpp | 88 ++++++++++++++++++++++++++++----------------- 3 files changed, 59 insertions(+), 37 deletions(-) diff --git a/src/mame/drivers/poly88.cpp b/src/mame/drivers/poly88.cpp index fd9bca41661..ac9fb35b81d 100644 --- a/src/mame/drivers/poly88.cpp +++ b/src/mame/drivers/poly88.cpp @@ -14,7 +14,7 @@ BASIC. PolyMorphic's "System 16" package shipped with 16K of RAM (as did the 8813), though their earlier systems had only 8K or less. ToDo: -- Polyphase format not working because 8251 device doesn't support sync. +- Polyphase format not working because 8251 device doesn't support bisync. - More accurate interrupt emulation. - Single-step control. - .CAS file format support (http://deramp.com/polymorphic-computers/emu88.html). @@ -148,7 +148,7 @@ void poly88_state::poly88(machine_config &config) CASSETTE(config, m_cassette); m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED); m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - TIMER(config, "kansas_r").configure_periodic(FUNC(poly88_state::kansas_r), attotime::from_hz(40000)); + TIMER(config, "kansas_r").configure_periodic(FUNC(poly88_state::kansas_r), attotime::from_hz(38400)); /* uart */ I8251(config, m_usart, 16.5888_MHz_XTAL / 9); diff --git a/src/mame/includes/poly88.h b/src/mame/includes/poly88.h index 5d063c9a813..ed7e9d115d6 100644 --- a/src/mame/includes/poly88.h +++ b/src/mame/includes/poly88.h @@ -79,8 +79,8 @@ private: required_ioport m_onboard_config; uint8_t m_int_vector; - bool m_dtr, m_rts, m_txd, m_rxd, m_cassold; - u8 m_cass_data[4]; + bool m_dtr, m_rts, m_txd, m_rxd, m_cassold, m_casspol; + u8 m_cass_data[5]; std::unique_ptr m_onboard_ram; bool m_onboard_disable; }; diff --git a/src/mame/machine/poly88.cpp b/src/mame/machine/poly88.cpp index 354b26e7954..82ab61f1c91 100644 --- a/src/mame/machine/poly88.cpp +++ b/src/mame/machine/poly88.cpp @@ -77,24 +77,55 @@ IRQ_CALLBACK_MEMBER(poly88_state::poly88_irq_callback) TIMER_DEVICE_CALLBACK_MEMBER( poly88_state::kansas_r ) { if (BIT(m_linec->read(), 7)) - return; - - // no tape - set uart to idle - m_cass_data[1]++; - if (m_dtr || (m_cass_data[1] > 32)) { - m_cass_data[1] = 32; - m_rxd = 1; - } + // Polyphase LOAD + if (m_dtr) + { + m_cass_data[1] = m_cass_data[2] = m_cass_data[3] = 0; + m_casspol = 1; + return; + } + + m_cass_data[1]++; + m_cass_data[2]++; - // turn 1200/2400Hz to a bit - uint8_t cass_ws = (m_cassette->input() > +0.04) ? 1 : 0; + uint8_t cass_ws = (m_cassette->input() > +0.04) ? 1 : 0; - if (cass_ws != m_cass_data[0]) + if (cass_ws != m_cass_data[0]) + { + m_cass_data[0] = cass_ws; + if (m_cass_data[1] > 13) + m_casspol ^= 1; + m_cass_data[1] = 0; + m_cass_data[2] = 0; + m_usart->write_rxd(m_casspol); + } + if ((m_cass_data[2] & 7)==2) + { + m_cass_data[3]++; + m_usart->write_rxc(BIT(m_cass_data[3], 0)); + } + } + else { - m_cass_data[0] = cass_ws; - m_rxd = (m_cass_data[1] < 12) ? 1 : 0; - m_cass_data[1] = 0; + // 300 baud LOAD + // no tape - set uart to idle + m_cass_data[1]++; + if (m_dtr || (m_cass_data[1] > 32)) + { + m_cass_data[1] = 32; + m_rxd = 1; + } + + // turn 1200/2400Hz to a bit + uint8_t cass_ws = (m_cassette->input() > +0.04) ? 1 : 0; + + if (cass_ws != m_cass_data[0]) + { + m_cass_data[0] = cass_ws; + m_rxd = (m_cass_data[1] < 12) ? 1 : 0; + m_cass_data[1] = 0; + } } } @@ -103,28 +134,19 @@ WRITE_LINE_MEMBER(poly88_state::cassette_clock_w) // incoming @4800Hz (bit), 2400Hz (polyphase) if (BIT(m_linec->read(), 7)) { - // polyphase - // SAVE + // polyphase SAVE if (!m_rts) - m_cassette->output((m_txd ^ state) ? 1.0 : -1.0); - // LOAD - if (!m_dtr) - { - u8 cass_ws = (m_cassette->input() > +0.04) ? 1 : 0; - if (state) - m_usart->write_rxd(cass_ws); - } + m_cassette->output((m_txd ^ state) ? -1.0 : 1.0); } else { - // byte mode 300 baud Kansas City format - u8 twobit = m_cass_data[3] & 3; + // byte mode 300 baud Kansas City format SAVE + u8 twobit = m_cass_data[4] & 15; - // SAVE if (m_rts && (twobit == 0)) { m_cassette->output(0); - m_cass_data[3] = 0; // reset waveforms + m_cass_data[4] = 0; // reset waveforms } else if (state) @@ -133,14 +155,14 @@ WRITE_LINE_MEMBER(poly88_state::cassette_clock_w) m_cassold = m_txd; if (m_cassold) - m_cassette->output(BIT(m_cass_data[3], 0) ? -1.0 : +1.0); // 2400Hz + m_cassette->output(BIT(m_cass_data[4], 0) ? -1.0 : +1.0); // 2400Hz else - m_cassette->output(BIT(m_cass_data[3], 1) ? -1.0 : +1.0); // 1200Hz + m_cassette->output(BIT(m_cass_data[4], 1) ? -1.0 : +1.0); // 1200Hz - m_cass_data[3]++; + m_cass_data[4]++; } - // LOAD + // byte mode 300 baud Kansas City format LOAD if (state && !m_dtr && (twobit == 0)) m_usart->write_rxd(m_rxd); } @@ -148,7 +170,7 @@ WRITE_LINE_MEMBER(poly88_state::cassette_clock_w) if (!m_rts) m_usart->write_txc(state); - if (!m_dtr) + if (!m_dtr && !BIT(m_linec->read(), 7)) m_usart->write_rxc(state); } -- cgit v1.2.3