mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
(MESS) concept: Preliminary implementations of the original and buffered floppy disk controllers. [R. Belmont]
This commit is contained in:
parent
c5e24175a1
commit
8155c6cc77
4
.gitattributes
vendored
4
.gitattributes
vendored
@ -479,6 +479,10 @@ src/emu/bus/a2bus/a2vulcan.c svneol=native#text/plain
|
||||
src/emu/bus/a2bus/a2vulcan.h svneol=native#text/plain
|
||||
src/emu/bus/a2bus/a2zipdrive.c svneol=native#text/plain
|
||||
src/emu/bus/a2bus/a2zipdrive.h svneol=native#text/plain
|
||||
src/emu/bus/a2bus/corvfdc01.c svneol=native#text/plain
|
||||
src/emu/bus/a2bus/corvfdc01.h svneol=native#text/plain
|
||||
src/emu/bus/a2bus/corvfdc02.c svneol=native#text/plain
|
||||
src/emu/bus/a2bus/corvfdc02.h svneol=native#text/plain
|
||||
src/emu/bus/a2bus/laser128.c svneol=native#text/plain
|
||||
src/emu/bus/a2bus/laser128.h svneol=native#text/plain
|
||||
src/emu/bus/a2bus/mouse.c svneol=native#text/plain
|
||||
|
281
src/emu/bus/a2bus/corvfdc01.c
Normal file
281
src/emu/bus/a2bus/corvfdc01.c
Normal file
@ -0,0 +1,281 @@
|
||||
/*********************************************************************
|
||||
|
||||
corvfdc01.c
|
||||
|
||||
Implemention of the Corvus Systems CORVUS01 floppy controller
|
||||
|
||||
Boot PROM 0.8 fixes this at: 8", 500 blocks total, 128 bytes/block,
|
||||
26 sectors/track, 77 tracks.
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "corvfdc01.h"
|
||||
|
||||
/***************************************************************************
|
||||
PARAMETERS
|
||||
***************************************************************************/
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
const device_type A2BUS_CORVFDC01 = &device_creator<a2bus_corvfdc01_device>;
|
||||
|
||||
#define FDC01_ROM_REGION "fdc01_rom"
|
||||
#define FDC01_FDC_TAG "fdc01_fdc"
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( a2bus_corvfdc01_device::corv_floppy_formats )
|
||||
FLOPPY_IMD_FORMAT
|
||||
FLOPPY_FORMATS_END
|
||||
|
||||
static SLOT_INTERFACE_START( corv_floppies )
|
||||
SLOT_INTERFACE( "8dssd", FLOPPY_8_DSSD )
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
MACHINE_CONFIG_FRAGMENT( fdc01 )
|
||||
MCFG_FD1793x_ADD(FDC01_FDC_TAG, XTAL_16MHz / 8)
|
||||
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(a2bus_corvfdc01_device, intrq_w))
|
||||
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(a2bus_corvfdc01_device, drq_w))
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC01_FDC_TAG":0", corv_floppies, "8dssd", a2bus_corvfdc01_device::corv_floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC01_FDC_TAG":1", corv_floppies, "8dssd", a2bus_corvfdc01_device::corv_floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC01_FDC_TAG":2", corv_floppies, "8dssd", a2bus_corvfdc01_device::corv_floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC01_FDC_TAG":3", corv_floppies, "8dssd", a2bus_corvfdc01_device::corv_floppy_formats)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( fdc01 )
|
||||
ROM_REGION(0x20, FDC01_ROM_REGION, 0)
|
||||
ROM_LOAD( "ff01.bin", 0x000000, 0x000020, CRC(ad3c1136) SHA1(b1e1e8a10618588b1b44b3be5d88857497f30b33) )
|
||||
ROM_END
|
||||
|
||||
enum
|
||||
{
|
||||
LS_DRQ_bit = 0, // DRQ
|
||||
LS_INT_bit = 1, // INT
|
||||
LS_SS_bit = 4, // 1 if single-sided (floppy or drive?)
|
||||
LS_8IN_bit = 5, // 1 if 8" floppy drive?
|
||||
LS_DSKCHG_bit = 6, // 0 if disk changed, 1 if not
|
||||
LS_SD_bit = 7, // 1 if single density
|
||||
|
||||
LS_DRQ_mask = (1 << LS_DRQ_bit),
|
||||
LS_INT_mask = (1 << LS_INT_bit),
|
||||
LS_SS_mask = (1 << LS_SS_bit),
|
||||
LS_8IN_mask = (1 << LS_8IN_bit),
|
||||
LS_DSKCHG_mask = (1 << LS_DSKCHG_bit),
|
||||
LS_SD_mask = (1 << LS_SD_bit)
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LC_FLPSD1_bit = 0, // 0 if side 0 , 1 if side 1
|
||||
LC_DE0_bit = 1, // drive select bit 0
|
||||
LC_DE1_bit = 4, // drive select bit 1
|
||||
LC_MOTOROF_bit = 5, // 1 if motor to be turned off
|
||||
LC_FLP8IN_bit = 6, // 1 to select 8", 0 for 5"1/4 (which I knew what it means)
|
||||
LC_FMMFM_bit = 7, // 1 to select single density, 0 for double
|
||||
|
||||
LC_FLPSD1_mask = (1 << LC_FLPSD1_bit),
|
||||
LC_DE0_mask = (1 << LC_DE0_bit),
|
||||
LC_DE1_mask = (1 << LC_DE1_bit),
|
||||
LC_MOTOROF_mask = (1 << LC_MOTOROF_bit),
|
||||
LC_FLP8IN_mask = (1 << LC_FLP8IN_bit),
|
||||
LC_FMMFM_mask = (1 << LC_FMMFM_bit)
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
FUNCTION PROTOTYPES
|
||||
***************************************************************************/
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_config_additions - device-specific
|
||||
// machine configurations
|
||||
//-------------------------------------------------
|
||||
|
||||
machine_config_constructor a2bus_corvfdc01_device::device_mconfig_additions() const
|
||||
{
|
||||
return MACHINE_CONFIG_NAME( fdc01 );
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// rom_region - device-specific ROM region
|
||||
//-------------------------------------------------
|
||||
|
||||
const rom_entry *a2bus_corvfdc01_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( fdc01 );
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
a2bus_corvfdc01_device::a2bus_corvfdc01_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
|
||||
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
|
||||
device_a2bus_card_interface(mconfig, *this),
|
||||
m_wdfdc(*this, FDC01_FDC_TAG),
|
||||
m_con1(*this, FDC01_FDC_TAG":0"),
|
||||
m_con2(*this, FDC01_FDC_TAG":1"),
|
||||
m_con3(*this, FDC01_FDC_TAG":2"),
|
||||
m_con4(*this, FDC01_FDC_TAG":3")
|
||||
{
|
||||
}
|
||||
|
||||
a2bus_corvfdc01_device::a2bus_corvfdc01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, A2BUS_CORVFDC01, "Corvus Systems Floppy Controller", tag, owner, clock, "crvfdc01", __FILE__),
|
||||
device_a2bus_card_interface(mconfig, *this),
|
||||
m_wdfdc(*this, FDC01_FDC_TAG),
|
||||
m_con1(*this, FDC01_FDC_TAG":0"),
|
||||
m_con2(*this, FDC01_FDC_TAG":1"),
|
||||
m_con3(*this, FDC01_FDC_TAG":2"),
|
||||
m_con4(*this, FDC01_FDC_TAG":3")
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void a2bus_corvfdc01_device::device_start()
|
||||
{
|
||||
// set_a2bus_device makes m_slot valid
|
||||
set_a2bus_device();
|
||||
|
||||
astring tempstring;
|
||||
m_rom = device().machine().root_device().memregion(this->subtag(tempstring, FDC01_ROM_REGION))->base();
|
||||
|
||||
save_item(NAME(m_fdc_local_status));
|
||||
save_item(NAME(m_fdc_local_command));
|
||||
}
|
||||
|
||||
void a2bus_corvfdc01_device::device_reset()
|
||||
{
|
||||
m_fdc_local_status = 0;
|
||||
m_fdc_local_command = 0;
|
||||
m_curfloppy = NULL;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
read_c0nx - called for reads from this card's c0nx space
|
||||
-------------------------------------------------*/
|
||||
|
||||
UINT8 a2bus_corvfdc01_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // local status
|
||||
if (m_curfloppy)
|
||||
{
|
||||
m_fdc_local_status &= ~LS_DSKCHG_mask;
|
||||
m_fdc_local_status |= m_curfloppy->dskchg_r() ? LS_DSKCHG_mask : 0;
|
||||
}
|
||||
return m_fdc_local_status;
|
||||
|
||||
case 8: // WD1793 at 8-11
|
||||
return m_wdfdc->status_r(space, offset);
|
||||
|
||||
case 9:
|
||||
return m_wdfdc->track_r(space, offset);
|
||||
|
||||
case 10:
|
||||
return m_wdfdc->sector_r(space, offset);
|
||||
|
||||
case 11:
|
||||
return m_wdfdc->data_r(space, offset);
|
||||
}
|
||||
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
write_c0nx - called for writes to this card's c0nx space
|
||||
-------------------------------------------------*/
|
||||
|
||||
void a2bus_corvfdc01_device::write_c0nx(address_space &space, UINT8 offset, UINT8 data)
|
||||
{
|
||||
int current_drive;
|
||||
floppy_image_device *floppy;
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // LOCAL COMMAND REG
|
||||
m_fdc_local_command = data;
|
||||
|
||||
current_drive = ((data >> LC_DE0_bit) & 1) | ((data >> (LC_DE1_bit-1)) & 2);
|
||||
switch (current_drive)
|
||||
{
|
||||
case 0:
|
||||
floppy = m_con1 ? m_con1->get_device() : 0;
|
||||
break;
|
||||
case 1:
|
||||
floppy = m_con2 ? m_con2->get_device() : 0;
|
||||
break;
|
||||
case 2:
|
||||
floppy = m_con3 ? m_con3->get_device() : 0;
|
||||
break;
|
||||
case 3:
|
||||
floppy = m_con4 ? m_con4->get_device() : 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (floppy != m_curfloppy)
|
||||
{
|
||||
m_wdfdc->set_floppy(floppy);
|
||||
}
|
||||
|
||||
if (m_curfloppy != NULL)
|
||||
{
|
||||
// side select
|
||||
m_curfloppy->ss_w((data & LC_FLPSD1_mask) != 0);
|
||||
|
||||
// motor control (active low)
|
||||
m_curfloppy->mon_w((data & LC_MOTOROF_mask) ? 1 : 0);
|
||||
}
|
||||
|
||||
/*flp_8in = (data & LC_FLP8IN_mask) != 0;*/
|
||||
|
||||
m_wdfdc->dden_w(BIT(data, LC_FMMFM_bit));
|
||||
break;
|
||||
|
||||
case 8: // FDC COMMAMD REG
|
||||
m_wdfdc->cmd_w(space, offset, data);
|
||||
break;
|
||||
|
||||
case 9: // FDC TRACK REG
|
||||
m_wdfdc->track_w(space, offset, data);
|
||||
break;
|
||||
|
||||
case 10: // FDC SECTOR REG
|
||||
m_wdfdc->sector_w(space, offset, data);
|
||||
break;
|
||||
|
||||
case 11: // FDC DATA REG
|
||||
m_wdfdc->data_w(space, offset, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
read_cnxx - called for reads from this card's cnxx space
|
||||
-------------------------------------------------*/
|
||||
|
||||
UINT8 a2bus_corvfdc01_device::read_cnxx(address_space &space, UINT8 offset)
|
||||
{
|
||||
return m_rom[offset & 0x1f];
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(a2bus_corvfdc01_device::intrq_w)
|
||||
{
|
||||
if (state)
|
||||
m_fdc_local_status |= LS_INT_mask;
|
||||
else
|
||||
m_fdc_local_status &= ~LS_INT_mask;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(a2bus_corvfdc01_device::drq_w)
|
||||
{
|
||||
if (state)
|
||||
m_fdc_local_status |= LS_DRQ_mask;
|
||||
else
|
||||
m_fdc_local_status &= ~LS_DRQ_mask;
|
||||
}
|
||||
|
63
src/emu/bus/a2bus/corvfdc01.h
Normal file
63
src/emu/bus/a2bus/corvfdc01.h
Normal file
@ -0,0 +1,63 @@
|
||||
/*********************************************************************
|
||||
|
||||
corvfdc01.h
|
||||
|
||||
Implemention of the Corvus Systems CORVUS01 floppy controller
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef __A2BUS_CORVFDC01__
|
||||
#define __A2BUS_CORVFDC01__
|
||||
|
||||
#include "emu.h"
|
||||
#include "a2bus.h"
|
||||
#include "machine/wd_fdc.h"
|
||||
#include "formats/imd_dsk.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class a2bus_corvfdc01_device:
|
||||
public device_t,
|
||||
public device_a2bus_card_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
a2bus_corvfdc01_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a2bus_corvfdc01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
virtual const rom_entry *device_rom_region() const;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(intrq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(drq_w);
|
||||
|
||||
DECLARE_FLOPPY_FORMATS(corv_floppy_formats);
|
||||
|
||||
protected:
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
// overrides of standard a2bus slot functions
|
||||
virtual UINT8 read_c0nx(address_space &space, UINT8 offset);
|
||||
virtual void write_c0nx(address_space &space, UINT8 offset, UINT8 data);
|
||||
virtual UINT8 read_cnxx(address_space &space, UINT8 offset);
|
||||
|
||||
required_device<fd1793_t> m_wdfdc;
|
||||
required_device<floppy_connector> m_con1;
|
||||
required_device<floppy_connector> m_con2;
|
||||
required_device<floppy_connector> m_con3;
|
||||
required_device<floppy_connector> m_con4;
|
||||
|
||||
private:
|
||||
UINT8 *m_rom;
|
||||
UINT8 m_fdc_local_status, m_fdc_local_command;
|
||||
floppy_image_device *m_curfloppy;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
extern const device_type A2BUS_CORVFDC01;
|
||||
|
||||
#endif /* __A2BUS_CORVFDC01__ */
|
266
src/emu/bus/a2bus/corvfdc02.c
Normal file
266
src/emu/bus/a2bus/corvfdc02.c
Normal file
@ -0,0 +1,266 @@
|
||||
/*********************************************************************
|
||||
|
||||
corvfdc02.c
|
||||
|
||||
Implemention of the Corvus Systems CORVUS02 floppy controller
|
||||
aka the "Buffered Floppy Controller"
|
||||
|
||||
Boot PROM 0.8 says 8" DSDD or 5.25" DSDD
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "corvfdc02.h"
|
||||
|
||||
/***************************************************************************
|
||||
PARAMETERS
|
||||
***************************************************************************/
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
const device_type A2BUS_CORVFDC02 = &device_creator<a2bus_corvfdc02_device>;
|
||||
|
||||
#define FDC02_ROM_REGION "fdc02_rom"
|
||||
#define FDC02_FDC_TAG "fdc02_fdc"
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( a2bus_corvfdc02_device::corv_floppy_formats )
|
||||
FLOPPY_IMD_FORMAT
|
||||
FLOPPY_FORMATS_END
|
||||
|
||||
static SLOT_INTERFACE_START( corv_floppies )
|
||||
SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD )
|
||||
SLOT_INTERFACE( "525dsqd", FLOPPY_525_QD )
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
MACHINE_CONFIG_FRAGMENT( fdc02 )
|
||||
MCFG_UPD765A_ADD(FDC02_FDC_TAG, true, false)
|
||||
MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(a2bus_corvfdc02_device, intrq_w))
|
||||
MCFG_UPD765_DRQ_CALLBACK(WRITELINE(a2bus_corvfdc02_device, drq_w))
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC02_FDC_TAG":0", corv_floppies, "525dsqd", a2bus_corvfdc02_device::corv_floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC02_FDC_TAG":1", corv_floppies, "525dsqd", a2bus_corvfdc02_device::corv_floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC02_FDC_TAG":2", corv_floppies, "525dsqd", a2bus_corvfdc02_device::corv_floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_ADD(FDC02_FDC_TAG":3", corv_floppies, "525dsqd", a2bus_corvfdc02_device::corv_floppy_formats)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( fdc02 )
|
||||
ROM_REGION(0x20, FDC02_ROM_REGION, 0)
|
||||
ROM_LOAD( "bfc00.bin", 0x000000, 0x000020, CRC(98d1a765) SHA1(d27c3c6921e1bb3778a3f78decf106275bc0add1) )
|
||||
ROM_END
|
||||
|
||||
/***************************************************************************
|
||||
FUNCTION PROTOTYPES
|
||||
***************************************************************************/
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_config_additions - device-specific
|
||||
// machine configurations
|
||||
//-------------------------------------------------
|
||||
|
||||
machine_config_constructor a2bus_corvfdc02_device::device_mconfig_additions() const
|
||||
{
|
||||
return MACHINE_CONFIG_NAME( fdc02 );
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// rom_region - device-specific ROM region
|
||||
//-------------------------------------------------
|
||||
|
||||
const rom_entry *a2bus_corvfdc02_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( fdc02 );
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
a2bus_corvfdc02_device::a2bus_corvfdc02_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
|
||||
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
|
||||
device_a2bus_card_interface(mconfig, *this),
|
||||
m_fdc(*this, FDC02_FDC_TAG),
|
||||
m_con1(*this, FDC02_FDC_TAG":0"),
|
||||
m_con2(*this, FDC02_FDC_TAG":1"),
|
||||
m_con3(*this, FDC02_FDC_TAG":2"),
|
||||
m_con4(*this, FDC02_FDC_TAG":3")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
a2bus_corvfdc02_device::a2bus_corvfdc02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, A2BUS_CORVFDC02, "Corvus Systems Buffered Floppy Controller", tag, owner, clock, "crvfdc02", __FILE__),
|
||||
device_a2bus_card_interface(mconfig, *this),
|
||||
m_fdc(*this, FDC02_FDC_TAG),
|
||||
m_con1(*this, FDC02_FDC_TAG":0"),
|
||||
m_con2(*this, FDC02_FDC_TAG":1"),
|
||||
m_con3(*this, FDC02_FDC_TAG":2"),
|
||||
m_con4(*this, FDC02_FDC_TAG":3")
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void a2bus_corvfdc02_device::device_start()
|
||||
{
|
||||
// set_a2bus_device makes m_slot valid
|
||||
set_a2bus_device();
|
||||
|
||||
astring tempstring;
|
||||
m_rom = device().machine().root_device().memregion(this->subtag(tempstring, FDC02_ROM_REGION))->base();
|
||||
|
||||
save_item(NAME(m_fdc_local_status));
|
||||
save_item(NAME(m_fdc_local_command));
|
||||
save_item(NAME(m_bufptr));
|
||||
save_item(NAME(m_buffer));
|
||||
}
|
||||
|
||||
void a2bus_corvfdc02_device::device_reset()
|
||||
{
|
||||
m_fdc_local_status = 2;
|
||||
m_fdc_local_command = 0;
|
||||
m_curfloppy = NULL;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
read_c0nx - called for reads from this card's c0nx space
|
||||
-------------------------------------------------*/
|
||||
|
||||
UINT8 a2bus_corvfdc02_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // 765 FIFO
|
||||
return m_fdc->fifo_r(space, 0);
|
||||
|
||||
case 1: // 765 MSR
|
||||
return m_fdc->msr_r(space, 0);
|
||||
|
||||
case 2: // buffer address
|
||||
return (m_bufptr>>1) & 0xff;
|
||||
|
||||
case 3:
|
||||
// printf("Read buffer @ %x = %02x\n", m_bufptr, m_buffer[m_bufptr]);
|
||||
return m_buffer[m_bufptr];
|
||||
|
||||
case 4: // local status
|
||||
if (m_curfloppy)
|
||||
{
|
||||
m_fdc_local_status &= ~(1 | 0x40);
|
||||
m_fdc_local_status |= m_curfloppy->dskchg_r() ? 1 : 0;
|
||||
m_fdc_local_status |= m_curfloppy->ready_r() ? 0x40 : 0;
|
||||
}
|
||||
return m_fdc_local_status;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
write_c0nx - called for writes to this card's c0nx space
|
||||
-------------------------------------------------*/
|
||||
|
||||
void a2bus_corvfdc02_device::write_c0nx(address_space &space, UINT8 offset, UINT8 data)
|
||||
{
|
||||
floppy_image_device *floppy = NULL;
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // FDC FIFO write
|
||||
m_fdc->fifo_w(space, offset, data);
|
||||
break;
|
||||
|
||||
case 1: // FDC ???
|
||||
break;
|
||||
|
||||
case 2: // buffer address
|
||||
m_bufptr = (data << 1) | (data & 1);
|
||||
// printf("%02x to buffer address yields %x\n", data, m_bufptr);
|
||||
break;
|
||||
|
||||
case 3: // buffer write
|
||||
// printf("%02x to buffer @ %x\n", data, m_bufptr);
|
||||
m_buffer[m_bufptr--] = data;
|
||||
break;
|
||||
|
||||
case 4: // LOCAL COMMAND REG
|
||||
m_fdc_local_command = data;
|
||||
|
||||
// drive select enabled?
|
||||
if (data & 4)
|
||||
{
|
||||
switch (data & 3)
|
||||
{
|
||||
case 0:
|
||||
floppy = m_con1 ? m_con1->get_device() : 0;
|
||||
break;
|
||||
case 1:
|
||||
floppy = m_con2 ? m_con2->get_device() : 0;
|
||||
break;
|
||||
case 2:
|
||||
floppy = m_con3 ? m_con3->get_device() : 0;
|
||||
break;
|
||||
case 3:
|
||||
floppy = m_con4 ? m_con4->get_device() : 0;
|
||||
break;
|
||||
}
|
||||
|
||||
logerror("corvfdc02: selecting drive %d: %p\n", data & 3, floppy);
|
||||
|
||||
if (floppy != m_curfloppy)
|
||||
{
|
||||
m_fdc->set_floppy(floppy);
|
||||
m_curfloppy = floppy;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_curfloppy != NULL)
|
||||
{
|
||||
// motor control (active low)
|
||||
m_curfloppy->mon_w((data & 8) ? 1 : 0);
|
||||
// printf("Cur drive %p motor %s\n", m_curfloppy, (data & 8) ? "OFF" : "ON");
|
||||
}
|
||||
|
||||
if (data & 0x80)
|
||||
{
|
||||
// printf("Reset NEC765\n");
|
||||
m_fdc->reset();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
read_cnxx - called for reads from this card's cnxx space
|
||||
-------------------------------------------------*/
|
||||
|
||||
UINT8 a2bus_corvfdc02_device::read_cnxx(address_space &space, UINT8 offset)
|
||||
{
|
||||
return m_rom[offset & 0x1f];
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(a2bus_corvfdc02_device::intrq_w)
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
m_fdc_local_status &= ~2; // indicate IRQ occured
|
||||
if (m_fdc_local_command & 0x20)
|
||||
{
|
||||
raise_slot_irq();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_fdc_local_status |= 2; // clear IRQ
|
||||
lower_slot_irq();
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(a2bus_corvfdc02_device::drq_w)
|
||||
{
|
||||
// printf("DRQ: %d\n", state);
|
||||
}
|
||||
|
65
src/emu/bus/a2bus/corvfdc02.h
Normal file
65
src/emu/bus/a2bus/corvfdc02.h
Normal file
@ -0,0 +1,65 @@
|
||||
/*********************************************************************
|
||||
|
||||
corvfdc02.h
|
||||
|
||||
Implemention of the Corvus Systems CORVUS02 floppy controller
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef __A2BUS_CORVFDC02__
|
||||
#define __A2BUS_CORVFDC02__
|
||||
|
||||
#include "emu.h"
|
||||
#include "a2bus.h"
|
||||
#include "machine/upd765.h"
|
||||
#include "formats/imd_dsk.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class a2bus_corvfdc02_device:
|
||||
public device_t,
|
||||
public device_a2bus_card_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
a2bus_corvfdc02_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a2bus_corvfdc02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
virtual const rom_entry *device_rom_region() const;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(intrq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(drq_w);
|
||||
|
||||
DECLARE_FLOPPY_FORMATS(corv_floppy_formats);
|
||||
|
||||
protected:
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
// overrides of standard a2bus slot functions
|
||||
virtual UINT8 read_c0nx(address_space &space, UINT8 offset);
|
||||
virtual void write_c0nx(address_space &space, UINT8 offset, UINT8 data);
|
||||
virtual UINT8 read_cnxx(address_space &space, UINT8 offset);
|
||||
|
||||
required_device<upd765a_device> m_fdc;
|
||||
required_device<floppy_connector> m_con1;
|
||||
required_device<floppy_connector> m_con2;
|
||||
required_device<floppy_connector> m_con3;
|
||||
required_device<floppy_connector> m_con4;
|
||||
|
||||
private:
|
||||
UINT8 *m_rom;
|
||||
UINT8 m_fdc_local_status, m_fdc_local_command;
|
||||
UINT16 m_bufptr;
|
||||
UINT8 m_buffer[2048]; // 1x6116 SRAM
|
||||
floppy_image_device *m_curfloppy;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
extern const device_type A2BUS_CORVFDC02;
|
||||
|
||||
#endif /* __A2BUS_CORVFDC02__ */
|
@ -781,6 +781,8 @@ BUSOBJS += $(BUSOBJ)/a2bus/a2mcms.o
|
||||
BUSOBJS += $(BUSOBJ)/a2bus/a2dx1.o
|
||||
BUSOBJS += $(BUSOBJ)/a2bus/timemasterho.o
|
||||
BUSOBJS += $(BUSOBJ)/a2bus/mouse.o
|
||||
BUSOBJS += $(BUSOBJ)/a2bus/corvfdc01.o
|
||||
BUSOBJS += $(BUSOBJ)/a2bus/corvfdc02.o
|
||||
endif
|
||||
|
||||
#-------------------------------------------------
|
||||
|
@ -32,6 +32,8 @@
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "includes/concept.h"
|
||||
#include "bus/a2bus/a2corvus.h"
|
||||
#include "bus/a2bus/corvfdc01.h"
|
||||
#include "bus/a2bus/corvfdc02.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
static ADDRESS_MAP_START(concept_memmap, AS_PROGRAM, 16, concept_state )
|
||||
@ -194,6 +196,8 @@ INPUT_PORTS_END
|
||||
|
||||
SLOT_INTERFACE_START( concept_a2_cards )
|
||||
SLOT_INTERFACE("fchdd", A2BUS_CORVUS) /* Corvus flat-cable HDD interface (see notes in a2corvus.c) */
|
||||
SLOT_INTERFACE("fdc01", A2BUS_CORVFDC01) /* Corvus WD1793 floppy controller */
|
||||
SLOT_INTERFACE("fdc02", A2BUS_CORVFDC02) /* Corvus NEC765 buffered floppy controller */
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
|
||||
@ -254,7 +258,7 @@ static MACHINE_CONFIG_START( concept, concept_state )
|
||||
MCFG_A2BUS_SLOT_ADD(A2BUS_TAG, "sl1", concept_a2_cards, NULL)
|
||||
MCFG_A2BUS_SLOT_ADD(A2BUS_TAG, "sl2", concept_a2_cards, NULL)
|
||||
MCFG_A2BUS_SLOT_ADD(A2BUS_TAG, "sl3", concept_a2_cards, NULL)
|
||||
MCFG_A2BUS_SLOT_ADD(A2BUS_TAG, "sl4", concept_a2_cards, "fchdd")
|
||||
MCFG_A2BUS_SLOT_ADD(A2BUS_TAG, "sl4", concept_a2_cards, "fdc02")
|
||||
|
||||
/* 2x RS232 ports */
|
||||
MCFG_RS232_PORT_ADD("rs232a", default_rs232_devices, NULL)
|
||||
|
Loading…
Reference in New Issue
Block a user