summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine
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 /src/mess/machine
parent5f72cb409c6194a1eaca27bf7474d7082ccdc097 (diff)
trs80: updated to use the new wd fdc
Diffstat (limited to 'src/mess/machine')
-rw-r--r--src/mess/machine/trs80.c106
1 files changed, 28 insertions, 78 deletions
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);
}
/*************************************