From b218528e1f1857d06d7c08b8ffccdfef50c24e43 Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 30 Jul 2019 21:02:54 -0400 Subject: microdrv: Change image type to magtape; default clock; move to imagedev (nw) --- scripts/src/machine.lua | 2 + scripts/target/mame/mess.lua | 2 - src/devices/bus/spectrum/intf1.cpp | 4 +- src/devices/bus/spectrum/intf1.h | 2 +- src/devices/imagedev/microdrv.cpp | 185 +++++++++++++++++++++++++++++++++++++ src/devices/imagedev/microdrv.h | 94 +++++++++++++++++++ src/mame/drivers/ql.cpp | 6 +- src/mame/machine/microdrv.cpp | 185 ------------------------------------- src/mame/machine/microdrv.h | 94 ------------------- src/mame/machine/zx8302.cpp | 2 +- 10 files changed, 288 insertions(+), 288 deletions(-) create mode 100644 src/devices/imagedev/microdrv.cpp create mode 100644 src/devices/imagedev/microdrv.h delete mode 100644 src/mame/machine/microdrv.cpp delete mode 100644 src/mame/machine/microdrv.h diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index 82d77e9ab18..1d6c95d3346 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -51,6 +51,8 @@ files { MAME_DIR .. "src/devices/imagedev/harddriv.h", MAME_DIR .. "src/devices/imagedev/mfmhd.cpp", MAME_DIR .. "src/devices/imagedev/mfmhd.h", + MAME_DIR .. "src/devices/imagedev/microdrv.cpp", + MAME_DIR .. "src/devices/imagedev/microdrv.h", MAME_DIR .. "src/devices/imagedev/midiin.cpp", MAME_DIR .. "src/devices/imagedev/midiin.h", MAME_DIR .. "src/devices/imagedev/midiout.cpp", diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 4786db2e3f2..4230fc88ead 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1453,8 +1453,6 @@ end -------------------------------------------------- createMESSProjects(_target, _subtarget, "messshared") files { - MAME_DIR .. "src/mame/machine/microdrv.cpp", - MAME_DIR .. "src/mame/machine/microdrv.h", MAME_DIR .. "src/mame/machine/teleprinter.cpp", MAME_DIR .. "src/mame/machine/teleprinter.h", MAME_DIR .. "src/mame/machine/z80bin.cpp", diff --git a/src/devices/bus/spectrum/intf1.cpp b/src/devices/bus/spectrum/intf1.cpp index a5e1859e28a..ce9713c66e2 100644 --- a/src/devices/bus/spectrum/intf1.cpp +++ b/src/devices/bus/spectrum/intf1.cpp @@ -45,9 +45,9 @@ void spectrum_intf1_device::device_add_mconfig(machine_config &config) RS232_PORT(config, m_rs232, default_rs232_devices, nullptr); /* microdrive */ - MICRODRIVE(config, m_mdv1, 0); + MICRODRIVE(config, m_mdv1); m_mdv1->comms_out_wr_callback().set(m_mdv2, FUNC(microdrive_image_device::comms_in_w)); - MICRODRIVE(config, m_mdv2, 0); + MICRODRIVE(config, m_mdv2); /* passthru */ SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr); diff --git a/src/devices/bus/spectrum/intf1.h b/src/devices/bus/spectrum/intf1.h index 3a09ca74a0a..022efc9b557 100644 --- a/src/devices/bus/spectrum/intf1.h +++ b/src/devices/bus/spectrum/intf1.h @@ -12,7 +12,7 @@ #include "exp.h" #include "bus/rs232/rs232.h" -#include "machine/microdrv.h" +#include "imagedev/microdrv.h" //************************************************************************** // TYPE DEFINITIONS diff --git a/src/devices/imagedev/microdrv.cpp b/src/devices/imagedev/microdrv.cpp new file mode 100644 index 00000000000..1947d22f840 --- /dev/null +++ b/src/devices/imagedev/microdrv.cpp @@ -0,0 +1,185 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************* + + microdrv.c + + MESS interface to the Sinclair Microdrive image abstraction code + +*********************************************************************/ + +#include "emu.h" +#include "microdrv.h" + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define LOG 0 + +#define MDV_SECTOR_COUNT 255 +#define MDV_SECTOR_LENGTH 686 +#define MDV_IMAGE_LENGTH (MDV_SECTOR_COUNT * MDV_SECTOR_LENGTH) + +#define MDV_PREAMBLE_LENGTH 12 +#define MDV_GAP_LENGTH 120 + +#define MDV_OFFSET_HEADER_PREAMBLE 0 +#define MDV_OFFSET_HEADER MDV_OFFSET_HEADER_PREAMBLE + MDV_PREAMBLE_LENGTH +#define MDV_OFFSET_DATA_PREAMBLE 28 +#define MDV_OFFSET_DATA MDV_OFFSET_DATA_PREAMBLE + MDV_PREAMBLE_LENGTH +#define MDV_OFFSET_GAP 566 + +#define MDV_BITRATE 120000 // invalid, from ZX microdrive + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// device type definition +DEFINE_DEVICE_TYPE(MICRODRIVE, microdrive_image_device, "microdrive_image", "Sinclair Microdrive") + +//------------------------------------------------- +// microdrive_image_device - constructor +//------------------------------------------------- + +microdrive_image_device::microdrive_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, MICRODRIVE, tag, owner, clock), + device_image_interface(mconfig, *this), + m_write_comms_out(*this) +{ +} + +//------------------------------------------------- +// microdrive_image_device - destructor +//------------------------------------------------- + +microdrive_image_device::~microdrive_image_device() +{ +} + + +void microdrive_image_device::device_start() +{ + // resolve callbacks + m_write_comms_out.resolve_safe(); + + // allocate track buffers + m_left = std::make_unique(MDV_IMAGE_LENGTH / 2); + m_right = std::make_unique(MDV_IMAGE_LENGTH / 2); + + // allocate timers + m_bit_timer = timer_alloc(); + m_bit_timer->adjust(attotime::zero, 0, attotime::from_hz(MDV_BITRATE)); + m_bit_timer->enable(0); + + m_clk = 0; + m_comms_in = 0; + m_comms_out = 0; +} + +image_init_result microdrive_image_device::call_load() +{ + if (length() != MDV_IMAGE_LENGTH) + return image_init_result::FAIL; + + for (int i = 0; i < MDV_IMAGE_LENGTH / 2; i++) + { + fread(m_left.get(), 1); + fread(m_right.get(), 1); + } + + m_bit_offset = 0; + m_byte_offset = 0; + + return image_init_result::PASS; +} + +void microdrive_image_device::call_unload() +{ + memset(m_left.get(), 0, MDV_IMAGE_LENGTH / 2); + memset(m_right.get(), 0, MDV_IMAGE_LENGTH / 2); +} + +void microdrive_image_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + m_bit_offset++; + + if (m_bit_offset == 8) + { + m_bit_offset = 0; + m_byte_offset++; + + if (m_byte_offset == MDV_IMAGE_LENGTH) + { + m_byte_offset = 0; + } + } +} + +WRITE_LINE_MEMBER( microdrive_image_device::clk_w ) +{ + if (LOG) logerror("Microdrive '%s' CLK: %u\n", tag(), state); + if (!m_clk && state) + { + m_comms_out = m_comms_in; + if (LOG) logerror("Microdrive '%s' COMMS OUT: %u\n", tag(), m_comms_out); + m_write_comms_out(m_comms_out); + m_bit_timer->enable(m_comms_out); + } + m_clk = state; +} + +WRITE_LINE_MEMBER( microdrive_image_device::comms_in_w ) +{ + if (LOG) logerror("Microdrive '%s' COMMS IN: %u\n", tag(), state); + m_comms_in = state; +} + +WRITE_LINE_MEMBER( microdrive_image_device::erase_w ) +{ + if (LOG) logerror("Microdrive '%s' ERASE: %u\n", tag(), state); + m_erase = state; +} + +WRITE_LINE_MEMBER( microdrive_image_device::read_write_w ) +{ + if (LOG) logerror("Microdrive '%s' READ/WRITE: %u\n", tag(), state); + m_read_write = state; +} + +WRITE_LINE_MEMBER( microdrive_image_device::data1_w ) +{ + if (m_comms_out && !m_read_write) + { + // TODO + } +} + +WRITE_LINE_MEMBER( microdrive_image_device::data2_w ) +{ + if (m_comms_out && !m_read_write) + { + // TODO + } +} + +READ_LINE_MEMBER( microdrive_image_device::data1_r ) +{ + int data = 0; + if (m_comms_out && m_read_write) + { + data = BIT(m_left[m_byte_offset], 7 - m_bit_offset); + } + return data; +} + +READ_LINE_MEMBER( microdrive_image_device::data2_r ) +{ + int data = 0; + if (m_comms_out && m_read_write) + { + data = BIT(m_right[m_byte_offset], 7 - m_bit_offset); + } + return data; +} diff --git a/src/devices/imagedev/microdrv.h b/src/devices/imagedev/microdrv.h new file mode 100644 index 00000000000..4ec1f728d83 --- /dev/null +++ b/src/devices/imagedev/microdrv.h @@ -0,0 +1,94 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************* + + microdrv.h + + MESS interface to the Sinclair Microdrive image abstraction code + +*********************************************************************/ + +#ifndef MAME_DEVICES_IMAGEDEV_MICRODRV_H +#define MAME_DEVICES_IMAGEDEV_MICRODRV_H + +#pragma once + +#include "softlist_dev.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MDV_1 "mdv1" +#define MDV_2 "mdv2" + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// ======================> microdrive_image_device + +class microdrive_image_device : public device_t, + public device_image_interface +{ +public: + // construction/destruction + microdrive_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + virtual ~microdrive_image_device(); + + auto comms_out_wr_callback() { return m_write_comms_out.bind(); } + + // image-level overrides + virtual image_init_result call_load() override; + virtual void call_unload() override; + virtual const software_list_loader &get_software_list_loader() const override { return image_software_list_loader::instance(); } + + virtual iodevice_t image_type() const override { return IO_MAGTAPE; } + + virtual bool is_readable() const override { return 1; } + virtual bool is_writeable() const override { return 1; } + virtual bool is_creatable() const override { return 0; } + virtual bool must_be_loaded() const override { return 0; } + virtual bool is_reset_on_load() const override { return 0; } + virtual const char *image_interface() const override { return "ql_cass"; } + virtual const char *file_extensions() const override { return "mdv"; } + + // specific implementation + DECLARE_WRITE_LINE_MEMBER( clk_w ); + DECLARE_WRITE_LINE_MEMBER( comms_in_w ); + DECLARE_WRITE_LINE_MEMBER( erase_w ); + DECLARE_WRITE_LINE_MEMBER( read_write_w ); + DECLARE_WRITE_LINE_MEMBER( data1_w ); + DECLARE_WRITE_LINE_MEMBER( data2_w ); + DECLARE_READ_LINE_MEMBER ( data1_r ); + DECLARE_READ_LINE_MEMBER ( data2_r ); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; +private: + devcb_write_line m_write_comms_out; + + int m_clk; + int m_comms_in; + int m_comms_out; + int m_erase; + int m_read_write; + + std::unique_ptr m_left; + std::unique_ptr m_right; + + int m_bit_offset; + int m_byte_offset; + + emu_timer *m_bit_timer; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(MICRODRIVE, microdrive_image_device) + +#endif // MAME_DEVICES_IMAGEDEV_MICRODRV_H diff --git a/src/mame/drivers/ql.cpp b/src/mame/drivers/ql.cpp index d7c00923d23..d33fba654e6 100644 --- a/src/mame/drivers/ql.cpp +++ b/src/mame/drivers/ql.cpp @@ -80,7 +80,7 @@ #include "bus/rs232/rs232.h" #include "cpu/m68000/m68000.h" #include "cpu/mcs48/mcs48.h" -#include "machine/microdrv.h" +#include "imagedev/microdrv.h" #include "machine/qimi.h" #include "machine/ram.h" #include "machine/zx8302.h" @@ -946,9 +946,9 @@ void ql_state::ql(machine_config &config) m_zx8302->out_raw2_callback().set(FUNC(ql_state::zx8302_raw2_w)); m_zx8302->in_raw2_callback().set(FUNC(ql_state::zx8302_raw2_r)); - MICRODRIVE(config, m_mdv1, 0); + MICRODRIVE(config, m_mdv1); m_mdv1->comms_out_wr_callback().set(m_mdv2, FUNC(microdrive_image_device::comms_in_w)); - MICRODRIVE(config, m_mdv2, 0); + MICRODRIVE(config, m_mdv2); RS232_PORT(config, m_ser1, default_rs232_devices, nullptr); // wired as DCE RS232_PORT(config, m_ser2, default_rs232_devices, nullptr); // wired as DTE diff --git a/src/mame/machine/microdrv.cpp b/src/mame/machine/microdrv.cpp deleted file mode 100644 index 1947d22f840..00000000000 --- a/src/mame/machine/microdrv.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Curt Coder -/********************************************************************* - - microdrv.c - - MESS interface to the Sinclair Microdrive image abstraction code - -*********************************************************************/ - -#include "emu.h" -#include "microdrv.h" - -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -#define LOG 0 - -#define MDV_SECTOR_COUNT 255 -#define MDV_SECTOR_LENGTH 686 -#define MDV_IMAGE_LENGTH (MDV_SECTOR_COUNT * MDV_SECTOR_LENGTH) - -#define MDV_PREAMBLE_LENGTH 12 -#define MDV_GAP_LENGTH 120 - -#define MDV_OFFSET_HEADER_PREAMBLE 0 -#define MDV_OFFSET_HEADER MDV_OFFSET_HEADER_PREAMBLE + MDV_PREAMBLE_LENGTH -#define MDV_OFFSET_DATA_PREAMBLE 28 -#define MDV_OFFSET_DATA MDV_OFFSET_DATA_PREAMBLE + MDV_PREAMBLE_LENGTH -#define MDV_OFFSET_GAP 566 - -#define MDV_BITRATE 120000 // invalid, from ZX microdrive - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -// device type definition -DEFINE_DEVICE_TYPE(MICRODRIVE, microdrive_image_device, "microdrive_image", "Sinclair Microdrive") - -//------------------------------------------------- -// microdrive_image_device - constructor -//------------------------------------------------- - -microdrive_image_device::microdrive_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, MICRODRIVE, tag, owner, clock), - device_image_interface(mconfig, *this), - m_write_comms_out(*this) -{ -} - -//------------------------------------------------- -// microdrive_image_device - destructor -//------------------------------------------------- - -microdrive_image_device::~microdrive_image_device() -{ -} - - -void microdrive_image_device::device_start() -{ - // resolve callbacks - m_write_comms_out.resolve_safe(); - - // allocate track buffers - m_left = std::make_unique(MDV_IMAGE_LENGTH / 2); - m_right = std::make_unique(MDV_IMAGE_LENGTH / 2); - - // allocate timers - m_bit_timer = timer_alloc(); - m_bit_timer->adjust(attotime::zero, 0, attotime::from_hz(MDV_BITRATE)); - m_bit_timer->enable(0); - - m_clk = 0; - m_comms_in = 0; - m_comms_out = 0; -} - -image_init_result microdrive_image_device::call_load() -{ - if (length() != MDV_IMAGE_LENGTH) - return image_init_result::FAIL; - - for (int i = 0; i < MDV_IMAGE_LENGTH / 2; i++) - { - fread(m_left.get(), 1); - fread(m_right.get(), 1); - } - - m_bit_offset = 0; - m_byte_offset = 0; - - return image_init_result::PASS; -} - -void microdrive_image_device::call_unload() -{ - memset(m_left.get(), 0, MDV_IMAGE_LENGTH / 2); - memset(m_right.get(), 0, MDV_IMAGE_LENGTH / 2); -} - -void microdrive_image_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - m_bit_offset++; - - if (m_bit_offset == 8) - { - m_bit_offset = 0; - m_byte_offset++; - - if (m_byte_offset == MDV_IMAGE_LENGTH) - { - m_byte_offset = 0; - } - } -} - -WRITE_LINE_MEMBER( microdrive_image_device::clk_w ) -{ - if (LOG) logerror("Microdrive '%s' CLK: %u\n", tag(), state); - if (!m_clk && state) - { - m_comms_out = m_comms_in; - if (LOG) logerror("Microdrive '%s' COMMS OUT: %u\n", tag(), m_comms_out); - m_write_comms_out(m_comms_out); - m_bit_timer->enable(m_comms_out); - } - m_clk = state; -} - -WRITE_LINE_MEMBER( microdrive_image_device::comms_in_w ) -{ - if (LOG) logerror("Microdrive '%s' COMMS IN: %u\n", tag(), state); - m_comms_in = state; -} - -WRITE_LINE_MEMBER( microdrive_image_device::erase_w ) -{ - if (LOG) logerror("Microdrive '%s' ERASE: %u\n", tag(), state); - m_erase = state; -} - -WRITE_LINE_MEMBER( microdrive_image_device::read_write_w ) -{ - if (LOG) logerror("Microdrive '%s' READ/WRITE: %u\n", tag(), state); - m_read_write = state; -} - -WRITE_LINE_MEMBER( microdrive_image_device::data1_w ) -{ - if (m_comms_out && !m_read_write) - { - // TODO - } -} - -WRITE_LINE_MEMBER( microdrive_image_device::data2_w ) -{ - if (m_comms_out && !m_read_write) - { - // TODO - } -} - -READ_LINE_MEMBER( microdrive_image_device::data1_r ) -{ - int data = 0; - if (m_comms_out && m_read_write) - { - data = BIT(m_left[m_byte_offset], 7 - m_bit_offset); - } - return data; -} - -READ_LINE_MEMBER( microdrive_image_device::data2_r ) -{ - int data = 0; - if (m_comms_out && m_read_write) - { - data = BIT(m_right[m_byte_offset], 7 - m_bit_offset); - } - return data; -} diff --git a/src/mame/machine/microdrv.h b/src/mame/machine/microdrv.h deleted file mode 100644 index 2b7202cd321..00000000000 --- a/src/mame/machine/microdrv.h +++ /dev/null @@ -1,94 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Curt Coder -/********************************************************************* - - microdrv.h - - MESS interface to the Sinclair Microdrive image abstraction code - -*********************************************************************/ - -#ifndef MAME_MACHINE_MICRODRV_H -#define MAME_MACHINE_MICRODRV_H - -#pragma once - -#include "softlist_dev.h" - - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MDV_1 "mdv1" -#define MDV_2 "mdv2" - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -// ======================> microdrive_image_device - -class microdrive_image_device : public device_t, - public device_image_interface -{ -public: - // construction/destruction - microdrive_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~microdrive_image_device(); - - auto comms_out_wr_callback() { return m_write_comms_out.bind(); } - - // image-level overrides - virtual image_init_result call_load() override; - virtual void call_unload() override; - virtual const software_list_loader &get_software_list_loader() const override { return image_software_list_loader::instance(); } - - virtual iodevice_t image_type() const override { return IO_CASSETTE; } - - virtual bool is_readable() const override { return 1; } - virtual bool is_writeable() const override { return 1; } - virtual bool is_creatable() const override { return 0; } - virtual bool must_be_loaded() const override { return 0; } - virtual bool is_reset_on_load() const override { return 0; } - virtual const char *image_interface() const override { return "ql_cass"; } - virtual const char *file_extensions() const override { return "mdv"; } - - // specific implementation - DECLARE_WRITE_LINE_MEMBER( clk_w ); - DECLARE_WRITE_LINE_MEMBER( comms_in_w ); - DECLARE_WRITE_LINE_MEMBER( erase_w ); - DECLARE_WRITE_LINE_MEMBER( read_write_w ); - DECLARE_WRITE_LINE_MEMBER( data1_w ); - DECLARE_WRITE_LINE_MEMBER( data2_w ); - DECLARE_READ_LINE_MEMBER ( data1_r ); - DECLARE_READ_LINE_MEMBER ( data2_r ); - -protected: - // device-level overrides - virtual void device_start() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; -private: - devcb_write_line m_write_comms_out; - - int m_clk; - int m_comms_in; - int m_comms_out; - int m_erase; - int m_read_write; - - std::unique_ptr m_left; - std::unique_ptr m_right; - - int m_bit_offset; - int m_byte_offset; - - emu_timer *m_bit_timer; -}; - - -// device type definition -DECLARE_DEVICE_TYPE(MICRODRIVE, microdrive_image_device) - -#endif // MAME_MACHINE_MICRODRV_H diff --git a/src/mame/machine/zx8302.cpp b/src/mame/machine/zx8302.cpp index f161efc364e..97d5c0ee0c9 100644 --- a/src/mame/machine/zx8302.cpp +++ b/src/mame/machine/zx8302.cpp @@ -21,7 +21,7 @@ #include "emu.h" #include "zx8302.h" -#include "machine/microdrv.h" +#include "imagedev/microdrv.h" #include -- cgit v1.2.3