diff --git a/src/mame/drivers/osi.cpp b/src/mame/drivers/osi.cpp index 583ee49bdbc..40991a1595a 100644 --- a/src/mame/drivers/osi.cpp +++ b/src/mame/drivers/osi.cpp @@ -164,17 +164,18 @@ Notes: TODO: - - fix uk101 video to 64x16 - floppy PIA is actually a 6820 - break key - power on reset - Superboard II revisions A/C/D - uk101 medium resolution graphics - uk101 ay-3-8910 sound - - cassette - faster cassette - floppy + - need floppies to test with + - support for BAS files and other formats - wemon? + - rs232 */ @@ -220,6 +221,7 @@ PRINT FRE(0) #include "includes/osi.h" #include "machine/clock.h" +#include "sound/wave.h" #include "screen.h" #include "speaker.h" @@ -454,7 +456,7 @@ void sb2m600_state::osi600_mem(address_map &map) map(0xa000, 0xbfff).rom(); map(0xd000, 0xd3ff).ram().share("video_ram"); map(0xdf00, 0xdf00).rw(FUNC(sb2m600_state::keyboard_r), FUNC(sb2m600_state::keyboard_w)); - map(0xf000, 0xf001).rw(m_acia_0, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); + map(0xf000, 0xf001).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); map(0xf800, 0xffff).rom(); } @@ -465,7 +467,7 @@ void uk101_state::uk101_mem(address_map &map) map(0xd000, 0xd3ff).ram().share("video_ram"); map(0xd400, 0xd7ff).noprw(); // bios sets this to spaces at boot map(0xdc00, 0xdfff).r(FUNC(uk101_state::keyboard_r)).w(FUNC(uk101_state::keyboard_w)); - map(0xf000, 0xf001).mirror(0x00fe).rw(m_acia_0, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); + map(0xf000, 0xf001).mirror(0x00fe).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); map(0xf800, 0xffff).rom(); } @@ -480,7 +482,7 @@ void c1p_state::c1p_mem(address_map &map) map(0xd400, 0xd7ff).ram().share("color_ram"); map(0xd800, 0xd800).w(FUNC(c1p_state::ctrl_w)); map(0xdf00, 0xdf00).rw(FUNC(c1p_state::keyboard_r), FUNC(c1p_state::keyboard_w)); - map(0xf000, 0xf001).rw(m_acia_0, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); + map(0xf000, 0xf001).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); map(0xf7c0, 0xf7c0).w(FUNC(c1p_state::osi630_sound_w)); map(0xf7e0, 0xf7e0).w(FUNC(c1p_state::osi630_ctrl_w)); map(0xf800, 0xffff).rom(); @@ -499,7 +501,7 @@ void c1pmf_state::c1pmf_mem(address_map &map) map(0xd400, 0xd7ff).ram().share("color_ram"); map(0xd800, 0xd800).w(FUNC(c1pmf_state::ctrl_w)); map(0xdf00, 0xdf00).rw(FUNC(c1pmf_state::keyboard_r), FUNC(c1pmf_state::keyboard_w)); - map(0xf000, 0xf001).rw(m_acia_0, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); + map(0xf000, 0xf001).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); map(0xf7c0, 0xf7c0).w(FUNC(c1pmf_state::osi630_sound_w)); map(0xf7e0, 0xf7e0).w(FUNC(c1pmf_state::osi630_ctrl_w)); map(0xf800, 0xffff).rom(); @@ -609,17 +611,34 @@ INPUT_PORTS_END /* Machine Start */ -WRITE_LINE_MEMBER( sb2m600_state::write_cassette_clock ) +TIMER_DEVICE_CALLBACK_MEMBER( sb2m600_state::kansas_w ) { - m_acia_0->write_rxd((m_cassette->input() > 0.0) ? 1 : 0); + m_cass_data[3]++; - m_acia_0->write_txc(state); - m_acia_0->write_rxc(state); + if (m_cassbit != m_cassold) + { + m_cass_data[3] = 0; + m_cassold = m_cassbit; + } + + 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 } -WRITE_LINE_MEMBER( sb2m600_state::cassette_tx ) +TIMER_DEVICE_CALLBACK_MEMBER( sb2m600_state::kansas_r) { - m_cassette->output(state ? +1.0 : -1.0); + /* cassette - turn 1200/2400Hz to a bit */ + m_cass_data[1]++; + uint8_t cass_ws = (m_cass->input() > +0.03) ? 1 : 0; + + if (cass_ws != m_cass_data[0]) + { + m_cass_data[0] = cass_ws; + m_acia->write_rxd((m_cass_data[1] < 12) ? 1 : 0); + m_cass_data[1] = 0; + } } void sb2m600_state::machine_start() @@ -723,18 +742,23 @@ void sb2m600_state::osi600(machine_config &config) /* sound hardware */ SPEAKER(config, "mono").front_center(); + WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.05); DISCRETE(config, m_discrete); m_discrete->set_intf(osi600_discrete_interface); m_discrete->add_route(ALL_OUTPUTS, "mono", 0.50); /* cassette ACIA */ - ACIA6850(config, m_acia_0, 0); - m_acia_0->txd_handler().set(FUNC(sb2m600_state::cassette_tx)); + ACIA6850(config, m_acia, 0); + m_acia->txd_handler().set([this] (bool state) { m_cassbit = state; }); - CLOCK(config, "cassette_clock", X1/32).signal_handler().set(FUNC(sb2m600_state::write_cassette_clock)); + clock_device &acia_clock(CLOCK(config, "acia_clock", 4'800)); // 300 baud x 16(divider) = 4800 + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); /* cassette */ - CASSETTE(config, m_cassette); + CASSETTE(config, m_cass); + TIMER(config, "kansas_w").configure_periodic(FUNC(sb2m600_state::kansas_w), attotime::from_hz(4800)); // cass write + TIMER(config, "kansas_r").configure_periodic(FUNC(sb2m600_state::kansas_r), attotime::from_hz(40000)); // cass read /* internal ram */ RAM(config, m_ram); @@ -752,14 +776,22 @@ void uk101_state::uk101(machine_config &config) uk101_video(config); GFXDECODE(config, "gfxdecode", "palette", gfx_osi); - /* cassette ACIA */ - ACIA6850(config, m_acia_0, 0); - m_acia_0->txd_handler().set(FUNC(uk101_state::cassette_tx)); + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.05); - CLOCK(config, "cassette_clock", 500000).signal_handler().set(FUNC(uk101_state::write_cassette_clock)); + /* cassette ACIA */ + ACIA6850(config, m_acia, 0); + m_acia->txd_handler().set([this] (bool state) { m_cassbit = state; }); + + clock_device &acia_clock(CLOCK(config, "acia_clock", 4'800)); // 300 baud x 16(divider) = 4800 + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); /* cassette */ - CASSETTE(config, m_cassette); + CASSETTE(config, m_cass); + TIMER(config, "kansas_w").configure_periodic(FUNC(uk101_state::kansas_w), attotime::from_hz(4800)); // cass write + TIMER(config, "kansas_r").configure_periodic(FUNC(uk101_state::kansas_r), attotime::from_hz(40000)); // cass read /* internal ram */ RAM(config, m_ram); @@ -779,6 +811,7 @@ void c1p_state::c1p(machine_config &config) /* sound hardware */ SPEAKER(config, "mono").front_center(); + WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.05); DISCRETE(config, m_discrete); m_discrete->set_intf(osi600c_discrete_interface); m_discrete->add_route(ALL_OUTPUTS, "mono", 0.50); @@ -789,13 +822,17 @@ void c1p_state::c1p(machine_config &config) PIA6821(config, "pia_3", 0); /* cassette ACIA */ - ACIA6850(config, m_acia_0, 0); - m_acia_0->txd_handler().set(FUNC(c1p_state::cassette_tx)); + ACIA6850(config, m_acia, 0); + m_acia->txd_handler().set([this] (bool state) { m_cassbit = state; }); - CLOCK(config, "cassette_clock", X1/32).signal_handler().set(FUNC(c1p_state::write_cassette_clock)); + clock_device &acia_clock(CLOCK(config, "acia_clock", 4'800)); // 300 baud x 16(divider) = 4800 + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); /* cassette */ - CASSETTE(config, m_cassette); + CASSETTE(config, m_cass); + TIMER(config, "kansas_w").configure_periodic(FUNC(c1p_state::kansas_w), attotime::from_hz(4800)); // cass write + TIMER(config, "kansas_r").configure_periodic(FUNC(c1p_state::kansas_r), attotime::from_hz(40000)); // cass read /* internal ram */ RAM(config, m_ram); @@ -895,8 +932,8 @@ void c1p_state::init_c1p() /* System Drivers */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1978, sb2m600b, 0, 0, osi600, osi600, sb2m600_state, empty_init, "Ohio Scientific", "Superboard II Model 600 (Rev. B)", MACHINE_NOT_WORKING) +COMP( 1978, sb2m600b, 0, 0, osi600, osi600, sb2m600_state, empty_init, "Ohio Scientific", "Superboard II Model 600 (Rev. B)", 0 ) //COMP( 1980, sb2m600c, 0, 0, osi600c, osi600, sb2m600_state, empty_init, "Ohio Scientific", "Superboard II Model 600 (Rev. C)", MACHINE_NOT_WORKING) -COMP( 1980, c1p, sb2m600b, 0, c1p, osi600, c1p_state, init_c1p, "Ohio Scientific", "Challenger 1P Series 2", MACHINE_NOT_WORKING) +COMP( 1980, c1p, sb2m600b, 0, c1p, osi600, c1p_state, init_c1p, "Ohio Scientific", "Challenger 1P Series 2", 0 ) COMP( 1980, c1pmf, sb2m600b, 0, c1pmf, osi600, c1pmf_state, init_c1p, "Ohio Scientific", "Challenger 1P MF Series 2", MACHINE_NOT_WORKING) -COMP( 1979, uk101, sb2m600b, 0, uk101, uk101, uk101_state, empty_init, "Compukit", "UK101", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) +COMP( 1979, uk101, sb2m600b, 0, uk101, uk101, uk101_state, empty_init, "Compukit", "UK101", 0 ) diff --git a/src/mame/includes/osi.h b/src/mame/includes/osi.h index 2e50c0d585d..73e0457cf03 100644 --- a/src/mame/includes/osi.h +++ b/src/mame/includes/osi.h @@ -12,6 +12,7 @@ #include "imagedev/floppy.h" #include "machine/6850acia.h" #include "machine/6821pia.h" +#include "machine/timer.h" #include "machine/ram.h" #include "sound/discrete.h" #include "sound/beep.h" @@ -32,9 +33,11 @@ class sb2m600_state : public driver_device public: sb2m600_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , m_cassbit(0) + , m_cassold(0) , m_maincpu(*this, M6502_TAG) - , m_acia_0(*this, "acia_0") - , m_cassette(*this, "cassette") + , m_acia(*this, "acia") + , m_cass(*this, "cassette") , m_discrete(*this, DISCRETE_TAG) , m_ram(*this, RAM_TAG) , m_video_ram(*this, "video_ram") @@ -55,8 +58,8 @@ protected: DECLARE_READ8_MEMBER( keyboard_r ); DECLARE_WRITE8_MEMBER( keyboard_w ); DECLARE_WRITE8_MEMBER( ctrl_w ); - DECLARE_WRITE_LINE_MEMBER( cassette_tx ); - DECLARE_WRITE_LINE_MEMBER( write_cassette_clock ); + TIMER_DEVICE_CALLBACK_MEMBER(kansas_w); + TIMER_DEVICE_CALLBACK_MEMBER(kansas_r); void floppy_index_callback(floppy_image_device *floppy, int state); @@ -66,9 +69,12 @@ protected: void osi630_video(machine_config &config); void osi600_mem(address_map &map); + uint8_t m_cass_data[4]; + bool m_cassbit; + bool m_cassold; required_device m_maincpu; - required_device m_acia_0; - required_device m_cassette; + required_device m_acia; + required_device m_cass; optional_device m_discrete; required_device m_ram; required_shared_ptr m_video_ram;