mirror of
https://github.com/holub/mame
synced 2025-06-02 19:06:43 +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);
|
||||
}
|
||||
|
||||
if(main_state == IDLE || status_type_1) {
|
||||
if((main_state == IDLE && !drq) || status_type_1) {
|
||||
if(floppy && floppy->idx_r())
|
||||
status |= S_IP;
|
||||
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)
|
||||
*
|
||||
*/
|
||||
/*
|
||||
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))
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user