wd_fdc: Hold DRQ in status register until scan ID command has been fully read. This fixes Osborne 1/2

This commit is contained in:
Curt Coder 2014-05-19 21:16:03 +00:00
parent a6dd3e9c1b
commit bfc80dde16
4 changed files with 32 additions and 50 deletions

View File

@ -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

View File

@ -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))

View File

@ -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<cpu_device> m_maincpu;
required_device<pia6821_device> m_pia0;
required_device<pia6821_device> m_pia1;
required_device<mb8877_device> m_fdc;
required_device<mb8877_t> m_fdc;
required_device<beep_device> m_beep;
required_device<ram_device> m_ram;
required_device<ieee488_device> m_ieee;
required_device<floppy_image_device> m_floppy0;
required_device<floppy_image_device> m_floppy1;
DECLARE_WRITE8_MEMBER(osborne1_0000_w);
DECLARE_WRITE8_MEMBER(osborne1_1000_w);

View File

@ -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<osborne1_state>();
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));
}