Added first step in adding floppy hook-up to Acorn Archimedes, removed old device implementation in favor of new device core.

This commit is contained in:
Angelo Salese 2014-04-11 19:21:50 +00:00
parent 29225a4dbb
commit 4b25602230
3 changed files with 44 additions and 28 deletions

View File

@ -10,7 +10,7 @@
#include "machine/aakart.h"
#include "sound/dac.h"
#include "machine/i2cmem.h"
#include "machine/wd17xx.h"
#include "machine/wd_fdc.h"
// interrupt definitions. these are for the real Archimedes computer - arcade
// and gambling knockoffs likely are a bit different.
@ -47,7 +47,9 @@ public:
m_kart(*this, "kart"),
m_maincpu(*this, "maincpu"),
m_i2cmem(*this, "i2cmem"),
m_wd1772(*this, "wd1772"),
m_fdc(*this, "fdc"),
m_floppy0(*this, "fdc:0"),
m_floppy1(*this, "fdc:1"),
m_region_maincpu(*this, "maincpu"),
m_region_vram(*this, "vram"),
m_screen(*this, "screen"),
@ -92,7 +94,9 @@ public:
protected:
required_device<cpu_device> m_maincpu;
optional_device<i2cmem_device> m_i2cmem;
optional_device<wd1772_device> m_wd1772;
optional_device<wd1772_t> m_fdc;
optional_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
required_memory_region m_region_maincpu;
required_memory_region m_region_vram;
required_device<screen_device> m_screen;

View File

@ -685,9 +685,9 @@ READ32_MEMBER(archimedes_state::archimedes_ioc_r)
{
case 0: return ioc_ctrl_r(space,offset,mem_mask);
case 1:
if (m_wd1772) {
if (m_fdc) {
logerror("17XX: R @ addr %x mask %08x\n", offset*4, mem_mask);
return m_wd1772->data_r(space, offset&0xf);
return m_fdc->data_r(space, offset&0xf);
} else {
logerror("Read from FDC device?\n");
return 0;
@ -702,7 +702,7 @@ READ32_MEMBER(archimedes_state::archimedes_ioc_r)
logerror("IOC: Internal Podule Read\n");
return 0xffff;
case 5:
if (m_wd1772) {
if (m_fdc) {
switch(ioc_addr & 0xfffc)
{
case 0x50: return 0; //fdc type, new model returns 5 here
@ -740,9 +740,9 @@ WRITE32_MEMBER(archimedes_state::archimedes_ioc_w)
{
case 0: ioc_ctrl_w(space,offset,data,mem_mask); return;
case 1:
if (m_wd1772) {
if (m_fdc) {
logerror("17XX: %x to addr %x mask %08x\n", data, offset*4, mem_mask);
m_wd1772->data_w(space, offset&0xf, data&0xff);
m_fdc->data_w(space, offset&0xf, data&0xff);
} else {
logerror("Write to FDC device?\n");
}
@ -757,20 +757,28 @@ WRITE32_MEMBER(archimedes_state::archimedes_ioc_w)
logerror("IOC: Internal Podule Write\n");
return;
case 5:
if (m_wd1772) {
if (m_fdc) {
switch(ioc_addr & 0xfffc)
{
case 0x18: // latch B
m_wd1772->dden_w(BIT(data, 1));
m_fdc->dden_w(BIT(data, 1));
return;
case 0x40: // latch A
if (data & 1) { m_wd1772->set_drive(0); }
if (data & 2) { m_wd1772->set_drive(1); }
if (data & 4) { m_wd1772->set_drive(2); }
if (data & 8) { m_wd1772->set_drive(3); }
floppy_image_device *floppy = NULL;
m_wd1772->set_side((data & 0x10)>>4);
if (data & 1) { floppy = m_floppy0->get_device(); }
if (data & 2) { floppy = m_floppy1->get_device(); }
//if (data & 4) { m_fdc->set_drive(2); }
//if (data & 8) { m_fdc->set_drive(3); }
m_fdc->set_floppy(floppy);
if(floppy)
{
floppy->mon_w(BIT(data, 5));
m_fdc->dden_w(BIT(data, 4));
}
//bit 5 is motor on
return;
}
@ -920,6 +928,7 @@ WRITE32_MEMBER(archimedes_state::archimedes_vidc_w)
//#ifdef MAME_DEBUG
if(0)
logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], m_vidc_regs[reg]);
//#endif

View File

@ -15,6 +15,7 @@
* \- some subtle memory paging fault
* \- missing RAM max size
* \- ARM bug?
* - 38776b8
*
*
=======================================================================================
@ -58,14 +59,14 @@
#include "emu.h"
#include "machine/wd17xx.h"
#include "imagedev/flopdrv.h"
#include "cpu/arm/arm.h"
#include "sound/dac.h"
#include "includes/archimds.h"
#include "machine/i2cmem.h"
//#include "machine/aakart.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
#include "formats/applix_dsk.h"
class a310_state : public archimedes_state
@ -87,6 +88,7 @@ public:
virtual void machine_start();
virtual void machine_reset();
DECLARE_INPUT_CHANGED_MEMBER(key_stroke);
DECLARE_FLOPPY_FORMATS( floppy_formats );
protected:
@ -296,13 +298,13 @@ static INPUT_PORTS_START( a310 )
PORT_BIT (0xf8, 0x80, IPT_UNUSED)
INPUT_PORTS_END
static const wd17xx_interface a310_wd17xx_interface =
{
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(a310_state, a310_wd177x_intrq_w),
DEVCB_DRIVER_LINE_MEMBER(a310_state, a310_wd177x_drq_w),
{FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
};
FLOPPY_FORMATS_MEMBER( a310_state::floppy_formats )
FLOPPY_APPLIX_FORMAT
FLOPPY_FORMATS_END
static SLOT_INTERFACE_START( a310_floppies )
SLOT_INTERFACE( "35dd", FLOPPY_35_DD )
SLOT_INTERFACE_END
WRITE_LINE_MEMBER( archimedes_state::a310_kart_tx_w )
{
@ -331,13 +333,14 @@ static ARM_INTERFACE( a310_config )
ARM_COPRO_TYPE_VL86C020
};
static MACHINE_CONFIG_START( a310, a310_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", ARM, 8000000) /* 8 MHz */
MCFG_CPU_PROGRAM_MAP(a310_mem)
MCFG_CPU_CONFIG(a310_config)
MCFG_AAKART_ADD("kart", 8000000/256, kart_interface) // TODO: frequency
MCFG_AAKART_ADD("kart", 8000000/256, kart_interface)
MCFG_I2CMEM_ADD("i2cmem")
MCFG_I2CMEM_DATA_SIZE(0x100)
@ -356,9 +359,9 @@ static MACHINE_CONFIG_START( a310, a310_state )
MCFG_RAM_DEFAULT_SIZE("2M")
MCFG_RAM_EXTRA_OPTIONS("512K, 1M, 4M, 8M, 16M")
MCFG_WD1772_ADD("wd1772", a310_wd17xx_interface )
//MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(a310_floppy_interface)
MCFG_WD1772x_ADD("fdc", 8000000 / 2)
MCFG_FLOPPY_DRIVE_ADD("fdc:0", a310_floppies, "35dd", a310_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", a310_floppies, "35dd", a310_state::floppy_formats)
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("dac0", DAC, 0)