diff options
author | 2022-09-10 08:13:29 -0800 | |
---|---|---|
committer | 2022-09-10 12:13:29 -0400 | |
commit | 1e85658dd337bed6990949b26837e477231a9687 (patch) | |
tree | 0c219f6ca84cfc64d9e8848a82148b98e2121512 /src | |
parent | b6234ed1f1d24d9a4eb615f7e546f61635e9a9eb (diff) |
bus/nes_ctrl: Added Sharp Cassette Interface AN-300SL device. (#10318)
Clones promoted to working
--------------------------
Sharp My Computer Terebi C1 [kmg]
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/bus/nes_ctrl/ctrl.cpp | 2 | ||||
-rw-r--r-- | src/devices/bus/nes_ctrl/sharpcass.cpp | 89 | ||||
-rw-r--r-- | src/devices/bus/nes_ctrl/sharpcass.h | 48 | ||||
-rw-r--r-- | src/mame/nintendo/nes.cpp | 2 |
4 files changed, 140 insertions, 1 deletions
diff --git a/src/devices/bus/nes_ctrl/ctrl.cpp b/src/devices/bus/nes_ctrl/ctrl.cpp index a505b687783..aaeec552b4e 100644 --- a/src/devices/bus/nes_ctrl/ctrl.cpp +++ b/src/devices/bus/nes_ctrl/ctrl.cpp @@ -59,6 +59,7 @@ #include "partytap.h" #include "powerpad.h" #include "rob.h" +#include "sharpcass.h" #include "snesadapter.h" #include "suborkey.h" #include "turbofile.h" @@ -223,6 +224,7 @@ void fc_expansion_devices(device_slot_interface &device) device.option_add("joypad", NES_FCPAD_EXP); device.option_add("arcstick", NES_ARCSTICK); device.option_add("fc_keyboard", NES_FCKEYBOARD); + device.option_add("sharp_cassette", NES_SHARPCASS); device.option_add("zapper", NES_ZAPPER); device.option_add("bandaihs", NES_BANDAIHS); device.option_add("vaus", NES_ARKPADDLE_FC); diff --git a/src/devices/bus/nes_ctrl/sharpcass.cpp b/src/devices/bus/nes_ctrl/sharpcass.cpp new file mode 100644 index 00000000000..5668498bfd0 --- /dev/null +++ b/src/devices/bus/nes_ctrl/sharpcass.cpp @@ -0,0 +1,89 @@ +// license:BSD-3-Clause +// copyright-holders:kmg +/********************************************************************** + + Nintendo Family Computer Sharp Cassette Interface AN-300SL + + An alternative to the Nintendo released Data Recorder. Unlike the + Data Recorder, which plugs into the Famicom Keyboard via audio jacks, + this Sharp Cassette Interface plugs directly into the expansion port + and connects to any cassette deck via two audio jacks. The Sharp and + Nintendo cassette interfaces are software incompatible. + + This device is used by the built-in Graphics/Note program of the + Sharp My Computer Terebi C1 for saving/loading. Is there any other + use for this device? + + TODO: The menu option of "play" when verifying saved data suggests + that the unit autodetects when the play button is pressed on a + cassette deck and signals this somehow to the Graphics/Note program. + +**********************************************************************/ + +#include "emu.h" +#include "sharpcass.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(NES_SHARPCASS, nes_sharpcass_device, "nes_sharpcass", "Sharp Cassette Interface AN-300SL") + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void nes_sharpcass_device::device_add_mconfig(machine_config &config) +{ + CASSETTE(config, m_cassette); + m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); + m_cassette->set_interface("fc_cass"); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// nes_sharpcass_device - constructor +//------------------------------------------------- + +nes_sharpcass_device::nes_sharpcass_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, NES_SHARPCASS, tag, owner, clock) + , device_nes_control_port_interface(mconfig, *this) + , m_cassette(*this, "tape") +{ +} + + +//------------------------------------------------- +// read +//------------------------------------------------- + +u8 nes_sharpcass_device::read_exp(offs_t offset) +{ + u8 ret = 0; + + if (offset == 1) // $4017 + { + if ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_PLAY) + { + if (m_cassette->input() < 0) + ret |= 0x04; + } + } + + return ret; +} + +//------------------------------------------------- +// write +//------------------------------------------------- + +void nes_sharpcass_device::write(u8 data) +{ + if ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_RECORD) + m_cassette->output(BIT(data, 2) ? +1.0 : -1.0); +} diff --git a/src/devices/bus/nes_ctrl/sharpcass.h b/src/devices/bus/nes_ctrl/sharpcass.h new file mode 100644 index 00000000000..c66b561c066 --- /dev/null +++ b/src/devices/bus/nes_ctrl/sharpcass.h @@ -0,0 +1,48 @@ +// license:BSD-3-Clause +// copyright-holders:kmg +/********************************************************************** + + Nintendo Family Computer Sharp Cassette Interface AN-300SL + +**********************************************************************/ + +#ifndef MAME_BUS_NES_CTRL_SHARPCASS_H +#define MAME_BUS_NES_CTRL_SHARPCASS_H + +#pragma once + +#include "ctrl.h" +#include "imagedev/cassette.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> nes_sharpcass_device + +class nes_sharpcass_device : public device_t, + public device_nes_control_port_interface +{ +public: + // construction/destruction + nes_sharpcass_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + virtual u8 read_exp(offs_t offset) override; + virtual void write(u8 data) override; + +protected: + // device-level overrides + virtual void device_start() override { } + + virtual void device_add_mconfig(machine_config &config) override; + +private: + required_device<cassette_image_device> m_cassette; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(NES_SHARPCASS, nes_sharpcass_device) + +#endif // MAME_BUS_NES_CTRL_SHARPCASS_H diff --git a/src/mame/nintendo/nes.cpp b/src/mame/nintendo/nes.cpp index 790a740af07..f76151abf72 100644 --- a/src/mame/nintendo/nes.cpp +++ b/src/mame/nintendo/nes.cpp @@ -414,7 +414,7 @@ CONS( 198?, m82p, nes, 0, nespal, nes, nes_state, empty_init, // Famicom hardware CONS( 1983, famicom, 0, nes, famicom, famicom, nes_state, init_famicom, "Nintendo", "Famicom", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) CONS( 1983, famicomo, famicom, 0, famicomo, famicom, nes_state, init_famicom, "Nintendo", "Famicom (earlier, with RP2A03)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -CONS( 1983, famitvc1, famicom, 0, famitvc1, famicom, nes_state, init_famicom, "Sharp", "My Computer Terebi C1", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // working but for unimplemented save/load in builtin cartridge, which causes system to hang +CONS( 1983, famitvc1, famicom, 0, famitvc1, famicom, nes_state, init_famicom, "Sharp", "My Computer Terebi C1", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) CONS( 1986, fds, famicom, 0, fds, famicom, nes_state, init_famicom, "Nintendo", "Famicom (w/ Disk System add-on)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) CONS( 1986, famitwin, famicom, 0, famitwin, famicom, nes_state, init_famicom, "Sharp", "Famicom Twin", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) |