mirror of
https://github.com/holub/mame
synced 2025-07-05 09:57:47 +03:00
upd765: Explicitly emulate reset line
* hx5102: Add addressable latches
This commit is contained in:
parent
d95c5b097a
commit
51a4222299
@ -121,7 +121,9 @@ void hx5102_device::memmap(address_map &map)
|
|||||||
*/
|
*/
|
||||||
void hx5102_device::crumap(address_map &map)
|
void hx5102_device::crumap(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x17e0, 0x17ff).rw(FUNC(hx5102_device::cruread), FUNC(hx5102_device::cruwrite));
|
map(0x17e0, 0x17ff).r(FUNC(hx5102_device::cruread));
|
||||||
|
map(0x17e0, 0x17ef).w(m_crulatch[0], FUNC(ls259_device::write_d0));
|
||||||
|
map(0x17f0, 0x17ff).w(m_crulatch[1], FUNC(ls259_device::write_d0));
|
||||||
}
|
}
|
||||||
|
|
||||||
hx5102_device::hx5102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock):
|
hx5102_device::hx5102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock):
|
||||||
@ -140,6 +142,7 @@ hx5102_device::hx5102_device(const machine_config &mconfig, const char *tag, dev
|
|||||||
m_floppy_select_last(UNDEF),
|
m_floppy_select_last(UNDEF),
|
||||||
m_hexbus_ctrl(*this, IBC_TAG),
|
m_hexbus_ctrl(*this, IBC_TAG),
|
||||||
m_floppy_ctrl(*this, FDC_TAG),
|
m_floppy_ctrl(*this, FDC_TAG),
|
||||||
|
m_crulatch(*this, "crulatch%u", 0U),
|
||||||
m_motormf(*this, MTRD_TAG),
|
m_motormf(*this, MTRD_TAG),
|
||||||
m_speedmf(*this, MTSPD_TAG),
|
m_speedmf(*this, MTSPD_TAG),
|
||||||
m_readyff(*this, READYFF_TAG),
|
m_readyff(*this, READYFF_TAG),
|
||||||
@ -480,92 +483,81 @@ uint8_t hx5102_device::cruread(offs_t offset)
|
|||||||
/*
|
/*
|
||||||
CRU write access.
|
CRU write access.
|
||||||
*/
|
*/
|
||||||
void hx5102_device::cruwrite(offs_t offset, uint8_t data)
|
WRITE_LINE_MEMBER(hx5102_device::nocomp_w)
|
||||||
{
|
{
|
||||||
// LOG("Writing CRU address %04x: %x\n", 0x17e0 + (offset<<1), data);
|
// unused right now
|
||||||
switch (offset)
|
LOGMASKED(LOG_CRU, "Set precompensation = %d\n", state);
|
||||||
{
|
}
|
||||||
case 0:
|
|
||||||
// unused right now
|
|
||||||
LOGMASKED(LOG_CRU, "Set precompensation = %d\n", data);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (data==1)
|
|
||||||
{
|
|
||||||
LOGMASKED(LOG_CRU, "Trigger motor monoflop\n");
|
|
||||||
}
|
|
||||||
m_motormf->b_w(data);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
LOGMASKED(LOG_CRU, "Set undefined CRU bit 2 to %d\n", data);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
LOGMASKED(LOG_CRU, "Set step direction = %d\n", data);
|
|
||||||
if (m_current_floppy != nullptr) m_current_floppy->dir_w((data==0)? 1 : 0);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
if (data==1)
|
|
||||||
{
|
|
||||||
LOGMASKED(LOG_CRU, "Assert DACK*\n");
|
|
||||||
m_dacken = (data != 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
if (data==1)
|
|
||||||
{
|
|
||||||
LOGMASKED(LOG_CRU, "Step pulse\n");
|
|
||||||
}
|
|
||||||
if (m_current_floppy != nullptr) m_current_floppy->stp_w((data==0)? 1 : 0);
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
if (data==1)
|
|
||||||
{
|
|
||||||
LOGMASKED(LOG_CRU, "Start watchdog\n");
|
|
||||||
}
|
|
||||||
m_speedmf->b_w(data);
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
if (data==0)
|
|
||||||
{
|
|
||||||
LOGMASKED(LOG_CRU, "Reset i8272A controller\n");
|
|
||||||
m_floppy_ctrl->soft_reset();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
LOGMASKED(LOG_CRU, "Set drive select 0 to %d\n", data);
|
|
||||||
if (data == 1) m_floppy_select |= 1;
|
|
||||||
else m_floppy_select &= ~1;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
LOGMASKED(LOG_CRU, "Set drive select 1 to %d\n", data);
|
|
||||||
if (data == 1) m_floppy_select |= 2;
|
|
||||||
else m_floppy_select &= ~2;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
// External drive; not implemented
|
|
||||||
LOGMASKED(LOG_CRU, "Set drive select 2 to %d\n", data);
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
// External drive; not implemented
|
|
||||||
LOGMASKED(LOG_CRU, "Set drive select 3 to %d\n", data);
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
// External drive; not implemented
|
|
||||||
LOGMASKED(LOG_CRU, "Set auxiliary motor line to %d\n", data);
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
LOGMASKED(LOG_CRU, "Set CRU bit 13 to %d (unused)\n", data);
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
m_wait = (data!=0);
|
|
||||||
LOGMASKED(LOG_CRU, "READY circuit %s\n", m_wait? "active" : "inactive" );
|
|
||||||
update_readyff_input();
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
LOGMASKED(LOG_CRU, "Set CRU bit 15 to %d (unused)\n", data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::diren_w)
|
||||||
|
{
|
||||||
|
LOGMASKED(LOG_CRU, "Set step direction = %d\n", state);
|
||||||
|
if (m_current_floppy != nullptr)
|
||||||
|
m_current_floppy->dir_w((state==0)? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::dacken_w)
|
||||||
|
{
|
||||||
|
if (state==1)
|
||||||
|
LOGMASKED(LOG_CRU, "Assert DACK*\n");
|
||||||
|
m_dacken = (state != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::stepen_w)
|
||||||
|
{
|
||||||
|
if (state==1)
|
||||||
|
LOGMASKED(LOG_CRU, "Step pulse\n");
|
||||||
|
if (m_current_floppy != nullptr)
|
||||||
|
m_current_floppy->stp_w((state==0)? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::ds1_w)
|
||||||
|
{
|
||||||
|
LOGMASKED(LOG_CRU, "Set drive select 0 to %d\n", state);
|
||||||
|
if (state == 1)
|
||||||
|
m_floppy_select |= 1;
|
||||||
|
else
|
||||||
|
m_floppy_select &= ~1;
|
||||||
|
update_drive_select();
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::ds2_w)
|
||||||
|
{
|
||||||
|
LOGMASKED(LOG_CRU, "Set drive select 1 to %d\n", state);
|
||||||
|
if (state == 1)
|
||||||
|
m_floppy_select |= 2;
|
||||||
|
else
|
||||||
|
m_floppy_select &= ~2;
|
||||||
|
update_drive_select();
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::ds3_w)
|
||||||
|
{
|
||||||
|
// External drive; not implemented
|
||||||
|
LOGMASKED(LOG_CRU, "Set drive select 2 to %d\n", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::ds4_w)
|
||||||
|
{
|
||||||
|
// External drive; not implemented
|
||||||
|
LOGMASKED(LOG_CRU, "Set drive select 3 to %d\n", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::aux_motor_w)
|
||||||
|
{
|
||||||
|
// External drive; not implemented
|
||||||
|
LOGMASKED(LOG_CRU, "Set auxiliary motor line to %d\n", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(hx5102_device::wait_w)
|
||||||
|
{
|
||||||
|
m_wait = (state!=0);
|
||||||
|
LOGMASKED(LOG_CRU, "READY circuit %s\n", m_wait? "active" : "inactive" );
|
||||||
|
update_readyff_input();
|
||||||
|
}
|
||||||
|
|
||||||
|
void hx5102_device::update_drive_select()
|
||||||
|
{
|
||||||
if (m_floppy_select != m_floppy_select_last)
|
if (m_floppy_select != m_floppy_select_last)
|
||||||
{
|
{
|
||||||
if (m_floppy_select == 1)
|
if (m_floppy_select == 1)
|
||||||
@ -677,7 +669,7 @@ void hx5102_device::device_add_mconfig(machine_config& config)
|
|||||||
HEXBUS(config, "hexbus", 0, hexbus_options, nullptr);
|
HEXBUS(config, "hexbus", 0, hexbus_options, nullptr);
|
||||||
|
|
||||||
// TMS9995 CPU @ 12.0 MHz
|
// TMS9995 CPU @ 12.0 MHz
|
||||||
TMS9995(config, m_flopcpu, XTAL(12'000'000));
|
TMS9995(config, m_flopcpu, 12_MHz_XTAL);
|
||||||
m_flopcpu->set_addrmap(AS_PROGRAM, &hx5102_device::memmap);
|
m_flopcpu->set_addrmap(AS_PROGRAM, &hx5102_device::memmap);
|
||||||
m_flopcpu->set_addrmap(AS_IO, &hx5102_device::crumap);
|
m_flopcpu->set_addrmap(AS_IO, &hx5102_device::crumap);
|
||||||
m_flopcpu->extop_cb().set(FUNC(hx5102_device::external_operation));
|
m_flopcpu->extop_cb().set(FUNC(hx5102_device::external_operation));
|
||||||
@ -687,27 +679,41 @@ void hx5102_device::device_add_mconfig(machine_config& config)
|
|||||||
// Not connected: Select lines (DS0, DS1), Head load (HDL), VCO
|
// Not connected: Select lines (DS0, DS1), Head load (HDL), VCO
|
||||||
// Tied to 1: READY
|
// Tied to 1: READY
|
||||||
// Tied to 0: TC
|
// Tied to 0: TC
|
||||||
I8272A(config, m_floppy_ctrl, 8'000'000, false);
|
I8272A(config, m_floppy_ctrl, 8_MHz_XTAL / 2, false);
|
||||||
m_floppy_ctrl->intrq_wr_callback().set(FUNC(hx5102_device::fdc_irq_w));
|
m_floppy_ctrl->intrq_wr_callback().set(FUNC(hx5102_device::fdc_irq_w));
|
||||||
m_floppy_ctrl->drq_wr_callback().set(FUNC(hx5102_device::fdc_drq_w));
|
m_floppy_ctrl->drq_wr_callback().set(FUNC(hx5102_device::fdc_drq_w));
|
||||||
|
|
||||||
FLOPPY_CONNECTOR(config, "d0", hx5102_drive, "525dd", hx5102_device::floppy_formats).enable_sound(true);
|
FLOPPY_CONNECTOR(config, "d0", hx5102_drive, "525dd", hx5102_device::floppy_formats).enable_sound(true);
|
||||||
FLOPPY_CONNECTOR(config, "d1", hx5102_drive, nullptr, hx5102_device::floppy_formats).enable_sound(true);
|
FLOPPY_CONNECTOR(config, "d1", hx5102_drive, nullptr, hx5102_device::floppy_formats).enable_sound(true);
|
||||||
|
|
||||||
|
// Addressable latches
|
||||||
|
LS259(config, m_crulatch[0]); // U18
|
||||||
|
m_crulatch[0]->q_out_cb<0>().set(FUNC(hx5102_device::nocomp_w));
|
||||||
|
m_crulatch[0]->q_out_cb<1>().set(m_motormf, FUNC(ttl74123_device::b_w));
|
||||||
|
m_crulatch[0]->q_out_cb<3>().set(FUNC(hx5102_device::diren_w));
|
||||||
|
m_crulatch[0]->q_out_cb<4>().set(FUNC(hx5102_device::dacken_w));
|
||||||
|
m_crulatch[0]->q_out_cb<5>().set(FUNC(hx5102_device::stepen_w));
|
||||||
|
m_crulatch[0]->q_out_cb<6>().set(m_speedmf, FUNC(ttl74123_device::b_w));
|
||||||
|
m_crulatch[0]->q_out_cb<7>().set(m_floppy_ctrl, FUNC(i8272a_device::reset_w)).invert();
|
||||||
|
|
||||||
|
LS259(config, m_crulatch[1]); // U10
|
||||||
|
m_crulatch[1]->q_out_cb<0>().set(FUNC(hx5102_device::ds1_w));
|
||||||
|
m_crulatch[1]->q_out_cb<1>().set(FUNC(hx5102_device::ds2_w));
|
||||||
|
m_crulatch[1]->q_out_cb<2>().set(FUNC(hx5102_device::ds3_w));
|
||||||
|
m_crulatch[1]->q_out_cb<3>().set(FUNC(hx5102_device::ds4_w));
|
||||||
|
m_crulatch[1]->q_out_cb<4>().set(FUNC(hx5102_device::aux_motor_w));
|
||||||
|
m_crulatch[1]->q_out_cb<6>().set(FUNC(hx5102_device::wait_w));
|
||||||
|
|
||||||
// Monoflops
|
// Monoflops
|
||||||
TTL74123(config, m_motormf, 0);
|
TTL74123(config, m_motormf, RES_K(200), CAP_U(47));
|
||||||
m_motormf->set_connection_type(TTL74123_GROUNDED);
|
m_motormf->set_connection_type(TTL74123_GROUNDED);
|
||||||
m_motormf->set_resistor_value(RES_K(200));
|
|
||||||
m_motormf->set_capacitor_value(CAP_U(47));
|
|
||||||
m_motormf->set_a_pin_value(0);
|
m_motormf->set_a_pin_value(0);
|
||||||
m_motormf->set_b_pin_value(1);
|
m_motormf->set_b_pin_value(1);
|
||||||
m_motormf->set_clear_pin_value(1);
|
m_motormf->set_clear_pin_value(1);
|
||||||
m_motormf->out_cb().set(FUNC(hx5102_device::motor_w));
|
m_motormf->out_cb().set(FUNC(hx5102_device::motor_w));
|
||||||
|
|
||||||
TTL74123(config, m_speedmf, 0);
|
TTL74123(config, m_speedmf, RES_K(200), CAP_U(10));
|
||||||
m_speedmf->set_connection_type(TTL74123_GROUNDED);
|
m_speedmf->set_connection_type(TTL74123_GROUNDED);
|
||||||
m_speedmf->set_resistor_value(RES_K(200));
|
|
||||||
m_speedmf->set_capacitor_value(CAP_U(10));
|
|
||||||
m_speedmf->set_a_pin_value(0);
|
m_speedmf->set_a_pin_value(0);
|
||||||
m_speedmf->set_b_pin_value(1);
|
m_speedmf->set_b_pin_value(1);
|
||||||
m_speedmf->set_clear_pin_value(1);
|
m_speedmf->set_clear_pin_value(1);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "machine/upd765.h"
|
#include "machine/upd765.h"
|
||||||
#include "machine/7474.h"
|
#include "machine/7474.h"
|
||||||
#include "machine/74123.h"
|
#include "machine/74123.h"
|
||||||
|
#include "machine/74259.h"
|
||||||
#include "machine/rescap.h"
|
#include "machine/rescap.h"
|
||||||
#include "machine/ram.h"
|
#include "machine/ram.h"
|
||||||
#include "imagedev/floppy.h"
|
#include "imagedev/floppy.h"
|
||||||
@ -71,7 +72,17 @@ private:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(hsklatch_out);
|
DECLARE_WRITE_LINE_MEMBER(hsklatch_out);
|
||||||
|
|
||||||
uint8_t cruread(offs_t offset);
|
uint8_t cruread(offs_t offset);
|
||||||
void cruwrite(offs_t offset, uint8_t data);
|
DECLARE_WRITE_LINE_MEMBER(nocomp_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(diren_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(dacken_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(stepen_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ds1_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ds2_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ds3_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ds4_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(aux_motor_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(wait_w);
|
||||||
|
void update_drive_select();
|
||||||
|
|
||||||
// Operate the floppy motors
|
// Operate the floppy motors
|
||||||
bool m_motor_on;
|
bool m_motor_on;
|
||||||
@ -96,6 +107,7 @@ private:
|
|||||||
|
|
||||||
required_device<ibc_device> m_hexbus_ctrl;
|
required_device<ibc_device> m_hexbus_ctrl;
|
||||||
required_device<i8272a_device> m_floppy_ctrl;
|
required_device<i8272a_device> m_floppy_ctrl;
|
||||||
|
required_device_array<ls259_device, 2> m_crulatch;
|
||||||
required_device<ttl74123_device> m_motormf;
|
required_device<ttl74123_device> m_motormf;
|
||||||
required_device<ttl74123_device> m_speedmf;
|
required_device<ttl74123_device> m_speedmf;
|
||||||
required_device<ttl7474_device> m_readyff;
|
required_device<ttl7474_device> m_readyff;
|
||||||
|
@ -45,10 +45,6 @@ isa8_fdc_device::isa8_fdc_device(const machine_config &mconfig, device_type type
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void isa8_fdc_device::device_reset()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( isa8_fdc_device::irq_w )
|
WRITE_LINE_MEMBER( isa8_fdc_device::irq_w )
|
||||||
{
|
{
|
||||||
m_isa->irq6_w(state ? ASSERT_LINE : CLEAR_LINE);
|
m_isa->irq6_w(state ? ASSERT_LINE : CLEAR_LINE);
|
||||||
@ -80,7 +76,9 @@ void isa8_fdc_device::eop_w(int state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
isa8_upd765_fdc_device::isa8_upd765_fdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : isa8_fdc_device(mconfig, type, tag, owner, clock)
|
isa8_upd765_fdc_device::isa8_upd765_fdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||||
|
: isa8_fdc_device(mconfig, type, tag, owner, clock)
|
||||||
|
, dor(0x00)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +92,11 @@ void isa8_upd765_fdc_device::device_start()
|
|||||||
|
|
||||||
irq = drq = false;
|
irq = drq = false;
|
||||||
fdc_irq = fdc_drq = false;
|
fdc_irq = fdc_drq = false;
|
||||||
dor = 0x00;
|
}
|
||||||
|
|
||||||
|
void isa8_upd765_fdc_device::device_reset()
|
||||||
|
{
|
||||||
|
dor_w(0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bits 0-1 select one of the 4 drives, but only if the associated
|
// Bits 0-1 select one of the 4 drives, but only if the associated
|
||||||
@ -109,7 +111,6 @@ void isa8_upd765_fdc_device::device_start()
|
|||||||
void isa8_upd765_fdc_device::dor_w(uint8_t data)
|
void isa8_upd765_fdc_device::dor_w(uint8_t data)
|
||||||
{
|
{
|
||||||
LOG("dor = %02x\n", data);
|
LOG("dor = %02x\n", data);
|
||||||
uint8_t pdor = dor;
|
|
||||||
dor = data;
|
dor = data;
|
||||||
|
|
||||||
for(int i=0; i<4; i++)
|
for(int i=0; i<4; i++)
|
||||||
@ -124,8 +125,7 @@ void isa8_upd765_fdc_device::dor_w(uint8_t data)
|
|||||||
|
|
||||||
check_irq();
|
check_irq();
|
||||||
check_drq();
|
check_drq();
|
||||||
if((pdor^dor) & 4)
|
m_fdc->reset_w(!BIT(dor, 2));
|
||||||
m_fdc->soft_reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t isa8_upd765_fdc_device::dor_r()
|
uint8_t isa8_upd765_fdc_device::dor_r()
|
||||||
|
@ -34,9 +34,6 @@ protected:
|
|||||||
// construction/destruction
|
// construction/destruction
|
||||||
isa8_fdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
isa8_fdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||||
|
|
||||||
// device-level overrides
|
|
||||||
virtual void device_reset() override;
|
|
||||||
|
|
||||||
virtual uint8_t dack_r(int line) override;
|
virtual uint8_t dack_r(int line) override;
|
||||||
virtual void dack_w(int line, uint8_t data) override;
|
virtual void dack_w(int line, uint8_t data) override;
|
||||||
virtual void dack_line_w(int line, int state) override;
|
virtual void dack_line_w(int line, int state) override;
|
||||||
@ -53,6 +50,7 @@ protected:
|
|||||||
|
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_start() override;
|
virtual void device_start() override;
|
||||||
|
virtual void device_reset() override;
|
||||||
|
|
||||||
uint8_t dor_r();
|
uint8_t dor_r();
|
||||||
void dor_w(uint8_t data);
|
void dor_w(uint8_t data);
|
||||||
|
@ -1333,8 +1333,7 @@ void omti8621_device::fd_moten_w(uint8_t data)
|
|||||||
|
|
||||||
m_moten = data;
|
m_moten = data;
|
||||||
|
|
||||||
if (!BIT(data, 2))
|
m_fdc->reset_w(!BIT(data, 2));
|
||||||
m_fdc->soft_reset();
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
|
@ -174,6 +174,7 @@ upd765_family_device::upd765_family_device(const machine_config &mconfig, device
|
|||||||
ready_polled(true),
|
ready_polled(true),
|
||||||
select_connected(true),
|
select_connected(true),
|
||||||
select_multiplexed(true),
|
select_multiplexed(true),
|
||||||
|
has_dor(true),
|
||||||
external_ready(false),
|
external_ready(false),
|
||||||
recalibrate_steps(77),
|
recalibrate_steps(77),
|
||||||
mode(mode_t::AT),
|
mode(mode_t::AT),
|
||||||
@ -181,8 +182,7 @@ upd765_family_device::upd765_family_device(const machine_config &mconfig, device
|
|||||||
drq_cb(*this),
|
drq_cb(*this),
|
||||||
hdl_cb(*this),
|
hdl_cb(*this),
|
||||||
idx_cb(*this),
|
idx_cb(*this),
|
||||||
us_cb(*this),
|
us_cb(*this)
|
||||||
dor_reset(0x00)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,6 +245,7 @@ void upd765_family_device::device_start()
|
|||||||
cur_rate = 250000;
|
cur_rate = 250000;
|
||||||
tc = false;
|
tc = false;
|
||||||
selected_drive = -1;
|
selected_drive = -1;
|
||||||
|
dor = 0x0c;
|
||||||
|
|
||||||
// reset at upper levels may cause a write to tc ending up with
|
// reset at upper levels may cause a write to tc ending up with
|
||||||
// live_sync, which will crash if the live structure isn't
|
// live_sync, which will crash if the live structure isn't
|
||||||
@ -267,7 +268,8 @@ void upd765_family_device::device_start()
|
|||||||
|
|
||||||
void upd765_family_device::device_reset()
|
void upd765_family_device::device_reset()
|
||||||
{
|
{
|
||||||
dor = dor_reset;
|
if(has_dor)
|
||||||
|
dor = 0x00;
|
||||||
locked = false;
|
locked = false;
|
||||||
soft_reset();
|
soft_reset();
|
||||||
}
|
}
|
||||||
@ -304,6 +306,14 @@ void upd765_family_device::soft_reset()
|
|||||||
set_ds(select_multiplexed ? 0 : -1);
|
set_ds(select_multiplexed ? 0 : -1);
|
||||||
|
|
||||||
check_irq();
|
check_irq();
|
||||||
|
if(BIT(dor, 2))
|
||||||
|
end_reset();
|
||||||
|
else if(ready_polled)
|
||||||
|
poll_timer->adjust(attotime::never);
|
||||||
|
}
|
||||||
|
|
||||||
|
void upd765_family_device::end_reset()
|
||||||
|
{
|
||||||
if(ready_polled)
|
if(ready_polled)
|
||||||
poll_timer->adjust(attotime::from_usec(100), 0, attotime::from_usec(1024));
|
poll_timer->adjust(attotime::from_usec(100), 0, attotime::from_usec(1024));
|
||||||
}
|
}
|
||||||
@ -333,6 +343,25 @@ bool upd765_family_device::get_ready(int fid)
|
|||||||
return !external_ready;
|
return !external_ready;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(upd765_family_device::reset_w)
|
||||||
|
{
|
||||||
|
// This implementation is not valid for devices with DOR and possibly other extra registers.
|
||||||
|
// The working assumption is that no need to manipulate the RESET line directly when software can use DOR instead.
|
||||||
|
assert(!has_dor);
|
||||||
|
if(bool(state) == !BIT(dor, 2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
LOGREGS("reset = %d\n", state);
|
||||||
|
if(state) {
|
||||||
|
dor &= 0xfb;
|
||||||
|
soft_reset();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dor |= 0x04;
|
||||||
|
end_reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void upd765_family_device::set_ds(int fid)
|
void upd765_family_device::set_ds(int fid)
|
||||||
{
|
{
|
||||||
if(selected_drive == fid)
|
if(selected_drive == fid)
|
||||||
@ -399,11 +428,16 @@ uint8_t upd765_family_device::dor_r()
|
|||||||
|
|
||||||
void upd765_family_device::dor_w(uint8_t data)
|
void upd765_family_device::dor_w(uint8_t data)
|
||||||
{
|
{
|
||||||
|
assert(has_dor);
|
||||||
LOGREGS("dor = %02x\n", data);
|
LOGREGS("dor = %02x\n", data);
|
||||||
uint8_t diff = dor ^ data;
|
uint8_t diff = dor ^ data;
|
||||||
dor = data;
|
dor = data;
|
||||||
if(diff & 4)
|
if(BIT(diff, 2)) {
|
||||||
soft_reset();
|
if(BIT(data, 2))
|
||||||
|
end_reset();
|
||||||
|
else
|
||||||
|
soft_reset();
|
||||||
|
}
|
||||||
|
|
||||||
for(int i=0; i<4; i++) {
|
for(int i=0; i<4; i++) {
|
||||||
floppy_info &fi = flopi[i];
|
floppy_info &fi = flopi[i];
|
||||||
@ -513,6 +547,9 @@ uint8_t upd765_family_device::fifo_r()
|
|||||||
|
|
||||||
void upd765_family_device::fifo_w(uint8_t data)
|
void upd765_family_device::fifo_w(uint8_t data)
|
||||||
{
|
{
|
||||||
|
if(!BIT(dor, 2))
|
||||||
|
LOGWARN("%s: fifo_w(%02x) in reset\n", machine().describe_context(), data);
|
||||||
|
|
||||||
switch(main_phase) {
|
switch(main_phase) {
|
||||||
case PHASE_CMD: {
|
case PHASE_CMD: {
|
||||||
command[command_pos++] = data;
|
command[command_pos++] = data;
|
||||||
@ -780,7 +817,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
if(read_one_bit(limit))
|
if(read_one_bit(limit))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOGSHIFT("%s: shift = %04x data=%02x c=%d\n", tts(cur_live.tm), cur_live.shift_reg,
|
LOGSHIFT("%s: shift = %04x data=%02x c=%d\n", cur_live.tm.to_string(), cur_live.shift_reg,
|
||||||
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
||||||
@ -796,7 +833,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
cur_live.data_separator_phase = false;
|
cur_live.data_separator_phase = false;
|
||||||
cur_live.bit_counter = 0;
|
cur_live.bit_counter = 0;
|
||||||
cur_live.state = READ_HEADER_BLOCK_HEADER;
|
cur_live.state = READ_HEADER_BLOCK_HEADER;
|
||||||
LOGLIVE("%s: Found A1\n", tts(cur_live.tm));
|
LOGLIVE("%s: Found A1\n", cur_live.tm.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!mfm && cur_live.shift_reg == 0xf57e) {
|
if(!mfm && cur_live.shift_reg == 0xf57e) {
|
||||||
@ -804,7 +841,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
cur_live.data_separator_phase = false;
|
cur_live.data_separator_phase = false;
|
||||||
cur_live.bit_counter = 0;
|
cur_live.bit_counter = 0;
|
||||||
cur_live.state = READ_ID_BLOCK;
|
cur_live.state = READ_ID_BLOCK;
|
||||||
LOGLIVE("%s: Found IDAM\n", tts(cur_live.tm));
|
LOGLIVE("%s: Found IDAM\n", cur_live.tm.to_string());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -812,7 +849,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
if(read_one_bit(limit))
|
if(read_one_bit(limit))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOGSHIFT("%s: shift = %04x data=%02x counter=%d\n", tts(cur_live.tm), cur_live.shift_reg,
|
LOGSHIFT("%s: shift = %04x data=%02x counter=%d\n", cur_live.tm.to_string(), cur_live.shift_reg,
|
||||||
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
||||||
@ -832,11 +869,11 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
if(cur_live.shift_reg != 0x4489)
|
if(cur_live.shift_reg != 0x4489)
|
||||||
cur_live.state = SEARCH_ADDRESS_MARK_HEADER;
|
cur_live.state = SEARCH_ADDRESS_MARK_HEADER;
|
||||||
else
|
else
|
||||||
LOGLIVE("%s: Found A1\n", tts(cur_live.tm));
|
LOGLIVE("%s: Found A1\n", cur_live.tm.to_string());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(cur_live.data_reg != 0xfe) {
|
if(cur_live.data_reg != 0xfe) {
|
||||||
LOGLIVE("%s: No ident byte found after triple-A1, continue search\n", tts(cur_live.tm));
|
LOGLIVE("%s: No ident byte found after triple-A1, continue search\n", cur_live.tm.to_string());
|
||||||
cur_live.state = SEARCH_ADDRESS_MARK_HEADER;
|
cur_live.state = SEARCH_ADDRESS_MARK_HEADER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -854,7 +891,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
break;
|
break;
|
||||||
int slot = (cur_live.bit_counter >> 4)-1;
|
int slot = (cur_live.bit_counter >> 4)-1;
|
||||||
|
|
||||||
LOGLIVE("%s: slot=%d data=%02x crc=%04x\n", tts(cur_live.tm), slot, cur_live.data_reg, cur_live.crc);
|
LOGLIVE("%s: slot=%d data=%02x crc=%04x\n", cur_live.tm.to_string(), slot, cur_live.data_reg, cur_live.crc);
|
||||||
cur_live.idbuf[slot] = cur_live.data_reg;
|
cur_live.idbuf[slot] = cur_live.data_reg;
|
||||||
if(slot == 5) {
|
if(slot == 5) {
|
||||||
live_delay(IDLE);
|
live_delay(IDLE);
|
||||||
@ -867,7 +904,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
if(read_one_bit(limit))
|
if(read_one_bit(limit))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOGSHIFT("%s: shift = %04x data=%02x c=%d.%x\n", tts(cur_live.tm), cur_live.shift_reg,
|
LOGSHIFT("%s: shift = %04x data=%02x c=%d.%x\n", cur_live.tm.to_string(), cur_live.shift_reg,
|
||||||
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
||||||
@ -912,7 +949,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
if(read_one_bit(limit))
|
if(read_one_bit(limit))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOGSHIFT("%s: shift = %04x data=%02x counter=%d\n", tts(cur_live.tm), cur_live.shift_reg,
|
LOGSHIFT("%s: shift = %04x data=%02x counter=%d\n", cur_live.tm.to_string(), cur_live.shift_reg,
|
||||||
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
(cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
(cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) |
|
||||||
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
(cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) |
|
||||||
@ -1218,7 +1255,7 @@ void upd765_family_device::live_run(attotime limit)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOGWARN("%s: Unknown live state %d\n", tts(cur_live.tm), cur_live.state);
|
LOGWARN("%s: Unknown live state %d\n", cur_live.tm.to_string(), cur_live.state);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2412,17 +2449,6 @@ bool upd765_family_device::get_irq() const
|
|||||||
return cur_irq;
|
return cur_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string upd765_family_device::tts(attotime t)
|
|
||||||
{
|
|
||||||
const char *sign = "";
|
|
||||||
if(t.seconds() < 0) {
|
|
||||||
t = attotime::zero - t;
|
|
||||||
sign = "-";
|
|
||||||
}
|
|
||||||
int const nsec = t.attoseconds() / ATTOSECONDS_PER_NANOSECOND;
|
|
||||||
return util::string_format("%s%04d.%03d,%03d,%03d", sign, int(t.seconds()), nsec/1000000, (nsec/1000)%1000, nsec % 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string upd765_family_device::results() const
|
std::string upd765_family_device::results() const
|
||||||
{
|
{
|
||||||
std::ostringstream stream;
|
std::ostringstream stream;
|
||||||
@ -2440,7 +2466,7 @@ std::string upd765_family_device::results() const
|
|||||||
|
|
||||||
std::string upd765_family_device::ttsn() const
|
std::string upd765_family_device::ttsn() const
|
||||||
{
|
{
|
||||||
return tts(machine().time());
|
return machine().time().to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
void upd765_family_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
void upd765_family_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||||
@ -2623,7 +2649,7 @@ bool upd765_family_device::write_one_bit(const attotime &limit)
|
|||||||
|
|
||||||
void upd765_family_device::live_write_raw(uint16_t raw)
|
void upd765_family_device::live_write_raw(uint16_t raw)
|
||||||
{
|
{
|
||||||
LOGLIVE("%s: write %04x %04x\n", tts(cur_live.tm), raw, cur_live.crc);
|
LOGLIVE("%s: write %04x %04x\n", cur_live.tm.to_string(), raw, cur_live.crc);
|
||||||
cur_live.shift_reg = raw;
|
cur_live.shift_reg = raw;
|
||||||
cur_live.data_bit_context = raw & 1;
|
cur_live.data_bit_context = raw & 1;
|
||||||
}
|
}
|
||||||
@ -2643,7 +2669,7 @@ void upd765_family_device::live_write_mfm(uint8_t mfm)
|
|||||||
cur_live.data_reg = mfm;
|
cur_live.data_reg = mfm;
|
||||||
cur_live.shift_reg = raw;
|
cur_live.shift_reg = raw;
|
||||||
cur_live.data_bit_context = context;
|
cur_live.data_bit_context = context;
|
||||||
LOGLIVE("%s: write %02x %04x %04x\n", tts(cur_live.tm), mfm, cur_live.crc, raw);
|
LOGLIVE("%s: write %02x %04x %04x\n", cur_live.tm.to_string(), mfm, cur_live.crc, raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
void upd765_family_device::live_write_fm(uint8_t fm)
|
void upd765_family_device::live_write_fm(uint8_t fm)
|
||||||
@ -2655,7 +2681,7 @@ void upd765_family_device::live_write_fm(uint8_t fm)
|
|||||||
cur_live.data_reg = fm;
|
cur_live.data_reg = fm;
|
||||||
cur_live.shift_reg = raw;
|
cur_live.shift_reg = raw;
|
||||||
cur_live.data_bit_context = fm & 1;
|
cur_live.data_bit_context = fm & 1;
|
||||||
LOGLIVE("%s: write %02x %04x %04x\n", tts(cur_live.tm), fm, cur_live.crc, raw);
|
LOGLIVE("%s: write %02x %04x %04x\n", cur_live.tm.to_string(), fm, cur_live.crc, raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool upd765_family_device::sector_matches() const
|
bool upd765_family_device::sector_matches() const
|
||||||
@ -2672,17 +2698,17 @@ bool upd765_family_device::sector_matches() const
|
|||||||
|
|
||||||
upd765a_device::upd765a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765A, tag, owner, clock)
|
upd765a_device::upd765a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765A, tag, owner, clock)
|
||||||
{
|
{
|
||||||
dor_reset = 0x0c;
|
has_dor = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
upd765b_device::upd765b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765B, tag, owner, clock)
|
upd765b_device::upd765b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, UPD765B, tag, owner, clock)
|
||||||
{
|
{
|
||||||
dor_reset = 0x0c;
|
has_dor = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
i8272a_device::i8272a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, I8272A, tag, owner, clock)
|
i8272a_device::i8272a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, I8272A, tag, owner, clock)
|
||||||
{
|
{
|
||||||
dor_reset = 0x0c;
|
has_dor = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
upd72065_device::upd72065_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd72065_device(mconfig, UPD72065, tag, owner, clock)
|
upd72065_device::upd72065_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd72065_device(mconfig, UPD72065, tag, owner, clock)
|
||||||
@ -2691,7 +2717,7 @@ upd72065_device::upd72065_device(const machine_config &mconfig, const char *tag,
|
|||||||
|
|
||||||
upd72065_device::upd72065_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, type, tag, owner, clock)
|
upd72065_device::upd72065_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, type, tag, owner, clock)
|
||||||
{
|
{
|
||||||
dor_reset = 0x0c;
|
has_dor = false;
|
||||||
recalibrate_steps = 255;
|
recalibrate_steps = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2713,7 +2739,7 @@ upd72069_device::upd72069_device(const machine_config &mconfig, const char *tag,
|
|||||||
|
|
||||||
i82072_device::i82072_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, I82072, tag, owner, clock)
|
i82072_device::i82072_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : upd765_family_device(mconfig, I82072, tag, owner, clock)
|
||||||
{
|
{
|
||||||
dor_reset = 0x0c;
|
has_dor = false;
|
||||||
recalibrate_steps = 255;
|
recalibrate_steps = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3089,7 +3115,7 @@ mcs3201_device::mcs3201_device(const machine_config &mconfig, const char *tag, d
|
|||||||
upd765_family_device(mconfig, MCS3201, tag, owner, clock),
|
upd765_family_device(mconfig, MCS3201, tag, owner, clock),
|
||||||
m_input_handler(*this)
|
m_input_handler(*this)
|
||||||
{
|
{
|
||||||
dor_reset = 0x0c;
|
has_dor = true;
|
||||||
ready_polled = false;
|
ready_polled = false;
|
||||||
ready_connected = false;
|
ready_connected = false;
|
||||||
select_connected = true;
|
select_connected = true;
|
||||||
|
@ -49,6 +49,7 @@ public:
|
|||||||
void ready_w(bool val);
|
void ready_w(bool val);
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(tc_line_w) { tc_w(state == ASSERT_LINE); }
|
DECLARE_WRITE_LINE_MEMBER(tc_line_w) { tc_w(state == ASSERT_LINE); }
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(reset_w);
|
||||||
|
|
||||||
void set_rate(int rate); // rate in bps, to be used when the fdc is externally frequency-controlled
|
void set_rate(int rate); // rate in bps, to be used when the fdc is externally frequency-controlled
|
||||||
|
|
||||||
@ -231,7 +232,7 @@ protected:
|
|||||||
|
|
||||||
static constexpr int rates[4] = { 500000, 300000, 250000, 1000000 };
|
static constexpr int rates[4] = { 500000, 300000, 250000, 1000000 };
|
||||||
|
|
||||||
bool ready_connected, ready_polled, select_connected, select_multiplexed;
|
bool ready_connected, ready_polled, select_connected, select_multiplexed, has_dor;
|
||||||
|
|
||||||
bool external_ready;
|
bool external_ready;
|
||||||
|
|
||||||
@ -250,7 +251,7 @@ protected:
|
|||||||
bool fifo_write;
|
bool fifo_write;
|
||||||
uint8_t dor, dsr, msr, fifo[16], command[16], result[16];
|
uint8_t dor, dsr, msr, fifo[16], command[16], result[16];
|
||||||
uint8_t st1, st2, st3;
|
uint8_t st1, st2, st3;
|
||||||
uint8_t fifocfg, dor_reset;
|
uint8_t fifocfg;
|
||||||
uint8_t precomp;
|
uint8_t precomp;
|
||||||
uint16_t spec;
|
uint16_t spec;
|
||||||
int sector_size;
|
int sector_size;
|
||||||
@ -259,7 +260,6 @@ protected:
|
|||||||
|
|
||||||
emu_timer *poll_timer;
|
emu_timer *poll_timer;
|
||||||
|
|
||||||
static std::string tts(attotime t);
|
|
||||||
std::string results() const;
|
std::string results() const;
|
||||||
std::string ttsn() const;
|
std::string ttsn() const;
|
||||||
|
|
||||||
@ -288,6 +288,8 @@ protected:
|
|||||||
C_INCOMPLETE
|
C_INCOMPLETE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void end_reset();
|
||||||
|
|
||||||
void delay_cycles(emu_timer *tm, int cycles);
|
void delay_cycles(emu_timer *tm, int cycles);
|
||||||
void check_irq();
|
void check_irq();
|
||||||
void fifo_expect(int size, bool write);
|
void fifo_expect(int size, bool write);
|
||||||
|
@ -111,8 +111,7 @@ void duet16_state::fdcctrl_w(u8 data)
|
|||||||
|
|
||||||
m_fd[0]->get_device()->mon_w(!BIT(data, 0));
|
m_fd[0]->get_device()->mon_w(!BIT(data, 0));
|
||||||
m_fd[1]->get_device()->mon_w(!BIT(data, 0));
|
m_fd[1]->get_device()->mon_w(!BIT(data, 0));
|
||||||
if(!BIT(data, 1))
|
m_fdc->reset_w(!BIT(data, 1));
|
||||||
m_fdc->soft_reset();
|
|
||||||
|
|
||||||
// TODO: bit 3 = LSPD
|
// TODO: bit 3 = LSPD
|
||||||
}
|
}
|
||||||
|
@ -343,9 +343,9 @@ void fs3216_state::floppy_control_w(u8 data)
|
|||||||
m_floppy_status &= 0xef;
|
m_floppy_status &= 0xef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_fdc->reset_w(!BIT(data, 1));
|
||||||
if (!BIT(data, 1))
|
if (!BIT(data, 1))
|
||||||
{
|
{
|
||||||
m_fdc->soft_reset();
|
|
||||||
m_fdc_dma_count = 0;
|
m_fdc_dma_count = 0;
|
||||||
m_fdc->tc_w(0);
|
m_fdc->tc_w(0);
|
||||||
}
|
}
|
||||||
|
@ -404,8 +404,7 @@ void pcjr_state::pcjr_fdc_dor_w(uint8_t data)
|
|||||||
else
|
else
|
||||||
m_fdc->set_floppy(nullptr);
|
m_fdc->set_floppy(nullptr);
|
||||||
|
|
||||||
if((pdor^m_pcjr_dor) & 0x80)
|
m_fdc->reset_w(!BIT(m_pcjr_dor, 7));
|
||||||
m_fdc->soft_reset();
|
|
||||||
|
|
||||||
if(m_pcjr_dor & 0x20) {
|
if(m_pcjr_dor & 0x20) {
|
||||||
if((pdor & 0x40) && !(m_pcjr_dor & 0x40))
|
if((pdor & 0x40) && !(m_pcjr_dor & 0x40))
|
||||||
|
@ -72,7 +72,6 @@ private:
|
|||||||
|
|
||||||
void bank_switch_w(u8 data);
|
void bank_switch_w(u8 data);
|
||||||
void panel_led_w(u8 data);
|
void panel_led_w(u8 data);
|
||||||
DECLARE_WRITE_LINE_MEMBER(fdc_reset_w);
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(fdc_tc_w);
|
DECLARE_WRITE_LINE_MEMBER(fdc_tc_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(sed9420c_trgin_w);
|
DECLARE_WRITE_LINE_MEMBER(sed9420c_trgin_w);
|
||||||
u8 fdc_r(offs_t offset);
|
u8 fdc_r(offs_t offset);
|
||||||
@ -156,12 +155,6 @@ void korg_dss1_state::panel_led_w(u8 data)
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(korg_dss1_state::fdc_reset_w)
|
|
||||||
{
|
|
||||||
if (!state)
|
|
||||||
m_fdc->soft_reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(korg_dss1_state::fdc_tc_w)
|
WRITE_LINE_MEMBER(korg_dss1_state::fdc_tc_w)
|
||||||
{
|
{
|
||||||
if (m_cpu1.found())
|
if (m_cpu1.found())
|
||||||
@ -444,7 +437,7 @@ void korg_dss1_state::klm780(machine_config &config)
|
|||||||
m_io1->out_pc_callback().set(m_lcdc, FUNC(hd44780_device::e_w)).bit(0);
|
m_io1->out_pc_callback().set(m_lcdc, FUNC(hd44780_device::e_w)).bit(0);
|
||||||
m_io1->out_pc_callback().append(m_lcdc, FUNC(hd44780_device::rw_w)).bit(1);
|
m_io1->out_pc_callback().append(m_lcdc, FUNC(hd44780_device::rw_w)).bit(1);
|
||||||
m_io1->out_pc_callback().append(m_lcdc, FUNC(hd44780_device::rs_w)).bit(2);
|
m_io1->out_pc_callback().append(m_lcdc, FUNC(hd44780_device::rs_w)).bit(2);
|
||||||
m_io1->out_pc_callback().append(FUNC(korg_dss1_state::fdc_reset_w)).bit(3);
|
m_io1->out_pc_callback().append(m_fdc, FUNC(upd765a_device::reset_w)).bit(3).invert();
|
||||||
m_io1->out_pc_callback().append(FUNC(korg_dss1_state::fdc_tc_w)).bit(4);
|
m_io1->out_pc_callback().append(FUNC(korg_dss1_state::fdc_tc_w)).bit(4);
|
||||||
m_io1->out_pc_callback().append(FUNC(korg_dss1_state::sed9420c_trgin_w)).bit(5);
|
m_io1->out_pc_callback().append(FUNC(korg_dss1_state::sed9420c_trgin_w)).bit(5);
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ WRITE_LINE_MEMBER( mm1_state::recall_w )
|
|||||||
{
|
{
|
||||||
LOG("RECALL %u\n", state);
|
LOG("RECALL %u\n", state);
|
||||||
m_recall = state;
|
m_recall = state;
|
||||||
if (state) m_fdc->soft_reset();
|
m_fdc->reset_w(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -995,12 +995,7 @@ void pc1512_base_state::drive_select_w(uint8_t data)
|
|||||||
img->mon_w((data & 0x03) == n && BIT(data, n + 4) ? 0 : 1);
|
img->mon_w((data & 0x03) == n && BIT(data, n + 4) ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_dreset != BIT(data, 2))
|
m_fdc->reset_w(!BIT(data, 2));
|
||||||
{
|
|
||||||
m_dreset = BIT(data, 2);
|
|
||||||
m_fdc->soft_reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_nden = BIT(data, 3);
|
m_nden = BIT(data, 3);
|
||||||
update_fdc_int();
|
update_fdc_int();
|
||||||
update_fdc_drq();
|
update_fdc_drq();
|
||||||
@ -1091,7 +1086,6 @@ void pc1512_base_state::machine_start()
|
|||||||
save_item(NAME(m_nden));
|
save_item(NAME(m_nden));
|
||||||
save_item(NAME(m_dint));
|
save_item(NAME(m_dint));
|
||||||
save_item(NAME(m_ddrq));
|
save_item(NAME(m_ddrq));
|
||||||
save_item(NAME(m_dreset));
|
|
||||||
save_item(NAME(m_neop));
|
save_item(NAME(m_neop));
|
||||||
save_item(NAME(m_ack_int_enable));
|
save_item(NAME(m_ack_int_enable));
|
||||||
save_item(NAME(m_centronics_ack));
|
save_item(NAME(m_centronics_ack));
|
||||||
|
@ -439,11 +439,9 @@ uint8_t pc9801_state::fdc_2hd_ctrl_r()
|
|||||||
void pc9801_state::fdc_2hd_ctrl_w(uint8_t data)
|
void pc9801_state::fdc_2hd_ctrl_w(uint8_t data)
|
||||||
{
|
{
|
||||||
//logerror("%02x ctrl\n",data);
|
//logerror("%02x ctrl\n",data);
|
||||||
if(((m_fdc_2hd_ctrl & 0x80) == 0) && (data & 0x80))
|
m_fdc_2hd->reset_w(BIT(data, 7));
|
||||||
m_fdc_2hd->soft_reset();
|
|
||||||
|
|
||||||
m_fdc_2hd_ctrl = data;
|
m_fdc_2hd_ctrl = data;
|
||||||
|
|
||||||
if(data & 0x40)
|
if(data & 0x40)
|
||||||
{
|
{
|
||||||
m_fdc_2hd->set_ready_line_connected(0);
|
m_fdc_2hd->set_ready_line_connected(0);
|
||||||
@ -475,8 +473,7 @@ uint8_t pc9801_state::fdc_2dd_ctrl_r()
|
|||||||
void pc9801_state::fdc_2dd_ctrl_w(uint8_t data)
|
void pc9801_state::fdc_2dd_ctrl_w(uint8_t data)
|
||||||
{
|
{
|
||||||
logerror("%02x ctrl\n",data);
|
logerror("%02x ctrl\n",data);
|
||||||
if(((m_fdc_2dd_ctrl & 0x80) == 0) && (data & 0x80))
|
m_fdc_2dd->reset_w(BIT(data, 7));
|
||||||
m_fdc_2dd->soft_reset();
|
|
||||||
|
|
||||||
m_fdc_2dd_ctrl = data;
|
m_fdc_2dd_ctrl = data;
|
||||||
m_fdc_2dd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
|
m_fdc_2dd->subdevice<floppy_connector>("0")->get_device()->mon_w(data & 8 ? CLEAR_LINE : ASSERT_LINE);
|
||||||
|
@ -94,15 +94,9 @@ WRITE_LINE_MEMBER(prof80_state::select_w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(prof80_state::resf_w)
|
|
||||||
{
|
|
||||||
if (state)
|
|
||||||
m_fdc->soft_reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(prof80_state::mini_w)
|
WRITE_LINE_MEMBER(prof80_state::mini_w)
|
||||||
{
|
{
|
||||||
|
m_fdc->set_unscaled_clock(16_MHz_XTAL / (state ? 4 : 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -453,7 +447,7 @@ void prof80_state::machine_start()
|
|||||||
void prof80_state::prof80(machine_config &config)
|
void prof80_state::prof80(machine_config &config)
|
||||||
{
|
{
|
||||||
// basic machine hardware
|
// basic machine hardware
|
||||||
Z80(config, m_maincpu, XTAL(6'000'000));
|
Z80(config, m_maincpu, 6_MHz_XTAL);
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &prof80_state::prof80_mem);
|
m_maincpu->set_addrmap(AS_PROGRAM, &prof80_state::prof80_mem);
|
||||||
m_maincpu->set_addrmap(AS_IO, &prof80_state::prof80_io);
|
m_maincpu->set_addrmap(AS_IO, &prof80_state::prof80_io);
|
||||||
|
|
||||||
@ -465,7 +459,7 @@ void prof80_state::prof80(machine_config &config)
|
|||||||
UPD1990A(config, m_rtc);
|
UPD1990A(config, m_rtc);
|
||||||
|
|
||||||
// FDC
|
// FDC
|
||||||
UPD765A(config, m_fdc, 8'000'000, true, true);
|
UPD765A(config, m_fdc, 16_MHz_XTAL / 2, true, true); // clocked through FDC9229B
|
||||||
FLOPPY_CONNECTOR(config, UPD765_TAG ":0", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats);
|
FLOPPY_CONNECTOR(config, UPD765_TAG ":0", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats);
|
||||||
FLOPPY_CONNECTOR(config, UPD765_TAG ":1", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats);
|
FLOPPY_CONNECTOR(config, UPD765_TAG ":1", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats);
|
||||||
FLOPPY_CONNECTOR(config, UPD765_TAG ":2", prof80_floppies, nullptr, floppy_image_device::default_floppy_formats);
|
FLOPPY_CONNECTOR(config, UPD765_TAG ":2", prof80_floppies, nullptr, floppy_image_device::default_floppy_formats);
|
||||||
@ -483,7 +477,7 @@ void prof80_state::prof80(machine_config &config)
|
|||||||
m_flra->q_out_cb<6>().set(FUNC(prof80_state::motor_w)); // _MOTOR
|
m_flra->q_out_cb<6>().set(FUNC(prof80_state::motor_w)); // _MOTOR
|
||||||
m_flra->q_out_cb<7>().set(FUNC(prof80_state::select_w)); // SELECT
|
m_flra->q_out_cb<7>().set(FUNC(prof80_state::select_w)); // SELECT
|
||||||
LS259(config, m_flrb);
|
LS259(config, m_flrb);
|
||||||
m_flrb->q_out_cb<0>().set(FUNC(prof80_state::resf_w)); // RESF
|
m_flrb->q_out_cb<0>().set(m_fdc, FUNC(upd765a_device::reset_w)); // RESF
|
||||||
m_flrb->q_out_cb<1>().set(FUNC(prof80_state::mini_w)); // MINI
|
m_flrb->q_out_cb<1>().set(FUNC(prof80_state::mini_w)); // MINI
|
||||||
m_flrb->q_out_cb<2>().set(m_rs232a, FUNC(rs232_port_device::write_rts)); // _RTS
|
m_flrb->q_out_cb<2>().set(m_rs232a, FUNC(rs232_port_device::write_rts)); // _RTS
|
||||||
m_flrb->q_out_cb<3>().set(m_rs232a, FUNC(rs232_port_device::write_txd)); // TX
|
m_flrb->q_out_cb<3>().set(m_rs232a, FUNC(rs232_port_device::write_txd)); // TX
|
||||||
|
@ -157,10 +157,7 @@ void tandy2k_state::enable_w(uint8_t data)
|
|||||||
m_pit->write_gate2(BIT(data, 4));
|
m_pit->write_gate2(BIT(data, 4));
|
||||||
|
|
||||||
// FDC reset
|
// FDC reset
|
||||||
if (!BIT(data, 5))
|
m_fdc->reset_w(!BIT(data, 5));
|
||||||
{
|
|
||||||
m_fdc->soft_reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
// timer 0 enable
|
// timer 0 enable
|
||||||
m_maincpu->tmrin0_w(BIT(data, 6));
|
m_maincpu->tmrin0_w(BIT(data, 6));
|
||||||
|
@ -75,7 +75,6 @@ public:
|
|||||||
m_nden(1),
|
m_nden(1),
|
||||||
m_dint(0),
|
m_dint(0),
|
||||||
m_ddrq(0),
|
m_ddrq(0),
|
||||||
m_dreset(1),
|
|
||||||
m_fdc_dsr(0),
|
m_fdc_dsr(0),
|
||||||
m_neop(0),
|
m_neop(0),
|
||||||
m_ack_int_enable(1),
|
m_ack_int_enable(1),
|
||||||
@ -178,7 +177,6 @@ public:
|
|||||||
int m_nden;
|
int m_nden;
|
||||||
int m_dint;
|
int m_dint;
|
||||||
int m_ddrq;
|
int m_ddrq;
|
||||||
int m_dreset;
|
|
||||||
uint8_t m_fdc_dsr;
|
uint8_t m_fdc_dsr;
|
||||||
int m_neop;
|
int m_neop;
|
||||||
|
|
||||||
|
@ -86,7 +86,6 @@ private:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(inuse_w);
|
DECLARE_WRITE_LINE_MEMBER(inuse_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(motor_w);
|
DECLARE_WRITE_LINE_MEMBER(motor_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(select_w);
|
DECLARE_WRITE_LINE_MEMBER(select_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(resf_w);
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(mini_w);
|
DECLARE_WRITE_LINE_MEMBER(mini_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(mstop_w);
|
DECLARE_WRITE_LINE_MEMBER(mstop_w);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user