diff options
Diffstat (limited to 'src/devices/bus/ieee488/c8280.cpp')
| -rw-r--r-- | src/devices/bus/ieee488/c8280.cpp | 90 |
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") |
