summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2015-06-04 08:33:26 +0200
committer Dirk Best <mail@dirk-best.de>2015-06-04 08:33:57 +0200
commit3a571779c0c0a47aeebde26256ac6f0e5c7223c3 (patch)
treefb02ff893eff3647a16918fb43e956da948a5fe8
parent5f72cb409c6194a1eaca27bf7474d7082ccdc097 (diff)
trs80: updated to use the new wd fdc
-rw-r--r--scripts/src/lib.lua4
-rw-r--r--src/lib/formats/trs80_dsk.c55
-rw-r--r--src/lib/formats/trs80_dsk.h36
-rw-r--r--src/lib/formats/trs_dsk.c80
-rw-r--r--src/lib/formats/trs_dsk.h20
-rw-r--r--src/mess/drivers/trs80.c67
-rw-r--r--src/mess/includes/trs80.h17
-rw-r--r--src/mess/machine/trs80.c106
8 files changed, 171 insertions, 214 deletions
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua
index 5fc9603849e..49cfc2bc2f2 100644
--- a/scripts/src/lib.lua
+++ b/scripts/src/lib.lua
@@ -369,8 +369,8 @@ project "formats"
MAME_DIR .. "src/lib/formats/trd_dsk.h",
MAME_DIR .. "src/lib/formats/trs_cas.c",
MAME_DIR .. "src/lib/formats/trs_cas.h",
- MAME_DIR .. "src/lib/formats/trs_dsk.c",
- MAME_DIR .. "src/lib/formats/trs_dsk.h",
+ MAME_DIR .. "src/lib/formats/trs80_dsk.c",
+ MAME_DIR .. "src/lib/formats/trs80_dsk.h",
MAME_DIR .. "src/lib/formats/tvc_cas.c",
MAME_DIR .. "src/lib/formats/tvc_cas.h",
MAME_DIR .. "src/lib/formats/tvc_dsk.c",
diff --git a/src/lib/formats/trs80_dsk.c b/src/lib/formats/trs80_dsk.c
new file mode 100644
index 00000000000..acd122144d1
--- /dev/null
+++ b/src/lib/formats/trs80_dsk.c
@@ -0,0 +1,55 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ TRS-80
+
+ JV1 disk image format
+
+ Used by Jeff Vavasour's TRS-80 Emulators
+
+ TODO:
+ - Gap sizes unverified
+
+***************************************************************************/
+
+#include "trs80_dsk.h"
+
+trs80_format::trs80_format() : wd177x_format(formats)
+{
+}
+
+const char *trs80_format::name() const
+{
+ return "trs80";
+}
+
+const char *trs80_format::description() const
+{
+ return "TRS-80 JV1 disk image";
+}
+
+const char *trs80_format::extensions() const
+{
+ return "dsk";
+}
+
+int trs80_format::get_track_dam_fm(const format &f, int head, int track)
+{
+ return (track == 17 && head == 0) ? FM_DDAM : FM_DAM;
+}
+
+const trs80_format::format trs80_format::formats[] =
+{
+ {
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 35, 1, 256, {}, 0, {}, 14, 11, 12
+ },
+ {
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 40, 1, 256, {}, 0, {}, 14, 11, 12
+ },
+ {}
+};
+
+const floppy_format_type FLOPPY_TRS80_FORMAT = &floppy_image_format_creator<trs80_format>;
diff --git a/src/lib/formats/trs80_dsk.h b/src/lib/formats/trs80_dsk.h
new file mode 100644
index 00000000000..988d7ee2a7d
--- /dev/null
+++ b/src/lib/formats/trs80_dsk.h
@@ -0,0 +1,36 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ TRS-80
+
+ JV1 disk image format
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __TRS80_DSK_H__
+#define __TRS80_DSK_H__
+
+#include "wd177x_dsk.h"
+
+class trs80_format : public wd177x_format
+{
+public:
+ trs80_format();
+
+ virtual const char *name() const;
+ virtual const char *description() const;
+ virtual const char *extensions() const;
+
+protected:
+ virtual int get_track_dam_fm(const format &f, int head, int track);
+
+private:
+ static const format formats[];
+};
+
+extern const floppy_format_type FLOPPY_TRS80_FORMAT;
+
+#endif // __TRS80_DSK_H__
diff --git a/src/lib/formats/trs_dsk.c b/src/lib/formats/trs_dsk.c
deleted file mode 100644
index 2bb87173167..00000000000
--- a/src/lib/formats/trs_dsk.c
+++ /dev/null
@@ -1,80 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nathan Woods
-#include <string.h>
-#include <assert.h>
-#include "trs_dsk.h"
-#include "basicdsk.h"
-#include "coco_dsk.h"
-
-/* -----------------------------------------------------------------------
- * JV1 (Jeff Vavasour 1) format
- *
- * Used by Jeff Vavasour's TRS-80 Emulators
- *
- * Very straight basic disk; 1 head, 10 sectors, 256 sector length
- * ----------------------------------------------------------------------- */
-
-#define TRS80_JV1_HEADS 1
-#define TRS80_JV1_SECTORS 10
-#define TRS80_JV1_SECTORLENGTH 256
-#define TRS80_JV1_FIRSTSECTORID 0
-
-static FLOPPY_IDENTIFY( trs80_jv1_identify )
-{
- UINT64 size;
- size = floppy_image_size(floppy);
- *vote = (size % (TRS80_JV1_HEADS * TRS80_JV1_SECTORS * TRS80_JV1_SECTORLENGTH))
- ? 0 : 100;
- return FLOPPY_ERROR_SUCCESS;
-}
-
-
-static UINT64 trs80_jv1_get_ddam(floppy_image_legacy *floppy, const struct basicdsk_geometry *geom, int track, int head, int sector)
-{
- // directory track is protected
- if ((track==17) && (head==0)) {
- return ID_FLAG_DELETED_DATA;
- }
- return 0;
-}
-
-static FLOPPY_CONSTRUCT( trs80_jv1_construct )
-{
- struct basicdsk_geometry geometry;
-
- memset(&geometry, 0, sizeof(geometry));
- geometry.heads = TRS80_JV1_HEADS;
- geometry.sectors = TRS80_JV1_SECTORS;
- geometry.first_sector_id = TRS80_JV1_FIRSTSECTORID;
- geometry.sector_length = TRS80_JV1_SECTORLENGTH;
- geometry.get_ddam = trs80_jv1_get_ddam;
-
- if (params)
- {
- /* create */
- geometry.tracks = option_resolution_lookup_int(params, PARAM_TRACKS);
- }
- else
- {
- /* load */
- geometry.tracks = (int) (floppy_image_size(floppy) / geometry.heads
- / geometry.sectors / geometry.sector_length);
- }
- return basicdsk_construct(floppy, &geometry);
-}
-
-
-
-/* ----------------------------------------------------------------------- */
-
-LEGACY_FLOPPY_OPTIONS_START( trs80 )
- LEGACY_FLOPPY_OPTION( trs80_jv1, "dsk", "TRS-80 JV1 disk image", trs80_jv1_identify, trs80_jv1_construct, NULL,
- TRACKS([35]-255))
- LEGACY_FLOPPY_OPTION( trs80_dmk, "dsk,dmk", "TRS-80 DMK disk image", coco_dmk_identify, coco_dmk_construct, NULL,
- HEADS([1]-2)
- TRACKS([35]-255)
- SECTORS(1-[10]-18)
- SECTOR_LENGTH(128/[256]/512/1024/2048/4096/8192)
- INTERLEAVE(0-[6]-17)
- FIRST_SECTOR_ID([0]-1))
-LEGACY_FLOPPY_OPTIONS_END
diff --git a/src/lib/formats/trs_dsk.h b/src/lib/formats/trs_dsk.h
deleted file mode 100644
index a33cec6872b..00000000000
--- a/src/lib/formats/trs_dsk.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nathan Woods
-/*********************************************************************
-
- formats/trs_dsk.h
-
- TRS-80 disk images
-
-*********************************************************************/
-
-#ifndef TRS_DSK_H
-#define TRS_DSK_H
-
-#include "flopimg.h"
-
-/**************************************************************************/
-
-LEGACY_FLOPPY_OPTIONS_EXTERN( trs80 );
-
-#endif /* TRS_DSK_H */
diff --git a/src/mess/drivers/trs80.c b/src/mess/drivers/trs80.c
index c57784bedc1..cccffe4f349 100644
--- a/src/mess/drivers/trs80.c
+++ b/src/mess/drivers/trs80.c
@@ -136,6 +136,8 @@ There don't seem to be any JV1 boot disks for Model III/4.
***************************************************************************/
#include "includes/trs80.h"
+#include "formats/trs80_dsk.h"
+#include "formats/dmk_dsk.h"
static ADDRESS_MAP_START( trs80_map, AS_PROGRAM, 8, trs80_state )
@@ -158,10 +160,10 @@ static ADDRESS_MAP_START( model1_map, AS_PROGRAM, 8, trs80_state )
AM_RANGE(0x37e4, 0x37e7) AM_WRITE(trs80_cassunit_w)
AM_RANGE(0x37e8, 0x37eb) AM_READWRITE(trs80_printer_r, trs80_printer_w)
AM_RANGE(0x37ec, 0x37ec) AM_READ(trs80_wd179x_r)
- AM_RANGE(0x37ec, 0x37ec) AM_DEVWRITE("wd179x", fd1793_device, command_w)
- AM_RANGE(0x37ed, 0x37ed) AM_DEVREADWRITE("wd179x", fd1793_device, track_r, track_w)
- AM_RANGE(0x37ee, 0x37ee) AM_DEVREADWRITE("wd179x", fd1793_device, sector_r, sector_w)
- AM_RANGE(0x37ef, 0x37ef) AM_DEVREADWRITE("wd179x", fd1793_device, data_r, data_w)
+ AM_RANGE(0x37ec, 0x37ec) AM_DEVWRITE("fdc", fd1793_t, cmd_w)
+ AM_RANGE(0x37ed, 0x37ed) AM_DEVREADWRITE("fdc", fd1793_t, track_r, track_w)
+ AM_RANGE(0x37ee, 0x37ee) AM_DEVREADWRITE("fdc", fd1793_t, sector_r, sector_w)
+ AM_RANGE(0x37ef, 0x37ef) AM_DEVREADWRITE("fdc", fd1793_t, data_r, data_w)
AM_RANGE(0x3800, 0x38ff) AM_MIRROR(0x300) AM_READ(trs80_keyboard_r)
AM_RANGE(0x3c00, 0x3fff) AM_READWRITE(trs80_videoram_r, trs80_videoram_w) AM_SHARE("p_videoram")
AM_RANGE(0x4000, 0xffff) AM_RAM
@@ -208,10 +210,10 @@ static ADDRESS_MAP_START( model3_io, AS_IO, 8, trs80_state )
AM_RANGE(0xeb, 0xeb) AM_READWRITE(trs80m4_eb_r, trs80m4_eb_w)
AM_RANGE(0xec, 0xef) AM_READWRITE(trs80m4_ec_r, trs80m4_ec_w)
AM_RANGE(0xf0, 0xf0) AM_READ(trs80_wd179x_r)
- AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("wd179x", fd1793_device, command_w)
- AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("wd179x", fd1793_device, track_r, track_w)
- AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("wd179x", fd1793_device, sector_r, sector_w)
- AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("wd179x", fd1793_device, data_r, data_w)
+ AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("fdc", fd1793_t, cmd_w)
+ AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("fdc", fd1793_t, track_r, track_w)
+ AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("fdc", fd1793_t, sector_r, sector_w)
+ AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("fdc", fd1793_t, data_r, data_w)
AM_RANGE(0xf4, 0xf4) AM_WRITE(trs80m4_f4_w)
AM_RANGE(0xf8, 0xfb) AM_READWRITE(trs80_printer_r, trs80_printer_w)
AM_RANGE(0xfc, 0xff) AM_READWRITE(trs80m4_ff_r, trs80m4_ff_w)
@@ -230,10 +232,10 @@ static ADDRESS_MAP_START( model4_io, AS_IO, 8, trs80_state )
AM_RANGE(0xeb, 0xeb) AM_READWRITE(trs80m4_eb_r, trs80m4_eb_w)
AM_RANGE(0xec, 0xef) AM_READWRITE(trs80m4_ec_r, trs80m4_ec_w)
AM_RANGE(0xf0, 0xf0) AM_READ(trs80_wd179x_r)
- AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("wd179x", fd1793_device, command_w)
- AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("wd179x", fd1793_device, track_r, track_w)
- AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("wd179x", fd1793_device, sector_r, sector_w)
- AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("wd179x", fd1793_device, data_r, data_w)
+ AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("fdc", fd1793_t, cmd_w)
+ AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("fdc", fd1793_t, track_r, track_w)
+ AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("fdc", fd1793_t, sector_r, sector_w)
+ AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("fdc", fd1793_t, data_r, data_w)
AM_RANGE(0xf4, 0xf4) AM_WRITE(trs80m4_f4_w)
AM_RANGE(0xf8, 0xfb) AM_READWRITE(trs80_printer_r, trs80_printer_w)
AM_RANGE(0xfc, 0xff) AM_READWRITE(trs80m4_ff_r, trs80m4_ff_w)
@@ -253,10 +255,10 @@ static ADDRESS_MAP_START( model4p_io, AS_IO, 8, trs80_state )
AM_RANGE(0xeb, 0xeb) AM_READWRITE(trs80m4_eb_r, trs80m4_eb_w)
AM_RANGE(0xec, 0xef) AM_READWRITE(trs80m4_ec_r, trs80m4_ec_w)
AM_RANGE(0xf0, 0xf0) AM_READ(trs80_wd179x_r)
- AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("wd179x", fd1793_device, command_w)
- AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("wd179x", fd1793_device, track_r, track_w)
- AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("wd179x", fd1793_device, sector_r, sector_w)
- AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("wd179x", fd1793_device, data_r, data_w)
+ AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("fdc", fd1793_t, cmd_w)
+ AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("fdc", fd1793_t, track_r, track_w)
+ AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("fdc", fd1793_t, sector_r, sector_w)
+ AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("fdc", fd1793_t, data_r, data_w)
AM_RANGE(0xf4, 0xf4) AM_WRITE(trs80m4_f4_w)
AM_RANGE(0xf8, 0xfb) AM_READWRITE(trs80_printer_r, trs80_printer_w)
AM_RANGE(0xfc, 0xff) AM_READWRITE(trs80m4_ff_r, trs80m4_ff_w)
@@ -277,10 +279,10 @@ static ADDRESS_MAP_START( meritum_io, AS_IO, 8, trs80_state )
// eg. port F0 should be 5, port F2 should have bit 3 set.
//AM_RANGE(0x03, 0x03) unknown
AM_RANGE(0xf0, 0xf0) AM_READ(trs80_wd179x_r)
- AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("wd179x", fd1793_device, command_w)
- AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("wd179x", fd1793_device, track_r, track_w)
- AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("wd179x", fd1793_device, sector_r, sector_w)
- AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("wd179x", fd1793_device, data_r, data_w)
+ AM_RANGE(0xf0, 0xf0) AM_DEVWRITE("fdc", fd1793_t, cmd_w)
+ AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("fdc", fd1793_t, track_r, track_w)
+ AM_RANGE(0xf2, 0xf2) AM_DEVREADWRITE("fdc", fd1793_t, sector_r, sector_w)
+ AM_RANGE(0xf3, 0xf3) AM_DEVREADWRITE("fdc", fd1793_t, data_r, data_w)
AM_RANGE(0xf4, 0xf4) AM_WRITE(trs80m4_f4_w)
AM_RANGE(0xf8, 0xfb) AM_READWRITE(trs80_printer_r, trs80_printer_w)
//AM_RANGE(0xfc, 0xfd) unknown
@@ -545,12 +547,15 @@ static GFXDECODE_START(meritum)
GFXDECODE_END
-static const floppy_interface trs80_floppy_interface =
-{
- FLOPPY_STANDARD_5_25_DSHD,
- LEGACY_FLOPPY_OPTIONS_NAME(trs80),
- NULL
-};
+FLOPPY_FORMATS_MEMBER( trs80_state::floppy_formats )
+ FLOPPY_TRS80_FORMAT,
+ FLOPPY_DMK_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START( trs80_floppies )
+ SLOT_INTERFACE("sssd", FLOPPY_525_SSSD)
+SLOT_INTERFACE_END
+
static MACHINE_CONFIG_START( trs80, trs80_state ) // the original model I, level I, with no extras
/* basic machine hardware */
@@ -595,11 +600,13 @@ static MACHINE_CONFIG_DERIVED( model1, trs80 ) // model I, level II
MCFG_QUICKLOAD_ADD("quickload", trs80_state, trs80_cmd, "cmd", 0.5)
- MCFG_DEVICE_ADD("wd179x", FD1793, 0) // should be FD1771 or FD1791 but inverted data lines are too tricky to fix now
- MCFG_WD17XX_DEFAULT_DRIVE4_TAGS
- MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(trs80_state,trs80_fdc_intrq_w))
+ MCFG_FD1793x_ADD("fdc", XTAL_1MHz) // todo: should be fd1771
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(trs80_state,trs80_fdc_intrq_w))
- MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(trs80_floppy_interface)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", trs80_floppies, "sssd", trs80_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", trs80_floppies, "sssd", trs80_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:2", trs80_floppies, "", trs80_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:3", trs80_floppies, "", trs80_state::floppy_formats)
MCFG_CENTRONICS_ADD("centronics", centronics_devices, "printer")
MCFG_CENTRONICS_BUSY_HANDLER(DEVWRITELINE("cent_status_in", input_buffer_device, write_bit7))
diff --git a/src/mess/includes/trs80.h b/src/mess/includes/trs80.h
index 62925ff3a7c..e4ced5999ab 100644
--- a/src/mess/includes/trs80.h
+++ b/src/mess/includes/trs80.h
@@ -16,12 +16,11 @@
#include "machine/ay31015.h"
#include "machine/buffer.h"
#include "bus/centronics/ctronics.h"
-#include "machine/wd17xx.h"
+#include "machine/wd_fdc.h"
#include "imagedev/cassette.h"
#include "imagedev/flopdrv.h"
#include "imagedev/snapquik.h"
#include "formats/trs_cas.h"
-#include "formats/trs_dsk.h"
class trs80_state : public driver_device
@@ -34,7 +33,11 @@ public:
m_cent_data_out(*this, "cent_data_out"),
m_cent_status_in(*this, "cent_status_in"),
m_ay31015(*this, "tr1602"),
- m_fdc(*this, "wd179x"),
+ m_fdc(*this, "fdc"),
+ m_floppy0(*this, "fdc:0"),
+ m_floppy1(*this, "fdc:1"),
+ m_floppy2(*this, "fdc:2"),
+ m_floppy3(*this, "fdc:3"),
m_speaker(*this, "speaker"),
m_cassette(*this, "cassette"),
m_p_videoram(*this, "p_videoram"),
@@ -67,12 +70,18 @@ public:
m_bank18(NULL),
m_bank19(NULL) { }
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
required_device<cpu_device> m_maincpu;
optional_device<centronics_device> m_centronics;
optional_device<output_latch_device> m_cent_data_out;
optional_device<input_buffer_device> m_cent_status_in;
optional_device<ay31015_device> m_ay31015;
- optional_device<fd1793_device> m_fdc;
+ optional_device<fd1793_t> m_fdc;
+ optional_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+ optional_device<floppy_connector> m_floppy2;
+ optional_device<floppy_connector> m_floppy3;
required_device<speaker_sound_device> m_speaker;
required_device<cassette_image_device> m_cassette;
DECLARE_WRITE8_MEMBER ( trs80_ff_w );
diff --git a/src/mess/machine/trs80.c b/src/mess/machine/trs80.c
index e87ece1c1d1..980176e109e 100644
--- a/src/mess/machine/trs80.c
+++ b/src/mess/machine/trs80.c
@@ -490,8 +490,6 @@ WRITE8_MEMBER( trs80_state::trs80m4_ec_w )
m_port_ec = data & 0x7e;
}
-WRITE8_MEMBER( trs80_state::trs80m4_f4_w )
-{
/* Selection of drive and parameters - d6..d5 not emulated.
A write also causes the selected drive motor to turn on for about 3 seconds.
When the motor turns off, the drive is deselected.
@@ -503,36 +501,24 @@ WRITE8_MEMBER( trs80_state::trs80m4_f4_w )
d2 1=select drive 2
d1 1=select drive 1
d0 1=select drive 0 */
+WRITE8_MEMBER( trs80_state::trs80m4_f4_w )
+{
+ floppy_image_device *floppy = NULL;
- UINT8 drive = 255;
+ 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();
- if (data & 1)
- drive = 0;
- else
- if (data & 2)
- drive = 1;
- else
- if (data & 4)
- drive = 2;
- else
- if (data & 8)
- drive = 3;
+ m_fdc->set_floppy(floppy);
- m_head = (data & 16) ? 1 : 0;
-
- if (drive < 4)
+ if (floppy)
{
- m_fdc->set_drive(drive);
- m_fdc->set_side(m_head);
+ floppy->mon_w(0);
+ floppy->ss_w(BIT(data, 4));
}
m_fdc->dden_w(!BIT(data, 7));
-
- /* CLEAR_LINE means to turn motors on */
- floppy_get_device(machine(), 0)->floppy_mon_w((data & 0x0f) ? CLEAR_LINE : ASSERT_LINE);
- floppy_get_device(machine(), 1)->floppy_mon_w((data & 0x0f) ? CLEAR_LINE : ASSERT_LINE);
- floppy_get_device(machine(), 2)->floppy_mon_w((data & 0x0f) ? CLEAR_LINE : ASSERT_LINE);
- floppy_get_device(machine(), 3)->floppy_mon_w((data & 0x0f) ? CLEAR_LINE : ASSERT_LINE);
}
WRITE8_MEMBER( trs80_state::sys80_f8_w )
@@ -578,10 +564,10 @@ WRITE8_MEMBER( trs80_state::lnw80_fe_w )
mem.install_readwrite_handler (0x37e0, 0x37e3, read8_delegate(FUNC(trs80_state::trs80_irq_status_r), this), write8_delegate(FUNC(trs80_state::trs80_motor_w), this));
mem.install_readwrite_handler (0x37e8, 0x37eb, read8_delegate(FUNC(trs80_state::trs80_printer_r), this), write8_delegate(FUNC(trs80_state::trs80_printer_w), this));
mem.install_read_handler (0x37ec, 0x37ec, read8_delegate(FUNC(trs80_state::trs80_wd179x_r), this));
- mem.install_write_handler (0x37ec, 0x37ec, write8_delegate(FUNC(fd1793_device::command_w),(fd1793_device*)m_fdc));
- mem.install_readwrite_handler (0x37ed, 0x37ed, read8_delegate(FUNC(fd1793_device::track_r),(fd1793_device*)m_fdc), write8_delegate(FUNC(fd1793_device::track_w),(fd1793_device*)m_fdc));
- mem.install_readwrite_handler (0x37ee, 0x37ee, read8_delegate(FUNC(fd1793_device::sector_r),(fd1793_device*)m_fdc), write8_delegate(FUNC(fd1793_device::sector_w),(fd1793_device*)m_fdc));
- mem.install_readwrite_handler (0x37ef, 0x37ef, read8_delegate(FUNC(fd1793_device::data_r),(fd1793_device*)m_fdc),write8_delegate( FUNC(fd1793_device::data_w),(fd1793_device*)m_fdc));
+ mem.install_write_handler (0x37ec, 0x37ec, write8_delegate(FUNC(fd1793_t::cmd_w),(fd1793_t*)m_fdc));
+ mem.install_readwrite_handler (0x37ed, 0x37ed, read8_delegate(FUNC(fd1793_t::track_r),(fd1793_t*)m_fdc), write8_delegate(FUNC(fd1793_t::track_w),(fd1793_t*)m_fdc));
+ mem.install_readwrite_handler (0x37ee, 0x37ee, read8_delegate(FUNC(fd1793_t::sector_r),(fd1793_t*)m_fdc), write8_delegate(FUNC(fd1793_t::sector_w),(fd1793_t*)m_fdc));
+ mem.install_readwrite_handler (0x37ef, 0x37ef, read8_delegate(FUNC(fd1793_t::data_r),(fd1793_t*)m_fdc),write8_delegate( FUNC(fd1793_t::data_w),(fd1793_t*)m_fdc));
mem.install_read_handler (0x3800, 0x38ff, 0, 0x0300, read8_delegate(FUNC(trs80_state::trs80_keyboard_r), this));
mem.install_readwrite_handler (0x3c00, 0x3fff, read8_delegate(FUNC(trs80_state::trs80_videoram_r), this), write8_delegate(FUNC(trs80_state::trs80_videoram_w), this));
}
@@ -745,59 +731,23 @@ READ8_MEMBER( trs80_state::trs80_irq_status_r )
WRITE8_MEMBER( trs80_state::trs80_motor_w )
{
- UINT8 drive = 255;
+ floppy_image_device *floppy = NULL;
- switch (data)
- {
- case 1:
- drive = 0;
- m_head = 0;
- break;
- case 2:
- drive = 1;
- m_head = 0;
- break;
- case 4:
- drive = 2;
- m_head = 0;
- break;
- case 8:
- drive = 3;
- m_head = 0;
- break;
- /* These 3 combinations aren't official. Some manufacturers of double-sided disks
- used drive select 4 to indicate the other side. */
- case 9:
- drive = 0;
- m_head = 1;
- break;
- case 10:
- drive = 1;
- m_head = 1;
- break;
- case 12:
- drive = 2;
- m_head = 1;
- break;
- }
+ 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();
- if (drive > 3)
- { /* Turn motors off */
- floppy_get_device(machine(), 0)->floppy_mon_w(ASSERT_LINE);
- floppy_get_device(machine(), 1)->floppy_mon_w(ASSERT_LINE);
- floppy_get_device(machine(), 2)->floppy_mon_w(ASSERT_LINE);
- floppy_get_device(machine(), 3)->floppy_mon_w(ASSERT_LINE);
- return;
- }
+ m_fdc->set_floppy(floppy);
- m_fdc->set_drive(drive);
- m_fdc->set_side(m_head);
+ if (floppy)
+ {
+ floppy->mon_w(0);
+ floppy->ss_w(BIT(data, 4));
+ }
- /* Turn motors on */
- floppy_get_device(machine(), 0)->floppy_mon_w(CLEAR_LINE);
- floppy_get_device(machine(), 1)->floppy_mon_w(CLEAR_LINE);
- floppy_get_device(machine(), 2)->floppy_mon_w(CLEAR_LINE);
- floppy_get_device(machine(), 3)->floppy_mon_w(CLEAR_LINE);
+ // switch to fm
+ m_fdc->dden_w(1);
}
/*************************************