mirror of
https://github.com/holub/mame
synced 2025-07-02 00:29:37 +03:00
(MESS) abc80x: Floppy modernization. (nw)
This commit is contained in:
parent
4f4c70abb1
commit
a10c961810
@ -237,7 +237,7 @@ READ8_MEMBER( luxor_55_10828_device::pio_pb_r )
|
|||||||
UINT8 data = 0x04;
|
UINT8 data = 0x04;
|
||||||
|
|
||||||
// single/double sided drive
|
// single/double sided drive
|
||||||
UINT8 sw1 = ioport("SW1")->read() & 0x0f;
|
UINT8 sw1 = m_sw1->read() & 0x0f;
|
||||||
int ds0 = m_sel0 ? BIT(sw1, 0) : 1;
|
int ds0 = m_sel0 ? BIT(sw1, 0) : 1;
|
||||||
int ds1 = m_sel1 ? BIT(sw1, 1) : 1;
|
int ds1 = m_sel1 ? BIT(sw1, 1) : 1;
|
||||||
data |= !(ds0 & ds1);
|
data |= !(ds0 & ds1);
|
||||||
@ -251,8 +251,8 @@ READ8_MEMBER( luxor_55_10828_device::pio_pb_r )
|
|||||||
data |= 0x10;
|
data |= 0x10;
|
||||||
|
|
||||||
// head load
|
// head load
|
||||||
// data |= wd17xx_hdld_r(device) << 6;
|
data |= m_fdc->hld_r() << 6;
|
||||||
data |= 0x40;
|
data |= 0x40; // TODO remove
|
||||||
|
|
||||||
// FDC interrupt request
|
// FDC interrupt request
|
||||||
data |= m_fdc_irq << 7;
|
data |= m_fdc_irq << 7;
|
||||||
@ -278,10 +278,10 @@ WRITE8_MEMBER( luxor_55_10828_device::pio_pb_w )
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// double density enable
|
// double density enable
|
||||||
wd17xx_dden_w(m_fdc, BIT(data, 3));
|
m_fdc->dden_w(BIT(data, 3));
|
||||||
|
|
||||||
// head load timing
|
// head load timing
|
||||||
// wd17xx_hlt_w(m_fdc, BIT(data, 5));
|
m_fdc->hlt_w(BIT(data, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
static Z80PIO_INTERFACE( pio_intf )
|
static Z80PIO_INTERFACE( pio_intf )
|
||||||
@ -311,20 +311,15 @@ static const z80_daisy_config daisy_chain[] =
|
|||||||
// wd17xx_interface fdc_intf
|
// wd17xx_interface fdc_intf
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
static const floppy_interface lux10828_floppy_interface =
|
static SLOT_INTERFACE_START( abc_floppies )
|
||||||
{
|
SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "525sd", FLOPPY_525_SD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE_END
|
||||||
FLOPPY_STANDARD_5_25_DSDD,
|
|
||||||
LEGACY_FLOPPY_OPTIONS_NAME(default),
|
|
||||||
"floppy_5_25",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( luxor_55_10828_device::fdc_intrq_w )
|
void luxor_55_10828_device::fdc_intrq_w(bool state)
|
||||||
{
|
{
|
||||||
m_fdc_irq = state;
|
m_fdc_irq = state;
|
||||||
m_pio->port_b_write(state << 7);
|
m_pio->port_b_write(state << 7);
|
||||||
@ -332,37 +327,29 @@ WRITE_LINE_MEMBER( luxor_55_10828_device::fdc_intrq_w )
|
|||||||
if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( luxor_55_10828_device::fdc_drq_w )
|
void luxor_55_10828_device::fdc_drq_w(bool state)
|
||||||
{
|
{
|
||||||
m_fdc_drq = state;
|
m_fdc_drq = state;
|
||||||
|
|
||||||
if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const wd17xx_interface fdc_intf =
|
|
||||||
{
|
|
||||||
DEVCB_NULL,
|
|
||||||
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, luxor_55_10828_device, fdc_intrq_w),
|
|
||||||
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, luxor_55_10828_device, fdc_drq_w),
|
|
||||||
{ FLOPPY_0, FLOPPY_1, NULL, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// MACHINE_DRIVER( luxor_55_10828 )
|
// MACHINE_DRIVER( luxor_55_10828 )
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
static MACHINE_CONFIG_FRAGMENT( luxor_55_10828 )
|
static MACHINE_CONFIG_FRAGMENT( luxor_55_10828 )
|
||||||
// main CPU
|
|
||||||
MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_4MHz/2)
|
MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_4MHz/2)
|
||||||
MCFG_CPU_PROGRAM_MAP(luxor_55_10828_mem)
|
MCFG_CPU_PROGRAM_MAP(luxor_55_10828_mem)
|
||||||
MCFG_CPU_IO_MAP(luxor_55_10828_io)
|
MCFG_CPU_IO_MAP(luxor_55_10828_io)
|
||||||
MCFG_CPU_CONFIG(daisy_chain)
|
MCFG_CPU_CONFIG(daisy_chain)
|
||||||
|
|
||||||
// devices
|
|
||||||
MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_4MHz/2, pio_intf)
|
MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_4MHz/2, pio_intf)
|
||||||
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(lux10828_floppy_interface)
|
MCFG_FD1791x_ADD(FD1791_TAG, XTAL_4MHz/2)
|
||||||
MCFG_FD1791_ADD(FD1791_TAG, fdc_intf)
|
|
||||||
|
MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":0", abc_floppies, "525dd", NULL, floppy_image_device::default_floppy_formats)
|
||||||
|
MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":1", abc_floppies, "525dd", NULL, floppy_image_device::default_floppy_formats)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
|
||||||
@ -428,8 +415,10 @@ luxor_55_10828_device::luxor_55_10828_device(const machine_config &mconfig, cons
|
|||||||
m_maincpu(*this, Z80_TAG),
|
m_maincpu(*this, Z80_TAG),
|
||||||
m_pio(*this, Z80PIO_TAG),
|
m_pio(*this, Z80PIO_TAG),
|
||||||
m_fdc(*this, FD1791_TAG),
|
m_fdc(*this, FD1791_TAG),
|
||||||
m_image0(*this, FLOPPY_0),
|
m_floppy0(*this, FD1791_TAG":0"),
|
||||||
m_image1(*this, FLOPPY_1),
|
m_floppy1(*this, FD1791_TAG":1"),
|
||||||
|
m_sw1(*this, "SW1"),
|
||||||
|
m_s1(*this, "S1"),
|
||||||
m_cs(false),
|
m_cs(false),
|
||||||
m_fdc_irq(0),
|
m_fdc_irq(0),
|
||||||
m_fdc_drq(0),
|
m_fdc_drq(0),
|
||||||
@ -488,7 +477,7 @@ void luxor_55_10828_device::device_reset()
|
|||||||
|
|
||||||
void luxor_55_10828_device::abcbus_cs(UINT8 data)
|
void luxor_55_10828_device::abcbus_cs(UINT8 data)
|
||||||
{
|
{
|
||||||
UINT8 address = 0x2c | BIT(ioport("S1")->read(), 0);
|
UINT8 address = 0x2c | BIT(m_s1->read(), 0);
|
||||||
|
|
||||||
m_cs = (data == address);
|
m_cs = (data == address);
|
||||||
}
|
}
|
||||||
@ -619,27 +608,30 @@ WRITE8_MEMBER( luxor_55_10828_device::ctrl_w )
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// drive selection
|
// drive selection
|
||||||
if (BIT(data, 0)) wd17xx_set_drive(m_fdc, 0);
|
|
||||||
if (BIT(data, 1)) wd17xx_set_drive(m_fdc, 1);
|
|
||||||
// if (BIT(data, 2)) wd17xx_set_drive(m_fdc, 2);
|
|
||||||
m_sel0 = BIT(data, 0);
|
m_sel0 = BIT(data, 0);
|
||||||
m_sel1 = BIT(data, 1);
|
m_sel1 = BIT(data, 1);
|
||||||
|
|
||||||
// motor enable
|
floppy_image_device *floppy = NULL;
|
||||||
int moton = BIT(data, 3);
|
|
||||||
floppy_mon_w(m_image0, moton);
|
|
||||||
floppy_mon_w(m_image1, moton);
|
|
||||||
floppy_drive_set_ready_state(m_image0, !moton, 1);
|
|
||||||
floppy_drive_set_ready_state(m_image1, !moton, 1);
|
|
||||||
|
|
||||||
// side selection
|
if (BIT(data, 0)) floppy = m_floppy0->get_device();
|
||||||
//wd17xx_set_side(m_fdc, BIT(data, 4));
|
if (BIT(data, 1)) floppy = m_floppy1->get_device();
|
||||||
|
|
||||||
|
m_fdc->set_floppy(floppy);
|
||||||
|
|
||||||
|
if (floppy)
|
||||||
|
{
|
||||||
|
// motor enable
|
||||||
|
floppy->mon_w(BIT(data, 3));
|
||||||
|
|
||||||
|
// side select
|
||||||
|
floppy->ss_w(BIT(data, 4));
|
||||||
|
}
|
||||||
|
|
||||||
// wait enable
|
// wait enable
|
||||||
m_wait_enable = BIT(data, 6);
|
m_wait_enable = BIT(data, 6);
|
||||||
|
|
||||||
// FDC master reset
|
// FDC master reset
|
||||||
wd17xx_mr_w(m_fdc, BIT(data, 7));
|
if (!BIT(data, 7)) m_fdc->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -664,10 +656,10 @@ WRITE8_MEMBER( luxor_55_10828_device::status_w )
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// interrupt
|
|
||||||
// abcbus_int_w(m_bus, BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE);
|
|
||||||
|
|
||||||
m_status = data & 0xfe;
|
m_status = data & 0xfe;
|
||||||
|
|
||||||
|
// interrupt
|
||||||
|
m_bus->int_w(BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -677,23 +669,14 @@ WRITE8_MEMBER( luxor_55_10828_device::status_w )
|
|||||||
|
|
||||||
READ8_MEMBER( luxor_55_10828_device::fdc_r )
|
READ8_MEMBER( luxor_55_10828_device::fdc_r )
|
||||||
{
|
{
|
||||||
UINT8 data = 0xff;
|
|
||||||
|
|
||||||
if (!m_wait_enable && !m_fdc_irq && !m_fdc_drq)
|
if (!m_wait_enable && !m_fdc_irq && !m_fdc_drq)
|
||||||
{
|
{
|
||||||
logerror("WAIT\n");
|
fatalerror("Z80 WAIT not supported by MAME core\n");
|
||||||
|
|
||||||
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
|
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (offset & 0x03)
|
return m_fdc->gen_r(offset);
|
||||||
{
|
|
||||||
case 0: data = wd17xx_status_r(m_fdc, space, 0); break;
|
|
||||||
case 1: data = wd17xx_track_r(m_fdc, space, 0); break;
|
|
||||||
case 2: data = wd17xx_sector_r(m_fdc, space, 0); break;
|
|
||||||
case 3: data = wd17xx_data_r(m_fdc, space, 0); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -705,17 +688,12 @@ WRITE8_MEMBER( luxor_55_10828_device::fdc_w )
|
|||||||
{
|
{
|
||||||
if (!m_wait_enable && !m_fdc_irq && !m_fdc_drq)
|
if (!m_wait_enable && !m_fdc_irq && !m_fdc_drq)
|
||||||
{
|
{
|
||||||
logerror("WAIT\n");
|
fatalerror("Z80 WAIT not supported by MAME core\n");
|
||||||
|
|
||||||
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
|
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (offset & 0x03)
|
m_fdc->gen_w(offset, data);
|
||||||
{
|
|
||||||
case 0: wd17xx_command_w(m_fdc, space, 0, data); break;
|
|
||||||
case 1: wd17xx_track_w(m_fdc, space, 0, data); break;
|
|
||||||
case 2: wd17xx_sector_w(m_fdc, space, 0, data); break;
|
|
||||||
case 3: wd17xx_data_w(m_fdc, space, 0, data); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,11 +16,8 @@
|
|||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "cpu/z80/z80daisy.h"
|
#include "cpu/z80/z80daisy.h"
|
||||||
#include "formats/basicdsk.h"
|
|
||||||
#include "imagedev/flopdrv.h"
|
|
||||||
#include "machine/abcbus.h"
|
#include "machine/abcbus.h"
|
||||||
#include "machine/devhelpr.h"
|
#include "machine/wd_fdc.h"
|
||||||
#include "machine/wd17xx.h"
|
|
||||||
#include "machine/z80pio.h"
|
#include "machine/z80pio.h"
|
||||||
|
|
||||||
|
|
||||||
@ -29,9 +26,6 @@
|
|||||||
// MACROS / CONSTANTS
|
// MACROS / CONSTANTS
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
#define LUXOR_55_10828_TAG "luxor_55_10828"
|
|
||||||
|
|
||||||
|
|
||||||
#define ADDRESS_ABC830 45
|
#define ADDRESS_ABC830 45
|
||||||
#define ADDRESS_ABC832 44
|
#define ADDRESS_ABC832 44
|
||||||
#define ADDRESS_ABC834 44
|
#define ADDRESS_ABC834 44
|
||||||
@ -73,8 +67,8 @@ public:
|
|||||||
DECLARE_READ8_MEMBER( pio_pb_r );
|
DECLARE_READ8_MEMBER( pio_pb_r );
|
||||||
DECLARE_WRITE8_MEMBER( pio_pb_w );
|
DECLARE_WRITE8_MEMBER( pio_pb_w );
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w );
|
void fdc_intrq_w(bool state);
|
||||||
DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
|
void fdc_drq_w(bool state);
|
||||||
|
|
||||||
// optional information overrides
|
// optional information overrides
|
||||||
virtual const rom_entry *device_rom_region() const;
|
virtual const rom_entry *device_rom_region() const;
|
||||||
@ -99,22 +93,20 @@ protected:
|
|||||||
private:
|
private:
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<z80pio_device> m_pio;
|
required_device<z80pio_device> m_pio;
|
||||||
required_device<mb8876_device> m_fdc;
|
required_device<mb8876_t> m_fdc;
|
||||||
required_device<legacy_floppy_image_device> m_image0;
|
required_device<floppy_connector> m_floppy0;
|
||||||
required_device<legacy_floppy_image_device> m_image1;
|
required_device<floppy_connector> m_floppy1;
|
||||||
|
required_ioport m_sw1;
|
||||||
|
required_ioport m_s1;
|
||||||
|
|
||||||
bool m_cs; // card selected
|
bool m_cs; // card selected
|
||||||
UINT8 m_status; // ABC BUS status
|
UINT8 m_status; // ABC BUS status
|
||||||
UINT8 m_data; // ABC BUS data
|
UINT8 m_data; // ABC BUS data
|
||||||
int m_fdc_irq; // floppy interrupt
|
bool m_fdc_irq; // floppy interrupt
|
||||||
int m_fdc_drq; // floppy data request
|
bool m_fdc_drq; // floppy data request
|
||||||
int m_wait_enable; // wait enable
|
int m_wait_enable; // wait enable
|
||||||
int m_sel0; // drive select 0
|
int m_sel0; // drive select 0
|
||||||
int m_sel1; // drive select 1
|
int m_sel1; // drive select 1
|
||||||
|
|
||||||
UINT8 m_sw1; // single/double sided/density
|
|
||||||
UINT8 m_drive_type; // drive type
|
|
||||||
UINT8 m_s1; // ABC bus address
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,14 +74,6 @@ Notes:
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
TODO:
|
|
||||||
|
|
||||||
- 8" floppy is not supported, but there are no dumps available either
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lux21046.h"
|
#include "lux21046.h"
|
||||||
|
|
||||||
|
|
||||||
@ -110,9 +102,13 @@ const device_type LUXOR_55_21046 = &device_creator<luxor_55_21046_device>;
|
|||||||
|
|
||||||
ROM_START( luxor_55_21046 )
|
ROM_START( luxor_55_21046 )
|
||||||
ROM_REGION( 0x4000, Z80_TAG, 0 ) // A13 is always high, thus loading at 0x2000
|
ROM_REGION( 0x4000, Z80_TAG, 0 ) // A13 is always high, thus loading at 0x2000
|
||||||
ROM_LOAD_OPTIONAL( "cntr 108.6cd", 0x2000, 0x2000, CRC(229764cb) SHA1(a2e2f6f49c31b827efc62f894de9a770b65d109d) ) // 1986-03-12
|
ROM_DEFAULT_BIOS( "v107" )
|
||||||
ROM_LOAD_OPTIONAL( "diab 207.6cd", 0x2000, 0x2000, CRC(86622f52) SHA1(61ad271de53152c1640c0b364fce46d1b0b4c7e2) ) // 1987-06-24
|
ROM_SYSTEM_BIOS( 0, "v107", "Luxor v1.07 (1985-07-03)" )
|
||||||
ROM_LOAD( "cntr 1.07 6490318-07.6cd", 0x0000, 0x4000, CRC(db8c1c0e) SHA1(8bccd5bc72124984de529ee058df779f06d2c1d5) ) // 1985-07-03
|
ROMX_LOAD( "cntr 1.07 6490318-07.6cd", 0x0000, 0x4000, CRC(db8c1c0e) SHA1(8bccd5bc72124984de529ee058df779f06d2c1d5), ROM_BIOS(1) )
|
||||||
|
ROM_SYSTEM_BIOS( 1, "v108", "Luxor v1.08 (1986-03-12)" )
|
||||||
|
ROMX_LOAD( "cntr 108.6cd", 0x2000, 0x2000, CRC(229764cb) SHA1(a2e2f6f49c31b827efc62f894de9a770b65d109d), ROM_BIOS(2) )
|
||||||
|
ROM_SYSTEM_BIOS( 2, "v207", "DiAB v2.07 (1987-06-24)" )
|
||||||
|
ROMX_LOAD( "diab 207.6cd", 0x2000, 0x2000, CRC(86622f52) SHA1(61ad271de53152c1640c0b364fce46d1b0b4c7e2), ROM_BIOS(3) )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
|
||||||
@ -150,8 +146,8 @@ static ADDRESS_MAP_START( luxor_55_21046_io, AS_IO, 8, luxor_55_21046_device )
|
|||||||
AM_RANGE(0x30, 0x30) AM_MIRROR(0xff0f) AM_WRITE(_9b_w)
|
AM_RANGE(0x30, 0x30) AM_MIRROR(0xff0f) AM_WRITE(_9b_w)
|
||||||
AM_RANGE(0x40, 0x40) AM_MIRROR(0xff0f) AM_WRITE(_8a_w)
|
AM_RANGE(0x40, 0x40) AM_MIRROR(0xff0f) AM_WRITE(_8a_w)
|
||||||
AM_RANGE(0x50, 0x50) AM_MIRROR(0xff0f) AM_MASK(0xff00) AM_READ(_9a_r)
|
AM_RANGE(0x50, 0x50) AM_MIRROR(0xff0f) AM_MASK(0xff00) AM_READ(_9a_r)
|
||||||
AM_RANGE(0x60, 0x63) AM_MIRROR(0xff0c) AM_DEVREAD_LEGACY(SAB1793_TAG, wd17xx_r)
|
AM_RANGE(0x60, 0x63) AM_MIRROR(0xff0c) AM_DEVREAD(SAB1793_TAG, fd1793_t, read)
|
||||||
AM_RANGE(0x70, 0x73) AM_MIRROR(0xff0c) AM_DEVWRITE_LEGACY(SAB1793_TAG, wd17xx_w)
|
AM_RANGE(0x70, 0x73) AM_MIRROR(0xff0c) AM_DEVWRITE(SAB1793_TAG, fd1793_t, write)
|
||||||
AM_RANGE(0x80, 0x80) AM_MIRROR(0xff0f) AM_DEVREADWRITE_LEGACY(Z80DMA_TAG, z80dma_r, z80dma_w)
|
AM_RANGE(0x80, 0x80) AM_MIRROR(0xff0f) AM_DEVREADWRITE_LEGACY(Z80DMA_TAG, z80dma_r, z80dma_w)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
@ -242,34 +238,26 @@ static Z80DMA_INTERFACE( dma_intf )
|
|||||||
// wd17xx_interface fdc_intf
|
// wd17xx_interface fdc_intf
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
static const floppy_interface lux21046_floppy_interface =
|
static SLOT_INTERFACE_START( abc_floppies )
|
||||||
{
|
SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "525sd", FLOPPY_525_SD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD )
|
||||||
DEVCB_NULL,
|
SLOT_INTERFACE_END
|
||||||
FLOPPY_STANDARD_5_25_DSDD,
|
|
||||||
LEGACY_FLOPPY_OPTIONS_NAME(default),
|
|
||||||
"floppy_5_25",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( luxor_55_21046_device::fdc_intrq_w )
|
void luxor_55_21046_device::fdc_intrq_w(bool state)
|
||||||
{
|
{
|
||||||
m_fdc_irq = state;
|
m_fdc_irq = state;
|
||||||
|
|
||||||
// FDC and DMA interrupts are wire-ORed to the Z80
|
// FDC and DMA interrupts are wire-ORed to the Z80
|
||||||
m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_fdc_irq | m_dma_irq);
|
m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_fdc_irq || m_dma_irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const wd17xx_interface fdc_intf =
|
void luxor_55_21046_device::fdc_drq_w(bool state)
|
||||||
{
|
{
|
||||||
DEVCB_NULL,
|
m_dma->rdy_w(state);
|
||||||
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, luxor_55_21046_device, fdc_intrq_w),
|
}
|
||||||
DEVCB_DEVICE_LINE(Z80DMA_TAG, z80dma_rdy_w),
|
|
||||||
{ FLOPPY_0, FLOPPY_1, NULL, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -277,15 +265,15 @@ static const wd17xx_interface fdc_intf =
|
|||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
static MACHINE_CONFIG_FRAGMENT( luxor_55_21046 )
|
static MACHINE_CONFIG_FRAGMENT( luxor_55_21046 )
|
||||||
// main CPU
|
|
||||||
MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_16MHz/4)
|
MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_16MHz/4)
|
||||||
MCFG_CPU_PROGRAM_MAP(luxor_55_21046_mem)
|
MCFG_CPU_PROGRAM_MAP(luxor_55_21046_mem)
|
||||||
MCFG_CPU_IO_MAP(luxor_55_21046_io)
|
MCFG_CPU_IO_MAP(luxor_55_21046_io)
|
||||||
|
|
||||||
// devices
|
|
||||||
MCFG_Z80DMA_ADD(Z80DMA_TAG, XTAL_16MHz/4, dma_intf)
|
MCFG_Z80DMA_ADD(Z80DMA_TAG, XTAL_16MHz/4, dma_intf)
|
||||||
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(lux21046_floppy_interface)
|
MCFG_FD1793x_ADD(SAB1793_TAG, XTAL_16MHz/16)
|
||||||
MCFG_FD1793_ADD(SAB1793_TAG, fdc_intf)
|
|
||||||
|
MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":0", abc_floppies, "525dd", NULL, floppy_image_device::default_floppy_formats)
|
||||||
|
MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":1", abc_floppies, "525dd", NULL, floppy_image_device::default_floppy_formats)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
|
||||||
@ -396,8 +384,12 @@ luxor_55_21046_device::luxor_55_21046_device(const machine_config &mconfig, cons
|
|||||||
m_maincpu(*this, Z80_TAG),
|
m_maincpu(*this, Z80_TAG),
|
||||||
m_dma(*this, Z80DMA_TAG),
|
m_dma(*this, Z80DMA_TAG),
|
||||||
m_fdc(*this, SAB1793_TAG),
|
m_fdc(*this, SAB1793_TAG),
|
||||||
m_image0(*this, FLOPPY_0),
|
m_floppy0(*this, SAB1793_TAG":0"),
|
||||||
m_image1(*this, FLOPPY_1),
|
m_floppy1(*this, SAB1793_TAG":1"),
|
||||||
|
m_floppy(NULL),
|
||||||
|
m_sw1(*this, "SW1"),
|
||||||
|
m_sw2(*this, "SW2"),
|
||||||
|
m_sw3(*this, "SW3"),
|
||||||
m_cs(false),
|
m_cs(false),
|
||||||
m_fdc_irq(0),
|
m_fdc_irq(0),
|
||||||
m_dma_irq(0),
|
m_dma_irq(0),
|
||||||
@ -438,11 +430,6 @@ void luxor_55_21046_device::device_start()
|
|||||||
void luxor_55_21046_device::device_reset()
|
void luxor_55_21046_device::device_reset()
|
||||||
{
|
{
|
||||||
m_cs = false;
|
m_cs = false;
|
||||||
|
|
||||||
floppy_mon_w(m_image0, ASSERT_LINE);
|
|
||||||
floppy_mon_w(m_image1, ASSERT_LINE);
|
|
||||||
floppy_drive_set_ready_state(m_image0, 1, 1);
|
|
||||||
floppy_drive_set_ready_state(m_image1, 1, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -457,7 +444,7 @@ void luxor_55_21046_device::device_reset()
|
|||||||
|
|
||||||
void luxor_55_21046_device::abcbus_cs(UINT8 data)
|
void luxor_55_21046_device::abcbus_cs(UINT8 data)
|
||||||
{
|
{
|
||||||
m_cs = (data == ioport("SW3")->read());
|
m_cs = (data == m_sw3->read());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -639,19 +626,21 @@ WRITE8_MEMBER( luxor_55_21046_device::_9b_w )
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// drive select
|
// drive select
|
||||||
if (BIT(data, 0)) wd17xx_set_drive(m_fdc, 0);
|
m_floppy = NULL;
|
||||||
if (BIT(data, 1)) wd17xx_set_drive(m_fdc, 1);
|
|
||||||
//if (BIT(data, 2)) wd17xx_set_drive(m_fdc, 2);
|
|
||||||
|
|
||||||
|
if (BIT(data, 0)) m_floppy = m_floppy0->get_device();
|
||||||
|
if (BIT(data, 1)) m_floppy = m_floppy1->get_device();
|
||||||
|
|
||||||
|
m_fdc->set_floppy(m_floppy);
|
||||||
|
|
||||||
|
if (m_floppy)
|
||||||
|
{
|
||||||
// motor enable
|
// motor enable
|
||||||
int mtron = BIT(data, 3);
|
m_floppy->mon_w(!BIT(data, 3));
|
||||||
floppy_mon_w(m_image0, !mtron);
|
|
||||||
floppy_mon_w(m_image1, !mtron);
|
|
||||||
floppy_drive_set_ready_state(m_image0, mtron, 1);
|
|
||||||
floppy_drive_set_ready_state(m_image1, mtron, 1);
|
|
||||||
|
|
||||||
// side select
|
// side select
|
||||||
wd17xx_set_side(m_fdc, BIT(data, 5));
|
m_floppy->ss_w(BIT(data, 5));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -679,10 +668,10 @@ WRITE8_MEMBER( luxor_55_21046_device::_8a_w )
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// FDC master reset
|
// FDC master reset
|
||||||
wd17xx_mr_w(m_fdc, BIT(data, 0));
|
if (!BIT(data, 0)) m_fdc->reset();
|
||||||
|
|
||||||
// density select
|
// density select
|
||||||
wd17xx_dden_w(m_fdc, BIT(data, 1));
|
m_fdc->dden_w(BIT(data, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -699,7 +688,7 @@ READ8_MEMBER( luxor_55_21046_device::_9a_r )
|
|||||||
0 busy controller busy
|
0 busy controller busy
|
||||||
1 _FD2S double-sided disk
|
1 _FD2S double-sided disk
|
||||||
2 SW2
|
2 SW2
|
||||||
3 _DCG ? disk changed
|
3 _DCG disk changed
|
||||||
4 SW1-1
|
4 SW1-1
|
||||||
5 SW1-2
|
5 SW1-2
|
||||||
6 SW1-3
|
6 SW1-3
|
||||||
@ -712,13 +701,12 @@ READ8_MEMBER( luxor_55_21046_device::_9a_r )
|
|||||||
// busy
|
// busy
|
||||||
data |= m_busy;
|
data |= m_busy;
|
||||||
|
|
||||||
// SW1
|
// floppy
|
||||||
UINT8 sw1 = ioport("SW1")->read() & 0x0f;
|
data |= (m_floppy ? m_floppy->twosid_r() : 1) << 1;
|
||||||
|
data |= (m_floppy ? m_floppy->dskchg_r() : 1) << 3;
|
||||||
data |= sw1 << 4;
|
|
||||||
|
|
||||||
// SW2
|
// SW2
|
||||||
UINT8 sw2 = ioport("SW2")->read() & 0x0f;
|
UINT8 sw2 = m_sw2->read() & 0x0f;
|
||||||
|
|
||||||
// TTL inputs float high so DIP switch in off position equals 1
|
// TTL inputs float high so DIP switch in off position equals 1
|
||||||
int sw2_1 = BIT(sw2, 0) ? 1 : BIT(offset, 8);
|
int sw2_1 = BIT(sw2, 0) ? 1 : BIT(offset, 8);
|
||||||
@ -729,6 +717,9 @@ READ8_MEMBER( luxor_55_21046_device::_9a_r )
|
|||||||
|
|
||||||
data |= sw2_data << 2;
|
data |= sw2_data << 2;
|
||||||
|
|
||||||
|
// SW1
|
||||||
|
data |= (m_sw1->read() & 0x0f) << 4;
|
||||||
|
|
||||||
return data ^ 0xff;
|
return data ^ 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,11 +16,8 @@
|
|||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "cpu/z80/z80daisy.h"
|
#include "cpu/z80/z80daisy.h"
|
||||||
#include "formats/basicdsk.h"
|
|
||||||
#include "imagedev/flopdrv.h"
|
|
||||||
#include "machine/abcbus.h"
|
#include "machine/abcbus.h"
|
||||||
#include "machine/devhelpr.h"
|
#include "machine/wd_fdc.h"
|
||||||
#include "machine/wd17xx.h"
|
|
||||||
#include "machine/z80dma.h"
|
#include "machine/z80dma.h"
|
||||||
|
|
||||||
|
|
||||||
@ -29,9 +26,6 @@
|
|||||||
// MACROS / CONSTANTS
|
// MACROS / CONSTANTS
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
#define LUXOR_55_21046_TAG "luxor_55_21046"
|
|
||||||
|
|
||||||
|
|
||||||
#define ADDRESS_ABC832 44
|
#define ADDRESS_ABC832 44
|
||||||
#define ADDRESS_ABC830 45
|
#define ADDRESS_ABC830 45
|
||||||
#define ADDRESS_ABC838 46
|
#define ADDRESS_ABC838 46
|
||||||
@ -74,8 +68,11 @@ public:
|
|||||||
DECLARE_WRITE8_MEMBER( _9b_w );
|
DECLARE_WRITE8_MEMBER( _9b_w );
|
||||||
DECLARE_WRITE8_MEMBER( _8a_w );
|
DECLARE_WRITE8_MEMBER( _8a_w );
|
||||||
DECLARE_READ8_MEMBER( _9a_r );
|
DECLARE_READ8_MEMBER( _9a_r );
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER( dma_int_w );
|
DECLARE_WRITE_LINE_MEMBER( dma_int_w );
|
||||||
DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w );
|
|
||||||
|
void fdc_intrq_w(bool state);
|
||||||
|
void fdc_drq_w(bool state);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
@ -95,15 +92,19 @@ protected:
|
|||||||
private:
|
private:
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<z80dma_device> m_dma;
|
required_device<z80dma_device> m_dma;
|
||||||
required_device<fd1793_device> m_fdc;
|
required_device<fd1793_t> m_fdc;
|
||||||
required_device<legacy_floppy_image_device> m_image0;
|
required_device<floppy_connector> m_floppy0;
|
||||||
required_device<legacy_floppy_image_device> m_image1;
|
required_device<floppy_connector> m_floppy1;
|
||||||
|
floppy_image_device *m_floppy;
|
||||||
|
required_ioport m_sw1;
|
||||||
|
required_ioport m_sw2;
|
||||||
|
required_ioport m_sw3;
|
||||||
|
|
||||||
bool m_cs; // card selected
|
bool m_cs; // card selected
|
||||||
UINT8 m_status; // ABC BUS status
|
UINT8 m_status; // ABC BUS status
|
||||||
UINT8 m_data_in; // ABC BUS data in
|
UINT8 m_data_in; // ABC BUS data in
|
||||||
UINT8 m_data_out; // ABC BUS data out
|
UINT8 m_data_out; // ABC BUS data out
|
||||||
int m_fdc_irq; // FDC interrupt
|
bool m_fdc_irq; // FDC interrupt
|
||||||
int m_dma_irq; // DMA interrupt
|
int m_dma_irq; // DMA interrupt
|
||||||
int m_busy; // busy bit
|
int m_busy; // busy bit
|
||||||
int m_force_busy; // force busy bit
|
int m_force_busy; // force busy bit
|
||||||
|
Loading…
Reference in New Issue
Block a user