diff options
| author | 2026-04-16 03:41:37 +1000 | |
|---|---|---|
| committer | 2026-04-16 03:41:37 +1000 | |
| commit | 6d0d50b450a7e8307c6c5046bedc5dcd5fcb2185 (patch) | |
| tree | 85e1ce95c6141f7d11a67ece368f89e3d03401be | |
| parent | 0ff8ec15a3bef83a8e4a725f3e124e5e4601e0b6 (diff) | |
-bus/ieee488: Cleaned up code, improved displayed device names.
-docs: Reorganised listing of MSYS2 packages for building documentation.
33 files changed, 1465 insertions, 1434 deletions
diff --git a/docs/source/initialsetup/compilingmame.rst b/docs/source/initialsetup/compilingmame.rst index bc1ce29c66a..7a248928c56 100644 --- a/docs/source/initialsetup/compilingmame.rst +++ b/docs/source/initialsetup/compilingmame.rst @@ -111,23 +111,6 @@ These instructions assume you have some familiarity with MSYS2 and the * Install packages necessary to build MAME. At the very least, you’ll need ``bash``, ``git`` and ``make``. * For debugging you may want to install ``gdb``. -* To build the HTML user/developer documentation, you’ll need - ``mingw-w64-clang-x86_64-librsvg``, ``mingw-w64-clang-x86_64-python-sphinx``, - ``mingw-w64-clang-x86_64-python-sphinx_rtd_theme`` and - ``mingw-w64-clang-x86_64-python-sphinxcontrib-svg2pdfconverter`` for a CLANG64 - environment (or alternatively ``mingw-w64-clang-aarch64-librsvg``, - ``mingw-w64-clang-aarch64-python-sphinx``, - ``mingw-w64-clang-aarch64-python-sphinx_rtd_theme`` and - ``mingw-w64-clang-aarch64-python-sphinxcontrib-svg2pdfconverter`` a CLANGARM64 - environment). -* To build the PDF documentation, you’ll additionally need - ``mingw-w64-ucrt-x86_64-texlive-latex-extra`` and - ``mingw-w64-ucrt-x86_64-texlive-fonts-recommended`` for a UCRT64 environment, - or ``mingw-w64-clang-x86_64-texlive-latex-extra`` and - ``mingw-w64-clang-x86_64-texlive-fonts-recommended`` for a CLANG64 - environment. You must build the PDF documentation using the UCRT64 or CLANG64 - environment as the TeX Live tools currently do not work with the CLANGARM64 - environment. * To generate API documentation from source, you’ll need ``doxygen``. * If you plan to rebuild bgfx shaders and you want to rebuild the GLSL parser, you’ll need ``bison``. @@ -148,6 +131,13 @@ building for. * To build against the portable SDL interfaces, you’ll need ``mingw-w64-ucrt-x86_64-SDL2`` and ``mingw-w64-ucrt-x86_64-SDL2_ttf``. * To build the Qt debugger, you’ll need ``mingw-w64-ucrt-x86_64-qt6-base``. +* To build the HTML user/developer documentation, you’ll need + ``mingw-w64-ucrt-x86_64-librsvg``, ``mingw-w64-ucrt-x86_64-python-sphinx``, + ``mingw-w64-ucrt-x86_64-python-sphinx_rtd_theme`` and + ``mingw-w64-ucrt-x86_64-python-sphinxcontrib-svg2pdfconverter``. +* To build the PDF documentation, you’ll additionally need + ``mingw-w64-ucrt-x86_64-texlive-latex-extra`` and + ``mingw-w64-ucrt-x86_64-texlive-fonts-recommended``. * Open the **ucrt64.exe** helper from the **msys64** installation folder or the **MSYS2 UCRT64** shortcut from the start menu to start a Bash shell configured with the correct paths and environment variables. @@ -163,6 +153,13 @@ building for. * To build against the portable SDL interfaces, you’ll need ``mingw-w64-clang-x86_64-SDL2`` and ``mingw-w64-clang-x86_64-SDL2_ttf``. * To build the Qt debugger, you’ll need ``mingw-w64-clang-x86_64-qt6-base``. +* To build the HTML user/developer documentation, you’ll need + ``mingw-w64-clang-x86_64-librsvg``, ``mingw-w64-clang-x86_64-python-sphinx``, + ``mingw-w64-clang-x86_64-python-sphinx_rtd_theme`` and + ``mingw-w64-clang-x86_64-python-sphinxcontrib-svg2pdfconverter``. +* To build the PDF documentation, you’ll additionally need + ``mingw-w64-clang-x86_64-texlive-latex-extra`` and + ``mingw-w64-clang-x86_64-texlive-fonts-recommended``. * Open the **clang64.exe** helper from the **msys64** installation folder or use the **MSYS2 CLANG64** shortcut to start a Bash shell configured with the correct paths and environment variables. @@ -178,6 +175,15 @@ building for. * To build against the portable SDL interfaces, you’ll need ``mingw-w64-clang-aarch64-SDL2`` and ``mingw-w64-clang-aarch64-SDL2_ttf``. * To build the Qt debugger, you’ll need ``mingw-w64-clang-aarch64-qt6-base``. +* To build the HTML user/developer documentation, you’ll need + ``mingw-w64-clangarm64-x86_64-librsvg``, + ``mingw-w64-clangarm64-x86_64-python-sphinx``, + ``mingw-w64-clangarm64-x86_64-python-sphinx_rtd_theme`` and + ``mingw-w64-clangarm64-x86_64-python-sphinxcontrib-svg2pdfconverter``. +* It is not currently possible to build the PDF documentation using the + CLANGARM64 environment as the TeX Live tools do not work. You may be able + to use the UCRT64 or CLANG64 environment to build the PDF documentation on a + 64-bit ARM system. * Open the **clangarm64.exe** helper from the **msys64** installation folder or use the **MSYS2 CLANGARM64** shortcut to start a Bash shell configured with the correct paths and environment variables. @@ -457,7 +463,7 @@ can install these packages with pacman -S mingw-w64-x86_64-librsvg mingw-w64-x86_64-python-sphinx mingw-w64-x86_64-python-sphinxcontrib-svg2pdfconverter If you intend to make a PDF via LaTeX, you’ll need to install a LaTeX -distribution such as TeX Live: +distribution such as TeX Live: .. code-block:: bash @@ -483,7 +489,7 @@ On Debian, you’ll need to install the **librsvg2-bin** package: sudo apt-get install librsvg2-bin If you intend to make a PDF via LaTeX, you’ll need to install a LaTeX -distribution such as TeX Live: +distribution such as TeX Live: .. code-block:: bash diff --git a/src/devices/bus/cbmiec/c1526.cpp b/src/devices/bus/cbmiec/c1526.cpp index 45e4540e236..75b5b8e997f 100644 --- a/src/devices/bus/cbmiec/c1526.cpp +++ b/src/devices/bus/cbmiec/c1526.cpp @@ -24,7 +24,7 @@ //************************************************************************** DEFINE_DEVICE_TYPE(C1526, c1526_device, "c1526", "Commodore 1526/MPS-802 Dot Matrix Printer") -DEFINE_DEVICE_TYPE(C4023, c4023_device, "c4023", "Commodore 4023 Printer") +DEFINE_DEVICE_TYPE(GPIB_C4023, c4023_device, "c4023", "Commodore 4023 Printer") //------------------------------------------------- @@ -173,7 +173,7 @@ c1526_device::c1526_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- c4023_device::c4023_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c1526_device_base(mconfig, C4023, tag, owner, clock), + c1526_device_base(mconfig, GPIB_C4023, tag, owner, clock), device_ieee488_interface(mconfig, *this) { } diff --git a/src/devices/bus/cbmiec/c1526.h b/src/devices/bus/cbmiec/c1526.h index 52b7f906a47..a44f3dc3f81 100644 --- a/src/devices/bus/cbmiec/c1526.h +++ b/src/devices/bus/cbmiec/c1526.h @@ -79,7 +79,7 @@ protected: // device type definition DECLARE_DEVICE_TYPE(C1526, c1526_device) -DECLARE_DEVICE_TYPE(C4023, c4023_device) +DECLARE_DEVICE_TYPE(GPIB_C4023, c4023_device) #endif // MAME_BUS_CBMIEC_C1526_H diff --git a/src/devices/bus/ieee488/c2031.cpp b/src/devices/bus/ieee488/c2031.cpp index fa96ba01266..8fe1196d68b 100644 --- a/src/devices/bus/ieee488/c2031.cpp +++ b/src/devices/bus/ieee488/c2031.cpp @@ -9,17 +9,22 @@ #include "emu.h" #include "c2031.h" +#include "cpu/m6502/m6502.h" +#include "imagedev/floppy.h" +#include "machine/64h156.h" +#include "machine/6522via.h" + #include "formats/d64_dsk.h" #include "formats/g64_dsk.h" +namespace { + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** #define M6502_TAG "ucd5" -#define M6522_0_TAG "uab1" -#define M6522_1_TAG "ucd4" #define C64H156_TAG "64h156" @@ -32,10 +37,65 @@ enum //************************************************************************** -// DEVICE DEFINITIONS +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(C2031, c2031_device, "c2031", "Commodore 2031") +// ======================> c2031_device + +class c2031_device : public device_t, + public device_ieee488_interface +{ +public: + // construction/destruction + c2031_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + // device_ieee488_interface implementation + virtual void ieee488_atn(int state) override; + virtual void ieee488_ifc(int state) override; + +private: + inline int get_device_number(); + + void via0_irq_w(int state); + uint8_t via0_pa_r(); + void via0_pa_w(uint8_t data); + uint8_t via0_pb_r(); + void via0_pb_w(uint8_t data); + void via1_irq_w(int state); + uint8_t via1_pb_r(); + void via1_pb_w(uint8_t data); + void byte_w(int state); + + void c2031_mem(address_map &map) ATTR_COLD; + + static void floppy_formats(format_registration &fr); + + required_device<m6502_device> m_maincpu; + required_device<via6522_device> m_via0; + required_device<via6522_device> m_via1; + required_device<c64h156_device> m_ga; + required_device<floppy_image_device> m_floppy; + required_ioport m_address; + output_finder<2> m_leds; + + // IEEE-488 bus + int m_nrfd_out; // not ready for data + int m_ndac_out; // not data accepted + int m_atna; // attention acknowledge + int m_ifc; + + // interrupts + int m_via0_irq; // VIA #0 interrupt request + int m_via1_irq; // VIA #1 interrupt request +}; //------------------------------------------------- @@ -66,8 +126,8 @@ const tiny_rom_entry *c2031_device::device_rom_region() const void c2031_device::c2031_mem(address_map &map) { map(0x0000, 0x07ff).mirror(0x6000).ram(); - map(0x1800, 0x180f).mirror(0x63f0).m(M6522_0_TAG, FUNC(via6522_device::map)); - map(0x1c00, 0x1c0f).mirror(0x63f0).m(M6522_1_TAG, FUNC(via6522_device::map)); + map(0x1800, 0x180f).mirror(0x63f0).m(m_via0, FUNC(via6522_device::map)); + map(0x1c00, 0x1c0f).mirror(0x63f0).m(m_via1, FUNC(via6522_device::map)); map(0x8000, 0xbfff).mirror(0x4000).rom().region(M6502_TAG, 0); } @@ -388,11 +448,11 @@ inline int c2031_device::get_device_number() //------------------------------------------------- c2031_device::c2031_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, C2031, tag, owner, clock) + : device_t(mconfig, GPIB_C2031, tag, owner, clock) , device_ieee488_interface(mconfig, *this) , m_maincpu(*this, M6502_TAG) - , m_via0(*this, M6522_0_TAG) - , m_via1(*this, M6522_1_TAG) + , m_via0(*this, "uab1") + , m_via1(*this, "ucd4") , m_ga(*this, C64H156_TAG) , m_floppy(*this, C64H156_TAG":0:525ssqd") , m_address(*this, "ADDRESS") @@ -473,3 +533,12 @@ void c2031_device::ieee488_ifc(int state) m_ifc = state; } + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C2031, device_ieee488_interface, c2031_device, "c2031", "Commodore 2031 single disk drive") diff --git a/src/devices/bus/ieee488/c2031.h b/src/devices/bus/ieee488/c2031.h index f35b1eb1bc4..682165a80a7 100644 --- a/src/devices/bus/ieee488/c2031.h +++ b/src/devices/bus/ieee488/c2031.h @@ -12,79 +12,10 @@ #pragma once #include "ieee488.h" -#include "cpu/m6502/m6502.h" -#include "imagedev/floppy.h" -#include "machine/64h156.h" -#include "machine/6522via.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> c2031_device - -class c2031_device : public device_t, - public device_ieee488_interface -{ -public: - // construction/destruction - c2031_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_atn(int state) override; - virtual void ieee488_ifc(int state) override; - -private: - inline int get_device_number(); - - void via0_irq_w(int state); - uint8_t via0_pa_r(); - void via0_pa_w(uint8_t data); - uint8_t via0_pb_r(); - void via0_pb_w(uint8_t data); - void via1_irq_w(int state); - uint8_t via1_pb_r(); - void via1_pb_w(uint8_t data); - void byte_w(int state); - - void c2031_mem(address_map &map) ATTR_COLD; - - static void floppy_formats(format_registration &fr); - - required_device<m6502_device> m_maincpu; - required_device<via6522_device> m_via0; - required_device<via6522_device> m_via1; - required_device<c64h156_device> m_ga; - required_device<floppy_image_device> m_floppy; - required_ioport m_address; - output_finder<2> m_leds; - - // IEEE-488 bus - int m_nrfd_out; // not ready for data - int m_ndac_out; // not data accepted - int m_atna; // attention acknowledge - int m_ifc; - - // interrupts - int m_via0_irq; // VIA #0 interrupt request - int m_via1_irq; // VIA #1 interrupt request -}; - - -// device type definition -DECLARE_DEVICE_TYPE(C2031, c2031_device) +DECLARE_DEVICE_TYPE(GPIB_C2031, device_ieee488_interface) #endif // MAME_BUS_IEEE488_C2031_H diff --git a/src/devices/bus/ieee488/c2040.cpp b/src/devices/bus/ieee488/c2040.cpp index 80a396deaaa..6f9397b49da 100644 --- a/src/devices/bus/ieee488/c2040.cpp +++ b/src/devices/bus/ieee488/c2040.cpp @@ -50,6 +50,13 @@ #include "emu.h" #include "c2040.h" +#include "c2040fdc.h" + +#include "cpu/m6502/m6502.h" +#include "cpu/m6502/m6504.h" +#include "machine/6522via.h" +#include "machine/mos6530.h" + #include "formats/c3040_dsk.h" #include "formats/c4040_dsk.h" #include "formats/d64_dsk.h" @@ -57,13 +64,13 @@ +namespace { + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** #define M6502_TAG "un1" -#define M6532_0_TAG "uc1" -#define M6532_1_TAG "ue1" #define M6504_TAG "uh3" #define M6522_TAG "um3" #define M6530_TAG "uk3" @@ -72,12 +79,109 @@ //************************************************************************** -// DEVICE DEFINITIONS +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(C2040, c2040_device, "c2040", "Commodore 2040") -DEFINE_DEVICE_TYPE(C3040, c3040_device, "c3040", "Commodore 3040") -DEFINE_DEVICE_TYPE(C4040, c4040_device, "c4040", "Commodore 4040") +// ======================> c2040_device + +class c2040_device : public device_t, public device_ieee488_interface +{ +public: + // construction/destruction + c2040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + c2040_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + // device_ieee488_interface implementation + virtual void ieee488_atn(int state) override; + virtual void ieee488_ifc(int state) override; + + enum + { + LED_POWER = 0, + LED_ACT0, + LED_ACT1, + LED_ERR + }; + + void add_common_devices(machine_config &config); + inline void update_ieee_signals(); + + uint8_t dio_r() { return m_bus->dio_r(); }; + void dio_w(uint8_t data) { m_bus->dio_w(this, data); }; + uint8_t riot1_pa_r(); + void riot1_pa_w(uint8_t data); + uint8_t riot1_pb_r(); + void riot1_pb_w(uint8_t data); + void via_pb_w(uint8_t data); + + static void floppy_formats(format_registration &fr); + + required_device<m6502_device> m_maincpu; + required_device<m6504_device> m_fdccpu; + required_device<mos6532_device> m_riot0; + required_device<mos6532_device> m_riot1; + required_device<mos6530_device> m_miot; + required_device<via6522_device> m_via; + required_device<floppy_image_device> m_floppy0; + optional_device<floppy_image_device> m_floppy1; + required_device<c2040_fdc_device> m_fdc; + required_ioport m_address; + output_finder<4> m_leds; + + void c2040_fdc_mem(address_map &map) ATTR_COLD; + void c2040_main_mem(address_map &map) ATTR_COLD; + + // IEEE-488 bus + int m_rfdo; // not ready for data output + int m_daco; // not data accepted output + int m_atna; // attention acknowledge + int m_ifc; +}; + + +// ======================> c3040_device + +class c3040_device : public c2040_device +{ +public: + // construction/destruction + c3040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + static void floppy_formats(format_registration &fr); +}; + + +// ======================> c4040_device + +class c4040_device : public c2040_device +{ +public: + // construction/destruction + c4040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + static void floppy_formats(format_registration &fr); +}; //------------------------------------------------- @@ -171,10 +275,10 @@ const tiny_rom_entry *c4040_device::device_rom_region() const void c2040_device::c2040_main_mem(address_map &map) { map.global_mask(0x7fff); - map(0x0000, 0x007f).mirror(0x0100).m(M6532_0_TAG, FUNC(mos6532_device::ram_map)); - map(0x0080, 0x00ff).mirror(0x0100).m(M6532_1_TAG, FUNC(mos6532_device::ram_map)); - map(0x0200, 0x021f).mirror(0x0d60).m(M6532_0_TAG, FUNC(mos6532_device::io_map)); - map(0x0280, 0x029f).mirror(0x0d60).m(M6532_1_TAG, FUNC(mos6532_device::io_map)); + map(0x0000, 0x007f).mirror(0x0100).m(m_riot0, FUNC(mos6532_device::ram_map)); + map(0x0080, 0x00ff).mirror(0x0100).m(m_riot1, FUNC(mos6532_device::ram_map)); + map(0x0200, 0x021f).mirror(0x0d60).m(m_riot0, FUNC(mos6532_device::io_map)); + map(0x0280, 0x029f).mirror(0x0d60).m(m_riot1, FUNC(mos6532_device::io_map)); map(0x1000, 0x13ff).mirror(0x0c00).ram().share("share1"); map(0x2000, 0x23ff).mirror(0x0c00).ram().share("share2"); map(0x3000, 0x33ff).mirror(0x0c00).ram().share("share3"); @@ -533,8 +637,8 @@ c2040_device::c2040_device(const machine_config &mconfig, device_type type, cons device_ieee488_interface(mconfig, *this), m_maincpu(*this, M6502_TAG), m_fdccpu(*this, M6504_TAG), - m_riot0(*this, M6532_0_TAG), - m_riot1(*this, M6532_1_TAG), + m_riot0(*this, "uc1"), + m_riot1(*this, "ue1"), m_miot(*this, M6530_TAG), m_via(*this, M6522_TAG), m_floppy0(*this, FDC_TAG":0:525ssqd"), @@ -550,7 +654,7 @@ c2040_device::c2040_device(const machine_config &mconfig, device_type type, cons } c2040_device::c2040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c2040_device(mconfig, C2040, tag, owner, clock) + c2040_device(mconfig, GPIB_C2040, tag, owner, clock) { } @@ -560,7 +664,7 @@ c2040_device::c2040_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- c3040_device::c3040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c2040_device(mconfig, C3040, tag, owner, clock) + c2040_device(mconfig, GPIB_C3040, tag, owner, clock) { } @@ -570,7 +674,7 @@ c3040_device::c3040_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- c4040_device::c4040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c2040_device(mconfig, C4040, tag, owner, clock) + c2040_device(mconfig, GPIB_C4040, tag, owner, clock) { } @@ -637,3 +741,14 @@ void c2040_device::ieee488_ifc(int state) m_ifc = state; } + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C2040, device_ieee488_interface, c2040_device, "c2040", "Commodore 2040 disk drive") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C3040, device_ieee488_interface, c3040_device, "c3040", "Commodore 3040 disk drive") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C4040, device_ieee488_interface, c4040_device, "c4040", "Commodore 4040 disk drive") diff --git a/src/devices/bus/ieee488/c2040.h b/src/devices/bus/ieee488/c2040.h index 6ba30c9647d..b4f2f553c50 100644 --- a/src/devices/bus/ieee488/c2040.h +++ b/src/devices/bus/ieee488/c2040.h @@ -12,126 +12,12 @@ #pragma once #include "ieee488.h" -#include "c2040fdc.h" -#include "cpu/m6502/m6502.h" -#include "cpu/m6502/m6504.h" -#include "machine/6522via.h" -#include "machine/mos6530.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> c2040_device - -class c2040_device : public device_t, public device_ieee488_interface -{ -public: - // construction/destruction - c2040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - c2040_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_atn(int state) override; - virtual void ieee488_ifc(int state) override; - - enum - { - LED_POWER = 0, - LED_ACT0, - LED_ACT1, - LED_ERR - }; - - void add_common_devices(machine_config &config); - inline void update_ieee_signals(); - - uint8_t dio_r() { return m_bus->dio_r(); }; - void dio_w(uint8_t data) { m_bus->dio_w(this, data); }; - uint8_t riot1_pa_r(); - void riot1_pa_w(uint8_t data); - uint8_t riot1_pb_r(); - void riot1_pb_w(uint8_t data); - void via_pb_w(uint8_t data); - - static void floppy_formats(format_registration &fr); - - required_device<m6502_device> m_maincpu; - required_device<m6504_device> m_fdccpu; - required_device<mos6532_device> m_riot0; - required_device<mos6532_device> m_riot1; - required_device<mos6530_device> m_miot; - required_device<via6522_device> m_via; - required_device<floppy_image_device> m_floppy0; - optional_device<floppy_image_device> m_floppy1; - required_device<c2040_fdc_device> m_fdc; - required_ioport m_address; - output_finder<4> m_leds; - - void c2040_fdc_mem(address_map &map) ATTR_COLD; - void c2040_main_mem(address_map &map) ATTR_COLD; - - // IEEE-488 bus - int m_rfdo; // not ready for data output - int m_daco; // not data accepted output - int m_atna; // attention acknowledge - int m_ifc; -}; - - -// ======================> c3040_device - -class c3040_device : public c2040_device -{ -public: - // construction/destruction - c3040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - -private: - static void floppy_formats(format_registration &fr); -}; - - -// ======================> c4040_device - -class c4040_device : public c2040_device -{ -public: - // construction/destruction - c4040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - -private: - static void floppy_formats(format_registration &fr); -}; - - -// device type definition -DECLARE_DEVICE_TYPE(C2040, c2040_device) -DECLARE_DEVICE_TYPE(C3040, c3040_device) -DECLARE_DEVICE_TYPE(C4040, c4040_device) +DECLARE_DEVICE_TYPE(GPIB_C2040, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_C3040, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_C4040, device_ieee488_interface) #endif // MAME_BUS_IEEE488_C2040_H diff --git a/src/devices/bus/ieee488/c2040fdc.h b/src/devices/bus/ieee488/c2040fdc.h index f86a7f4811f..9864833dfb6 100644 --- a/src/devices/bus/ieee488/c2040fdc.h +++ b/src/devices/bus/ieee488/c2040fdc.h @@ -51,25 +51,15 @@ public: void set_floppy(floppy_image_device *floppy0, floppy_image_device *floppy1); protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_clock_changed() override; - virtual void device_reset() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - - TIMER_CALLBACK_MEMBER(update_state); - - void stp_w(floppy_image_device *floppy, int mtr, int &old_stp, int stp); - - enum { + enum + { IDLE, RUNNING, RUNNING_SYNCPOINT }; - struct live_info { + struct live_info + { attotime tm; int state, next_state; int sync; @@ -96,6 +86,32 @@ protected: int write_position; }; + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_clock_changed() override; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + + TIMER_CALLBACK_MEMBER(update_state); + + void stp_w(floppy_image_device *floppy, int mtr, int &old_stp, int stp); + + floppy_image_device* get_floppy(); + + void live_start(); + void checkpoint(); + void rollback(); + bool write_next_bit(bool bit, const attotime &limit); + void start_writing(const attotime &tm); + void commit(const attotime &tm); + void stop_writing(const attotime &tm); + void live_delay(int state); + void live_sync(); + void live_abort(); + void live_run(const attotime &limit = attotime::never); + void get_next_edge(const attotime &when); + int get_next_bit(attotime &tm, const attotime &limit); + devcb_write_line m_write_sync; devcb_write_line m_write_ready; devcb_write_line m_write_error; @@ -122,26 +138,10 @@ protected: live_info cur_live, checkpoint_live; emu_timer *t_gen; - - floppy_image_device* get_floppy(); - - void live_start(); - void checkpoint(); - void rollback(); - bool write_next_bit(bool bit, const attotime &limit); - void start_writing(const attotime &tm); - void commit(const attotime &tm); - void stop_writing(const attotime &tm); - void live_delay(int state); - void live_sync(); - void live_abort(); - void live_run(const attotime &limit = attotime::never); - void get_next_edge(const attotime &when); - int get_next_bit(attotime &tm, const attotime &limit); }; -// device type definition +// device type declaration DECLARE_DEVICE_TYPE(C2040_FDC, c2040_fdc_device) #endif // MAME_BUS_IEEE488_C2040FDC_H diff --git a/src/devices/bus/ieee488/c8050.cpp b/src/devices/bus/ieee488/c8050.cpp index 94ceb0e59f1..f624539be5e 100644 --- a/src/devices/bus/ieee488/c8050.cpp +++ b/src/devices/bus/ieee488/c8050.cpp @@ -25,18 +25,25 @@ #include "emu.h" #include "c8050.h" +#include "c8050fdc.h" + +#include "cpu/m6502/m6502.h" +#include "cpu/m6502/m6504.h" +#include "machine/6522via.h" +#include "machine/mos6530.h" + #include "formats/d80_dsk.h" #include "formats/d82_dsk.h" +namespace { + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** #define M6502_TAG "un1" -#define M6532_0_TAG "uc1" -#define M6532_1_TAG "ue1" #define M6504_TAG "uh3" #define M6530_TAG "uk3" #define FDC_TAG "fdc" @@ -53,13 +60,121 @@ enum //************************************************************************** -// DEVICE DEFINITIONS +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(C8050, c8050_device, "c8050", "Commodore 8050") -DEFINE_DEVICE_TYPE(C8250, c8250_device, "c8250", "Commodore 8250") -DEFINE_DEVICE_TYPE(C8250LP, c8250lp_device, "c8250lp", "Commodore 8250LP") -DEFINE_DEVICE_TYPE(SFD1001, sfd1001_device, "sfd1001", "Commodore SFD-1001") +// ======================> c8050_device + +class c8050_device : public device_t, public device_ieee488_interface +{ +public: + // construction/destruction + c8050_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + c8050_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + // device_ieee488_interface implementation + virtual void ieee488_atn(int state) override; + virtual void ieee488_ifc(int state) override; + + void add_common_devices(machine_config &config); + inline void update_ieee_signals(); + + uint8_t dio_r() { return m_bus->dio_r(); }; + void dio_w(uint8_t data) { m_bus->dio_w(this, data); }; + uint8_t riot1_pa_r(); + void riot1_pa_w(uint8_t data); + uint8_t riot1_pb_r(); + void riot1_pb_w(uint8_t data); + void via_pb_w(uint8_t data); + + required_device<m6502_device> m_maincpu; + required_device<m6504_device> m_fdccpu; + required_device<mos6532_device> m_riot0; + required_device<mos6532_device> m_riot1; + required_device<mos6530_device> m_miot; + required_device<via6522_device> m_via; + required_device<floppy_connector> m_floppy0; + optional_device<floppy_connector> m_floppy1; + required_device<c8050_fdc_device> m_fdc; + required_ioport m_address; + output_finder<4> m_leds; + + void c8050_fdc_mem(address_map &map) ATTR_COLD; + void c8050_main_mem(address_map &map) ATTR_COLD; + void c8250lp_fdc_mem(address_map &map) ATTR_COLD; + void sfd1001_fdc_mem(address_map &map) ATTR_COLD; + + // IEEE-488 bus + int m_rfdo; // not ready for data output + int m_daco; // not data accepted output + int m_atna; // attention acknowledge + int m_ifc; + +private: + static void floppy_formats(format_registration &fr); +}; + + +// ======================> c8250_device + +class c8250_device : public c8050_device +{ +public: + // construction/destruction + c8250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + static void floppy_formats(format_registration &fr); +}; + + +// ======================> c8250lp_device + +class c8250lp_device : public c8050_device +{ +public: + // construction/destruction + c8250lp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + static void floppy_formats(format_registration &fr); +}; + + +// ======================> sfd1001_device + +class sfd1001_device : public c8050_device +{ +public: + // construction/destruction + sfd1001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + static void floppy_formats(format_registration &fr); +}; //------------------------------------------------- @@ -200,10 +315,10 @@ const tiny_rom_entry *sfd1001_device::device_rom_region() const void c8050_device::c8050_main_mem(address_map &map) { - map(0x0000, 0x007f).mirror(0x0100).m(M6532_0_TAG, FUNC(mos6532_device::ram_map)); - map(0x0080, 0x00ff).mirror(0x0100).m(M6532_1_TAG, FUNC(mos6532_device::ram_map)); - map(0x0200, 0x021f).mirror(0x0d60).m(M6532_0_TAG, FUNC(mos6532_device::io_map)); - map(0x0280, 0x029f).mirror(0x0d60).m(M6532_1_TAG, FUNC(mos6532_device::io_map)); + map(0x0000, 0x007f).mirror(0x0100).m(m_riot0, FUNC(mos6532_device::ram_map)); + map(0x0080, 0x00ff).mirror(0x0100).m(m_riot1, FUNC(mos6532_device::ram_map)); + map(0x0200, 0x021f).mirror(0x0d60).m(m_riot0, FUNC(mos6532_device::io_map)); + map(0x0280, 0x029f).mirror(0x0d60).m(m_riot1, FUNC(mos6532_device::io_map)); map(0x1000, 0x13ff).mirror(0x0c00).ram().share("share1"); map(0x2000, 0x23ff).mirror(0x0c00).ram().share("share2"); map(0x3000, 0x33ff).mirror(0x0c00).ram().share("share3"); @@ -653,8 +768,8 @@ c8050_device::c8050_device(const machine_config &mconfig, device_type type, cons device_ieee488_interface(mconfig, *this), m_maincpu(*this, M6502_TAG), m_fdccpu(*this, M6504_TAG), - m_riot0(*this, M6532_0_TAG), - m_riot1(*this, M6532_1_TAG), + m_riot0(*this, "uc1"), + m_riot1(*this, "ue1"), m_miot(*this, M6530_TAG), m_via(*this, "um3"), m_floppy0(*this, FDC_TAG ":0"), @@ -670,7 +785,7 @@ c8050_device::c8050_device(const machine_config &mconfig, device_type type, cons } c8050_device::c8050_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c8050_device(mconfig, C8050, tag, owner, clock) + c8050_device(mconfig, GPIB_C8050, tag, owner, clock) { } @@ -680,7 +795,7 @@ c8050_device::c8050_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- c8250_device::c8250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c8050_device(mconfig, C8250, tag, owner, clock) + c8050_device(mconfig, GPIB_C8250, tag, owner, clock) { } @@ -690,7 +805,7 @@ c8250_device::c8250_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- c8250lp_device::c8250lp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c8050_device(mconfig, C8250LP, tag, owner, clock) + c8050_device(mconfig, GPIB_C8250LP, tag, owner, clock) { } @@ -700,7 +815,7 @@ c8250lp_device::c8250lp_device(const machine_config &mconfig, const char *tag, d //------------------------------------------------- sfd1001_device::sfd1001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - c8050_device(mconfig, SFD1001, tag, owner, clock) + c8050_device(mconfig, GPIB_SFD1001, tag, owner, clock) { } @@ -767,3 +882,16 @@ void c8050_device::ieee488_ifc(int state) m_ifc = state; } + +} // anonymous namespace + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C8050, device_ieee488_interface, c8050_device, "c8050", "Commodore 8050 disk drive") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C8250, device_ieee488_interface, c8250_device, "c8250", "Commodore 8250 disk drive") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C8250LP, device_ieee488_interface, c8250lp_device, "c8250lp", "Commodore 8250LP disk drive") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_SFD1001, device_ieee488_interface, sfd1001_device, "sfd1001", "Commodore SFD-1001 disk drive") diff --git a/src/devices/bus/ieee488/c8050.h b/src/devices/bus/ieee488/c8050.h index 36dc02aa204..24eba5c69c8 100644 --- a/src/devices/bus/ieee488/c8050.h +++ b/src/devices/bus/ieee488/c8050.h @@ -12,139 +12,13 @@ #pragma once #include "ieee488.h" -#include "c8050fdc.h" -#include "cpu/m6502/m6502.h" -#include "cpu/m6502/m6504.h" -#include "machine/6522via.h" -#include "machine/mos6530.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> c8050_device - -class c8050_device : public device_t, public device_ieee488_interface -{ -public: - // construction/destruction - c8050_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - c8050_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_atn(int state) override; - virtual void ieee488_ifc(int state) override; - - void add_common_devices(machine_config &config); - inline void update_ieee_signals(); - - uint8_t dio_r() { return m_bus->dio_r(); }; - void dio_w(uint8_t data) { m_bus->dio_w(this, data); }; - uint8_t riot1_pa_r(); - void riot1_pa_w(uint8_t data); - uint8_t riot1_pb_r(); - void riot1_pb_w(uint8_t data); - void via_pb_w(uint8_t data); - - required_device<m6502_device> m_maincpu; - required_device<m6504_device> m_fdccpu; - required_device<mos6532_device> m_riot0; - required_device<mos6532_device> m_riot1; - required_device<mos6530_device> m_miot; - required_device<via6522_device> m_via; - required_device<floppy_connector> m_floppy0; - optional_device<floppy_connector> m_floppy1; - required_device<c8050_fdc_device> m_fdc; - required_ioport m_address; - output_finder<4> m_leds; - - void c8050_fdc_mem(address_map &map) ATTR_COLD; - void c8050_main_mem(address_map &map) ATTR_COLD; - void c8250lp_fdc_mem(address_map &map) ATTR_COLD; - void sfd1001_fdc_mem(address_map &map) ATTR_COLD; - - // IEEE-488 bus - int m_rfdo; // not ready for data output - int m_daco; // not data accepted output - int m_atna; // attention acknowledge - int m_ifc; - -private: - static void floppy_formats(format_registration &fr); -}; - - -// ======================> c8250_device - -class c8250_device : public c8050_device -{ -public: - // construction/destruction - c8250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // optional information overrides - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - -private: - static void floppy_formats(format_registration &fr); -}; - - -// ======================> c8250lp_device - -class c8250lp_device : public c8050_device -{ -public: - // construction/destruction - c8250lp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - -private: - static void floppy_formats(format_registration &fr); -}; - - -// ======================> sfd1001_device - -class sfd1001_device : public c8050_device -{ -public: - // construction/destruction - sfd1001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - -private: - static void floppy_formats(format_registration &fr); -}; - - -// device type definition -DECLARE_DEVICE_TYPE(C8050, c8050_device) -DECLARE_DEVICE_TYPE(C8250, c8250_device) -DECLARE_DEVICE_TYPE(C8250LP, c8250lp_device) -DECLARE_DEVICE_TYPE(SFD1001, sfd1001_device) +DECLARE_DEVICE_TYPE(GPIB_C8050, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_C8250, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_C8250LP, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_SFD1001, device_ieee488_interface) #endif // MAME_BUS_IEEE488_C8050_H diff --git a/src/devices/bus/ieee488/c8050fdc.h b/src/devices/bus/ieee488/c8050fdc.h index d736d61dc44..ddd2d5a3d34 100644 --- a/src/devices/bus/ieee488/c8050fdc.h +++ b/src/devices/bus/ieee488/c8050fdc.h @@ -55,24 +55,15 @@ public: void set_floppy(floppy_connector *floppy0, floppy_connector *floppy1); protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - - TIMER_CALLBACK_MEMBER(update_state); - - void stp_w(floppy_image_device *floppy, int mtr, int &old_stp, int stp); - - enum { + enum + { IDLE, RUNNING, RUNNING_SYNCPOINT }; - struct live_info { + struct live_info + { attotime tm; int state, next_state; int sync; @@ -95,6 +86,33 @@ protected: uint16_t shift_reg_write; }; + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + + TIMER_CALLBACK_MEMBER(update_state); + + void stp_w(floppy_image_device *floppy, int mtr, int &old_stp, int stp); + + floppy_image_device* get_floppy(); + + void live_start(); + void checkpoint(); + void rollback(); + void pll_reset(const attotime &when); + void pll_start_writing(const attotime &tm); + void pll_commit(floppy_image_device *floppy, const attotime &tm); + void pll_stop_writing(floppy_image_device *floppy, const attotime &tm); + int pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit); + bool pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit); + void pll_save_checkpoint(); + void pll_retrieve_checkpoint(); + void live_delay(int state); + void live_sync(); + void live_abort(); + void live_run(const attotime &limit = attotime::never); + devcb_write_line m_write_sync; devcb_write_line m_write_ready; devcb_write_line m_write_brdy; @@ -121,28 +139,10 @@ protected: live_info cur_live, checkpoint_live; fdc_pll_t cur_pll, checkpoint_pll; emu_timer *t_gen; - - floppy_image_device* get_floppy(); - - void live_start(); - void checkpoint(); - void rollback(); - void pll_reset(const attotime &when); - void pll_start_writing(const attotime &tm); - void pll_commit(floppy_image_device *floppy, const attotime &tm); - void pll_stop_writing(floppy_image_device *floppy, const attotime &tm); - int pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit); - bool pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit); - void pll_save_checkpoint(); - void pll_retrieve_checkpoint(); - void live_delay(int state); - void live_sync(); - void live_abort(); - void live_run(const attotime &limit = attotime::never); }; -// device type definition +// device type declaration DECLARE_DEVICE_TYPE(C8050_FDC, c8050_fdc_device) #endif // MAME_BUS_IEEE488_C8050FDC_H diff --git a/src/devices/bus/ieee488/c8280.cpp b/src/devices/bus/ieee488/c8280.cpp index ba90235d30c..6a3ebd6cc9d 100644 --- a/src/devices/bus/ieee488/c8280.cpp +++ b/src/devices/bus/ieee488/c8280.cpp @@ -10,10 +10,15 @@ #include "c8280.h" #include "cpu/m6502/m6502.h" +#include "imagedev/floppy.h" +#include "machine/mos6530.h" +#include "machine/wd_fdc.h" + #include "formats/c8280_dsk.h" +namespace { //************************************************************************** // MACROS / CONSTANTS @@ -21,8 +26,6 @@ #define M6502_DOS_TAG "5c" #define M6502_FDC_TAG "9e" -#define M6532_0_TAG "9f" -#define M6532_1_TAG "9g" #define WD1797_TAG "5e" @@ -37,10 +40,64 @@ enum //************************************************************************** -// DEVICE DEFINITIONS +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(C8280, c8280_device, "c8280", "Commodore 8280") +// ======================> c8280_device + +class c8280_device : public device_t, public device_ieee488_interface +{ +public: + // construction/destruction + c8280_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + // device_ieee488_interface implementation + void ieee488_atn(int state) override; + void ieee488_ifc(int state) override; + +private: + inline void update_ieee_signals(); + + uint8_t dio_r(); + void dio_w(uint8_t data); + uint8_t riot1_pa_r(); + void riot1_pa_w(uint8_t data); + uint8_t riot1_pb_r(); + void riot1_pb_w(uint8_t data); + uint8_t fk5_r(); + void fk5_w(uint8_t data); + + void c8280_fdc_mem(address_map &map) ATTR_COLD; + void c8280_main_mem(address_map &map) ATTR_COLD; + + static void floppy_formats(format_registration &fr); + + required_device<cpu_device> m_maincpu; + required_device<cpu_device> m_fdccpu; + required_device<mos6532_device> m_riot0; + required_device<mos6532_device> m_riot1; + required_device<fd1797_device> m_fdc; + required_device_array<floppy_connector, 2> m_floppy; + required_ioport m_address; + floppy_image_device *m_selected_floppy; + output_finder<4> m_leds; + + // IEEE-488 bus + int m_rfdo; // not ready for data output + int m_daco; // not data accepted output + int m_atna; // attention acknowledge + int m_ifc; + + uint8_t m_fk5; +}; //------------------------------------------------- @@ -80,10 +137,10 @@ const tiny_rom_entry *c8280_device::device_rom_region() const void c8280_device::c8280_main_mem(address_map &map) { - map(0x0000, 0x007f).mirror(0x100).m(M6532_0_TAG, FUNC(mos6532_device::ram_map)); - map(0x0080, 0x00ff).mirror(0x100).m(M6532_1_TAG, FUNC(mos6532_device::ram_map)); - map(0x0200, 0x021f).mirror(0xd60).m(M6532_0_TAG, FUNC(mos6532_device::io_map)); - map(0x0280, 0x029f).mirror(0xd60).m(M6532_1_TAG, FUNC(mos6532_device::io_map)); + map(0x0000, 0x007f).mirror(0x100).m(m_riot0, FUNC(mos6532_device::ram_map)); + map(0x0080, 0x00ff).mirror(0x100).m(m_riot1, FUNC(mos6532_device::ram_map)); + map(0x0200, 0x021f).mirror(0xd60).m(m_riot0, FUNC(mos6532_device::io_map)); + map(0x0280, 0x029f).mirror(0xd60).m(m_riot1, FUNC(mos6532_device::io_map)); map(0x1000, 0x13ff).mirror(0xc00).ram().share("share1"); map(0x2000, 0x23ff).mirror(0xc00).ram().share("share2"); map(0x3000, 0x33ff).mirror(0xc00).ram().share("share3"); @@ -100,7 +157,7 @@ void c8280_device::c8280_fdc_mem(address_map &map) { map.global_mask(0x1fff); map(0x0000, 0x007f).mirror(0x300).ram(); - map(0x0080, 0x0083).mirror(0x37c).rw(WD1797_TAG, FUNC(fd1797_device::read), FUNC(fd1797_device::write)); + map(0x0080, 0x0083).mirror(0x37c).rw(m_fdc, FUNC(fd1797_device::read), FUNC(fd1797_device::write)); map(0x0400, 0x07ff).ram().share("share1"); map(0x0800, 0x0bff).ram().share("share2"); map(0x0c00, 0x0fff).ram().share("share3"); @@ -385,12 +442,12 @@ inline void c8280_device::update_ieee_signals() //------------------------------------------------- c8280_device::c8280_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, C8280, tag, owner, clock), + device_t(mconfig, GPIB_C8280, tag, owner, clock), device_ieee488_interface(mconfig, *this), m_maincpu(*this, M6502_DOS_TAG), m_fdccpu(*this, M6502_FDC_TAG), - m_riot0(*this, M6532_0_TAG), - m_riot1(*this, M6532_1_TAG), + m_riot0(*this, "9f"), + m_riot1(*this, "9g"), m_fdc(*this, WD1797_TAG), m_floppy(*this, WD1797_TAG ":%u", 0U), m_address(*this, "ADDRESS"), @@ -533,3 +590,12 @@ void c8280_device::fk5_w(uint8_t data) // density select m_fdc->dden_w(BIT(data, 2)); } + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_C8280, device_ieee488_interface, c8280_device, "c8280", "Commodore 8280 dual 8\" disk drive") diff --git a/src/devices/bus/ieee488/c8280.h b/src/devices/bus/ieee488/c8280.h index f5a1342f857..5de94f93b37 100644 --- a/src/devices/bus/ieee488/c8280.h +++ b/src/devices/bus/ieee488/c8280.h @@ -12,77 +12,10 @@ #pragma once #include "ieee488.h" -#include "imagedev/floppy.h" -#include "machine/mos6530.h" -#include "machine/wd_fdc.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> c8280_device - -class c8280_device : public device_t, public device_ieee488_interface -{ -public: - // construction/destruction - c8280_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - - // device_ieee488_interface overrides - void ieee488_atn(int state) override; - void ieee488_ifc(int state) override; - -private: - inline void update_ieee_signals(); - - uint8_t dio_r(); - void dio_w(uint8_t data); - uint8_t riot1_pa_r(); - void riot1_pa_w(uint8_t data); - uint8_t riot1_pb_r(); - void riot1_pb_w(uint8_t data); - uint8_t fk5_r(); - void fk5_w(uint8_t data); - - void c8280_fdc_mem(address_map &map) ATTR_COLD; - void c8280_main_mem(address_map &map) ATTR_COLD; - - static void floppy_formats(format_registration &fr); - - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_fdccpu; - required_device<mos6532_device> m_riot0; - required_device<mos6532_device> m_riot1; - required_device<fd1797_device> m_fdc; - required_device_array<floppy_connector, 2> m_floppy; - required_ioport m_address; - floppy_image_device *m_selected_floppy; - output_finder<4> m_leds; - - // IEEE-488 bus - int m_rfdo; // not ready for data output - int m_daco; // not data accepted output - int m_atna; // attention acknowledge - int m_ifc; - - uint8_t m_fk5; -}; - - -// device type definition -DECLARE_DEVICE_TYPE(C8280, c8280_device) +DECLARE_DEVICE_TYPE(GPIB_C8280, device_ieee488_interface) #endif // MAME_BUS_IEEE488_C8280_H diff --git a/src/devices/bus/ieee488/d9060.cpp b/src/devices/bus/ieee488/d9060.cpp index 3020fa41f42..097cd0d4a47 100644 --- a/src/devices/bus/ieee488/d9060.cpp +++ b/src/devices/bus/ieee488/d9060.cpp @@ -29,9 +29,16 @@ #include "emu.h" #include "d9060.h" + #include "bus/scsi/d9060hd.h" +#include "bus/scsi/scsi.h" +#include "cpu/m6502/m6502.h" +#include "machine/6522via.h" +#include "machine/mos6530.h" + +namespace { //************************************************************************** // MACROS / CONSTANTS @@ -58,11 +65,94 @@ enum //************************************************************************** -// DEVICE DEFINITIONS +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(D9060, d9060_device, "d9060", "Commodore D9060") -DEFINE_DEVICE_TYPE(D9090, d9090_device, "d9090", "Commodore D9090") + +// ======================> d9060_device_base + +class d9060_device_base : public device_t, public device_ieee488_interface +{ +protected: + enum + { + TYPE_9060, + TYPE_9090 + }; + + // construction/destruction + d9060_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); + + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + // device_ieee488_interface implementation + void ieee488_atn(int state) override; + void ieee488_ifc(int state) override; + +private: + inline void update_ieee_signals(); + + uint8_t dio_r(); + void dio_w(uint8_t data); + uint8_t riot1_pa_r(); + void riot1_pa_w(uint8_t data); + uint8_t riot1_pb_r(); + void riot1_pb_w(uint8_t data); + void via_pb_w(uint8_t data); + void ack_w(int state); + void enable_w(int state); + void scsi_data_w(uint8_t data); + + void hdc_mem(address_map &map) ATTR_COLD; + void main_mem(address_map &map) ATTR_COLD; + + required_device<m6502_device> m_maincpu; + required_device<m6502_device> m_hdccpu; + required_device<mos6532_device> m_riot0; + required_device<mos6532_device> m_riot1; + required_device<via6522_device> m_via; + required_device<scsi_port_device> m_sasibus; + required_device<output_latch_device> m_sasi_data_out; + required_ioport m_address; + output_finder<3> m_leds; + + // IEEE-488 bus + int m_rfdo; // not ready for data output + int m_daco; // not data accepted output + int m_atna; // attention acknowledge + int m_ifc; + + // SASI bus + int m_enable; + uint8_t m_data; + + int m_variant; +}; + + +// ======================> d9060_device + +class d9060_device : public d9060_device_base +{ +public: + // construction/destruction + d9060_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + + +// ======================> d9090_device + +class d9090_device : public d9060_device_base +{ +public: + // construction/destruction + d9090_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; //------------------------------------------------- @@ -497,7 +587,7 @@ d9060_device_base::d9060_device_base(const machine_config &mconfig, device_type //------------------------------------------------- d9060_device::d9060_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : d9060_device_base(mconfig, D9060, tag, owner, clock, TYPE_9060) + : d9060_device_base(mconfig, GPIB_D9060, tag, owner, clock, TYPE_9060) { } @@ -507,7 +597,7 @@ d9060_device::d9060_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- d9090_device::d9090_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : d9060_device_base(mconfig, D9090, tag, owner, clock, TYPE_9090) + : d9060_device_base(mconfig, GPIB_D9090, tag, owner, clock, TYPE_9090) { } @@ -571,3 +661,14 @@ void d9060_device_base::ieee488_ifc(int state) m_ifc = state; } + +} // anonymous namespace + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_D9060, device_ieee488_interface, d9060_device, "d9060", "Commodore D9060 hard disk drive") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_D9090, device_ieee488_interface, d9090_device, "d9090", "Commodore D9090 hard disk drive") diff --git a/src/devices/bus/ieee488/d9060.h b/src/devices/bus/ieee488/d9060.h index 8bf7d32ae6e..a729f512438 100644 --- a/src/devices/bus/ieee488/d9060.h +++ b/src/devices/bus/ieee488/d9060.h @@ -12,107 +12,11 @@ #pragma once #include "ieee488.h" -#include "cpu/m6502/m6502.h" -#include "machine/6522via.h" -#include "machine/mos6530.h" -#include "bus/scsi/scsi.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - - -// ======================> d9060_device_base - -class d9060_device_base : public device_t, public device_ieee488_interface -{ -protected: - enum - { - TYPE_9060, - TYPE_9090 - }; - - // construction/destruction - d9060_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); - - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - - // device_ieee488_interface overrides - void ieee488_atn(int state) override; - void ieee488_ifc(int state) override; - -private: - inline void update_ieee_signals(); - - uint8_t dio_r(); - void dio_w(uint8_t data); - uint8_t riot1_pa_r(); - void riot1_pa_w(uint8_t data); - uint8_t riot1_pb_r(); - void riot1_pb_w(uint8_t data); - void via_pb_w(uint8_t data); - void ack_w(int state); - void enable_w(int state); - void scsi_data_w(uint8_t data); - - required_device<m6502_device> m_maincpu; - required_device<m6502_device> m_hdccpu; - required_device<mos6532_device> m_riot0; - required_device<mos6532_device> m_riot1; - required_device<via6522_device> m_via; - required_device<scsi_port_device> m_sasibus; - required_device<output_latch_device> m_sasi_data_out; - required_ioport m_address; - output_finder<3> m_leds; - - // IEEE-488 bus - int m_rfdo; // not ready for data output - int m_daco; // not data accepted output - int m_atna; // attention acknowledge - int m_ifc; - - // SASI bus - int m_enable; - uint8_t m_data; - - int m_variant; - void hdc_mem(address_map &map) ATTR_COLD; - void main_mem(address_map &map) ATTR_COLD; -}; - - -// ======================> d9060_device - -class d9060_device : public d9060_device_base -{ -public: - // construction/destruction - d9060_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); -}; - - -// ======================> d9090_device - -class d9090_device : public d9060_device_base -{ -public: - // construction/destruction - d9090_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); -}; - - // device type definition -DECLARE_DEVICE_TYPE(D9060, d9060_device) -DECLARE_DEVICE_TYPE(D9090, d9090_device) +DECLARE_DEVICE_TYPE(GPIB_D9060, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_D9090, device_ieee488_interface) #endif // MAME_BUS_IEEE488_D9060_H diff --git a/src/devices/bus/ieee488/grid2102.cpp b/src/devices/bus/ieee488/grid2102.cpp index 8da7c44e8a9..d25288a1e4a 100644 --- a/src/devices/bus/ieee488/grid2102.cpp +++ b/src/devices/bus/ieee488/grid2102.cpp @@ -16,6 +16,137 @@ #include "multibyte.h" #include <algorithm> +#include <array> +#include <queue> +#include <string_view> +#include <vector> + +#define LOG_BYTES_MASK (LOG_GENERAL << 1) +#define LOG_GPIB_STATE_MASK (LOG_GENERAL << 2) + +#define LOG_BYTES(...) LOGMASKED(LOG_BYTES_MASK, __VA_ARGS__) + +#define LOG_GPIB_STATE(...) LOGMASKED(LOG_GPIB_STATE_MASK, __VA_ARGS__) + +#define VERBOSE (LOG_GENERAL) +#include "logmacro.h" + + +namespace { + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> grid210x_device +class grid210x_device : public device_t, + public device_ieee488_interface, + public device_image_interface +{ +public: + struct disk_status + { + uint16_t sector_size; + uint16_t logical_sector_size; + uint16_t sector_count; + uint8_t drive_status; + uint16_t bitmap_fid; + uint16_t superblock_fid; + uint16_t min_dir_pages; + uint8_t flush; + std::string_view name; + uint16_t bytes_per_sector; + uint16_t sectors_per_track; + uint16_t tracks_per_cylinder; + + std::array<uint8_t, 52> serialize() const; + }; + + // construction/destruction + grid210x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int bus_addr, attotime read_delay = attotime::from_msec(5)); + +protected: + // device-level overrides + virtual void device_start() override ATTR_COLD; + + // device_ieee488_interface overrides + virtual void ieee488_eoi(int state) override; + virtual void ieee488_dav(int state) override; + virtual void ieee488_nrfd(int state) override; + virtual void ieee488_ndac(int state) override; + virtual void ieee488_ifc(int state) override; + virtual void ieee488_srq(int state) override; + virtual void ieee488_atn(int state) override; + virtual void ieee488_ren(int state) override; + + // image-level overrides + virtual bool is_readable() const noexcept override { return true; } + virtual bool is_writeable() const noexcept override { return true; } + virtual bool is_creatable() const noexcept override { return false; } + virtual bool is_reset_on_load() const noexcept override { return false; } + virtual const char *file_extensions() const noexcept override { return "img"; } + virtual const char *image_type_name() const noexcept override { return "floppydisk"; } + virtual const char *image_brief_type_name() const noexcept override { return "flop"; } + + void accept_transfer(); + void update_ndac(int atn); + + virtual disk_status get_status() = 0; + +private: + TIMER_CALLBACK_MEMBER(delay_tick); + + int m_gpib_loop_state; + int m_floppy_loop_state; + uint8_t m_last_recv_byte; + int m_last_recv_eoi; + int m_last_recv_atn; + uint8_t m_byte_to_send; + int m_send_eoi; + bool listening, talking, serial_polling; + bool has_srq; + uint8_t serial_poll_byte; + uint32_t floppy_sector_number; + int bus_addr; + std::vector<uint8_t> m_data_buffer; + std::queue<uint8_t> m_output_data_buffer; + uint16_t io_size; + emu_timer *m_delay_timer; + +protected: + attotime read_delay; +}; + +class grid2102_device : public grid210x_device { +public: + // construction/destruction + grid2102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual disk_status get_status() override; +}; + +class grid2101_floppy_device : public grid210x_device { +public: + // construction/destruction + grid2101_floppy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual disk_status get_status() override; +}; + +class grid2101_hdd_device : public grid210x_device { +public: + // construction/destruction + grid2101_hdd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // image-level overrides + virtual const char *image_type_name() const noexcept override { return "harddisk"; } + virtual const char *image_brief_type_name() const noexcept override { return "hard"; } + +protected: + virtual disk_status get_status() override; +}; static const grid210x_device::disk_status fdd_status { @@ -49,31 +180,6 @@ static const grid210x_device::disk_status hdd_status 4, }; -// device type definition -DEFINE_DEVICE_TYPE(GRID2102, grid2102_device, "grid2102", "GRID2102") -DEFINE_DEVICE_TYPE(GRID2101_FLOPPY, grid2101_floppy_device, "grid2101_floppy", "GRID2101_FLOPPY") -DEFINE_DEVICE_TYPE(GRID2101_HDD, grid2101_hdd_device, "grid2101_hdd", "GRID2101_HDD") - -#define LOG_BYTES_MASK (LOG_GENERAL << 1) -#define LOG_BYTES(...) LOGMASKED(LOG_BYTES_MASK, __VA_ARGS__) - -#define LOG_GPIB_STATE_MASK (LOG_GENERAL << 2) -#define LOG_GPIB_STATE(...) LOGMASKED(LOG_GPIB_STATE_MASK, __VA_ARGS__) - -#define VERBOSE (LOG_GENERAL) -#include "logmacro.h" - -#define GRID2102_FETCH32(Array, Offset) ((uint32_t)(\ - (Array[Offset] << 0) |\ - (Array[Offset + 1] << 8) |\ - (Array[Offset + 2] << 16) |\ - (Array[Offset + 3] << 24)\ -)) - -#define GRID2102_FETCH16(Array, Offset) ((uint16_t)(\ - (Array[Offset] << 0) |\ - (Array[Offset + 1] << 8)\ -)) #define GRID2101_HARDDISK_DEV_ADDR 4 #define GRID2102_DEV_ADDR 6 @@ -108,19 +214,19 @@ std::array<uint8_t, 52> grid210x_device::disk_status::serialize() const return out; } -grid210x_device::grid210x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int bus_addr, attotime read_delay) - : device_t(mconfig, type, tag, owner, clock), - device_ieee488_interface(mconfig, *this), - device_image_interface(mconfig, *this), - m_gpib_loop_state(GRID210X_GPIB_STATE_IDLE), - m_floppy_loop_state(GRID210X_STATE_IDLE), - listening(false), - talking(false), - serial_polling(false), - has_srq(false), - serial_poll_byte(0), - bus_addr(bus_addr), - read_delay(read_delay) +grid210x_device::grid210x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int bus_addr, attotime read_delay) : + device_t(mconfig, type, tag, owner, clock), + device_ieee488_interface(mconfig, *this), + device_image_interface(mconfig, *this), + m_gpib_loop_state(GRID210X_GPIB_STATE_IDLE), + m_floppy_loop_state(GRID210X_STATE_IDLE), + listening(false), + talking(false), + serial_polling(false), + has_srq(false), + serial_poll_byte(0), + bus_addr(bus_addr), + read_delay(read_delay) { } @@ -162,7 +268,7 @@ TIMER_CALLBACK_MEMBER(grid210x_device::delay_tick) { return; } - serial_poll_byte = 0x0F; + serial_poll_byte = 0x0f; has_srq = true; m_bus->srq_w(this, 0); m_floppy_loop_state = GRID210X_STATE_IDLE; @@ -174,10 +280,10 @@ void grid210x_device::ieee488_eoi(int state) { void grid210x_device::accept_transfer() { if (m_floppy_loop_state == GRID210X_STATE_IDLE) { - if (m_data_buffer.size() >= 0xA) { + if (m_data_buffer.size() >= 0xa) { uint8_t command = m_data_buffer[0]; - uint32_t sector_number = GRID2102_FETCH32(m_data_buffer, 3); - uint16_t data_size = GRID2102_FETCH16(m_data_buffer, 7); + uint32_t sector_number = get_u32le(&m_data_buffer[3]); + uint16_t data_size = get_u16le(&m_data_buffer[7]); LOG("grid210x_device command %u, data size %u, sector no %u\n", (unsigned)command, (unsigned)data_size, (unsigned)sector_number); (void)(sector_number); if (command == 0x0) { // ddInitialize @@ -204,7 +310,7 @@ void grid210x_device::accept_transfer() { } // else something is wrong, ignore } else if (m_floppy_loop_state == GRID210X_STATE_WRITING_DATA) { // write - if (floppy_sector_number < 0xFFFF) { + if (floppy_sector_number < 0xfffF) { fseek(floppy_sector_number * 512, SEEK_SET); fwrite(m_data_buffer.data(), m_data_buffer.size()); } else { @@ -222,7 +328,7 @@ void grid210x_device::ieee488_dav(int state) { // read data and wait for transfer end int atn = m_bus->atn_r() ^ 1; m_bus->nrfd_w(this, 0); - uint8_t data = m_bus->dio_r() ^ 0xFF; + uint8_t data = m_bus->dio_r() ^ 0xff; int eoi = m_bus->eoi_r() ^ 1; LOG_BYTES("grid210x_device byte recv %02x atn %d eoi %d\n", data, atn, eoi); m_last_recv_byte = data; @@ -238,18 +344,18 @@ void grid210x_device::ieee488_dav(int state) { update_ndac(m_bus->atn_r() ^ 1); if (m_last_recv_atn) { - if ((m_last_recv_byte & 0xE0) == 0x20) { - if ((m_last_recv_byte & 0x1F) == bus_addr) { + if ((m_last_recv_byte & 0xe0) == 0x20) { + if ((m_last_recv_byte & 0x1f) == bus_addr) { // dev-id = 5 listening = true; LOG_GPIB_STATE("grid210x_device now listening\n"); - } else if((m_last_recv_byte & 0x1F) == 0x1F) { + } else if((m_last_recv_byte & 0x1f) == 0x1f) { // reset listen listening = false; LOG_GPIB_STATE("grid210x_device now not listening\n"); } - } else if ((m_last_recv_byte & 0xE0) == 0x40) { - if ((m_last_recv_byte & 0x1F) == bus_addr) { + } else if ((m_last_recv_byte & 0xe0) == 0x40) { + if ((m_last_recv_byte & 0x1f) == bus_addr) { // dev-id = 5 talking = true; LOG_GPIB_STATE("grid210x_device now talking\n"); @@ -297,7 +403,7 @@ void grid210x_device::ieee488_dav(int state) { void grid210x_device::ieee488_nrfd(int state) { if (state == 1 && m_gpib_loop_state == GRID210X_GPIB_STATE_SEND_DATA_START) { // set dio and assert dav - m_bus->host_dio_w(m_byte_to_send ^ 0xFF); + m_bus->host_dio_w(m_byte_to_send ^ 0xff); m_bus->eoi_w(this, m_send_eoi ^ 1); m_bus->dav_w(this, 0); m_bus->ndac_w(this, 1); @@ -360,18 +466,20 @@ void grid210x_device::ieee488_ren(int state) { LOG("grid210x_device ren state set to %d\n", state); } -grid2101_hdd_device::grid2101_hdd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : grid210x_device(mconfig, GRID2101_HDD, tag, owner, clock, 4, attotime::from_usec(150)) +grid2101_hdd_device::grid2101_hdd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + grid210x_device(mconfig, GPIB_GRID2101_HDD, tag, owner, clock, 4, attotime::from_usec(150)) { } -grid2101_floppy_device::grid2101_floppy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : grid210x_device(mconfig, GRID2101_FLOPPY, tag, owner, clock, 5) +grid2101_floppy_device::grid2101_floppy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + grid210x_device(mconfig, GPIB_GRID2101_FLOPPY, tag, owner, clock, 5) { } -grid2102_device::grid2102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : grid210x_device(mconfig, GRID2102, tag, owner, clock, 6) +grid2102_device::grid2102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + grid210x_device(mconfig, GPIB_GRID2102, tag, owner, clock, 6) { } @@ -401,3 +509,11 @@ grid210x_device::disk_status grid2102_device::get_status() { return fdd_status; } + +} // anonymous namespace + + +// device type definition +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_GRID2102, device_ieee488_interface, grid2102_device, "grid2102", "GRID2102") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_GRID2101_FLOPPY, device_ieee488_interface, grid2101_floppy_device, "grid2101_floppy", "GRID2101_FLOPPY") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_GRID2101_HDD, device_ieee488_interface, grid2101_hdd_device, "grid2101_hdd", "GRID2101_HDD") diff --git a/src/devices/bus/ieee488/grid2102.h b/src/devices/bus/ieee488/grid2102.h index 6f0dc2b6364..dee1145d2ac 100644 --- a/src/devices/bus/ieee488/grid2102.h +++ b/src/devices/bus/ieee488/grid2102.h @@ -13,129 +13,9 @@ #include "ieee488.h" -#include <array> -#include <queue> -#include <string_view> -#include <vector> - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> grid210x_device -class grid210x_device : public device_t, - public device_ieee488_interface, - public device_image_interface -{ -public: - struct disk_status - { - uint16_t sector_size; - uint16_t logical_sector_size; - uint16_t sector_count; - uint8_t drive_status; - uint16_t bitmap_fid; - uint16_t superblock_fid; - uint16_t min_dir_pages; - uint8_t flush; - std::string_view name; - uint16_t bytes_per_sector; - uint16_t sectors_per_track; - uint16_t tracks_per_cylinder; - - std::array<uint8_t, 52> serialize() const; - }; - - // construction/destruction - grid210x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int bus_addr, attotime read_delay = attotime::from_msec(5)); - -protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_eoi(int state) override; - virtual void ieee488_dav(int state) override; - virtual void ieee488_nrfd(int state) override; - virtual void ieee488_ndac(int state) override; - virtual void ieee488_ifc(int state) override; - virtual void ieee488_srq(int state) override; - virtual void ieee488_atn(int state) override; - virtual void ieee488_ren(int state) override; - - // image-level overrides - virtual bool is_readable() const noexcept override { return true; } - virtual bool is_writeable() const noexcept override { return true; } - virtual bool is_creatable() const noexcept override { return false; } - virtual bool is_reset_on_load() const noexcept override { return false; } - virtual const char *file_extensions() const noexcept override { return "img"; } - virtual const char *image_type_name() const noexcept override { return "floppydisk"; } - virtual const char *image_brief_type_name() const noexcept override { return "flop"; } - - void accept_transfer(); - void update_ndac(int atn); - - virtual disk_status get_status() = 0; - -private: - TIMER_CALLBACK_MEMBER(delay_tick); - - int m_gpib_loop_state; - int m_floppy_loop_state; - uint8_t m_last_recv_byte; - int m_last_recv_eoi; - int m_last_recv_atn; - uint8_t m_byte_to_send; - int m_send_eoi; - bool listening, talking, serial_polling; - bool has_srq; - uint8_t serial_poll_byte; - uint32_t floppy_sector_number; - int bus_addr; - std::vector<uint8_t> m_data_buffer; - std::queue<uint8_t> m_output_data_buffer; - uint16_t io_size; - emu_timer *m_delay_timer; - -protected: - attotime read_delay; -}; - -class grid2102_device : public grid210x_device { -public: - // construction/destruction - grid2102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - virtual disk_status get_status() override; -}; - -class grid2101_floppy_device : public grid210x_device { -public: - // construction/destruction - grid2101_floppy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - virtual disk_status get_status() override; -}; - -class grid2101_hdd_device : public grid210x_device { -public: - // construction/destruction - grid2101_hdd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - // image-level overrides - virtual const char *image_type_name() const noexcept override { return "harddisk"; } - virtual const char *image_brief_type_name() const noexcept override { return "hard"; } - -protected: - virtual disk_status get_status() override; -}; - -// device type definition -DECLARE_DEVICE_TYPE(GRID2102, grid2102_device) -DECLARE_DEVICE_TYPE(GRID2101_FLOPPY, grid2101_floppy_device) -DECLARE_DEVICE_TYPE(GRID2101_HDD, grid2101_hdd_device) +DECLARE_DEVICE_TYPE(GPIB_GRID2102, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_GRID2101_FLOPPY, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_GRID2101_HDD, device_ieee488_interface) #endif // MAME_BUS_IEEE488_GRID2102_H diff --git a/src/devices/bus/ieee488/hardbox.cpp b/src/devices/bus/ieee488/hardbox.cpp index 0ad2db1abfb..ecaa05a93aa 100644 --- a/src/devices/bus/ieee488/hardbox.cpp +++ b/src/devices/bus/ieee488/hardbox.cpp @@ -41,8 +41,16 @@ #include "emu.h" #include "hardbox.h" +#include "cpu/z80/z80.h" +#include "imagedev/harddriv.h" +#include "machine/corvushd.h" +#include "machine/i8251.h" +#include "machine/i8255.h" + +namespace { + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** @@ -50,15 +58,59 @@ #define Z80_TAG "z80" #define I8255_0_TAG "ic17" #define I8255_1_TAG "ic16" -#define CORVUS_HDC_TAG "corvus" //************************************************************************** -// DEVICE DEFINITIONS +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(HARDBOX, hardbox_device, "hardbox", "SSE HardBox") +// ======================> hardbox_device + +class hardbox_device : public device_t, + public device_ieee488_interface +{ +public: + // construction/destruction + hardbox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset_after_children() override; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + // device_ieee488_interface implementation + virtual void ieee488_ifc(int state) override; + +private: + enum + { + LED_A = 0, + LED_B, + LED_READY + }; + + uint8_t ppi0_pa_r(); + void ppi0_pb_w(uint8_t data); + uint8_t ppi0_pc_r(); + + uint8_t ppi1_pa_r(); + void ppi1_pb_w(uint8_t data); + uint8_t ppi1_pc_r(); + void ppi1_pc_w(uint8_t data); + + void hardbox_io(address_map &map) ATTR_COLD; + void hardbox_mem(address_map &map) ATTR_COLD; + + required_device<cpu_device> m_maincpu; + required_device<corvus_hdc_device> m_hdc; + output_finder<3> m_leds; + + int m_ifc; // Tracks previous state of IEEE-488 IFC line +}; //------------------------------------------------- @@ -121,7 +173,7 @@ void hardbox_device::hardbox_io(address_map &map) map.global_mask(0xff); map(0x10, 0x13).rw(I8255_0_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x14, 0x17).rw(I8255_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x18, 0x18).rw(CORVUS_HDC_TAG, FUNC(corvus_hdc_device::read), FUNC(corvus_hdc_device::write)); + map(0x18, 0x18).rw(m_hdc, FUNC(corvus_hdc_device::read), FUNC(corvus_hdc_device::write)); } @@ -337,10 +389,10 @@ ioport_constructor hardbox_device::device_input_ports() const //------------------------------------------------- hardbox_device::hardbox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, HARDBOX, tag, owner, clock) + : device_t(mconfig, GPIB_HARDBOX, tag, owner, clock) , device_ieee488_interface(mconfig, *this) , m_maincpu(*this, Z80_TAG) - , m_hdc(*this, CORVUS_HDC_TAG) + , m_hdc(*this, "corvus") , m_leds(*this, "led%u", 0U) , m_ifc(0) { @@ -374,6 +426,7 @@ void hardbox_device::device_reset_after_children() its PC, then the normal map will be restored before the next instruction fetch. Here we just set the PC to 0xe000 after the Z80 resets, which has the same effect. */ + // FIXME: use a memory_view to do this properly m_maincpu->set_state_int(Z80_PC, 0xe000); } @@ -392,3 +445,12 @@ void hardbox_device::ieee488_ifc(int state) m_ifc = state; } + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_HARDBOX, device_ieee488_interface, hardbox_device, "gpib_hardbox", "SSE HardBox") diff --git a/src/devices/bus/ieee488/hardbox.h b/src/devices/bus/ieee488/hardbox.h index 0e1be1ac840..6894f9d98e1 100644 --- a/src/devices/bus/ieee488/hardbox.h +++ b/src/devices/bus/ieee488/hardbox.h @@ -12,69 +12,9 @@ #pragma once #include "ieee488.h" -#include "cpu/z80/z80.h" -#include "machine/i8251.h" -#include "machine/i8255.h" -#include "imagedev/harddriv.h" -#include "machine/corvushd.h" - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> hardbox_device - -class hardbox_device : public device_t, - public device_ieee488_interface -{ -public: - // construction/destruction - hardbox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset_after_children() override; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_ifc(int state) override; - -private: - uint8_t ppi0_pa_r(); - void ppi0_pb_w(uint8_t data); - uint8_t ppi0_pc_r(); - - uint8_t ppi1_pa_r(); - void ppi1_pb_w(uint8_t data); - uint8_t ppi1_pc_r(); - void ppi1_pc_w(uint8_t data); - - void hardbox_io(address_map &map) ATTR_COLD; - void hardbox_mem(address_map &map) ATTR_COLD; - - enum - { - LED_A = 0, - LED_B, - LED_READY - }; - - required_device<cpu_device> m_maincpu; - required_device<corvus_hdc_device> m_hdc; - output_finder<3> m_leds; - - int m_ifc; // Tracks previous state of IEEE-488 IFC line -}; - -// device type definition -DECLARE_DEVICE_TYPE(HARDBOX, hardbox_device) +DECLARE_DEVICE_TYPE(GPIB_HARDBOX, device_ieee488_interface) #endif // MAME_BUS_IEEE488_HARDBOX_H diff --git a/src/devices/bus/ieee488/hp9122c.cpp b/src/devices/bus/ieee488/hp9122c.cpp index f533ecb8b11..6331e0e3ba1 100644 --- a/src/devices/bus/ieee488/hp9122c.cpp +++ b/src/devices/bus/ieee488/hp9122c.cpp @@ -10,34 +10,169 @@ #include "emu.h" #include "hp9122c.h" + +#include "cpu/m6809/m6809.h" #include "cpu/m6809/m6809.h" +#include "imagedev/floppy.h" +#include "machine/fdc_pll.h" #include "machine/i8291a.h" +#include "machine/i8291a.h" +#include "machine/wd_fdc.h" #include "machine/wd_fdc.h" + #include "formats/flopimg.h" + #include "hp9122c.lh" -DEFINE_DEVICE_TYPE(HP9122C, hp9122c_device, "hp9122c", "HP9122C Dual High density disk drive") - -hp9122c_device::hp9122c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t{mconfig, HP9122C, tag, owner, clock}, - device_ieee488_interface{mconfig, *this}, - m_cpu{*this , "cpu"}, - m_i8291a{*this, "i8291a"}, - m_fdc{*this, "mb8876"}, - m_floppy{*this, "floppy%u", 0}, - m_hpib_addr{*this , "ADDRESS"}, - m_testmode{*this, "TESTMODE"}, - m_leds{*this, "led%d", 0U}, - m_intsel{3}, - m_fdc_irq{false}, - m_i8291a_irq{false}, - m_fdc_drq{false}, - m_i8291a_drq{false}, - m_cpuirq{false}, - m_cpufirq{false}, - m_index_int{false}, - m_ds0{false}, - m_ds1{false} +namespace { + +class hp9122c_device : public device_t, + public device_ieee488_interface +{ +public: + // construction/destruction + hp9122c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + + // device_ieee488_interface implementation + virtual void ieee488_eoi(int state) override; + virtual void ieee488_dav(int state) override; + virtual void ieee488_nrfd(int state) override; + virtual void ieee488_ndac(int state) override; + virtual void ieee488_ifc(int state) override; + virtual void ieee488_srq(int state) override; + virtual void ieee488_atn(int state) override; + virtual void ieee488_ren(int state) override; + +private: + + + /* Control register bits: + * 0 - Head select + * 1 - unused + * 2 - FDC Clock selector - 0 - 1Mhz, 1 - 2Mhz + * 3 - IntSel1 + * 4 - DS1# + * 5 - DS0# + * 6 - LED + * 7 - IntSel0 + * + * Intsel: + * * - FIRQ IRQ + * 0 - FDCIRQ FDCOrg + * 1 - HPIBINT HPIBDReq + * 2 - GND IndexInt + * 3 - GND GND + */ + + constexpr static int REG_CNTL_HEADSEL = 1 << 0; + constexpr static int REG_CNTL_CLOCK_SEL = 1 << 2; + constexpr static int REG_CNTL_INTSEL1 = 1 << 3; + constexpr static int REG_CNTL_DS1 = 1 << 4; + constexpr static int REG_CNTL_DS0 = 1 << 5; + constexpr static int REG_CNTL_LED = 1 << 6; + constexpr static int REG_CNTL_INTSEL0 = 1 << 7; + + /* Status register bits: + * 0 - Addr0 + * 1 - Addr1 + * 2 - Addr2 + * 3 - Dual(H)/Single(L) + * 4 - T(L) + * 5 - Diskchg# + * 6 - Addr3 + * 7 - density indicatior: H - DD, L - HD + */ + + static constexpr int REG_STATUS_DUAL = 1 << 3; + static constexpr int REG_STATUS_TEST = 1 << 4; + static constexpr int REG_STATUS_DISKCHG = 1 << 5; + static constexpr int REG_STATUS_LOW_DENSITY = 1 << 7; + + void i8291a_eoi_w(int state); + void i8291a_dav_w(int state); + void i8291a_nrfd_w(int state); + void i8291a_ndac_w(int state); + void i8291a_ifc_w(int state); + void i8291a_srq_w(int state); + void i8291a_atn_w(int state); + void i8291a_ren_w(int state); + + uint8_t i8291a_dio_r(); + void i8291a_dio_w(uint8_t data); + + void i8291a_int_w(int state); + void i8291a_dreq_w(int state); + + void fdc_intrq_w(int state); + void fdc_drq_w(int state); + + void cmd_w(uint8_t data); + uint8_t status_r(); + void clridx_w(uint8_t data); + + void cpu_map(address_map &map) ATTR_COLD; + + void index_pulse_cb(floppy_image_device *floppy, int state); + void update_intsel(void); + + TIMER_CALLBACK_MEMBER(motor_timeout); + + required_device<cpu_device> m_cpu; + required_device<i8291a_device> m_i8291a; + required_device<mb8876_device> m_fdc; + required_device_array<floppy_connector, 2> m_floppy; + + required_ioport m_hpib_addr; + required_ioport m_testmode; + + output_finder<3> m_leds; + + int m_intsel; + + bool m_fdc_irq; + bool m_i8291a_irq; + bool m_fdc_drq; + bool m_i8291a_drq; + + bool m_cpuirq; + bool m_cpufirq; + + bool m_index_int; + + bool m_ds0; + bool m_ds1; + + emu_timer *m_motor_timer; +}; + +hp9122c_device::hp9122c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t{mconfig, GPIB_HP9122C, tag, owner, clock}, + device_ieee488_interface{mconfig, *this}, + m_cpu{*this , "cpu"}, + m_i8291a{*this, "i8291a"}, + m_fdc{*this, "mb8876"}, + m_floppy{*this, "floppy%u", 0}, + m_hpib_addr{*this , "ADDRESS"}, + m_testmode{*this, "TESTMODE"}, + m_leds{*this, "led%d", 0U}, + m_intsel{3}, + m_fdc_irq{false}, + m_i8291a_irq{false}, + m_fdc_drq{false}, + m_i8291a_drq{false}, + m_cpuirq{false}, + m_cpufirq{false}, + m_index_int{false}, + m_ds0{false}, + m_ds1{false} { } @@ -398,3 +533,7 @@ void hp9122c_device::device_add_mconfig(machine_config &config) FLOPPY_CONNECTOR(config, "floppy1" , hp9122c_floppies , "35hd" , floppy_image_device::default_mfm_floppy_formats, true).enable_sound(true); config.set_default_layout(layout_hp9122c); } + +} // anonymous namespace + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_HP9122C, device_ieee488_interface, hp9122c_device, "hp9122c", "HP9122C Dual High density disk drive") diff --git a/src/devices/bus/ieee488/hp9122c.h b/src/devices/bus/ieee488/hp9122c.h index 08847c8cb6d..1ea502d55fd 100644 --- a/src/devices/bus/ieee488/hp9122c.h +++ b/src/devices/bus/ieee488/hp9122c.h @@ -14,139 +14,7 @@ #pragma once #include "ieee488.h" -#include "cpu/m6809/m6809.h" -#include "machine/i8291a.h" -#include "machine/wd_fdc.h" -#include "imagedev/floppy.h" -#include "machine/fdc_pll.h" -class hp9122c_device : public device_t, - public device_ieee488_interface -{ -public: - // construction/destruction - hp9122c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // device-level overrides - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_eoi(int state) override; - virtual void ieee488_dav(int state) override; - virtual void ieee488_nrfd(int state) override; - virtual void ieee488_ndac(int state) override; - virtual void ieee488_ifc(int state) override; - virtual void ieee488_srq(int state) override; - virtual void ieee488_atn(int state) override; - virtual void ieee488_ren(int state) override; - -private: - - - /* Control register bits: - * 0 - Head select - * 1 - unused - * 2 - FDC Clock selector - 0 - 1Mhz, 1 - 2Mhz - * 3 - IntSel1 - * 4 - DS1# - * 5 - DS0# - * 6 - LED - * 7 - IntSel0 - * - * Intsel: - * * - FIRQ IRQ - * 0 - FDCIRQ FDCOrg - * 1 - HPIBINT HPIBDReq - * 2 - GND IndexInt - * 3 - GND GND - */ - - constexpr static int REG_CNTL_HEADSEL = 1 << 0; - constexpr static int REG_CNTL_CLOCK_SEL = 1 << 2; - constexpr static int REG_CNTL_INTSEL1 = 1 << 3; - constexpr static int REG_CNTL_DS1 = 1 << 4; - constexpr static int REG_CNTL_DS0 = 1 << 5; - constexpr static int REG_CNTL_LED = 1 << 6; - constexpr static int REG_CNTL_INTSEL0 = 1 << 7; - - /* Status register bits: - * 0 - Addr0 - * 1 - Addr1 - * 2 - Addr2 - * 3 - Dual(H)/Single(L) - * 4 - T(L) - * 5 - Diskchg# - * 6 - Addr3 - * 7 - density indicatior: H - DD, L - HD - */ - - constexpr static int REG_STATUS_DUAL = 1 << 3; - constexpr static int REG_STATUS_TEST = 1 << 4; - constexpr static int REG_STATUS_DISKCHG = 1 << 5; - constexpr static int REG_STATUS_LOW_DENSITY = 1 << 7; - - void i8291a_eoi_w(int state); - void i8291a_dav_w(int state); - void i8291a_nrfd_w(int state); - void i8291a_ndac_w(int state); - void i8291a_ifc_w(int state); - void i8291a_srq_w(int state); - void i8291a_atn_w(int state); - void i8291a_ren_w(int state); - - uint8_t i8291a_dio_r(); - void i8291a_dio_w(uint8_t data); - - void i8291a_int_w(int state); - void i8291a_dreq_w(int state); - - void fdc_intrq_w(int state); - void fdc_drq_w(int state); - - void cmd_w(uint8_t data); - uint8_t status_r(); - void clridx_w(uint8_t data); - - void cpu_map(address_map &map) ATTR_COLD; - - required_device<cpu_device> m_cpu; - required_device<i8291a_device> m_i8291a; - required_device<mb8876_device> m_fdc; - required_device_array<floppy_connector, 2> m_floppy; - - required_ioport m_hpib_addr; - required_ioport m_testmode; - - output_finder<3> m_leds; - - void index_pulse_cb(floppy_image_device *floppy, int state); - int m_intsel; - void update_intsel(void); - - bool m_fdc_irq; - bool m_i8291a_irq; - bool m_fdc_drq; - bool m_i8291a_drq; - - bool m_cpuirq; - bool m_cpufirq; - - bool m_index_int; - - bool m_ds0; - bool m_ds1; - - TIMER_CALLBACK_MEMBER(motor_timeout); - emu_timer *m_motor_timer; -}; - -// device type definition -DECLARE_DEVICE_TYPE(HP9122C, hp9122c_device) +DECLARE_DEVICE_TYPE(GPIB_HP9122C, device_ieee488_interface) #endif // MAME_BUS_IEEE488_HP9122C_H diff --git a/src/devices/bus/ieee488/hp9133.cpp b/src/devices/bus/ieee488/hp9133.cpp index c68d5198c38..b9a4ae94e11 100644 --- a/src/devices/bus/ieee488/hp9133.cpp +++ b/src/devices/bus/ieee488/hp9133.cpp @@ -171,7 +171,7 @@ private: }; hp9133_device::hp9133_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t{mconfig, HP9133, tag, owner, clock}, + device_t{mconfig, GPIB_HP9133, tag, owner, clock}, device_ieee488_interface{mconfig, *this}, m_cpu{*this, "cpu"}, m_gpib{*this, "i8291a"}, @@ -876,4 +876,4 @@ const tiny_rom_entry *hp9133_device::device_rom_region() const } // anonymous namespace -DEFINE_DEVICE_TYPE_PRIVATE(HP9133, device_ieee488_interface, hp9133_device, "hp9133", "HP9133 Floppy/Fixed disk drive") +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_HP9133, device_ieee488_interface, hp9133_device, "hp9133", "HP9133 Floppy/Fixed disk drive") diff --git a/src/devices/bus/ieee488/hp9133.h b/src/devices/bus/ieee488/hp9133.h index b137596c004..821e3c25484 100644 --- a/src/devices/bus/ieee488/hp9133.h +++ b/src/devices/bus/ieee488/hp9133.h @@ -13,6 +13,6 @@ #pragma once -DECLARE_DEVICE_TYPE(HP9133, device_ieee488_interface) +DECLARE_DEVICE_TYPE(GPIB_HP9133, device_ieee488_interface) #endif // MAME_BUS_IEEE488_HP9133_H diff --git a/src/devices/bus/ieee488/hp9895.cpp b/src/devices/bus/ieee488/hp9895.cpp index ffc7ae29d70..8d09faddcb1 100644 --- a/src/devices/bus/ieee488/hp9895.cpp +++ b/src/devices/bus/ieee488/hp9895.cpp @@ -56,6 +56,12 @@ #include "emu.h" #include "hp9895.h" + +#include "cpu/z80/z80.h" +#include "imagedev/floppy.h" +#include "machine/fdc_pll.h" +#include "machine/phi.h" + #include "formats/fs_hp98x5.h" #include "formats/hpi_dsk.h" @@ -65,6 +71,9 @@ #define VERBOSE (LOG_LEVEL1) #include "logmacro.h" + +namespace { + // Macros to clear/set single bits #define BIT_MASK(n) (1U << (n)) #define BIT_CLR(w , n) ((w) &= ~BIT_MASK(n)) @@ -124,22 +133,137 @@ #define MIN_SYNC_BITS 29 // Number of bits to synchronize -// device type definition -DEFINE_DEVICE_TYPE(HP9895, hp9895_device, "hp9895", "HP9895") - // Masks of drive selectors in XV register static const uint8_t xv_drive_masks[] = { BIT_MASK(REG_XV_DRIVE0_BIT), BIT_MASK(REG_XV_DRIVE1_BIT) }; -hp9895_device::hp9895_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, HP9895, tag, owner, clock), - device_ieee488_interface(mconfig, *this), - m_cpu(*this , "cpu"), - m_phi(*this , "phi"), - m_drives(*this , "floppy%u" , 0U), - m_switches{*this , "switches"} +class hp9895_device : public device_t, + public device_ieee488_interface +{ +public: + // construction/destruction + hp9895_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + + // device_ieee488_interface implementation + virtual void ieee488_eoi(int state) override; + virtual void ieee488_dav(int state) override; + virtual void ieee488_nrfd(int state) override; + virtual void ieee488_ndac(int state) override; + virtual void ieee488_ifc(int state) override; + virtual void ieee488_srq(int state) override; + virtual void ieee488_atn(int state) override; + virtual void ieee488_ren(int state) override; + +private: + // PHI write CBs + void phi_eoi_w(int state); + void phi_dav_w(int state); + void phi_nrfd_w(int state); + void phi_ndac_w(int state); + void phi_ifc_w(int state); + void phi_srq_w(int state); + void phi_atn_w(int state); + void phi_ren_w(int state); + + // PHI DIO r/w CBs + uint8_t phi_dio_r(); + void phi_dio_w(uint8_t data); + + // PHI IRQ/Z80 NMI + void phi_int_w(int state); + + // Z80 IRQ + void z80_m1_w(uint8_t data); + + // Floppy interface + void data_w(uint8_t data); + void clock_w(uint8_t data); + void reset_w(uint8_t data); + void leds_w(uint8_t data); + void cntl_w(uint8_t data); + void drv_w(uint8_t data); + void xv_w(uint8_t data); + uint8_t data_r(); + uint8_t clock_r(); + uint8_t drivstat_r(); + uint8_t switches_r(); + uint8_t switches2_r(); + + // PHI register read + uint8_t phi_reg_r(offs_t offset); + + // Floppy drive interface + void floppy_ready_cb(floppy_image_device *floppy , int state); + + TIMER_CALLBACK_MEMBER(timeout_timer_tick); + TIMER_CALLBACK_MEMBER(byte_timer_tick); + TIMER_CALLBACK_MEMBER(half_bit_timer_tick); + + uint8_t get_switches2(void) const; + attotime get_half_bit_cell_period(void) const; + floppy_image_device *get_write_device(void) const; + void preset_crc(void); + void update_crc(bool bit); + bool shift_sr(uint8_t& sr , bool input_bit); + void get_next_transition(const attotime& from_when , attotime& edge); + void read_bit(bool crc_upd); + void write_bit(bool data_bit , bool clock_bit); + + void z80_io_map(address_map &map) ATTR_COLD; + void z80_program_map(address_map &map) ATTR_COLD; + + required_device<z80_device> m_cpu; + required_device<phi_device> m_phi; + required_device_array<floppy_connector, 2> m_drives; + required_ioport m_switches; + + bool m_cpu_irq; + floppy_image_device *m_current_drive; + unsigned m_current_drive_idx; + bool m_dskchg[ 2 ]; + uint16_t m_crc; // U77 + bool m_crcerr_syn; + bool m_overrun; + bool m_accdata; + bool m_timeout; + uint8_t m_cntl_reg; // U31 + uint8_t m_clock_sr; // U22 & U4 + uint8_t m_clock_reg; // U23 & U5 + uint8_t m_data_sr; // U24 & U6 + uint8_t m_wr_context; + bool m_had_transition; + bool m_lckup; + bool m_amdt; + uint8_t m_sync_cnt; // U28 & U73 + bool m_hiden; + bool m_mgnena; + + // Timers + emu_timer *m_timeout_timer; + emu_timer *m_byte_timer; + emu_timer *m_half_bit_timer; + + // PLL + fdc_pll_t m_pll; +}; + +hp9895_device::hp9895_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, GPIB_HP9895, tag, owner, clock), + device_ieee488_interface(mconfig, *this), + m_cpu(*this , "cpu"), + m_phi(*this , "phi"), + m_drives(*this , "floppy%u" , 0U), + m_switches{*this , "switches"} { } @@ -895,3 +1019,9 @@ void hp9895_device::device_add_mconfig(machine_config &config) FLOPPY_CONNECTOR(config, "floppy0", hp9895_floppies, "8dsdd", hp9895_floppy_formats).set_fixed(true); FLOPPY_CONNECTOR(config, "floppy1", hp9895_floppies, "8dsdd", hp9895_floppy_formats).set_fixed(true); } + +} // anonymous namespace + + +// device type definition +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_HP9895, device_ieee488_interface, hp9895_device, "hp9895", "HP9895 floppy drive") diff --git a/src/devices/bus/ieee488/hp9895.h b/src/devices/bus/ieee488/hp9895.h index 501b94d185a..6eef72250d6 100644 --- a/src/devices/bus/ieee488/hp9895.h +++ b/src/devices/bus/ieee488/hp9895.h @@ -14,131 +14,8 @@ #pragma once #include "ieee488.h" -#include "cpu/z80/z80.h" -#include "machine/phi.h" -#include "imagedev/floppy.h" -#include "machine/fdc_pll.h" - -class hp9895_device : public device_t, - public device_ieee488_interface -{ -public: - // construction/destruction - hp9895_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // device-level overrides - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_eoi(int state) override; - virtual void ieee488_dav(int state) override; - virtual void ieee488_nrfd(int state) override; - virtual void ieee488_ndac(int state) override; - virtual void ieee488_ifc(int state) override; - virtual void ieee488_srq(int state) override; - virtual void ieee488_atn(int state) override; - virtual void ieee488_ren(int state) override; - -private: - // PHI write CBs - void phi_eoi_w(int state); - void phi_dav_w(int state); - void phi_nrfd_w(int state); - void phi_ndac_w(int state); - void phi_ifc_w(int state); - void phi_srq_w(int state); - void phi_atn_w(int state); - void phi_ren_w(int state); - - // PHI DIO r/w CBs - uint8_t phi_dio_r(); - void phi_dio_w(uint8_t data); - - // PHI IRQ/Z80 NMI - void phi_int_w(int state); - - // Z80 IRQ - void z80_m1_w(uint8_t data); - - // Floppy interface - void data_w(uint8_t data); - void clock_w(uint8_t data); - void reset_w(uint8_t data); - void leds_w(uint8_t data); - void cntl_w(uint8_t data); - void drv_w(uint8_t data); - void xv_w(uint8_t data); - uint8_t data_r(); - uint8_t clock_r(); - uint8_t drivstat_r(); - uint8_t switches_r(); - uint8_t switches2_r(); - - // PHI register read - uint8_t phi_reg_r(offs_t offset); - - // Floppy drive interface - void floppy_ready_cb(floppy_image_device *floppy , int state); - - TIMER_CALLBACK_MEMBER(timeout_timer_tick); - TIMER_CALLBACK_MEMBER(byte_timer_tick); - TIMER_CALLBACK_MEMBER(half_bit_timer_tick); - - uint8_t get_switches2(void) const; - attotime get_half_bit_cell_period(void) const; - floppy_image_device *get_write_device(void) const; - void preset_crc(void); - void update_crc(bool bit); - bool shift_sr(uint8_t& sr , bool input_bit); - void get_next_transition(const attotime& from_when , attotime& edge); - void read_bit(bool crc_upd); - void write_bit(bool data_bit , bool clock_bit); - - void z80_io_map(address_map &map) ATTR_COLD; - void z80_program_map(address_map &map) ATTR_COLD; - - required_device<z80_device> m_cpu; - required_device<phi_device> m_phi; - required_device_array<floppy_connector, 2> m_drives; - required_ioport m_switches; - - bool m_cpu_irq; - floppy_image_device *m_current_drive; - unsigned m_current_drive_idx; - bool m_dskchg[ 2 ]; - uint16_t m_crc; // U77 - bool m_crcerr_syn; - bool m_overrun; - bool m_accdata; - bool m_timeout; - uint8_t m_cntl_reg; // U31 - uint8_t m_clock_sr; // U22 & U4 - uint8_t m_clock_reg; // U23 & U5 - uint8_t m_data_sr; // U24 & U6 - uint8_t m_wr_context; - bool m_had_transition; - bool m_lckup; - bool m_amdt; - uint8_t m_sync_cnt; // U28 & U73 - bool m_hiden; - bool m_mgnena; - - // Timers - emu_timer *m_timeout_timer; - emu_timer *m_byte_timer; - emu_timer *m_half_bit_timer; - - // PLL - fdc_pll_t m_pll; -}; // device type definition -DECLARE_DEVICE_TYPE(HP9895, hp9895_device) +DECLARE_DEVICE_TYPE(GPIB_HP9895, device_ieee488_interface) #endif // MAME_BUS_IEEE488_HP9895_H diff --git a/src/devices/bus/ieee488/ieee488.cpp b/src/devices/bus/ieee488/ieee488.cpp index 686fc0ae5ad..c5d1c0ea8c4 100644 --- a/src/devices/bus/ieee488/ieee488.cpp +++ b/src/devices/bus/ieee488/ieee488.cpp @@ -399,20 +399,20 @@ uint8_t ieee488_device::get_data() void cbm_ieee488_devices(device_slot_interface &device) { - device.option_add("c2040", C2040); - device.option_add("c3040", C3040); - device.option_add("c4040", C4040); - device.option_add("c8050", C8050); - device.option_add("c8250", C8250); - device.option_add("sfd1001", SFD1001); - device.option_add("c2031", C2031); - device.option_add("c8280", C8280); - device.option_add("d9060", D9060); - device.option_add("d9090", D9090); - device.option_add("softbox", SOFTBOX); - device.option_add("hardbox", HARDBOX); - device.option_add("shark", MSHARK); - device.option_add("c4023", C4023); + device.option_add("c2040", GPIB_C2040); + device.option_add("c3040", GPIB_C3040); + device.option_add("c4040", GPIB_C4040); + device.option_add("c8050", GPIB_C8050); + device.option_add("c8250", GPIB_C8250); + device.option_add("sfd1001", GPIB_SFD1001); + device.option_add("c2031", GPIB_C2031); + device.option_add("c8280", GPIB_C8280); + device.option_add("d9060", GPIB_D9060); + device.option_add("d9090", GPIB_D9090); + device.option_add("softbox", GPIB_SOFTBOX); + device.option_add("hardbox", GPIB_HARDBOX); + device.option_add("shark", GPIB_MSHARK); + device.option_add("c4023", GPIB_C4023); } //------------------------------------------------- @@ -426,9 +426,9 @@ void cbm_ieee488_devices(device_slot_interface &device) void hp_ieee488_devices(device_slot_interface &device) { - device.option_add("hp9122c", HP9122C); - device.option_add("hp9133", HP9133); - device.option_add("hp9895", HP9895); + device.option_add("hp9122c", GPIB_HP9122C); + device.option_add("hp9133", GPIB_HP9133); + device.option_add("hp9895", GPIB_HP9895); } //------------------------------------------------- @@ -440,7 +440,7 @@ void hp_ieee488_devices(device_slot_interface &device) void remote488_devices(device_slot_interface &device) { - device.option_add("remote488", REMOTE488); + device.option_add("remote488", GPIB_REMOTE488); } @@ -453,7 +453,7 @@ void remote488_devices(device_slot_interface &device) void grid_ieee488_devices(device_slot_interface &device) { - device.option_add("grid2102", GRID2102).clock(XTAL(4'000'000)); - device.option_add("grid2101_floppy", GRID2101_FLOPPY).clock(XTAL(4'000'000)); - device.option_add("grid2101_hdd", GRID2101_HDD).clock(XTAL(4'000'000)); + device.option_add("grid2102", GPIB_GRID2102).clock(XTAL(4'000'000)); + device.option_add("grid2101_floppy", GPIB_GRID2101_FLOPPY).clock(XTAL(4'000'000)); + device.option_add("grid2101_hdd", GPIB_GRID2101_HDD).clock(XTAL(4'000'000)); } diff --git a/src/devices/bus/ieee488/remote488.cpp b/src/devices/bus/ieee488/remote488.cpp index d559622dad6..bcbcf1d074f 100644 --- a/src/devices/bus/ieee488/remote488.cpp +++ b/src/devices/bus/ieee488/remote488.cpp @@ -187,6 +187,8 @@ #include "emu.h" #include "remote488.h" +#include "imagedev/bitbngr.h" + // Debugging #define LOG_PARSER_MASK (1U << 1) #define LOG_PARSER(...) LOGMASKED(LOG_PARSER_MASK, __VA_ARGS__) @@ -195,30 +197,30 @@ #include "logmacro.h" -// Bit manipulation namespace { - template<typename T> constexpr T BIT_MASK(unsigned n) - { - return (T)1U << n; - } - template<typename T> void BIT_CLR(T& w , unsigned n) - { - w &= ~BIT_MASK<T>(n); - } +// Bit manipulation +template<typename T> constexpr T BIT_MASK(unsigned n) +{ + return (T)1U << n; +} - template<typename T> void BIT_SET(T& w , unsigned n) - { - w |= BIT_MASK<T>(n); - } +template<typename T> void BIT_CLR(T& w , unsigned n) +{ + w &= ~BIT_MASK<T>(n); +} - template<typename T> void COPY_BIT(bool bit , T& w , unsigned n) - { - if (bit) { - BIT_SET(w , n); - } else { - BIT_CLR(w , n); - } +template<typename T> void BIT_SET(T& w , unsigned n) +{ + w |= BIT_MASK<T>(n); +} + +template<typename T> void COPY_BIT(bool bit , T& w , unsigned n) +{ + if (bit) { + BIT_SET(w , n); + } else { + BIT_CLR(w , n); } } @@ -240,11 +242,117 @@ constexpr unsigned HEARTBEAT_MS = 500; // Heartbeat ping period (ms) constexpr unsigned MAX_MISSED_HB = 3; // Missed heartbeats to declare the connection dead constexpr unsigned AH_TO_MS = 10; // Timeout in AH to report a byte string terminated (ms) -// device type definition -DEFINE_DEVICE_TYPE(REMOTE488, remote488_device, "remote488", "IEEE-488 Remotizer") +class remote488_device : public device_t, + public device_ieee488_interface +{ +public: + // construction/destruction + remote488_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // device_ieee488_interface implementation + virtual void ieee488_eoi(int state) override; + virtual void ieee488_dav(int state) override; + virtual void ieee488_nrfd(int state) override; + virtual void ieee488_ndac(int state) override; + virtual void ieee488_ifc(int state) override; + virtual void ieee488_srq(int state) override; + virtual void ieee488_atn(int state) override; + virtual void ieee488_ren(int state) override; + +protected: + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + // Position of signals in "S/R" msgs + enum signal_bit { + SIGNAL_ATN_BIT, // Bit 0 + SIGNAL_IFC_BIT, // Bit 1 + SIGNAL_REN_BIT, // Bit 2 + SIGNAL_SRQ_BIT, // Bit 3 + SIGNAL_COUNT + }; + + // Source handshake states + enum { + REM_SH_SIDS, + REM_SH_SDYS, + REM_SH_STRS + }; + + // Acceptor handshake states + enum { + REM_AH_AIDS, + REM_AH_ACRS, + REM_AH_ACDS, + REM_AH_AWNS + }; + + // Stream rx states + enum { + REM_RX_WAIT_CH, + REM_RX_WAIT_COLON, + REM_RX_WAIT_1ST_HEX, + REM_RX_WAIT_2ND_HEX, + REM_RX_WAIT_SEP, + REM_RX_WAIT_WS + }; + + required_device<bitbanger_device> m_stream; + uint8_t m_in_signals; + uint8_t m_out_signals; + bool m_no_propagation; + int m_sh_state; + int m_ah_state; + int m_rx_state; + char m_rx_ch; + uint8_t m_rx_data; + bool m_flush_bytes; + bool m_ibf; + uint8_t m_ib; + bool m_ib_eoi; + emu_timer *m_poll_timer; + emu_timer *m_hb_timer; + emu_timer *m_ah_timer; + unsigned m_connect_cnt; + bool m_connected; + uint8_t m_pp_data; + bool m_pp_requested; + uint8_t m_pp_dio; + uint8_t m_sh_dio; + bool m_waiting_checkpoint; + + + TIMER_CALLBACK_MEMBER(process_input_msgs); + TIMER_CALLBACK_MEMBER(heartbeat_tick); + TIMER_CALLBACK_MEMBER(checkpoint_timeout_tick); + + void bus_reset(); + void set_connection(bool state); + void recvd_data_byte(uint8_t data , bool eoi); + void flush_data(); + void update_signals_from_rem(uint8_t to_set , uint8_t to_clear); + void update_signal(signal_bit bit , int state); + void update_state(uint8_t new_signals); + void send_update(char type , uint8_t data); + static bool a2hex(char c , uint8_t& out); + static bool is_msg_type(char c); + static bool is_terminator(char c); + static bool is_space(char c); + char recv_update(uint8_t& data); + bool is_local_atn_active() const; + void ah_checkpoint(); + void update_ah_fsm(); + void update_sh_fsm(); + bool is_local_pp_active() const; + void update_pp(); + void update_pp_dio(); + void update_dio(); +}; remote488_device::remote488_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig , REMOTE488 , tag , owner , clock), + device_t(mconfig , GPIB_REMOTE488 , tag , owner , clock), device_ieee488_interface(mconfig , *this), m_stream(*this , "stream") { @@ -808,3 +916,8 @@ void remote488_device::update_dio() { m_bus->dio_w(this , m_pp_dio & m_sh_dio); } + +} // anonymous namespace + +// device type definition +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_REMOTE488, device_ieee488_interface, remote488_device, "gpib_remote488", "IEEE-488 Remotizer") diff --git a/src/devices/bus/ieee488/remote488.h b/src/devices/bus/ieee488/remote488.h index dcc989e62a9..67274678673 100644 --- a/src/devices/bus/ieee488/remote488.h +++ b/src/devices/bus/ieee488/remote488.h @@ -12,118 +12,7 @@ #pragma once #include "ieee488.h" -#include "imagedev/bitbngr.h" -class remote488_device : public device_t, - public device_ieee488_interface -{ -public: - // construction/destruction - remote488_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - // device_ieee488_interface overrides - virtual void ieee488_eoi(int state) override; - virtual void ieee488_dav(int state) override; - virtual void ieee488_nrfd(int state) override; - virtual void ieee488_ndac(int state) override; - virtual void ieee488_ifc(int state) override; - virtual void ieee488_srq(int state) override; - virtual void ieee488_atn(int state) override; - virtual void ieee488_ren(int state) override; - -protected: - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - -private: - // Position of signals in "S/R" msgs - enum signal_bit { - SIGNAL_ATN_BIT, // Bit 0 - SIGNAL_IFC_BIT, // Bit 1 - SIGNAL_REN_BIT, // Bit 2 - SIGNAL_SRQ_BIT, // Bit 3 - SIGNAL_COUNT - }; - - // Source handshake states - enum { - REM_SH_SIDS, - REM_SH_SDYS, - REM_SH_STRS - }; - - // Acceptor handshake states - enum { - REM_AH_AIDS, - REM_AH_ACRS, - REM_AH_ACDS, - REM_AH_AWNS - }; - - // Stream rx states - enum { - REM_RX_WAIT_CH, - REM_RX_WAIT_COLON, - REM_RX_WAIT_1ST_HEX, - REM_RX_WAIT_2ND_HEX, - REM_RX_WAIT_SEP, - REM_RX_WAIT_WS - }; - - required_device<bitbanger_device> m_stream; - uint8_t m_in_signals; - uint8_t m_out_signals; - bool m_no_propagation; - int m_sh_state; - int m_ah_state; - int m_rx_state; - char m_rx_ch; - uint8_t m_rx_data; - bool m_flush_bytes; - bool m_ibf; - uint8_t m_ib; - bool m_ib_eoi; - emu_timer *m_poll_timer; - emu_timer *m_hb_timer; - emu_timer *m_ah_timer; - unsigned m_connect_cnt; - bool m_connected; - uint8_t m_pp_data; - bool m_pp_requested; - uint8_t m_pp_dio; - uint8_t m_sh_dio; - bool m_waiting_checkpoint; - - - TIMER_CALLBACK_MEMBER(process_input_msgs); - TIMER_CALLBACK_MEMBER(heartbeat_tick); - TIMER_CALLBACK_MEMBER(checkpoint_timeout_tick); - - void bus_reset(); - void set_connection(bool state); - void recvd_data_byte(uint8_t data , bool eoi); - void flush_data(); - void update_signals_from_rem(uint8_t to_set , uint8_t to_clear); - void update_signal(signal_bit bit , int state); - void update_state(uint8_t new_signals); - void send_update(char type , uint8_t data); - static bool a2hex(char c , uint8_t& out); - static bool is_msg_type(char c); - static bool is_terminator(char c); - static bool is_space(char c); - char recv_update(uint8_t& data); - bool is_local_atn_active() const; - void ah_checkpoint(); - void update_ah_fsm(); - void update_sh_fsm(); - bool is_local_pp_active() const; - void update_pp(); - void update_pp_dio(); - void update_dio(); -}; - -// device type definition -DECLARE_DEVICE_TYPE(REMOTE488, remote488_device) +DECLARE_DEVICE_TYPE(GPIB_REMOTE488, device_ieee488_interface) #endif // MAME_BUS_IEEE488_REMOTE488_H diff --git a/src/devices/bus/ieee488/shark.cpp b/src/devices/bus/ieee488/shark.cpp index 1e160b6c310..c6131ba847b 100644 --- a/src/devices/bus/ieee488/shark.cpp +++ b/src/devices/bus/ieee488/shark.cpp @@ -8,12 +8,15 @@ #include "emu.h" #include "shark.h" + #include "bus/rs232/rs232.h" #include "cpu/i8085/i8085.h" #include "imagedev/harddriv.h" +namespace { + //************************************************************************** // MACROS / CONSTANTS //************************************************************************** @@ -22,14 +25,6 @@ #define RS232_TAG "rs232" - -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -DEFINE_DEVICE_TYPE(MSHARK, mshark_device, "mshark", "Mator SHARK") - - //------------------------------------------------- // ROM( mshark ) //------------------------------------------------- @@ -47,6 +42,34 @@ ROM_START( mshark ) ROM_END +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> mshark_device + +class mshark_device : public device_t, + public device_ieee488_interface +{ +public: + // construction/destruction + mshark_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + +private: + required_device<cpu_device> m_maincpu; + + void mshark_io(address_map &map) ATTR_COLD; + void mshark_mem(address_map &map) ATTR_COLD; +}; + + //------------------------------------------------- // rom_region - device-specific ROM region //------------------------------------------------- @@ -121,7 +144,7 @@ ioport_constructor mshark_device::device_input_ports() const //------------------------------------------------- mshark_device::mshark_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, MSHARK, tag, owner, clock) + : device_t(mconfig, GPIB_MSHARK, tag, owner, clock) , device_ieee488_interface(mconfig, *this) , m_maincpu(*this, I8085_TAG) { @@ -135,3 +158,13 @@ mshark_device::mshark_device(const machine_config &mconfig, const char *tag, dev void mshark_device::device_start() { } + +} // anonymous namespace + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_MSHARK, device_ieee488_interface, mshark_device, "gpib_mshark", "Mator SHARK") diff --git a/src/devices/bus/ieee488/shark.h b/src/devices/bus/ieee488/shark.h index e8d7de05b72..3c124f6677c 100644 --- a/src/devices/bus/ieee488/shark.h +++ b/src/devices/bus/ieee488/shark.h @@ -17,37 +17,6 @@ -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> mshark_device - -class mshark_device : public device_t, - public device_ieee488_interface -{ -public: - // construction/destruction - mshark_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - -private: - required_device<cpu_device> m_maincpu; - - void mshark_io(address_map &map) ATTR_COLD; - void mshark_mem(address_map &map) ATTR_COLD; -}; - - -// device type definition -DECLARE_DEVICE_TYPE(MSHARK, mshark_device) +DECLARE_DEVICE_TYPE(GPIB_MSHARK, device_ieee488_interface) #endif // MAME_BUS_IEEE488_SHARK_H diff --git a/src/devices/bus/ieee488/softbox.cpp b/src/devices/bus/ieee488/softbox.cpp index 0a38d5ce9cf..093e9863d62 100644 --- a/src/devices/bus/ieee488/softbox.cpp +++ b/src/devices/bus/ieee488/softbox.cpp @@ -10,13 +10,23 @@ This is an emulation of the SoftBox as a PET/CBM peripheral, where the PET is used as a terminal over IEEE-488. For the standalone mode where an RS-232 terminal is used, and also information on - how to set up the Corvus drive, see: src/mame/drivers/softbox.c. + how to set up the Corvus drive, see: src/mame/skeleton/softbox.cpp */ #include "emu.h" #include "softbox.h" +#include "bus/rs232/rs232.h" +#include "cpu/z80/z80.h" +#include "imagedev/harddriv.h" +#include "machine/com8116.h" +#include "machine/corvushd.h" +#include "machine/i8251.h" +#include "machine/i8255.h" + + +namespace { //************************************************************************** // MACROS / CONSTANTS @@ -30,13 +40,6 @@ -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -DEFINE_DEVICE_TYPE(SOFTBOX, softbox_device, "pet_softbox", "SSE SoftBox") - - //------------------------------------------------- // ROM( softbox ) //------------------------------------------------- @@ -56,6 +59,60 @@ ROM_START( softbox ) ROM_END +//************************************************************************** +// TYPE DECLARATIONS +//************************************************************************** + +// ======================> softbox_device + +class softbox_device : public device_t, + public device_ieee488_interface +{ +public: + // construction/destruction + softbox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset_after_children() override; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + // device_ieee488_interface implementation + virtual void ieee488_ifc(int state) override; + +private: + enum + { + LED_A = 0, + LED_B, + LED_READY + }; + + uint8_t ppi0_pa_r(); + void ppi0_pb_w(uint8_t data); + + uint8_t ppi1_pa_r(); + void ppi1_pb_w(uint8_t data); + uint8_t ppi1_pc_r(); + void ppi1_pc_w(uint8_t data); + + void dbrg_w(uint8_t data); + + void softbox_io(address_map &map) ATTR_COLD; + void softbox_mem(address_map &map) ATTR_COLD; + + required_device<cpu_device> m_maincpu; + required_device<com8116_device> m_dbrg; + required_device<corvus_hdc_device> m_hdc; + output_finder<3> m_leds; + + int m_ifc; // Tracks previous state of IEEE-488 IFC line +}; + + //------------------------------------------------- // rom_region - device-specific ROM region //------------------------------------------------- @@ -313,7 +370,7 @@ ioport_constructor softbox_device::device_input_ports() const //------------------------------------------------- softbox_device::softbox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, SOFTBOX, tag, owner, clock) + : device_t(mconfig, GPIB_SOFTBOX, tag, owner, clock) , device_ieee488_interface(mconfig, *this) , m_maincpu(*this, Z80_TAG) , m_dbrg(*this, "ic14") @@ -380,3 +437,12 @@ void softbox_device::dbrg_w(uint8_t data) m_dbrg->str_w(data & 0x0f); m_dbrg->stt_w(data >> 4); } + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(GPIB_SOFTBOX, device_ieee488_interface, softbox_device, "gpib_softbox", "SSE SoftBox") diff --git a/src/devices/bus/ieee488/softbox.h b/src/devices/bus/ieee488/softbox.h index 11dc90b4c40..8637690a8c6 100644 --- a/src/devices/bus/ieee488/softbox.h +++ b/src/devices/bus/ieee488/softbox.h @@ -12,74 +12,10 @@ #pragma once #include "ieee488.h" -#include "bus/rs232/rs232.h" -#include "cpu/z80/z80.h" -#include "imagedev/harddriv.h" -#include "machine/corvushd.h" -#include "machine/com8116.h" -#include "machine/i8251.h" -#include "machine/i8255.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> softbox_device - -class softbox_device : public device_t, - public device_ieee488_interface -{ -public: - // construction/destruction - softbox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset_after_children() override; - - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual ioport_constructor device_input_ports() const override ATTR_COLD; - - // device_ieee488_interface overrides - virtual void ieee488_ifc(int state) override; - -private: - uint8_t ppi0_pa_r(); - void ppi0_pb_w(uint8_t data); - - uint8_t ppi1_pa_r(); - void ppi1_pb_w(uint8_t data); - uint8_t ppi1_pc_r(); - void ppi1_pc_w(uint8_t data); - - void dbrg_w(uint8_t data); - - void softbox_io(address_map &map) ATTR_COLD; - void softbox_mem(address_map &map) ATTR_COLD; - - enum - { - LED_A = 0, - LED_B, - LED_READY - }; - - required_device<cpu_device> m_maincpu; - required_device<com8116_device> m_dbrg; - required_device<corvus_hdc_device> m_hdc; - output_finder<3> m_leds; - - int m_ifc; // Tracks previous state of IEEE-488 IFC line -}; - - -// device type definition -DECLARE_DEVICE_TYPE(SOFTBOX, softbox_device) +DECLARE_DEVICE_TYPE(GPIB_SOFTBOX, device_ieee488_interface) #endif // MAME_BUS_IEEE488_SOFTBOX_H diff --git a/src/mame/commodore/pet.cpp b/src/mame/commodore/pet.cpp index 867037c7c12..6c3983d59c2 100644 --- a/src/mame/commodore/pet.cpp +++ b/src/mame/commodore/pet.cpp @@ -1521,7 +1521,7 @@ MC6845_UPDATE_ROW( cbm8296_state::cbm8296_update_row ) void cbm8296d_ieee488_devices(device_slot_interface &device) { - device.option_add("c8250lp", C8250LP); + device.option_add("c8250lp", GPIB_C8250LP); } |
