From b10cef380b043351149632cd53c67bf1e4f0bd00 Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Mon, 3 Feb 2014 15:59:54 +0000 Subject: (MESS) Refactored the Commodore 1541/1551/1571/2031 disk drives to use the modern floppy system. [Curt Coder] --- src/emu/bus/cbmiec/c1541.c | 48 ++++++----------- src/emu/bus/cbmiec/c1541.h | 19 ++++--- src/emu/bus/cbmiec/c1571.c | 132 +++++++++++++-------------------------------- src/emu/bus/cbmiec/c1571.h | 16 +++--- 4 files changed, 70 insertions(+), 145 deletions(-) (limited to 'src/emu/bus/cbmiec') diff --git a/src/emu/bus/cbmiec/c1541.c b/src/emu/bus/cbmiec/c1541.c index b0be3d320ab..621c2b5d4a6 100644 --- a/src/emu/bus/cbmiec/c1541.c +++ b/src/emu/bus/cbmiec/c1541.c @@ -613,7 +613,7 @@ READ8_MEMBER( c1541c_device::via0_pa_r ) */ - return !floppy_tk00_r(m_image); + return !m_floppy->trk00_r(); } @@ -644,7 +644,7 @@ READ8_MEMBER( base_c1541_device::via1_pb_r ) UINT8 data = 0; // write protect sense - data |= !floppy_wpt_r(m_image) << 4; + data |= !m_floppy->wpt_r() << 4; // SYNC detect line data |= m_ga->sync_r() << 7; @@ -699,40 +699,24 @@ WRITE_LINE_MEMBER( base_c1541_device::byte_w ) m_via1->write_ca1(state); } -static C64H156_INTERFACE( ga_intf ) -{ - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c1541_device, atn_w), - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c1541_device, byte_w) -}; - //------------------------------------------------- -// LEGACY_FLOPPY_OPTIONS( c1541 ) +// SLOT_INTERFACE( c1540_floppies ) //------------------------------------------------- -static LEGACY_FLOPPY_OPTIONS_START( c1541 ) - LEGACY_FLOPPY_OPTION( c1541, "g64", "Commodore 1541 GCR Disk Image", g64_dsk_identify, g64_dsk_construct, NULL, NULL ) - LEGACY_FLOPPY_OPTION( c1541, "d64", "Commodore 1541 Disk Image", d64_dsk_identify, d64_dsk_construct, NULL, NULL ) -LEGACY_FLOPPY_OPTIONS_END +static SLOT_INTERFACE_START( c1540_floppies ) + SLOT_INTERFACE( "525ssqd", FLOPPY_525_SSQD ) +SLOT_INTERFACE_END //------------------------------------------------- -// floppy_interface c1541_floppy_interface +// FLOPPY_FORMATS( floppy_formats ) //------------------------------------------------- -static const floppy_interface c1541_floppy_interface = -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - FLOPPY_STANDARD_5_25_SSDD, - LEGACY_FLOPPY_OPTIONS_NAME(c1541), - "floppy_5_25", - NULL -}; +FLOPPY_FORMATS_MEMBER( base_c1541_device::floppy_formats ) + FLOPPY_D64_FORMAT, + FLOPPY_G64_FORMAT +FLOPPY_FORMATS_END READ8_MEMBER( c1541_prologic_dos_classic_device::pia_r ) @@ -802,8 +786,10 @@ static MACHINE_CONFIG_FRAGMENT( c1541 ) MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE(C64H156_TAG, c64h156_device, oe_w)) MCFG_VIA6522_IRQ_HANDLER(WRITELINE(base_c1541_device, via1_irq_w)) - MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1541_floppy_interface) - MCFG_64H156_ADD(C64H156_TAG, XTAL_16MHz, ga_intf) + MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz) + MCFG_64H156_ATN_CALLBACK(WRITELINE(base_c1541_device, atn_w)) + MCFG_64H156_BYTE_CALLBACK(WRITELINE(base_c1541_device, byte_w)) + MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1540_floppies, "525ssqd", base_c1541_device::floppy_formats) MACHINE_CONFIG_END @@ -974,7 +960,7 @@ base_c1541_device:: base_c1541_device(const machine_config &mconfig, device_type m_via0(*this, M6522_0_TAG), m_via1(*this, M6522_1_TAG), m_ga(*this, C64H156_TAG), - m_image(*this, FLOPPY_0), + m_floppy(*this, C64H156_TAG":0:525ssqd"), m_address(*this, "ADDRESS"), m_data_out(1), m_via0_irq(CLEAR_LINE), @@ -1075,7 +1061,7 @@ c1541_prologic_dos_classic_device::c1541_prologic_dos_classic_device(const machi void base_c1541_device::device_start() { // install image callbacks - m_ga->set_floppy(m_image); + m_ga->set_floppy(m_floppy); // register for state saving save_item(NAME(m_data_out)); diff --git a/src/emu/bus/cbmiec/c1541.h b/src/emu/bus/cbmiec/c1541.h index c4eca1447cd..01ea4b10b6d 100644 --- a/src/emu/bus/cbmiec/c1541.h +++ b/src/emu/bus/cbmiec/c1541.h @@ -17,14 +17,11 @@ #include "emu.h" #include "cbmiec.h" #include "bus/c64/bn1541.h" +#include "bus/centronics/ctronics.h" #include "cpu/m6502/m6502.h" -#include "imagedev/flopdrv.h" -#include "formats/d64_dsk.h" -#include "formats/g64_dsk.h" #include "machine/64h156.h" #include "machine/6522via.h" #include "machine/6821pia.h" -#include "bus/centronics/ctronics.h" @@ -43,13 +40,17 @@ // ======================> base_c1541_device class base_c1541_device : public device_t, - public device_cbm_iec_interface, - public device_c64_floppy_parallel_interface + public device_cbm_iec_interface, + public device_c64_floppy_parallel_interface { public: // construction/destruction base_c1541_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + DECLARE_WRITE_LINE_MEMBER( via0_irq_w ); virtual DECLARE_READ8_MEMBER( via0_pa_r ); DECLARE_WRITE8_MEMBER( via0_pa_w ); @@ -62,9 +63,7 @@ public: DECLARE_WRITE_LINE_MEMBER( atn_w ); DECLARE_WRITE_LINE_MEMBER( byte_w ); - // optional information overrides - virtual machine_config_constructor device_mconfig_additions() const; - virtual ioport_constructor device_input_ports() const; + DECLARE_FLOPPY_FORMATS( floppy_formats ); protected: // device-level overrides @@ -91,7 +90,7 @@ protected: required_device m_via0; required_device m_via1; required_device m_ga; - required_device m_image; + required_device m_floppy; required_ioport m_address; // IEC bus diff --git a/src/emu/bus/cbmiec/c1571.c b/src/emu/bus/cbmiec/c1571.c index 48ca54e36d9..02045d938dd 100644 --- a/src/emu/bus/cbmiec/c1571.c +++ b/src/emu/bus/cbmiec/c1571.c @@ -13,8 +13,7 @@ TODO: - - modernize floppy - - refactor 64H156 + - WD1770 set_floppy - 1571CR - MOS5710 - ICT Mini Chief MC-20 @@ -23,7 +22,6 @@ */ -#include "c1541.h" #include "c1571.h" @@ -201,7 +199,7 @@ READ8_MEMBER( c1571_device::via0_pa_r ) UINT8 data = 0; // track 0 sense - data |= floppy_tk00_r(m_image); + data |= m_floppy->trk00_r(); // byte ready data |= m_ga->byte_r() << 7; @@ -230,7 +228,7 @@ WRITE8_MEMBER( c1571_device::via0_pa_w ) m_ser_dir = BIT(data, 1); // side select - m_ga->set_side(BIT(data, 2)); + m_floppy->ss_w(BIT(data, 2)); // 1/2 MHz int clock_1_2 = BIT(data, 5); @@ -272,7 +270,7 @@ WRITE8_MEMBER( c1571cr_device::via0_pa_w ) */ // side select - m_ga->set_side(BIT(data, 2)); + m_floppy->ss_w(BIT(data, 2)); // 1/2 MHz int clock_1_2 = BIT(data, 5); @@ -429,7 +427,7 @@ READ8_MEMBER( c1571_device::via1_pb_r ) UINT8 data = 0; // write protect sense - data |= !floppy_wpt_r(m_image) << 4; + data |= !m_floppy->wpt_r() << 4; // SYNC detect line data |= m_ga->sync_r() << 7; @@ -490,12 +488,14 @@ WRITE_LINE_MEMBER( c1571_device::cia_pc_w ) WRITE_LINE_MEMBER( c1571_device::cia_cnt_w ) { m_cnt_out = state; + update_iec(); } WRITE_LINE_MEMBER( c1571_device::cia_sp_w ) { m_sp_out = state; + update_iec(); } @@ -555,95 +555,39 @@ WRITE8_MEMBER( mini_chief_device::cia_pb_w ) WRITE_LINE_MEMBER( c1571_device::byte_w ) { m_via1->write_ca1(state); + m_maincpu->set_input_line(M6502_SET_OVERFLOW, state); } -static C64H156_INTERFACE( ga_intf ) -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c1571_device, byte_w) -}; - - -//------------------------------------------------- -// SLOT_INTERFACE( c1570_floppies ) -//------------------------------------------------- -/* -static SLOT_INTERFACE_START( c1570_floppies ) - SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD ) -SLOT_INTERFACE_END -*/ //------------------------------------------------- // SLOT_INTERFACE( c1571_floppies ) //------------------------------------------------- -/* + static SLOT_INTERFACE_START( c1571_floppies ) - SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) + SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) SLOT_INTERFACE_END -*/ - -//------------------------------------------------- -// LEGACY_FLOPPY_OPTIONS( c1571 ) -//------------------------------------------------- - -static LEGACY_FLOPPY_OPTIONS_START( c1571 ) - LEGACY_FLOPPY_OPTION( c1571, "g64,g71", "Commodore 1541/1571 GCR Disk Image", g64_dsk_identify, g64_dsk_construct, NULL, NULL ) - LEGACY_FLOPPY_OPTION( c1571, "d64", "Commodore 1541 Disk Image", d64_dsk_identify, d64_dsk_construct, NULL, NULL ) - LEGACY_FLOPPY_OPTION( c1571, "d71", "Commodore 1571 Disk Image", d71_dsk_identify, d64_dsk_construct, NULL, NULL ) -LEGACY_FLOPPY_OPTIONS_END //------------------------------------------------- // floppy_interface c1571_floppy_interface //------------------------------------------------- -WRITE_LINE_MEMBER( c1571_device::wpt_w ) +void c1571_device::wpt_callback(floppy_image_device *floppy, int state) { m_via0->write_ca2(!state); } -static const floppy_interface c1571_floppy_interface = -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c1571_device, wpt_w), - DEVCB_NULL, - FLOPPY_STANDARD_5_25_DSDD, - LEGACY_FLOPPY_OPTIONS_NAME(c1571), - "floppy_5_25", - NULL -}; - - -//------------------------------------------------- -// LEGACY_FLOPPY_OPTIONS( c1541 ) -//------------------------------------------------- - -static LEGACY_FLOPPY_OPTIONS_START( c1541 ) - LEGACY_FLOPPY_OPTION( c1541, "g64", "Commodore 1541 GCR Disk Image", g64_dsk_identify, g64_dsk_construct, NULL, NULL ) - LEGACY_FLOPPY_OPTION( c1541, "d64", "Commodore 1541 Disk Image", d64_dsk_identify, d64_dsk_construct, NULL, NULL ) -LEGACY_FLOPPY_OPTIONS_END - //------------------------------------------------- -// floppy_interface c1570_floppy_interface +// FLOPPY_FORMATS( floppy_formats ) //------------------------------------------------- -static const floppy_interface c1570_floppy_interface = -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c1571_device, wpt_w), - DEVCB_NULL, - FLOPPY_STANDARD_5_25_SSDD, - LEGACY_FLOPPY_OPTIONS_NAME(c1541), - "floppy_5_25", - NULL -}; +FLOPPY_FORMATS_MEMBER( c1571_device::floppy_formats ) + FLOPPY_D64_FORMAT, + FLOPPY_G64_FORMAT, + FLOPPY_D71_FORMAT +FLOPPY_FORMATS_END //------------------------------------------------- @@ -699,11 +643,11 @@ static MACHINE_CONFIG_FRAGMENT( c1570 ) MCFG_MOS6526_ADD(M6526_TAG, XTAL_16MHz/16, 0, WRITELINE(c1571_device, cia_irq_w)) MCFG_MOS6526_SERIAL_CALLBACKS(WRITELINE(c1571_device, cia_cnt_w), WRITELINE(c1571_device, cia_sp_w)) MCFG_MOS6526_PORT_B_CALLBACKS(READ8(c1571_device, cia_pb_r), WRITE8(c1571_device, cia_pb_w), WRITELINE(c1571_device, cia_pc_w)) + MCFG_WD1770x_ADD(WD1770_TAG, XTAL_16MHz/2) - - MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1570_floppy_interface) - //MCFG_FLOPPY_DRIVE_ADD(WD1770_TAG":0", c1570_floppies, "525ssdd", 0, c1571_device::floppy_formats) - MCFG_64H156_ADD(C64H156_TAG, XTAL_16MHz, ga_intf) + MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz) + MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w)) + MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) MACHINE_CONFIG_END @@ -746,11 +690,11 @@ static MACHINE_CONFIG_FRAGMENT( c1571 ) MCFG_MOS6526_ADD(M6526_TAG, XTAL_16MHz/16, 0, WRITELINE(c1571_device, cia_irq_w)) MCFG_MOS6526_SERIAL_CALLBACKS(WRITELINE(c1571_device, cia_cnt_w), WRITELINE(c1571_device, cia_sp_w)) MCFG_MOS6526_PORT_B_CALLBACKS(READ8(c1571_device, cia_pb_r), WRITE8(c1571_device, cia_pb_w), WRITELINE(c1571_device, cia_pc_w)) + MCFG_WD1770x_ADD(WD1770_TAG, XTAL_16MHz/2) - - MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1571_floppy_interface) - //MCFG_FLOPPY_DRIVE_ADD(WD1770_TAG":0", c1571_floppies, "525dd", 0, c1571_device::floppy_formats) - MCFG_64H156_ADD(C64H156_TAG, XTAL_16MHz, ga_intf) + MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz) + MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w)) + MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) MACHINE_CONFIG_END @@ -793,10 +737,9 @@ static MACHINE_CONFIG_FRAGMENT( c1571cr ) //MCFG_MOS5710_ADD(M5710_TAG, XTAL_16MHz/16, 0) MCFG_WD1770x_ADD(WD1770_TAG, XTAL_16MHz/2) - - MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1571_floppy_interface) - //MCFG_FLOPPY_DRIVE_ADD(WD1770_TAG":0", c1571_floppies, "525dd", 0, c1571_device::floppy_formats) - MCFG_64H156_ADD(C64H156_TAG, XTAL_16MHz, ga_intf) + MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz) + MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w)) + MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) MACHINE_CONFIG_END @@ -839,11 +782,11 @@ static MACHINE_CONFIG_FRAGMENT( mini_chief ) MCFG_MOS6526_ADD(M6526_TAG, XTAL_16MHz/16, 0, WRITELINE(c1571_device, cia_irq_w)) MCFG_MOS6526_SERIAL_CALLBACKS(WRITELINE(c1571_device, cia_cnt_w), WRITELINE(c1571_device, cia_sp_w)) MCFG_MOS6526_PORT_B_CALLBACKS(READ8(c1571_device, cia_pb_r), WRITE8(c1571_device, cia_pb_w), WRITELINE(c1571_device, cia_pc_w)) - MCFG_WD1770x_ADD(WD1770_TAG, XTAL_16MHz/2) - MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1571_floppy_interface) - //MCFG_FLOPPY_DRIVE_ADD(WD1770_TAG":0", c1571_floppies, "525dd", 0, c1571_device::floppy_formats) - MCFG_64H156_ADD(C64H156_TAG, XTAL_16MHz, ga_intf) + MCFG_WD1770x_ADD(WD1770_TAG, XTAL_16MHz/2) + MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz) + MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w)) + MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) MCFG_ISA8_BUS_ADD(ISA_BUS_TAG, M6502_TAG, isabus_intf) MCFG_ISA8_SLOT_ADD(ISA_BUS_TAG, "isa1", mini_chief_isa8_cards, "wd1002a_wx1", false) @@ -904,7 +847,7 @@ c1571_device::c1571_device(const machine_config &mconfig, device_type type, cons m_cia(*this, M6526_TAG), m_fdc(*this, WD1770_TAG), m_ga(*this, C64H156_TAG), - m_image(*this, FLOPPY_0), + m_floppy(*this, C64H156_TAG":0:525qd"), m_address(*this, "ADDRESS"), m_1_2mhz(0), m_data_out(1), @@ -927,7 +870,7 @@ c1571_device::c1571_device(const machine_config &mconfig, const char *tag, devic m_cia(*this, M6526_TAG), m_fdc(*this, WD1770_TAG), m_ga(*this, C64H156_TAG), - m_image(*this, FLOPPY_0), + m_floppy(*this, C64H156_TAG":0:525qd"), m_address(*this, "ADDRESS"), m_1_2mhz(0), m_data_out(1), @@ -937,7 +880,6 @@ c1571_device::c1571_device(const machine_config &mconfig, const char *tag, devic m_via0_irq(CLEAR_LINE), m_via1_irq(CLEAR_LINE), m_cia_irq(CLEAR_LINE) - //m_floppy(*this, WD1770_TAG":0:525dd") { } @@ -948,7 +890,6 @@ c1571_device::c1571_device(const machine_config &mconfig, const char *tag, devic c1570_device::c1570_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : c1571_device(mconfig, C1570, "C1570", tag, owner, clock, "c1570", __FILE__) - //m_floppy(*this, WD1770_TAG":0:525ssdd") { } @@ -959,7 +900,6 @@ c1570_device::c1570_device(const machine_config &mconfig, const char *tag, devic c1571cr_device::c1571cr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : c1571_device(mconfig, C1571CR, "C1571CR", tag, owner, clock, "c1571cr", __FILE__) - //m_floppy(*this, WD1770_TAG":0:525dd") { } @@ -970,7 +910,6 @@ c1571cr_device::c1571cr_device(const machine_config &mconfig, const char *tag, d mini_chief_device::mini_chief_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : c1571_device(mconfig, MINI_CHIEF, "ICT Mini Chief", tag, owner, clock, "minichif", __FILE__) - //m_floppy(*this, WD1770_TAG":0:525dd") { } @@ -982,8 +921,9 @@ mini_chief_device::mini_chief_device(const machine_config &mconfig, const char * void c1571_device::device_start() { // install image callbacks - m_ga->set_floppy(m_image); + m_ga->set_floppy(m_floppy); //m_fdc->set_floppy(m_floppy); + m_floppy->setup_wpt_cb(floppy_image_device::wpt_cb(FUNC(c1571_device::wpt_callback), this)); // register for state saving save_item(NAME(m_1_2mhz)); diff --git a/src/emu/bus/cbmiec/c1571.h b/src/emu/bus/cbmiec/c1571.h index eed4eb3da77..73406ecadfe 100644 --- a/src/emu/bus/cbmiec/c1571.h +++ b/src/emu/bus/cbmiec/c1571.h @@ -18,15 +18,12 @@ #include "cbmiec.h" #include "bus/c64/bn1541.h" #include "cpu/m6502/m6502.h" -#include "imagedev/flopdrv.h" -#include "formats/d64_dsk.h" -#include "formats/g64_dsk.h" #include "machine/64h156.h" #include "machine/6522via.h" #include "machine/isa.h" +#include "machine/isa_wd1002a_wx1.h" #include "machine/mos6526.h" #include "machine/wd_fdc.h" -#include "machine/isa_wd1002a_wx1.h" @@ -45,8 +42,8 @@ // ======================> c1571_device class c1571_device : public device_t, - public device_cbm_iec_interface, - public device_c64_floppy_parallel_interface + public device_cbm_iec_interface, + public device_c64_floppy_parallel_interface { public: // construction/destruction @@ -81,6 +78,10 @@ public: DECLARE_WRITE_LINE_MEMBER( wpt_w ); + DECLARE_FLOPPY_FORMATS( floppy_formats ); + + void wpt_callback(floppy_image_device *floppy, int state); + protected: // device-level overrides virtual void device_start(); @@ -110,8 +111,7 @@ protected: required_device m_cia; required_device m_fdc; required_device m_ga; - required_device m_image; - //required_device m_floppy; + required_device m_floppy; required_ioport m_address; // signals -- cgit v1.2.3-70-g09d2