From 8fc27ad9289181c2115c7ee513d11ab5020857d7 Mon Sep 17 00:00:00 2001 From: arbee Date: Wed, 2 May 2018 21:50:34 -0400 Subject: [PATCH] Apple II: added 13-sector version of Disk II controller [R. Belmont] --- src/devices/bus/a2bus/a2diskiing.cpp | 57 +++++++++++++++++++++------- src/devices/bus/a2bus/a2diskiing.h | 24 +++++++++++- src/mame/drivers/apple2.cpp | 1 + src/mame/drivers/apple2e.cpp | 1 + 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/devices/bus/a2bus/a2diskiing.cpp b/src/devices/bus/a2bus/a2diskiing.cpp index bd4b1239123..0a9439bfc30 100644 --- a/src/devices/bus/a2bus/a2diskiing.cpp +++ b/src/devices/bus/a2bus/a2diskiing.cpp @@ -21,7 +21,8 @@ // GLOBAL VARIABLES //************************************************************************** -DEFINE_DEVICE_TYPE(A2BUS_DISKIING, a2bus_diskiing_device, "a2diskiing", "Apple Disk II NG controller") +DEFINE_DEVICE_TYPE(A2BUS_DISKIING, a2bus_diskiing_device, "a2diskiing", "Apple Disk II NG controller (16-sector)") +DEFINE_DEVICE_TYPE(A2BUS_DISKIING13, a2bus_diskiing13_device, "diskii13", "Apple Disk II NG controller (13-sector)") #define WOZFDC_TAG "wozfdc" #define DISKII_ROM_REGION "diskii_rom" @@ -35,35 +36,55 @@ ROM_START( diskiing ) ROM_LOAD( "341-0027-a.p5", 0x0000, 0x0100, CRC(ce7144f6) SHA1(d4181c9f046aafc3fb326b381baac809d9e38d16) ) /* 341-0027-a: 16-sector disk drive (older version), PROM P5 */ ROM_END -FLOPPY_FORMATS_MEMBER( a2bus_diskiing_device::floppy_formats ) +ROM_START( diskiing13 ) + ROM_REGION(0x100, DISKII_ROM_REGION, 0) + ROM_LOAD( "341-0009.bin", 0x000000, 0x000100, CRC(d34eb2ff) SHA1(afd060e6f35faf3bb0146fa889fc787adf56330a) ) +ROM_END + +FLOPPY_FORMATS_MEMBER( diskiing_device::floppy_formats ) FLOPPY_A216S_FORMAT, FLOPPY_RWTS18_FORMAT, FLOPPY_EDD_FORMAT, FLOPPY_WOZ_FORMAT FLOPPY_FORMATS_END +FLOPPY_FORMATS_MEMBER( a2bus_diskiing13_device::floppy_formats ) + FLOPPY_EDD_FORMAT, FLOPPY_WOZ_FORMAT +FLOPPY_FORMATS_END + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(a2bus_diskiing_device::device_add_mconfig) +MACHINE_CONFIG_START(diskiing_device::device_add_mconfig) MCFG_DEVICE_ADD(WOZFDC_TAG, DISKII_FDC, 1021800*2) - MCFG_FLOPPY_DRIVE_ADD("0", a2_floppies, "525", a2bus_diskiing_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("1", a2_floppies, "525", a2bus_diskiing_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("0", a2_floppies, "525", diskiing_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("1", a2_floppies, "525", diskiing_device::floppy_formats) +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(a2bus_diskiing13_device::device_add_mconfig) + MCFG_DEVICE_ADD(WOZFDC_TAG, DISKII_FDC, 1021800*2) + MCFG_FLOPPY_DRIVE_ADD("0", a2_floppies, "525", a2bus_diskiing13_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("1", a2_floppies, "525", a2bus_diskiing13_device::floppy_formats) MACHINE_CONFIG_END //------------------------------------------------- // rom_region - device-specific ROM region //------------------------------------------------- -const tiny_rom_entry *a2bus_diskiing_device::device_rom_region() const +const tiny_rom_entry *diskiing_device::device_rom_region() const { return ROM_NAME( diskiing ); } +const tiny_rom_entry *a2bus_diskiing13_device::device_rom_region() const +{ + return ROM_NAME( diskiing13 ); +} + //************************************************************************** // LIVE DEVICE //************************************************************************** -a2bus_diskiing_device::a2bus_diskiing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, A2BUS_DISKIING, tag, owner, clock), +diskiing_device::diskiing_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), device_a2bus_card_interface(mconfig, *this), m_wozfdc(*this, WOZFDC_TAG), floppy0(*this, "0"), @@ -72,16 +93,26 @@ a2bus_diskiing_device::a2bus_diskiing_device(const machine_config &mconfig, cons { } +a2bus_diskiing_device::a2bus_diskiing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + diskiing_device(mconfig, A2BUS_DISKIING, tag, owner, clock) +{ +} + +a2bus_diskiing13_device::a2bus_diskiing13_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + diskiing_device(mconfig, A2BUS_DISKIING13, tag, owner, clock) +{ +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- -void a2bus_diskiing_device::device_start() +void diskiing_device::device_start() { m_rom = device().machine().root_device().memregion(this->subtag(DISKII_ROM_REGION).c_str())->base(); } -void a2bus_diskiing_device::device_reset() +void diskiing_device::device_reset() { m_wozfdc->set_floppies(floppy0, floppy1); } @@ -90,7 +121,7 @@ void a2bus_diskiing_device::device_reset() read_c0nx - called for reads from this card's c0nx space -------------------------------------------------*/ -uint8_t a2bus_diskiing_device::read_c0nx(uint8_t offset) +uint8_t diskiing_device::read_c0nx(uint8_t offset) { return m_wozfdc->read(offset); } @@ -100,7 +131,7 @@ uint8_t a2bus_diskiing_device::read_c0nx(uint8_t offset) write_c0nx - called for writes to this card's c0nx space -------------------------------------------------*/ -void a2bus_diskiing_device::write_c0nx(uint8_t offset, uint8_t data) +void diskiing_device::write_c0nx(uint8_t offset, uint8_t data) { m_wozfdc->write(offset, data); } @@ -109,7 +140,7 @@ void a2bus_diskiing_device::write_c0nx(uint8_t offset, uint8_t data) read_cnxx - called for reads from this card's cnxx space -------------------------------------------------*/ -uint8_t a2bus_diskiing_device::read_cnxx(uint8_t offset) +uint8_t diskiing_device::read_cnxx(uint8_t offset) { return m_rom[offset]; } diff --git a/src/devices/bus/a2bus/a2diskiing.h b/src/devices/bus/a2bus/a2diskiing.h index 06c6327018a..e6476cb29a7 100644 --- a/src/devices/bus/a2bus/a2diskiing.h +++ b/src/devices/bus/a2bus/a2diskiing.h @@ -23,13 +23,13 @@ //************************************************************************** -class a2bus_diskiing_device: +class diskiing_device: public device_t, public device_a2bus_card_interface { public: // construction/destruction - a2bus_diskiing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + diskiing_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); protected: virtual void device_start() override; @@ -52,7 +52,27 @@ private: DECLARE_FLOPPY_FORMATS( floppy_formats ); }; +class a2bus_diskiing_device: public diskiing_device +{ +public: + a2bus_diskiing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + +class a2bus_diskiing13_device: public diskiing_device +{ +public: + a2bus_diskiing13_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + +private: + DECLARE_FLOPPY_FORMATS( floppy_formats ); +}; + // device type definition DECLARE_DEVICE_TYPE(A2BUS_DISKIING, a2bus_diskiing_device) +DECLARE_DEVICE_TYPE(A2BUS_DISKIING13, a2bus_diskiing13_device) #endif // MAME_BUS_A2BUS_A2DISKIING_H diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp index 6a32b1fbdd4..a862608c252 100644 --- a/src/mame/drivers/apple2.cpp +++ b/src/mame/drivers/apple2.cpp @@ -1327,6 +1327,7 @@ SLOT_INTERFACE_END static SLOT_INTERFACE_START(apple2_cards) SLOT_INTERFACE("diskii", A2BUS_DISKII) /* Disk II Controller Card */ SLOT_INTERFACE("diskiing", A2BUS_DISKIING) /* Disk II Controller Card, cycle-accurate version */ + SLOT_INTERFACE("diskiing13", A2BUS_DISKIING13) /* Disk II Controller Card, cycle-accurate version */ SLOT_INTERFACE("mockingboard", A2BUS_MOCKINGBOARD) /* Sweet Micro Systems Mockingboard */ SLOT_INTERFACE("phasor", A2BUS_PHASOR) /* Applied Engineering Phasor */ SLOT_INTERFACE("cffa2", A2BUS_CFFA2) /* CFFA2000 Compact Flash for Apple II (www.dreher.net), 65C02/65816 firmware */ diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp index a54dee057e0..1c3d35f9c9e 100644 --- a/src/mame/drivers/apple2e.cpp +++ b/src/mame/drivers/apple2e.cpp @@ -3830,6 +3830,7 @@ INPUT_PORTS_END static SLOT_INTERFACE_START(apple2_cards) SLOT_INTERFACE("diskii", A2BUS_DISKII) /* Disk II Controller Card */ SLOT_INTERFACE("diskiing", A2BUS_DISKIING) /* Disk II Controller Card, cycle-accurate version */ + SLOT_INTERFACE("diskiing13", A2BUS_DISKIING13) /* Disk II Controller Card, cycle-accurate version */ SLOT_INTERFACE("mockingboard", A2BUS_MOCKINGBOARD) /* Sweet Micro Systems Mockingboard */ SLOT_INTERFACE("phasor", A2BUS_PHASOR) /* Applied Engineering Phasor */ SLOT_INTERFACE("cffa2", A2BUS_CFFA2) /* CFFA2000 Compact Flash for Apple II (www.dreher.net), 65C02/65816 firmware */