summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2014-12-06 13:36:07 +0200
committer Curt Coder <curtcoder@mail.com>2014-12-06 13:36:07 +0200
commit78255c2c595e945d5bfe5b181f0dec96e977ed25 (patch)
tree19fa09337b3d59bbd68bd72953beb11791f67fbe
parenta5fe190070f904644628f7d974797480661ded80 (diff)
(MESS) victor9k: Floppy WIP. (nw)
-rw-r--r--src/mess/machine/victor9k_fdc.c150
-rw-r--r--src/mess/machine/victor9k_fdc.h7
2 files changed, 145 insertions, 12 deletions
diff --git a/src/mess/machine/victor9k_fdc.c b/src/mess/machine/victor9k_fdc.c
index d7af9928498..52d12ddfcd8 100644
--- a/src/mess/machine/victor9k_fdc.c
+++ b/src/mess/machine/victor9k_fdc.c
@@ -53,9 +53,20 @@
#define M6522_5_TAG "1k"
#define M6522_6_TAG "1h"
+// this is exactly the same decode as used in the Commodore 4040/8050 series drives
#define GCR_DECODE(_e, _i) \
((BIT(_e, 6) << 7) | (BIT(_i, 7) << 6) | (_e & 0x33) | (BIT(_e, 2) << 3) | (_i & 0x04))
+// Tandon TM-100 spindle @ 300RPM, measured TACH 12VAC 256Hz
+// TACH = RPM / 60 * SPINDLE RATIO * MOTOR POLES
+// 256 = 300 / 60 * 6.4 * 8
+#define SPINDLE_RATIO 6.4
+#define MOTOR_POLES 8
+
+// TODO wrong values here! motor speed is controlled by an LM2917, with help from the spindle TACH and a DAC0808 whose value is set by the SCP 8048
+const int victor_9000_fdc_t::rpm[] = { 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 254, 255, 257, 259, 260, 262, 264, 266, 267, 269, 271, 273, 275, 276, 278, 280, 282, 284, 286, 288, 290, 291, 293, 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 318, 320, 322, 324, 326, 328, 330, 333, 335, 337, 339, 342, 344, 346, 348, 351, 353, 355, 358, 360, 362, 365, 367, 370, 372, 375, 377, 380, 382, 385, 387, 390, 392, 395, 398, 400, 403, 406, 408, 411, 414, 416, 419, 422, 425, 428, 430, 433, 436, 439, 442, 445, 448, 451, 454, 457, 460, 463, 466, 469, 472, 475, 478, 482, 485, 488, 491, 494, 498, 501, 504, 508, 511, 514, 518, 521, 525, 528, 532, 535, 539, 542, 546, 550, 553, 557, 561, 564, 568, 572, 576, 579, 583, 587, 591, 595, 599, 603, 607, 611, 615, 619, 623, 627, 631, 636, 640, 644, 648, 653, 657, 661, 666, 670, 674, 679, 683, 688, 693, 697, 702, 706, 711, 716, 721, 725, 730, 735, 740, 745, 750, 755, 760, 765, 770, 775, 780, 785, 790, 796, 801, 806, 812, 817, 822, 828, 833, 839, 844, 850, 856, 861, 867, 873, 878, 884 };
+
+
//**************************************************************************
// DEVICE DEFINITIONS
@@ -92,7 +103,7 @@ const rom_entry *victor_9000_fdc_t::device_rom_region() const
//-------------------------------------------------
static ADDRESS_MAP_START( floppy_io, AS_IO, 8, victor_9000_fdc_t )
- AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r) AM_WRITENOP
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(floppy_p1_r, floppy_p1_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(floppy_p2_r, floppy_p2_w)
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(tach0_r)
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(tach1_r)
@@ -106,6 +117,7 @@ ADDRESS_MAP_END
int victor_9000_fdc_t::load0_cb(floppy_image_device *device)
{
+ // DOOR OPEN 0
m_via4->write_ca1(0);
return IMAGE_INIT_PASS;
@@ -113,11 +125,13 @@ int victor_9000_fdc_t::load0_cb(floppy_image_device *device)
void victor_9000_fdc_t::unload0_cb(floppy_image_device *device)
{
+ // DOOR OPEN 0
m_via4->write_ca1(1);
}
int victor_9000_fdc_t::load1_cb(floppy_image_device *device)
{
+ // DOOR OPEN 1
m_via4->write_cb1(0);
return IMAGE_INIT_PASS;
@@ -125,6 +139,7 @@ int victor_9000_fdc_t::load1_cb(floppy_image_device *device)
void victor_9000_fdc_t::unload1_cb(floppy_image_device *device)
{
+ // DOOR OPEN 1
m_via4->write_cb1(1);
}
@@ -147,7 +162,9 @@ static MACHINE_CONFIG_FRAGMENT( victor_9000_fdc )
MCFG_CPU_IO_MAP(floppy_io)
MCFG_DEVICE_ADD(M6522_4_TAG, VIA6522, XTAL_30MHz/30)
+ MCFG_VIA6522_READPA_HANDLER(READ8(victor_9000_fdc_t, via4_pa_r))
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(victor_9000_fdc_t, via4_pa_w))
+ MCFG_VIA6522_READPB_HANDLER(READ8(victor_9000_fdc_t, via4_pb_r))
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor_9000_fdc_t, via4_pb_w))
MCFG_VIA6522_CA2_HANDLER(WRITELINE(victor_9000_fdc_t, wrsync_w))
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor_9000_fdc_t, via4_irq_w))
@@ -319,11 +336,13 @@ void victor_9000_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int p
break;
case TM_TACH0:
- // TODO
+ m_tach0 = !m_tach0;
+ if (LOG_SCP) logerror("TACH0 %u\n", m_tach0);
break;
case TM_TACH1:
- // TODO
+ m_tach1 = !m_tach1;
+ if (LOG_SCP) logerror("TACH1 %u\n", m_tach1);
break;
}
}
@@ -355,12 +374,58 @@ READ8_MEMBER( victor_9000_fdc_t::floppy_p1_r )
//-------------------------------------------------
+// floppy_p1_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( victor_9000_fdc_t::floppy_p1_w )
+{
+ /*
+
+ bit description
+
+ 0 L0MS0
+ 1 L0MS1
+ 2 L0MS2
+ 3 L0MS3
+ 4 L1MS0
+ 5 L1MS1
+ 6 L1MS2
+ 7 L1MS3
+
+ */
+
+ m_l0ms = data & 0x0f;
+ m_l1ms = data >> 4;
+}
+
+
+//-------------------------------------------------
// floppy_p2_r -
//-------------------------------------------------
READ8_MEMBER( victor_9000_fdc_t::floppy_p2_r )
{
- return m_p2; // TODO needed because of ORL/ANL P2, should be in mcs48.c
+ /*
+
+ bit description
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6 RDY0
+ 7 RDY1
+
+ */
+
+ UINT8 data = m_p2 & 0x3f;
+
+ data |= m_rdy0 << 6;
+ data |= m_rdy1 << 7;
+
+ return data;
}
@@ -407,11 +472,8 @@ WRITE8_MEMBER( victor_9000_fdc_t::floppy_p2_w )
int sel1 = BIT(data, 4);
if (m_sel1 != sel1) sync = true;
- //m_rdy0 = BIT(data, 6);
- //m_via5->write_ca2(m_rdy0);
-
- //m_rdy1 = BIT(data, 7);
- //m_via5->write_cb2(m_rdy1);
+ set_rdy0(BIT(data, 6));
+ set_rdy1(BIT(data, 7));
if (LOG_SCP) logerror("%s %s START0/STOP0/SEL0/RDY0 %u/%u/%u/%u START1/STOP1/SEL1/RDY1 %u/%u/%u/%u\n", machine().time().as_string(), machine().describe_context(), start0, stop0, sel0, m_rdy0, start1, stop1, sel1, m_rdy1);
@@ -500,13 +562,34 @@ void victor_9000_fdc_t::update_spindle_motor(floppy_image_device *floppy, emu_ti
} else if (stop && !floppy->mon_r()) {
if (LOG_SCP) logerror("%s: motor stop\n", floppy->tag());
floppy->mon_w(1);
+ t_tach->reset();
}
if (sel) {
da = m_da;
+ if (!floppy->mon_r()) {
+ float tach = rpm[da] / 60 * SPINDLE_RATIO * MOTOR_POLES;
+
+ if (LOG_SCP) logerror("%s: motor speed %u rpm / tach %0.1f hz (DA %02x)\n", floppy->tag(), rpm[da], tach, da);
+
+ t_tach->adjust(attotime::from_hz(tach*2), 0, attotime::from_hz(tach*2));
+ floppy->set_rpm(rpm[da]);
+ }
}
}
+void victor_9000_fdc_t::set_rdy0(int state)
+{
+ //m_rdy0 = state;
+ //m_via5->write_ca2(m_rdy0);
+}
+
+void victor_9000_fdc_t::set_rdy1(int state)
+{
+ //m_rdy1 = state;
+ //m_via5->write_cb2(m_rdy1);
+}
+
//-------------------------------------------------
// da_w -
@@ -527,6 +610,26 @@ WRITE8_MEMBER( victor_9000_fdc_t::da_w )
}
}
+READ8_MEMBER( victor_9000_fdc_t::via4_pa_r )
+{
+ /*
+
+ bit description
+
+ PA0 L0MS0
+ PA1 L0MS1
+ PA2 L0MS2
+ PA3 L0MS3
+ PA4
+ PA5
+ PA6
+ PA7
+
+ */
+
+ return m_l0ms;
+}
+
WRITE8_MEMBER( victor_9000_fdc_t::via4_pa_w )
{
/*
@@ -567,6 +670,26 @@ WRITE8_MEMBER( victor_9000_fdc_t::via4_pa_w )
}
}
+READ8_MEMBER( victor_9000_fdc_t::via4_pb_r )
+{
+ /*
+
+ bit description
+
+ PB0 L1MS0
+ PB1 L1MS1
+ PB2 L1MS2
+ PB3 L1MS3
+ PB4
+ PB5
+ PB6
+ PB7
+
+ */
+
+ return m_l1ms;
+}
+
WRITE8_MEMBER( victor_9000_fdc_t::via4_pb_w )
{
/*
@@ -615,7 +738,7 @@ WRITE_LINE_MEMBER( victor_9000_fdc_t::wrsync_w )
m_wrsync = state;
cur_live.wrsync = state;
checkpoint();
- if (LOG_VIA) logerror("%s %s ERASE %u\n", machine().time().as_string(), machine().describe_context(), state);
+ if (LOG_VIA) logerror("%s %s WRSYNC %u\n", machine().time().as_string(), machine().describe_context(), state);
live_run();
}
}
@@ -813,8 +936,8 @@ WRITE8_MEMBER( victor_9000_fdc_t::via6_pb_w )
bit description
- PB0
- PB1
+ PB0 RDY0
+ PB1 RDY1
PB2 _SCRESET
PB3
PB4
@@ -824,6 +947,9 @@ WRITE8_MEMBER( victor_9000_fdc_t::via6_pb_w )
*/
+ set_rdy0(BIT(data, 0));
+ set_rdy1(BIT(data, 1));
+
// motor speed controller reset
if (!BIT(data, 2))
m_maincpu->reset();
diff --git a/src/mess/machine/victor9k_fdc.h b/src/mess/machine/victor9k_fdc.h
index 908518dc43a..577f81b5bcd 100644
--- a/src/mess/machine/victor9k_fdc.h
+++ b/src/mess/machine/victor9k_fdc.h
@@ -63,13 +63,16 @@ public:
DECLARE_FLOPPY_FORMATS( floppy_formats );
DECLARE_READ8_MEMBER( floppy_p1_r );
+ DECLARE_WRITE8_MEMBER( floppy_p1_w );
DECLARE_READ8_MEMBER( floppy_p2_r );
DECLARE_WRITE8_MEMBER( floppy_p2_w );
DECLARE_READ8_MEMBER( tach0_r );
DECLARE_READ8_MEMBER( tach1_r );
DECLARE_WRITE8_MEMBER( da_w );
+ DECLARE_READ8_MEMBER( via4_pa_r );
DECLARE_WRITE8_MEMBER( via4_pa_w );
+ DECLARE_READ8_MEMBER( via4_pb_r );
DECLARE_WRITE8_MEMBER( via4_pb_w );
DECLARE_WRITE_LINE_MEMBER( wrsync_w );
DECLARE_WRITE_LINE_MEMBER( via4_irq_w );
@@ -97,6 +100,8 @@ protected:
virtual machine_config_constructor device_mconfig_additions() const;
private:
+ static const int rpm[0x100];
+
enum
{
TM_GEN,
@@ -167,6 +172,8 @@ private:
void update_stepper_motor(floppy_image_device *floppy, int stp, int old_st, int st);
void update_spindle_motor(floppy_image_device *floppy, emu_timer *t_tach, bool start, bool stop, bool sel, UINT8 &da);
+ void set_rdy0(int state);
+ void set_rdy1(int state);
int load0_cb(floppy_image_device *device);
void unload0_cb(floppy_image_device *device);