From 8a34dbe531379bc493ec6c437c6617766dd3f53a Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 21 Jun 2019 00:06:15 +1000 Subject: (nw) alphatro: improved cassette reliability --- src/mame/drivers/alphatro.cpp | 77 ++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/src/mame/drivers/alphatro.cpp b/src/mame/drivers/alphatro.cpp index 9f0645f6305..1e7b09f6dae 100644 --- a/src/mame/drivers/alphatro.cpp +++ b/src/mame/drivers/alphatro.cpp @@ -36,7 +36,6 @@ #include "machine/bankdev.h" #include "machine/upd765.h" #include "machine/i8257.h" -#include "machine/timer.h" #include "bus/generic/carts.h" #include "bus/generic/slot.h" #include "sound/beep.h" @@ -80,14 +79,8 @@ public: protected: virtual void machine_start() override; virtual void machine_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: - enum - { - TIMER_SYSTEM - }; - DECLARE_READ8_MEMBER (ram0000_r); DECLARE_WRITE8_MEMBER(ram0000_w); DECLARE_READ8_MEMBER (ram6000_r); @@ -106,8 +99,8 @@ private: DECLARE_WRITE_LINE_MEMBER(hrq_w); DECLARE_WRITE_LINE_MEMBER(fdc_irq_w); void alphatro_palette(palette_device &palette) const; - TIMER_DEVICE_CALLBACK_MEMBER(kansas_r); - TIMER_DEVICE_CALLBACK_MEMBER(kansas_w); + DECLARE_WRITE_LINE_MEMBER(kansas_r); + DECLARE_WRITE_LINE_MEMBER(kansas_w); MC6845_UPDATE_ROW(crtc_update_row); image_init_result load_cart(device_image_interface &image, generic_slot_device *slot); @@ -343,14 +336,6 @@ void alphatro_state::portf0_w(uint8_t data) m_port_f0 = data; } -void alphatro_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch(id) - { - default: - assert_always(false, "Unknown id in alphatro_state::device_timer"); - } -} MC6845_UPDATE_ROW( alphatro_state::crtc_update_row ) { @@ -623,10 +608,10 @@ void alphatro_state::machine_reset() update_banking(); m_cass_data[0] = m_cass_data[1] = m_cass_data[2] = m_cass_data[3] = 0; - m_cassbit = 0; - m_cassold = 0; + m_cassbit = 1; + m_cassold = 1; m_fdc_irq = 0; - m_usart->write_rxd(0); + m_usart->write_rxd(1); m_usart->write_cts(0); m_beep->set_state(0); } @@ -671,27 +656,47 @@ void alphatro_state::alphatro_palette(palette_device &palette) const } -TIMER_DEVICE_CALLBACK_MEMBER(alphatro_state::kansas_w) +WRITE_LINE_MEMBER(alphatro_state::kansas_w) { - m_cass_data[3]++; + // incoming @19230Hz + u8 twobit = m_cass_data[3] & 3; - if (m_cassbit != m_cassold) + // relay off - exit, but wait for last bit to completely write + if ((!BIT(m_port_10, 3)) && (twobit == 0)) { - m_cass_data[3] = 0; - m_cassold = m_cassbit; + m_cass->output(0); + m_cass_data[3] = 0; // reset waveforms + return; } - if (m_cassbit) - m_cass->output(BIT(m_cass_data[3], 0) ? -1.0 : +1.0); // 2400Hz - else - m_cass->output(BIT(m_cass_data[3], 1) ? -1.0 : +1.0); // 1200Hz + if (state) + { + if (twobit == 0) + m_cassold = m_cassbit; + + if (m_cassold) + m_cass->output(BIT(m_cass_data[3], 2) ? -1.0 : +1.0); // 2400Hz + else + m_cass->output(BIT(m_cass_data[3], 3) ? -1.0 : +1.0); // 1200Hz + + m_cass_data[3]++; + } + + m_usart->write_txc(state); } -TIMER_DEVICE_CALLBACK_MEMBER(alphatro_state::kansas_r) +WRITE_LINE_MEMBER(alphatro_state::kansas_r) { + if (!BIT(m_port_10, 3)) + { + m_usart->write_rxd(1); + m_cass_data[0] = m_cass_data[1] = 0; + return; + } + /* cassette - turn 1200/2400Hz to a bit */ m_cass_data[1]++; - u8 cass_ws = (m_cass->input() > +0.03) ? 1 : 0; + uint8_t cass_ws = (m_cass->input() > +0.04) ? 1 : 0; if (cass_ws != m_cass_data[0]) { @@ -699,6 +704,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(alphatro_state::kansas_r) m_usart->write_rxd((m_cass_data[1] < 12) ? 1 : 0); m_cass_data[1] = 0; } + m_usart->write_rxc(state); } WRITE_LINE_MEMBER(alphatro_state::fdc_irq_w) @@ -769,18 +775,15 @@ MACHINE_CONFIG_START(alphatro_state::alphatro) I8251(config, m_usart, 16_MHz_XTAL / 4); m_usart->txd_handler().set([this] (bool state) { m_cassbit = state; }); - clock_device &usart_clock(CLOCK(config, "usart_clock", /*16_MHz_XTAL / 4 / 13 / 16*/ 19218)); // 19218 to load a real tape, 19222 to load a tape made by this driver - usart_clock.signal_handler().set(m_usart, FUNC(i8251_device::write_txc)); - usart_clock.signal_handler().append(m_usart, FUNC(i8251_device::write_rxc)); + clock_device &usart_clock(CLOCK(config, "usart_clock", 16_MHz_XTAL / 4 / 13 / 16)); + usart_clock.signal_handler().set(FUNC(alphatro_state::kansas_w)); + usart_clock.signal_handler().append(FUNC(alphatro_state::kansas_r)); CASSETTE(config, m_cass); m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); m_cass->set_interface("alphatro_cass"); SOFTWARE_LIST(config, "cass_list").set_original("alphatro_cass"); - TIMER(config, "kansas_w").configure_periodic(FUNC(alphatro_state::kansas_w), attotime::from_hz(4800)); - TIMER(config, "kansas_r").configure_periodic(FUNC(alphatro_state::kansas_r), attotime::from_hz(40000)); - RAM(config, "ram").set_default_size("64K"); /* cartridge */ -- cgit v1.2.3