(MESS) xor100: Floppy modernization. (nw)

This commit is contained in:
Curt Coder 2012-11-28 15:57:06 +00:00
parent 81ffb6d1e1
commit 52582aac7b
2 changed files with 103 additions and 72 deletions

View File

@ -202,14 +202,17 @@ WRITE8_MEMBER( xor100_state::fdc_dcont_w )
*/
/* drive select */
if (BIT(data, 0)) wd17xx_set_drive(m_fdc, 0);
if (BIT(data, 1)) wd17xx_set_drive(m_fdc, 1);
// drive select
floppy_image_device *floppy = NULL;
floppy_mon_w(m_floppy0, CLEAR_LINE);
floppy_mon_w(m_floppy1, CLEAR_LINE);
floppy_drive_set_ready_state(m_floppy0, 1, 1);
floppy_drive_set_ready_state(m_floppy1, 1, 1);
if (BIT(data, 0)) floppy = m_floppy0->get_device();
if (BIT(data, 1)) floppy = m_floppy1->get_device();
if (BIT(data, 2)) floppy = m_floppy2->get_device();
if (BIT(data, 3)) floppy = m_floppy3->get_device();
m_fdc->set_floppy(floppy);
if (floppy) floppy->mon_w(0);
}
WRITE8_MEMBER( xor100_state::fdc_dsel_w )
@ -237,7 +240,7 @@ WRITE8_MEMBER( xor100_state::fdc_dsel_w )
case 3: m_fdc_dden = !m_fdc_dden; break;
}
wd17xx_dden_w(m_fdc, m_fdc_dden);
m_fdc->dden_w(m_fdc_dden);
}
/* Memory Maps */
@ -260,7 +263,7 @@ static ADDRESS_MAP_START( xor100_io, AS_IO, 8, xor100_state )
AM_RANGE(0x0a, 0x0a) AM_READ(prom_disable_r)
AM_RANGE(0x0b, 0x0b) AM_READ_PORT("DSW0") AM_WRITE(baud_w)
AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE(Z80CTC_TAG, z80ctc_device, read, write)
AM_RANGE(0xf8, 0xfb) AM_DEVREADWRITE_LEGACY(WD1795_TAG, wd17xx_r, wd17xx_w)
AM_RANGE(0xf8, 0xfb) AM_DEVREADWRITE(WD1795_TAG, fd1795_t, read, write)
AM_RANGE(0xfc, 0xfc) AM_READWRITE(fdc_wait_r, fdc_dcont_w)
AM_RANGE(0xfd, 0xfd) AM_WRITE(fdc_dsel_w)
ADDRESS_MAP_END
@ -348,27 +351,23 @@ INPUT_PORTS_END
/* COM5016 Interface */
WRITE_LINE_MEMBER(xor100_state::com5016_fr_w)
WRITE_LINE_MEMBER( xor100_state::com5016_fr_w )
{
device_t *device = machine().device(I8251_A_TAG);
i8251_device* uart = dynamic_cast<i8251_device*>(device);
uart->transmit_clock();
uart->receive_clock();
m_uart_a->transmit_clock();
m_uart_a->receive_clock();
}
WRITE_LINE_MEMBER(xor100_state::com5016_ft_w)
WRITE_LINE_MEMBER( xor100_state::com5016_ft_w )
{
device_t *device = machine().device(I8251_B_TAG);
i8251_device* uart = dynamic_cast<i8251_device*>(device);
uart->transmit_clock();
uart->receive_clock();
m_uart_b->transmit_clock();
m_uart_b->receive_clock();
}
static COM8116_INTERFACE( com5016_intf )
{
DEVCB_NULL, /* fX/4 output */
DEVCB_DRIVER_LINE_MEMBER(xor100_state,com5016_fr_w), /* fR output */
DEVCB_DRIVER_LINE_MEMBER(xor100_state,com5016_ft_w), /* fT output */
DEVCB_DRIVER_LINE_MEMBER(xor100_state, com5016_fr_w), /* fR output */
DEVCB_DRIVER_LINE_MEMBER(xor100_state, com5016_ft_w), /* fT output */
{ 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, // WRONG?
{ 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, // WRONG?
};
@ -407,7 +406,6 @@ static const i8251_interface terminal_8251_intf =
READ8_MEMBER(xor100_state::i8255_pc_r)
{
centronics_device *centronics = machine().device<centronics_device>("centronics");
/*
bit description
@ -426,10 +424,10 @@ READ8_MEMBER(xor100_state::i8255_pc_r)
UINT8 data = 0;
/* on line */
data |= centronics->vcc_r() << 4;
data |= m_centronics->vcc_r() << 4;
/* busy */
data |= centronics->busy_r() << 5;
data |= m_centronics->busy_r() << 5;
return data;
}
@ -440,7 +438,7 @@ static I8255A_INTERFACE( printer_8255_intf )
DEVCB_DEVICE_MEMBER(CENTRONICS_TAG, centronics_device, write),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(CENTRONICS_TAG, centronics_device, strobe_w),
DEVCB_DRIVER_MEMBER(xor100_state,i8255_pc_r),
DEVCB_DRIVER_MEMBER(xor100_state, i8255_pc_r),
DEVCB_NULL
};
@ -453,29 +451,33 @@ static const centronics_interface xor100_centronics_intf =
/* Z80-CTC Interface */
WRITE_LINE_MEMBER(xor100_state::ctc_z0_w)
WRITE_LINE_MEMBER( xor100_state::ctc_z0_w )
{
}
WRITE_LINE_MEMBER(xor100_state::ctc_z1_w)
WRITE_LINE_MEMBER( xor100_state::ctc_z1_w )
{
}
WRITE_LINE_MEMBER(xor100_state::ctc_z2_w)
WRITE_LINE_MEMBER( xor100_state::ctc_z2_w )
{
}
static Z80CTC_INTERFACE( ctc_intf )
{
DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0), /* interrupt handler */
DEVCB_DRIVER_LINE_MEMBER(xor100_state,ctc_z0_w), /* ZC/TO0 callback */
DEVCB_DRIVER_LINE_MEMBER(xor100_state,ctc_z1_w), /* ZC/TO1 callback */
DEVCB_DRIVER_LINE_MEMBER(xor100_state,ctc_z2_w) /* ZC/TO2 callback */
DEVCB_DRIVER_LINE_MEMBER(xor100_state, ctc_z0_w), /* ZC/TO0 callback */
DEVCB_DRIVER_LINE_MEMBER(xor100_state, ctc_z1_w), /* ZC/TO1 callback */
DEVCB_DRIVER_LINE_MEMBER(xor100_state, ctc_z2_w) /* ZC/TO2 callback */
};
/* WD1795-02 Interface */
WRITE_LINE_MEMBER( xor100_state::fdc_irq_w )
static SLOT_INTERFACE_START( xor100_floppies )
SLOT_INTERFACE( "8ssdd", FLOPPY_8_SSDD ) // Shugart SA-100
SLOT_INTERFACE_END
void xor100_state::fdc_intrq_w(bool state)
{
m_fdc_irq = state;
m_ctc->trg0(state);
@ -487,7 +489,7 @@ WRITE_LINE_MEMBER( xor100_state::fdc_irq_w )
}
}
WRITE_LINE_MEMBER( xor100_state::fdc_drq_w )
void xor100_state::fdc_drq_w(bool state)
{
m_fdc_drq = state;
@ -498,27 +500,43 @@ WRITE_LINE_MEMBER( xor100_state::fdc_drq_w )
}
}
static const wd17xx_interface fdc_intf =
{
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(xor100_state, fdc_irq_w),
DEVCB_DRIVER_LINE_MEMBER(xor100_state, fdc_drq_w),
{ FLOPPY_0, FLOPPY_1, NULL, NULL }
};
/* Terminal Interface */
WRITE8_MEMBER(xor100_state::xor100_kbd_put)
WRITE8_MEMBER( xor100_state::xor100_kbd_put )
{
i8251_device* uart = dynamic_cast<i8251_device*>(machine().device(I8251_B_TAG));
uart->receive_character(data);
m_uart_b->receive_character(data);
}
static GENERIC_TERMINAL_INTERFACE( xor100_terminal_intf )
{
DEVCB_DRIVER_MEMBER(xor100_state,xor100_kbd_put)
DEVCB_DRIVER_MEMBER(xor100_state, xor100_kbd_put)
};
static S100_INTERFACE( s100_intf )
{
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_CPU_INPUT_LINE(Z80_TAG, Z80_INPUT_LINE_WAIT),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
};
static SLOT_INTERFACE_START( xor100_s100_cards )
SLOT_INTERFACE_END
/* Machine Initialization */
void xor100_state::machine_start()
@ -551,19 +569,6 @@ void xor100_state::machine_reset()
/* Machine Driver */
static const floppy_interface xor100_floppy_interface =
{
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
FLOPPY_STANDARD_5_25_DSDD,
LEGACY_FLOPPY_OPTIONS_NAME(default),
NULL,
NULL
};
static MACHINE_CONFIG_START( xor100, xor100_state )
/* basic machine hardware */
MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_8MHz/2)
@ -576,11 +581,28 @@ static MACHINE_CONFIG_START( xor100, xor100_state )
MCFG_I8255A_ADD(I8255A_TAG, printer_8255_intf)
MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_8MHz/2, ctc_intf)
MCFG_COM8116_ADD(COM5016_TAG, 5000000, com5016_intf)
MCFG_FD1795_ADD(WD1795_TAG, /*XTAL_8MHz/8,*/ fdc_intf)
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(xor100_floppy_interface)
MCFG_FD1795x_ADD(WD1795_TAG, XTAL_8MHz/8 *8)
MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":0", xor100_floppies, "8ssdd", NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":1", xor100_floppies, "8ssdd", NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":2", xor100_floppies, NULL, NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":3", xor100_floppies, NULL, NULL, floppy_image_device::default_floppy_formats)
MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, xor100_centronics_intf)
MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, xor100_terminal_intf)
// S-100
MCFG_S100_BUS_ADD(Z80_TAG, s100_intf)
MCFG_S100_SLOT_ADD("s100_1", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_2", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_3", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_4", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_5", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_6", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_7", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_8", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_9", xor100_s100_cards, NULL, NULL)
MCFG_S100_SLOT_ADD("s100_10", xor100_s100_cards, NULL, NULL)
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("64K")

View File

@ -5,15 +5,14 @@
#include "emu.h"
#include "cpu/z80/z80.h"
#include "formats/basicdsk.h"
#include "imagedev/flopdrv.h"
#include "machine/ram.h"
#include "machine/com8116.h"
#include "machine/ctronics.h"
#include "machine/i8255.h"
#include "machine/i8251.h"
#include "machine/s100.h"
#include "machine/terminal.h"
#include "machine/wd17xx.h"
#include "machine/wd_fdc.h"
#include "machine/z80ctc.h"
#define SCREEN_TAG "screen"
@ -33,24 +32,34 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, Z80_TAG),
m_dbrg(*this, COM5016_TAG),
m_uart_a(*this, I8251_A_TAG),
m_uart_b(*this, I8251_B_TAG),
m_fdc(*this, WD1795_TAG),
m_ctc(*this, Z80CTC_TAG),
m_ram(*this, RAM_TAG),
m_terminal(*this, TERMINAL_TAG),
m_floppy0(*this, FLOPPY_0),
m_floppy1(*this, FLOPPY_1)
m_centronics(*this, CENTRONICS_TAG),
m_s100(*this, S100_TAG),
m_floppy0(*this, WD1795_TAG":0"),
m_floppy1(*this, WD1795_TAG":1"),
m_floppy2(*this, WD1795_TAG":2"),
m_floppy3(*this, WD1795_TAG":3")
{ }
required_device<cpu_device> m_maincpu;
required_device<com8116_device> m_dbrg;
required_device<i8251_device> m_uart_a;
required_device<i8251_device> m_uart_b;
required_device<fd1795_device> m_fdc;
required_device<fd1795_t> m_fdc;
required_device<z80ctc_device> m_ctc;
required_device<ram_device> m_ram;
required_device<generic_terminal_device> m_terminal;
required_device<legacy_floppy_image_device> m_floppy0;
required_device<legacy_floppy_image_device> m_floppy1;
required_device<centronics_device> m_centronics;
required_device<s100_device> m_s100;
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
required_device<floppy_connector> m_floppy2;
required_device<floppy_connector> m_floppy3;
virtual void machine_start();
virtual void machine_reset();
@ -63,8 +72,8 @@ public:
DECLARE_READ8_MEMBER( fdc_wait_r );
DECLARE_WRITE8_MEMBER( fdc_dcont_w );
DECLARE_WRITE8_MEMBER( fdc_dsel_w );
DECLARE_WRITE_LINE_MEMBER( fdc_irq_w );
DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
void fdc_intrq_w(bool state);
void fdc_drq_w(bool state);
void bankswitch();
@ -73,8 +82,8 @@ public:
int m_bank;
// floppy state
int m_fdc_irq;
int m_fdc_drq;
bool m_fdc_irq;
bool m_fdc_drq;
int m_fdc_dden;
DECLARE_WRITE_LINE_MEMBER(com5016_fr_w);
DECLARE_WRITE_LINE_MEMBER(com5016_ft_w);