diff options
Diffstat (limited to 'src/devices/imagedev/floppy.cpp')
-rw-r--r-- | src/devices/imagedev/floppy.cpp | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp index ae8764d8c7c..fb99ba5dacb 100644 --- a/src/devices/imagedev/floppy.cpp +++ b/src/devices/imagedev/floppy.cpp @@ -118,6 +118,10 @@ DEFINE_DEVICE_TYPE(ALPS_3255190X, alps_3255190x, "alps_3255190x", "ALPS 32551901 // IBM 8" drives DEFINE_DEVICE_TYPE(IBM_6360, ibm_6360, "ibm_6360", "IBM 6360 8\" single-sided single density floppy drive") +// Mac 3.5" drives +DEFINE_DEVICE_TYPE(MFD51W, mfd51w_device, "mfd51w", "Apple/Sony 3.5 DD variable-speed drive") +DEFINE_DEVICE_TYPE(MFD75W, mfd75w_device, "mfd75w", "Apple/Sony 3.5 HD variable-speed drive") + const floppy_format_type floppy_image_device::default_floppy_formats[] = { FLOPPY_D88_FORMAT, @@ -551,6 +555,12 @@ image_init_result floppy_image_device::call_create(int format_type, util::option return image_init_result::PASS; } +/* write protect, active high */ +bool floppy_image_device::wpt_r() +{ + return wpt; +} + /* motor on, active low */ void floppy_image_device::mon_w(int state) { @@ -2349,3 +2359,163 @@ void ibm_6360::setup_characteristics() variants.push_back(floppy_image::SSSD); } + + +//------------------------------------------------- +// Variable-speed Macintosh drives +//------------------------------------------------- + +mac_floppy_device::mac_floppy_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : floppy_image_device(mconfig, type, tag, owner, clock) +{ +} + +void mac_floppy_device::device_start() +{ + floppy_image_device::device_start(); + save_item(NAME(m_reg)); + save_item(NAME(m_strb)); +} + +void mac_floppy_device::device_reset() +{ + floppy_image_device::device_reset(); + m_reg = 0; + m_strb = 0; +} + +bool mac_floppy_device::wpt_r() +{ + static const char *const regnames[16] = { + "Dir", "Step", "Motor", "Eject", + "RdData0", "MFMDrive", "DoubleSide", "NoDrive", + "NoDiskInPl", "NoWrProtect", "NotTrack0", "NoTachPulse", + "RdData1", "MFMModeOn", "NoReady", "NotRevised" + }; + + logerror("fdc disk wpt_r reg %x %s\n", m_reg, regnames[m_reg]); + if(m_reg == 4) + machine().debug_break(); + + switch(m_reg) { + case 0x2: // Is the motor on? + return mon; + + case 0x4: // Used when reading data, result ignored + return false; + + case 0x5: // Is it a superdrive? + return true; + + case 0x6: // Is the drive double-sided? + return true; + + case 0x7: // Does drive exist? + return true; + + case 0x8: // Is there a disk in the drive? + return image != nullptr; + + case 0x9: // Is the disk write-protected? + return wpt; + + case 0xa: // Not on track 0? + return cyl == 0; + + case 0xf: // Does it implement the new interface? + return true; + + default: + return false; + } +} + +void mac_floppy_device::seek_phase_w(int phases) +{ + static const char *const regnames[16] = { + "DirNext", "StepOn", "MotorOn", "EjectOff", + "DirPrev", "StepOff", "MotorOff", "EjectOn", + "-", "MFMModeOn", "-", "-", + "-", "GCRModeOn", "-", "-" + }; + + bool prev_strb = m_strb; + + m_reg = (phases & 7) | (ss ? 8 : 0); + m_strb = (phases >> 3) & 1; + + if(m_strb && !prev_strb) { + switch(m_reg) { + case 0x0: // Step to cylinder + 1 + logerror("cmd step dir +1\n"); + dir_w(0); + break; + + case 0x1: // Step + logerror("cmd step\n"); + stp_w(0); + stp_w(1); + break; + + case 0x2: // Motor on + logerror("cmd motor on\n"); + mon_w(0); + break; + + case 0x3: // End eject + logerror("cmd end eject\n"); + break; + + case 0x4: // Step to cylinder - 1 + logerror("cmd step dir -1\n"); + dir_w(1); + break; + + case 0x6: // Motor off + logerror("cmd motor off\n"); + mon_w(1); + break; + + case 0x7: // Start eject + logerror("cmd start eject\n"); + call_unload(); + break; + + default: + logerror("cmd reg %x %s\n", m_reg, regnames[m_reg]); + break; + } + } +} + +mfd51w_device::mfd51w_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : mac_floppy_device(mconfig, MFD51W, tag, owner, clock) +{ +} + +void mfd51w_device::setup_characteristics() +{ + form_factor = floppy_image::FF_35; + tracks = 80; + sides = 2; + set_rpm(300); + + variants.push_back(floppy_image::SSSD); + variants.push_back(floppy_image::SSDD); + variants.push_back(floppy_image::DSDD); +} + +mfd75w_device::mfd75w_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : mac_floppy_device(mconfig, MFD75W, tag, owner, clock) +{ +} + +void mfd75w_device::setup_characteristics() +{ + form_factor = floppy_image::FF_35; + tracks = 80; + sides = 2; + set_rpm(300); + + variants.push_back(floppy_image::SSSD); + variants.push_back(floppy_image::SSDD); + variants.push_back(floppy_image::DSDD); + variants.push_back(floppy_image::DSHD); +} |