From bfc80dde161d04849eb77b5a08e37eaf6302df2f Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Mon, 19 May 2014 21:16:03 +0000 Subject: [PATCH] wd_fdc: Hold DRQ in status register until scan ID command has been fully read. This fixes Osborne 1/2 --- src/emu/machine/wd_fdc.c | 2 +- src/mess/drivers/osborne1.c | 21 ++++++++-------- src/mess/includes/osborne1.h | 10 +++++--- src/mess/machine/osborne1.c | 49 +++++++++++------------------------- 4 files changed, 32 insertions(+), 50 deletions(-) diff --git a/src/emu/machine/wd_fdc.c b/src/emu/machine/wd_fdc.c index 1c3e8e2789e..37e81b1f85f 100644 --- a/src/emu/machine/wd_fdc.c +++ b/src/emu/machine/wd_fdc.c @@ -1052,7 +1052,7 @@ UINT8 wd_fdc_t::status_r() intrq_cb(intrq); } - if(main_state == IDLE || status_type_1) { + if((main_state == IDLE && !drq) || status_type_1) { if(floppy && floppy->idx_r()) status |= S_IP; else diff --git a/src/mess/drivers/osborne1.c b/src/mess/drivers/osborne1.c index 93fc59057d8..e9e159b12d0 100644 --- a/src/mess/drivers/osborne1.c +++ b/src/mess/drivers/osborne1.c @@ -166,6 +166,7 @@ static const z80_daisy_config osborne1_daisy_chain[] = * - DEC 1820 double density: 40 tracks, 9 sectors per track, 512-byte sectors (180 KByte) * */ + /* static LEGACY_FLOPPY_OPTIONS_START(osborne1 ) LEGACY_FLOPPY_OPTION( osd, "img", "Osborne single density", basicdsk_identify_default, basicdsk_construct_default, NULL, HEADS([1]) @@ -198,13 +199,12 @@ static LEGACY_FLOPPY_OPTIONS_START(osborne1 ) SECTOR_LENGTH([512]) FIRST_SECTOR_ID([1])) LEGACY_FLOPPY_OPTIONS_END +*/ -static const floppy_interface osborne1_floppy_interface = -{ - FLOPPY_STANDARD_5_25_SSDD_40, - LEGACY_FLOPPY_OPTIONS_NAME(osborne1), - "floppy_5_25" -}; +static SLOT_INTERFACE_START( osborne1_floppies ) + SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD ) // Siemens FDD 100-5, custom Osborne electronics + SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD ) // MPI 52(?), custom Osborne electronics +SLOT_INTERFACE_END /* F4 Character Displayer */ static const gfx_layout osborne1_charlayout = @@ -230,7 +230,6 @@ static MACHINE_CONFIG_START( osborne1, osborne1_state ) MCFG_CPU_IO_MAP( osborne1_io) MCFG_CPU_CONFIG( osborne1_daisy_chain ) - MCFG_DEVICE_ADD( "osborne1_daisy", OSBORNE1_DAISY, 0 ) MCFG_SCREEN_ADD("screen", RASTER) @@ -260,10 +259,10 @@ static MACHINE_CONFIG_START( osborne1, osborne1_state ) MCFG_PIA_CB2_HANDLER(WRITELINE(osborne1_state, video_pia_out_cb2_dummy)) MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func)) - MCFG_DEVICE_ADD("mb8877", MB8877, 0) - MCFG_WD17XX_DEFAULT_DRIVE2_TAGS - - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(osborne1_floppy_interface) + MCFG_DEVICE_ADD("mb8877", MB8877x, MAIN_CLOCK/16) + MCFG_WD_FDC_FORCE_READY + MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("mb8877:1", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats) MCFG_IEEE488_BUS_ADD() MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w)) diff --git a/src/mess/includes/osborne1.h b/src/mess/includes/osborne1.h index 849b60e023c..def8c716c4e 100644 --- a/src/mess/includes/osborne1.h +++ b/src/mess/includes/osborne1.h @@ -15,9 +15,7 @@ #include "machine/6850acia.h" #include "bus/ieee488/ieee488.h" #include "machine/ram.h" -#include "machine/wd17xx.h" -#include "imagedev/flopdrv.h" -#include "formats/basicdsk.h" +#include "machine/wd_fdc.h" class osborne1_state : public driver_device { @@ -37,6 +35,8 @@ public: m_beep(*this, "beeper"), m_ram(*this, RAM_TAG), m_ieee(*this, IEEE488_TAG), + m_floppy0(*this, "mb8877:0:525ssdd"), + m_floppy1(*this, "mb8877:1:525ssdd"), m_row0(*this, "ROW0"), m_row1(*this, "ROW1"), m_row2(*this, "ROW2"), @@ -60,10 +60,12 @@ public: required_device m_maincpu; required_device m_pia0; required_device m_pia1; - required_device m_fdc; + required_device m_fdc; required_device m_beep; required_device m_ram; required_device m_ieee; + required_device m_floppy0; + required_device m_floppy1; DECLARE_WRITE8_MEMBER(osborne1_0000_w); DECLARE_WRITE8_MEMBER(osborne1_1000_w); diff --git a/src/mess/machine/osborne1.c b/src/mess/machine/osborne1.c index 999fc900bd2..c92fdf9a1eb 100644 --- a/src/mess/machine/osborne1.c +++ b/src/mess/machine/osborne1.c @@ -53,7 +53,7 @@ READ8_MEMBER( osborne1_state::osborne1_2000_r ) switch( offset & 0x0F00 ) { case 0x100: /* Floppy */ - data = m_fdc->read( space, offset ); + data = m_fdc->read( space, offset & 0x03 ); break; case 0x200: /* Keyboard */ /* Row 0 */ @@ -104,7 +104,7 @@ WRITE8_MEMBER( osborne1_state::osborne1_2000_w ) switch( offset & 0x0F00 ) { case 0x100: /* Floppy */ - m_fdc->write(space, offset, data ); + m_fdc->write(space, offset & 0x03, data ); break; case 0x900: /* IEEE488 PIA */ m_pia0->write(space, offset & 0x03, data ); @@ -261,6 +261,7 @@ WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy ) WRITE8_MEMBER( osborne1_state::video_pia_port_a_w ) { m_fdc->dden_w(BIT(data, 0)); + logerror("dden %u\n",BIT(data, 0)); data -= 0xea; // remove bias @@ -278,10 +279,19 @@ WRITE8_MEMBER( osborne1_state::video_pia_port_b_w ) m_beep_state = BIT(data, 5); if (BIT(data, 6)) - m_fdc->set_drive( 0 ); + { + m_fdc->set_floppy(m_floppy0); + m_floppy0->mon_w(0); + } + else if (BIT(data, 7)) + { + m_fdc->set_floppy(m_floppy1); + m_floppy1->mon_w(0); + } else - if (BIT(data, 7)) - m_fdc->set_drive( 1 ); + { + m_fdc->set_floppy(NULL); + } //logerror("Video pia port b write: %02X\n", data ); } @@ -388,34 +398,8 @@ TIMER_CALLBACK_MEMBER(osborne1_state::setup_osborne1) m_pia1->ca1_w(0); } -static void osborne1_load_proc(device_image_interface &image) -{ - int size = image.length(); - osborne1_state *state = image.device().machine().driver_data(); - - switch( size ) - { - case 40 * 10 * 256: - state->m_fdc->dden_w(ASSERT_LINE); - break; - case 40 * 5 * 1024: - state->m_fdc->dden_w(CLEAR_LINE); - break; - case 40 * 8 * 512: - state->m_fdc->dden_w(ASSERT_LINE); - break; - case 40 * 18 * 128: - state->m_fdc->dden_w(ASSERT_LINE); - break; - case 40 * 9 * 512: - state->m_fdc->dden_w(CLEAR_LINE); - break; - } -} - void osborne1_state::machine_reset() { - int drive; address_space& space = m_maincpu->space(AS_PROGRAM); /* Initialize memory configuration */ osborne1_bankswitch_w( space, 0x00, 0 ); @@ -428,9 +412,6 @@ void osborne1_state::machine_reset() memset( m_ram->pointer() + 0x10000, 0xFF, 0x1000 ); - for(drive=0;drive<2;drive++) - floppy_get_device(machine(), drive)->floppy_install_load_proc(osborne1_load_proc); - space.set_direct_update_handler(direct_update_delegate(FUNC(osborne1_state::osborne1_opbase), this)); }