victor9k: Implemented SCP communications. Boots also to MS-DOS now. Promoted driver to working. [Curt Coder]

This commit is contained in:
Curt Coder 2016-08-14 23:36:17 +03:00
parent 5f5bcbed6d
commit 92858ce2c4
4 changed files with 52 additions and 48 deletions

View File

@ -2,7 +2,7 @@
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="victor9k_flop" description="Victor 9000 / ACT Sirius 1 diskettes">
<software name="audiokit" supported="no">
<software name="audiokit">
<description>Victor Audio Toolkit (v1.2)</description>
<year>1983</year>
<publisher>Victor Technologies</publisher>
@ -14,7 +14,7 @@
</part>
</software>
<software name="cpm86" supported="no">
<software name="cpm86">
<description>CP/M 86 v1.1-2.4</description>
<year>1982</year>
<publisher>&lt;unknown&gt;</publisher>

View File

@ -670,4 +670,4 @@ ROM_END
//**************************************************************************
// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS
COMP( 1982, victor9k, 0, 0, victor9k, victor9k, driver_device, 0, "Victor Business Products", "Victor 9000", MACHINE_NOT_WORKING )
COMP( 1982, victor9k, 0, 0, victor9k, victor9k, driver_device, 0, "Victor Business Products", "Victor 9000", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -29,7 +29,6 @@
TODO:
- audiokit tries to communicate with SCP using RDY0/1
- write protect
- separate read/write methods
- communication error with SCP after loading boot sector
@ -247,8 +246,14 @@ victor_9000_fdc_t::victor_9000_fdc_t(const machine_config &mconfig, const char *
m_tach1(0),
m_rdy0(0),
m_rdy1(0),
m_l0ms(0),
m_l1ms(0),
m_scp_rdy0(0),
m_scp_rdy1(0),
m_via_rdy0(1),
m_via_rdy1(1),
m_scp_l0ms(0),
m_scp_l1ms(0),
m_via_l0ms(0),
m_via_l1ms(0),
m_st0(0),
m_st1(0),
m_stp0(0),
@ -296,10 +301,14 @@ void victor_9000_fdc_t::device_start()
save_item(NAME(m_tach1));
save_item(NAME(m_rdy0));
save_item(NAME(m_rdy1));
save_item(NAME(m_scp_rdy0));
save_item(NAME(m_scp_rdy1));
save_item(NAME(m_via_rdy0));
save_item(NAME(m_via_rdy1));
save_item(NAME(m_l0ms));
save_item(NAME(m_l1ms));
save_item(NAME(m_scp_l0ms));
save_item(NAME(m_scp_l1ms));
save_item(NAME(m_via_l0ms));
save_item(NAME(m_via_l1ms));
save_item(NAME(m_st0));
save_item(NAME(m_st1));
save_item(NAME(m_stp0));
@ -389,7 +398,7 @@ READ8_MEMBER( victor_9000_fdc_t::floppy_p1_r )
*/
return (m_l1ms << 4) | m_l0ms;
return (m_via_l1ms << 4) | m_via_l0ms;
}
@ -414,8 +423,8 @@ WRITE8_MEMBER( victor_9000_fdc_t::floppy_p1_w )
*/
m_l0ms = data & 0x0f;
m_l1ms = data >> 4;
m_scp_l0ms = data & 0x0f;
m_scp_l1ms = data >> 4;
}
@ -492,8 +501,9 @@ WRITE8_MEMBER( victor_9000_fdc_t::floppy_p2_w )
int sel1 = BIT(data, 4);
if (m_sel1 != sel1) sync = true;
set_rdy0(BIT(data, 6));
set_rdy1(BIT(data, 7));
m_scp_rdy0 = BIT(data, 6);
m_scp_rdy1 = BIT(data, 7);
update_rdy();
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);
@ -614,20 +624,10 @@ void victor_9000_fdc_t::update_rpm(floppy_image_device *floppy, emu_timer *t_tac
#endif
}
void victor_9000_fdc_t::set_rdy0(int state)
void victor_9000_fdc_t::update_rdy()
{
#ifdef USE_SCP
m_rdy0 = state;
m_via5->write_ca2(m_rdy0);
#endif
}
void victor_9000_fdc_t::set_rdy1(int state)
{
#ifdef USE_SCP
m_rdy1 = state;
m_via5->write_cb2(m_rdy1);
#endif
m_via5->write_ca2((m_via_rdy0 && m_via_rdy1) ? m_rdy0 : m_scp_rdy0);
m_via5->write_cb2((m_via_rdy0 && m_via_rdy1) ? m_rdy1 : m_scp_rdy1);
}
@ -664,7 +664,7 @@ READ8_MEMBER( victor_9000_fdc_t::via4_pa_r )
*/
return m_l0ms;
return m_scp_l0ms;
}
WRITE8_MEMBER( victor_9000_fdc_t::via4_pa_w )
@ -684,23 +684,23 @@ WRITE8_MEMBER( victor_9000_fdc_t::via4_pa_w )
*/
m_l0ms = data & 0x0f;
m_via_l0ms = data & 0x0f;
#ifndef USE_SCP
{ // HACK to bypass SCP
if (m_floppy0->get_device())
{
m_floppy0->get_device()->mon_w((m_l0ms == 0xf) ? 1 : 0);
m_floppy0->get_device()->mon_w((m_via_l0ms == 0xf) ? 1 : 0);
m_floppy0->get_device()->set_rpm(victor9k_format::get_rpm(m_side, m_floppy0->get_device()->get_cyl()));
}
m_rdy0 = (m_l0ms == 0xf) ? 0 : 1;
m_via5->write_ca2(m_rdy0);
m_rdy0 = (m_via_l0ms == 0xf) ? 0 : 1;
update_rdy();
}
#endif
UINT8 st0 = data >> 4;
if (LOG_VIA) logerror("%s %s L0MS %01x ST0 %01x\n", machine().time().as_string(), machine().describe_context(), m_l0ms, st0);
if (LOG_VIA) logerror("%s %s L0MS %01x ST0 %01x\n", machine().time().as_string(), machine().describe_context(), m_via_l0ms, st0);
if (m_st0 != st0)
{
@ -729,7 +729,7 @@ READ8_MEMBER( victor_9000_fdc_t::via4_pb_r )
*/
return m_l1ms;
return m_scp_l1ms;
}
WRITE8_MEMBER( victor_9000_fdc_t::via4_pb_w )
@ -749,23 +749,23 @@ WRITE8_MEMBER( victor_9000_fdc_t::via4_pb_w )
*/
m_l1ms = data & 0x0f;
m_via_l1ms = data & 0x0f;
#ifndef USE_SCP
{ // HACK to bypass SCP
if (m_floppy1->get_device())
{
m_floppy1->get_device()->mon_w((m_l1ms == 0xf) ? 1 : 0);
m_floppy1->get_device()->mon_w((m_via_l1ms == 0xf) ? 1 : 0);
m_floppy1->get_device()->set_rpm(victor9k_format::get_rpm(m_side, m_floppy1->get_device()->get_cyl()));
}
m_rdy1 = (m_l1ms == 0xf) ? 0 : 1;
m_via5->write_cb2(m_rdy1);
m_rdy1 = (m_via_l1ms == 0xf) ? 0 : 1;
update_rdy();
}
#endif
UINT8 st1 = data >> 4;
if (LOG_VIA) logerror("%s %s L1MS %01x ST1 %01x\n", machine().time().as_string(), machine().describe_context(), m_l1ms, st1);
if (LOG_VIA) logerror("%s %s L1MS %01x ST1 %01x\n", machine().time().as_string(), machine().describe_context(), m_via_l1ms, st1);
if (m_st1 != st1)
{
@ -949,8 +949,8 @@ READ8_MEMBER( victor_9000_fdc_t::via6_pb_r )
bit description
PB0 RDY0
PB1 RDY1
PB0 RDY0 from SCP
PB1 RDY1 from SCP
PB2
PB3 _DS1
PB4 _DS0
@ -963,10 +963,10 @@ READ8_MEMBER( victor_9000_fdc_t::via6_pb_r )
UINT8 data = 0;
// motor speed status, drive A
data |= m_rdy0;
data |= (m_via_rdy0 && m_via_rdy1) ? m_rdy0 : m_scp_rdy0;
// motor speed status, drive B
data |= m_rdy1 << 1;
data |= ((m_via_rdy0 && m_via_rdy1) ? m_rdy1 : m_scp_rdy1) << 1;
// door B sense
data |= ((m_floppy1->get_device() && m_floppy1->get_device()->exists()) ? 0 : 1) << 3;
@ -986,8 +986,8 @@ WRITE8_MEMBER( victor_9000_fdc_t::via6_pb_w )
bit description
PB0 RDY0
PB1 RDY1
PB0 RDY0 to SCP
PB1 RDY1 to SCP
PB2 _SCRESET
PB3
PB4
@ -999,6 +999,7 @@ WRITE8_MEMBER( victor_9000_fdc_t::via6_pb_w )
m_via_rdy0 = BIT(data, 0);
m_via_rdy1 = BIT(data, 1);
update_rdy();
// motor speed controller reset
if (!BIT(data, 2))

View File

@ -166,8 +166,7 @@ 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 update_rpm(floppy_image_device *floppy, emu_timer *t_tach, bool sel, UINT8 &da);
void set_rdy0(int state);
void set_rdy1(int state);
void update_rdy();
image_init_result load0_cb(floppy_image_device *device);
void unload0_cb(floppy_image_device *device);
@ -191,10 +190,14 @@ private:
int m_tach1;
int m_rdy0;
int m_rdy1;
int m_scp_rdy0;
int m_scp_rdy1;
int m_via_rdy0;
int m_via_rdy1;
UINT8 m_l0ms;
UINT8 m_l1ms;
UINT8 m_scp_l0ms;
UINT8 m_scp_l1ms;
UINT8 m_via_l0ms;
UINT8 m_via_l1ms;
int m_st0;
int m_st1;
int m_stp0;