mirror of
https://github.com/holub/mame
synced 2025-06-07 13:23:50 +03:00
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:
parent
a6dd3e9c1b
commit
bfc80dde16
@ -1052,7 +1052,7 @@ UINT8 wd_fdc_t::status_r()
|
|||||||
intrq_cb(intrq);
|
intrq_cb(intrq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(main_state == IDLE || status_type_1) {
|
if((main_state == IDLE && !drq) || status_type_1) {
|
||||||
if(floppy && floppy->idx_r())
|
if(floppy && floppy->idx_r())
|
||||||
status |= S_IP;
|
status |= S_IP;
|
||||||
else
|
else
|
||||||
|
@ -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)
|
* - DEC 1820 double density: 40 tracks, 9 sectors per track, 512-byte sectors (180 KByte)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
static LEGACY_FLOPPY_OPTIONS_START(osborne1 )
|
static LEGACY_FLOPPY_OPTIONS_START(osborne1 )
|
||||||
LEGACY_FLOPPY_OPTION( osd, "img", "Osborne single density", basicdsk_identify_default, basicdsk_construct_default, NULL,
|
LEGACY_FLOPPY_OPTION( osd, "img", "Osborne single density", basicdsk_identify_default, basicdsk_construct_default, NULL,
|
||||||
HEADS([1])
|
HEADS([1])
|
||||||
@ -198,13 +199,12 @@ static LEGACY_FLOPPY_OPTIONS_START(osborne1 )
|
|||||||
SECTOR_LENGTH([512])
|
SECTOR_LENGTH([512])
|
||||||
FIRST_SECTOR_ID([1]))
|
FIRST_SECTOR_ID([1]))
|
||||||
LEGACY_FLOPPY_OPTIONS_END
|
LEGACY_FLOPPY_OPTIONS_END
|
||||||
|
*/
|
||||||
|
|
||||||
static const floppy_interface osborne1_floppy_interface =
|
static SLOT_INTERFACE_START( osborne1_floppies )
|
||||||
{
|
SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD ) // Siemens FDD 100-5, custom Osborne electronics
|
||||||
FLOPPY_STANDARD_5_25_SSDD_40,
|
SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD ) // MPI 52(?), custom Osborne electronics
|
||||||
LEGACY_FLOPPY_OPTIONS_NAME(osborne1),
|
SLOT_INTERFACE_END
|
||||||
"floppy_5_25"
|
|
||||||
};
|
|
||||||
|
|
||||||
/* F4 Character Displayer */
|
/* F4 Character Displayer */
|
||||||
static const gfx_layout osborne1_charlayout =
|
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_IO_MAP( osborne1_io)
|
||||||
MCFG_CPU_CONFIG( osborne1_daisy_chain )
|
MCFG_CPU_CONFIG( osborne1_daisy_chain )
|
||||||
|
|
||||||
|
|
||||||
MCFG_DEVICE_ADD( "osborne1_daisy", OSBORNE1_DAISY, 0 )
|
MCFG_DEVICE_ADD( "osborne1_daisy", OSBORNE1_DAISY, 0 )
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
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_CB2_HANDLER(WRITELINE(osborne1_state, video_pia_out_cb2_dummy))
|
||||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func))
|
MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func))
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("mb8877", MB8877, 0)
|
MCFG_DEVICE_ADD("mb8877", MB8877x, MAIN_CLOCK/16)
|
||||||
MCFG_WD17XX_DEFAULT_DRIVE2_TAGS
|
MCFG_WD_FDC_FORCE_READY
|
||||||
|
MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
|
||||||
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(osborne1_floppy_interface)
|
MCFG_FLOPPY_DRIVE_ADD("mb8877:1", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
|
||||||
|
|
||||||
MCFG_IEEE488_BUS_ADD()
|
MCFG_IEEE488_BUS_ADD()
|
||||||
MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w))
|
MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w))
|
||||||
|
@ -15,9 +15,7 @@
|
|||||||
#include "machine/6850acia.h"
|
#include "machine/6850acia.h"
|
||||||
#include "bus/ieee488/ieee488.h"
|
#include "bus/ieee488/ieee488.h"
|
||||||
#include "machine/ram.h"
|
#include "machine/ram.h"
|
||||||
#include "machine/wd17xx.h"
|
#include "machine/wd_fdc.h"
|
||||||
#include "imagedev/flopdrv.h"
|
|
||||||
#include "formats/basicdsk.h"
|
|
||||||
|
|
||||||
class osborne1_state : public driver_device
|
class osborne1_state : public driver_device
|
||||||
{
|
{
|
||||||
@ -37,6 +35,8 @@ public:
|
|||||||
m_beep(*this, "beeper"),
|
m_beep(*this, "beeper"),
|
||||||
m_ram(*this, RAM_TAG),
|
m_ram(*this, RAM_TAG),
|
||||||
m_ieee(*this, IEEE488_TAG),
|
m_ieee(*this, IEEE488_TAG),
|
||||||
|
m_floppy0(*this, "mb8877:0:525ssdd"),
|
||||||
|
m_floppy1(*this, "mb8877:1:525ssdd"),
|
||||||
m_row0(*this, "ROW0"),
|
m_row0(*this, "ROW0"),
|
||||||
m_row1(*this, "ROW1"),
|
m_row1(*this, "ROW1"),
|
||||||
m_row2(*this, "ROW2"),
|
m_row2(*this, "ROW2"),
|
||||||
@ -60,10 +60,12 @@ public:
|
|||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<pia6821_device> m_pia0;
|
required_device<pia6821_device> m_pia0;
|
||||||
required_device<pia6821_device> m_pia1;
|
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<beep_device> m_beep;
|
||||||
required_device<ram_device> m_ram;
|
required_device<ram_device> m_ram;
|
||||||
required_device<ieee488_device> m_ieee;
|
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_0000_w);
|
||||||
DECLARE_WRITE8_MEMBER(osborne1_1000_w);
|
DECLARE_WRITE8_MEMBER(osborne1_1000_w);
|
||||||
|
@ -53,7 +53,7 @@ READ8_MEMBER( osborne1_state::osborne1_2000_r )
|
|||||||
switch( offset & 0x0F00 )
|
switch( offset & 0x0F00 )
|
||||||
{
|
{
|
||||||
case 0x100: /* Floppy */
|
case 0x100: /* Floppy */
|
||||||
data = m_fdc->read( space, offset );
|
data = m_fdc->read( space, offset & 0x03 );
|
||||||
break;
|
break;
|
||||||
case 0x200: /* Keyboard */
|
case 0x200: /* Keyboard */
|
||||||
/* Row 0 */
|
/* Row 0 */
|
||||||
@ -104,7 +104,7 @@ WRITE8_MEMBER( osborne1_state::osborne1_2000_w )
|
|||||||
switch( offset & 0x0F00 )
|
switch( offset & 0x0F00 )
|
||||||
{
|
{
|
||||||
case 0x100: /* Floppy */
|
case 0x100: /* Floppy */
|
||||||
m_fdc->write(space, offset, data );
|
m_fdc->write(space, offset & 0x03, data );
|
||||||
break;
|
break;
|
||||||
case 0x900: /* IEEE488 PIA */
|
case 0x900: /* IEEE488 PIA */
|
||||||
m_pia0->write(space, offset & 0x03, data );
|
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 )
|
WRITE8_MEMBER( osborne1_state::video_pia_port_a_w )
|
||||||
{
|
{
|
||||||
m_fdc->dden_w(BIT(data, 0));
|
m_fdc->dden_w(BIT(data, 0));
|
||||||
|
logerror("dden %u\n",BIT(data, 0));
|
||||||
|
|
||||||
data -= 0xea; // remove bias
|
data -= 0xea; // remove bias
|
||||||
|
|
||||||
@ -278,10 +279,19 @@ WRITE8_MEMBER( osborne1_state::video_pia_port_b_w )
|
|||||||
m_beep_state = BIT(data, 5);
|
m_beep_state = BIT(data, 5);
|
||||||
|
|
||||||
if (BIT(data, 6))
|
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
|
else
|
||||||
if (BIT(data, 7))
|
{
|
||||||
m_fdc->set_drive( 1 );
|
m_fdc->set_floppy(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
//logerror("Video pia port b write: %02X\n", data );
|
//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);
|
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()
|
void osborne1_state::machine_reset()
|
||||||
{
|
{
|
||||||
int drive;
|
|
||||||
address_space& space = m_maincpu->space(AS_PROGRAM);
|
address_space& space = m_maincpu->space(AS_PROGRAM);
|
||||||
/* Initialize memory configuration */
|
/* Initialize memory configuration */
|
||||||
osborne1_bankswitch_w( space, 0x00, 0 );
|
osborne1_bankswitch_w( space, 0x00, 0 );
|
||||||
@ -428,9 +412,6 @@ void osborne1_state::machine_reset()
|
|||||||
|
|
||||||
memset( m_ram->pointer() + 0x10000, 0xFF, 0x1000 );
|
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));
|
space.set_direct_update_handler(direct_update_delegate(FUNC(osborne1_state::osborne1_opbase), this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user