diff options
-rw-r--r-- | scripts/src/lib.lua | 4 | ||||
-rw-r--r-- | src/lib/formats/trs80_dsk.c | 55 | ||||
-rw-r--r-- | src/lib/formats/trs80_dsk.h | 36 | ||||
-rw-r--r-- | src/lib/formats/trs_dsk.c | 80 | ||||
-rw-r--r-- | src/lib/formats/trs_dsk.h | 20 | ||||
-rw-r--r-- | src/mess/drivers/trs80.c | 67 | ||||
-rw-r--r-- | src/mess/includes/trs80.h | 17 | ||||
-rw-r--r-- | src/mess/machine/trs80.c | 106 |
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); } /************************************* |