ti99_8: OSO fix (nw)

This commit is contained in:
Michael Zapf 2017-11-13 00:40:15 +01:00
parent 46958737cf
commit 5a1764d24d
2 changed files with 13 additions and 25 deletions

View File

@ -2259,16 +2259,16 @@ oso_device::oso_device(const machine_config &mconfig, const char *tag, device_t
m_status(0xff), m_status(0xff),
m_control(0), m_control(0),
m_xmit(0), m_lasthxvalue(0x01), m_xmit(0), m_lasthxvalue(0x01),
m_bav(false), m_sbav(false), m_sbavold(true), m_bavhold(false), m_bav(false), m_sbav(false), m_sbavold(false), m_bavhold(false),
m_hsk(false), m_shsk(false), m_shskold(true), m_hskhold(false), m_hsk(false), m_shsk(false), m_shskold(false), m_hskhold(false),
m_wq1(false), m_wq1old(true), m_wq2(false), m_wq2old(true), m_wq1(false), m_wq1old(false), m_wq2(false), m_wq2old(false),
m_wnp(false), m_wbusyold(false), m_sendbyte(false), m_wnp(false), m_wbusyold(false), m_sendbyte(false),
m_wrset(false), m_counting(false), m_clkcount(0), m_wrset(false), m_counting(false), m_clkcount(0),
m_rq1(false), m_rq2(false), m_rq2old(true), m_rq1(false), m_rq2(false), m_rq2old(false),
m_rnib(false), m_rnibcold(false), m_rnib(false), m_rnibcold(false),
m_rdset(false), m_rdsetold(true), m_rdset(false), m_rdsetold(false),
m_msns(false), m_lsns(false), m_msns(false), m_lsns(false),
m_rdend(false), m_byteavailable(false) m_rhsus(false)
{ {
(void)m_shskold; (void)m_shskold;
m_hexbus_inbound = nullptr; m_hexbus_inbound = nullptr;
@ -2286,7 +2286,7 @@ READ8_MEMBER( oso_device::read )
if (TRACE_OSO) logerror("Read data register = %02x\n", value); if (TRACE_OSO) logerror("Read data register = %02x\n", value);
value = m_data; value = m_data;
// Release the handshake // Release the handshake
m_byteavailable = false; m_rhsus = false;
break; break;
case 1: case 1:
// read 5FFA: read status register // read 5FFA: read status register
@ -2357,7 +2357,6 @@ WRITE8_MEMBER( oso_device::write )
void oso_device::clear_int_status() void oso_device::clear_int_status()
{ {
m_status &= ~(HSKWT | HSKRD | BAVIAS | BAVAIS); m_status &= ~(HSKWT | HSKRD | BAVIAS | BAVAIS);
m_rdend = false;
m_int(CLEAR_LINE); m_int(CLEAR_LINE);
} }
@ -2432,7 +2431,7 @@ WRITE_LINE_MEMBER( oso_device::clock_in )
if (m_wq1 == true) if (m_wq1 == true)
m_sendbyte = false; m_sendbyte = false;
// logerror("sendbyte=%d, wq1=%d, wq2=%d, jwq1=%d, kwq1=%d, jwq2=%d, kwq2=%d, shsk=%d\n", m_sendbyte, m_wq1, m_wq2, jwq1, kwq1, jwq2, kwq2, m_shsk); // logerror("sendbyte=%d, wq1=%d, wq2=%d, jwq1=%d, kwq1=%d, jwq2=%d, kwq2=%d, shsk=%d\n", m_sendbyte, m_wq1, m_wq2, jwq1, kwq1, jwq2, kwq2, m_shsk);
// WBUSY is asserted on byte load, during phase 1, and phase 2. // WBUSY is asserted on byte load, during phase 1, and phase 2.
bool wbusy = m_sendbyte || m_wq1 || m_wq2; bool wbusy = m_sendbyte || m_wq1 || m_wq2;
@ -2524,23 +2523,22 @@ WRITE_LINE_MEMBER( oso_device::clock_in )
if (m_rq2old == true && m_rq2 == false) if (m_rq2old == true && m_rq2 == false)
{ {
set_status(HSKRD, true); set_status(HSKRD, true);
m_rdend = true; m_rhsus = true; // byte is available for reading
} }
m_rq2old = m_rq2; m_rq2old = m_rq2;
} }
else else
{ {
m_byteavailable = false; m_rhsus = false;
} }
// Handshake control // Handshake control
// Set HSK (Page 6, RHSUS*) // Set HSK (Page 6, RHSUS*)
bool hskwrite = !m_wq1 && m_wq2; bool hskwrite = !m_wq1 && m_wq2;
if (m_rdend) m_byteavailable = true;
// We can simplify this to a single flag because the CPU read operation // We can simplify this to a single flag because the CPU read operation
// is atomic here (starts and immediately terminates) // is atomic here (starts and immediately terminates)
m_hsk = hskwrite || m_byteavailable; m_hsk = hskwrite || m_rhsus;
update_hexbus(); update_hexbus();
} }
// Actions that occur for Phi3=0 // Actions that occur for Phi3=0
@ -2567,14 +2565,6 @@ WRITE_LINE_MEMBER( oso_device::clock_in )
m_rq1 = m_rq2 = m_rdset = false; m_rq1 = m_rq2 = m_rdset = false;
} }
// Show some lines in log
if (TRACE_OSO) {
if (m_sbav != m_sbavold) {
logerror("SBAV = %d\n", m_sbav? 1 : 0);
m_sbavold = m_sbav;
}
}
// Raise interrupt // Raise interrupt
if ((control_bit(WIEN) && status_bit(HSKWT)) if ((control_bit(WIEN) && status_bit(HSKWT))
|| (control_bit(RIEN) && status_bit(HSKRD)) || (control_bit(RIEN) && status_bit(HSKRD))

View File

@ -488,10 +488,8 @@ private:
bool m_msns; // Upper 4 bits bool m_msns; // Upper 4 bits
bool m_lsns; // Lower 4 bits bool m_lsns; // Lower 4 bits
bool m_rdend; // Read completed // Page 6 (RHSUS*)
bool m_rhsus; // Needed to assert the HSK line until the CPU has read the byte
// Page 6
bool m_byteavailable; // Needed to assert the HSK line until the CPU has read the byte
}; };
class mainboard8_device : public device_t class mainboard8_device : public device_t