(MESS) abc1600: Modernized floppy. (nw)

This commit is contained in:
Curt Coder 2012-12-11 20:43:34 +00:00
parent 9a40c918e6
commit 92fdb86ced
2 changed files with 44 additions and 48 deletions

View File

@ -2,14 +2,9 @@
Luxor ABC 1600 Luxor ABC 1600
Skeleton driver
*/
/*
How to create HDD image: How to create HDD image:
------------------------ ------------------------
chdman -createblankhd necd5126a.chd 615 4 17 512 chdman createhd -chs 615,4,17 -ss 512 -o necd5126a.chd
How to format HDD: How to format HDD:
------------------ ------------------
@ -42,8 +37,6 @@
sega19 0 task 0 sega19 0 task 0
sega 000 segd 00 pga 008 pgd 4058 virtual 02c730 (should be 004730) sega 000 segd 00 pga 008 pgd 4058 virtual 02c730 (should be 004730)
- floppy
- internal floppy is really drive 2, but wd17xx.c doesn't like having NULL drives
- short/long reset (RSTBUT) - short/long reset (RSTBUT)
- CIO - CIO
- optimize timers! - optimize timers!
@ -262,7 +255,7 @@ UINT8 abc1600_state::read_internal_io(offs_t offset)
switch (A10_A9_A8) switch (A10_A9_A8)
{ {
case FLP: case FLP:
data = wd17xx_r(m_fdc, program, A2_A1); data = m_fdc->gen_r(A2_A1);
break; break;
case CRT: case CRT:
@ -516,7 +509,7 @@ void abc1600_state::write_internal_io(offs_t offset, UINT8 data)
switch (A10_A9_A8) switch (A10_A9_A8)
{ {
case FLP: case FLP:
wd17xx_w(m_fdc, program, A2_A1, data); m_fdc->gen_w(A2_A1, data);
break; break;
case CRT: case CRT:
@ -1116,7 +1109,7 @@ inline void abc1600_state::update_drdy0()
if (m_sysfs) if (m_sysfs)
{ {
// floppy // floppy
m_dma0->rdy_w(!wd17xx_drq_r(m_fdc)); m_dma0->rdy_w(!m_fdc->drq_r());
} }
else else
{ {
@ -1278,12 +1271,16 @@ WRITE8_MEMBER( abc1600_state::fw0_w )
if (LOG) logerror("FW0 %02x\n", data); if (LOG) logerror("FW0 %02x\n", data);
// drive select // drive select
if (BIT(data, 0)) wd17xx_set_drive(m_fdc, 0); floppy_image_device *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)) floppy = m_floppy0->get_device();
if (BIT(data, 1)) floppy = m_floppy1->get_device();
if (BIT(data, 2)) floppy = m_floppy2->get_device();
m_fdc->set_floppy(floppy);
// floppy motor // floppy motor
floppy_mon_w(m_floppy, !BIT(data, 3)); if (floppy) floppy->mon_w(!BIT(data, 3));
} }
@ -1311,10 +1308,10 @@ WRITE8_MEMBER( abc1600_state::fw1_w )
if (LOG) logerror("FW1 %02x\n", data); if (LOG) logerror("FW1 %02x\n", data);
// 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));
} }
@ -1613,7 +1610,7 @@ READ8_MEMBER( abc1600_state::cio_pb_r )
data |= !m_sysfs << 6; data |= !m_sysfs << 6;
// floppy interrupt // floppy interrupt
data |= wd17xx_intrq_r(m_fdc) << 7; data |= m_fdc->intrq_r() << 7;
return data; return data;
} }
@ -1707,7 +1704,7 @@ static Z8536_INTERFACE( cio_intf )
//------------------------------------------------- //-------------------------------------------------
// wd17xx_interface fdc_intf // wd17xx_interface fdc_intf
//------------------------------------------------- //-------------------------------------------------
/*
static LEGACY_FLOPPY_OPTIONS_START( abc1600 ) static LEGACY_FLOPPY_OPTIONS_START( abc1600 )
LEGACY_FLOPPY_OPTION(abc1600, "dsk", "Luxor ABC 1600", basicdsk_identify_default, basicdsk_construct_default, NULL, LEGACY_FLOPPY_OPTION(abc1600, "dsk", "Luxor ABC 1600", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([2]) HEADS([2])
@ -1716,33 +1713,22 @@ static LEGACY_FLOPPY_OPTIONS_START( abc1600 )
SECTOR_LENGTH([256]) SECTOR_LENGTH([256])
FIRST_SECTOR_ID([1])) FIRST_SECTOR_ID([1]))
LEGACY_FLOPPY_OPTIONS_END LEGACY_FLOPPY_OPTIONS_END
*/
static const floppy_interface abc1600_floppy_interface = static SLOT_INTERFACE_START( abc1600_floppies )
SLOT_INTERFACE( "525qd", FLOPPY_525_QD )
SLOT_INTERFACE_END
void abc1600_state::fdc_intrq_w(bool state)
{ {
DEVCB_NULL, m_cio->pb7_w(state);
DEVCB_NULL, }
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
FLOPPY_STANDARD_5_25_DSQD,
LEGACY_FLOPPY_OPTIONS_NAME(abc1600),
"floppy_5_25",
NULL
};
WRITE_LINE_MEMBER( abc1600_state::drq_w ) void abc1600_state::fdc_drq_w(bool state)
{ {
update_drdy0(); update_drdy0();
} }
static const wd17xx_interface fdc_intf =
{
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(Z8536B1_TAG, z8536_device, pb7_w),
DEVCB_DRIVER_LINE_MEMBER(abc1600_state, drq_w),
{ FLOPPY_0, NULL, NULL, NULL } // TODO should be { NULL, NULL, FLOPPY_2, NULL }
};
//------------------------------------------------- //-------------------------------------------------
// ABC99_INTERFACE( abc99_intf ) // ABC99_INTERFACE( abc99_intf )
@ -1851,6 +1837,10 @@ void abc1600_state::machine_start()
// interrupt callback // interrupt callback
m_maincpu->set_irq_acknowledge_callback(abc1600_int_ack); m_maincpu->set_irq_acknowledge_callback(abc1600_int_ack);
// floppy callbacks
m_fdc->setup_intrq_cb(wd_fdc_t::line_cb(FUNC(abc1600_state::fdc_intrq_w), this));
m_fdc->setup_drq_cb(wd_fdc_t::line_cb(FUNC(abc1600_state::fdc_drq_w), this));
// allocate memory // allocate memory
m_segment_ram.allocate(0x400); m_segment_ram.allocate(0x400);
m_page_ram.allocate(0x400); m_page_ram.allocate(0x400);
@ -1932,8 +1922,10 @@ static MACHINE_CONFIG_START( abc1600, abc1600_state )
MCFG_Z8536_ADD(Z8536B1_TAG, XTAL_64MHz/16, cio_intf) MCFG_Z8536_ADD(Z8536B1_TAG, XTAL_64MHz/16, cio_intf)
MCFG_NMC9306_ADD(NMC9306_TAG) MCFG_NMC9306_ADD(NMC9306_TAG)
MCFG_E0516_ADD(E050_C16PC_TAG, XTAL_32_768kHz) MCFG_E0516_ADD(E050_C16PC_TAG, XTAL_32_768kHz)
MCFG_FD1797_ADD(SAB1797_02P_TAG, fdc_intf) MCFG_FD1797x_ADD(SAB1797_02P_TAG, XTAL_64MHz/64)
MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, abc1600_floppy_interface) MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":0", abc1600_floppies, NULL, NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":1", abc1600_floppies, NULL, NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":2", abc1600_floppies, "525qd", NULL, floppy_image_device::default_floppy_formats)
MCFG_ABC99_ADD(abc99_intf) MCFG_ABC99_ADD(abc99_intf)
MCFG_ABC1600BUS_SLOT_ADD("bus0i", bus0i_intf, abc1600bus_cards, NULL, NULL) MCFG_ABC1600BUS_SLOT_ADD("bus0i", bus0i_intf, abc1600bus_cards, NULL, NULL)

View File

@ -6,8 +6,6 @@
#include "emu.h" #include "emu.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "formats/basicdsk.h"
#include "imagedev/flopdrv.h"
#include "machine/ram.h" #include "machine/ram.h"
#include "machine/8530scc.h" #include "machine/8530scc.h"
#include "machine/abc99.h" #include "machine/abc99.h"
@ -15,7 +13,7 @@
#include "machine/e0516.h" #include "machine/e0516.h"
#include "machine/lux4105.h" #include "machine/lux4105.h"
#include "machine/nmc9306.h" #include "machine/nmc9306.h"
#include "machine/wd17xx.h" #include "machine/wd_fdc.h"
#include "machine/z80dart.h" #include "machine/z80dart.h"
#include "machine/z80dma.h" #include "machine/z80dma.h"
#include "machine/z8536.h" #include "machine/z8536.h"
@ -69,7 +67,9 @@ public:
m_nvram(*this, NMC9306_TAG), m_nvram(*this, NMC9306_TAG),
m_crtc(*this, SY6845E_TAG), m_crtc(*this, SY6845E_TAG),
m_ram(*this, RAM_TAG), m_ram(*this, RAM_TAG),
m_floppy(*this, FLOPPY_0), m_floppy0(*this, SAB1797_02P_TAG":0"),
m_floppy1(*this, SAB1797_02P_TAG":1"),
m_floppy2(*this, SAB1797_02P_TAG":2"),
m_bus0i(*this, BUS0I_TAG), m_bus0i(*this, BUS0I_TAG),
m_bus0x(*this, BUS0X_TAG), m_bus0x(*this, BUS0X_TAG),
m_bus1(*this, BUS1_TAG), m_bus1(*this, BUS1_TAG),
@ -86,12 +86,14 @@ public:
required_device<z80dart_device> m_dart; required_device<z80dart_device> m_dart;
required_device<scc8530_t> m_scc; required_device<scc8530_t> m_scc;
required_device<z8536_device> m_cio; required_device<z8536_device> m_cio;
required_device<fd1797_device> m_fdc; required_device<fd1797_t> m_fdc;
required_device<e0516_device> m_rtc; required_device<e0516_device> m_rtc;
required_device<nmc9306_device> m_nvram; required_device<nmc9306_device> m_nvram;
required_device<mc6845_device> m_crtc; required_device<mc6845_device> m_crtc;
required_device<ram_device> m_ram; required_device<ram_device> m_ram;
required_device<legacy_floppy_image_device> m_floppy; required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
required_device<floppy_connector> m_floppy2;
required_device<abc1600bus_slot_device> m_bus0i; required_device<abc1600bus_slot_device> m_bus0i;
required_device<abc1600bus_slot_device> m_bus0x; required_device<abc1600bus_slot_device> m_bus0x;
required_device<abc1600bus_slot_device> m_bus1; required_device<abc1600bus_slot_device> m_bus1;
@ -120,7 +122,6 @@ public:
DECLARE_WRITE8_MEMBER( dmamap_w ); DECLARE_WRITE8_MEMBER( dmamap_w );
DECLARE_WRITE_LINE_MEMBER( dbrq_w ); DECLARE_WRITE_LINE_MEMBER( dbrq_w );
DECLARE_WRITE_LINE_MEMBER( drq_w );
DECLARE_READ8_MEMBER( dma0_mreq_r ); DECLARE_READ8_MEMBER( dma0_mreq_r );
DECLARE_WRITE8_MEMBER( dma0_mreq_w ); DECLARE_WRITE8_MEMBER( dma0_mreq_w );
DECLARE_READ8_MEMBER( dma0_iorq_r ); DECLARE_READ8_MEMBER( dma0_iorq_r );
@ -149,6 +150,9 @@ public:
DECLARE_WRITE_LINE_MEMBER( nmi_w ); DECLARE_WRITE_LINE_MEMBER( nmi_w );
void fdc_intrq_w(bool state);
void fdc_drq_w(bool state);
int get_current_task(offs_t offset); int get_current_task(offs_t offset);
offs_t get_segment_address(offs_t offset); offs_t get_segment_address(offs_t offset);
offs_t get_page_address(offs_t offset, UINT8 segd); offs_t get_page_address(offs_t offset, UINT8 segd);