summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/ieee488/c8280.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/ieee488/c8280.cpp')
-rw-r--r--src/devices/bus/ieee488/c8280.cpp90
1 files changed, 78 insertions, 12 deletions
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")