(nw) osi : added cassette support

This commit is contained in:
Robbbert 2019-06-08 03:24:14 +10:00
parent 948bbea7d5
commit 285ff0f377
2 changed files with 77 additions and 34 deletions

View File

@ -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;
}
WRITE_LINE_MEMBER( sb2m600_state::cassette_tx )
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
}
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 )

View File

@ -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<cpu_device> m_maincpu;
required_device<acia6850_device> m_acia_0;
required_device<cassette_image_device> m_cassette;
required_device<acia6850_device> m_acia;
required_device<cassette_image_device> m_cass;
optional_device<discrete_sound_device> m_discrete;
required_device<ram_device> m_ram;
required_shared_ptr<uint8_t> m_video_ram;