diff --git a/src/emu/diserial.c b/src/emu/diserial.c index 7cd4b25c6fe..ce4ee565e38 100644 --- a/src/emu/diserial.c +++ b/src/emu/diserial.c @@ -19,6 +19,8 @@ device_serial_interface::device_serial_interface(const machine_config &mconfig, m_rcv_register_data(0x8000), m_rcv_flags(0), m_rcv_bit_count(0), + m_rcv_framing_error(false), + m_rcv_parity_error(false), m_tra_flags(TRANSMIT_REGISTER_EMPTY), m_rcv_clock(NULL), m_tra_clock(NULL), @@ -234,6 +236,8 @@ void device_serial_interface::receive_register_update_bit(int bit) m_rcv_flags |=RECEIVE_REGISTER_SYNCHRONISED; /* reset bit count received */ m_rcv_bit_count_received = 0; + m_rcv_framing_error = false; + m_rcv_parity_error = false; } } } @@ -242,6 +246,11 @@ void device_serial_interface::receive_register_update_bit(int bit) { m_rcv_bit_count_received++; + if (!bit && (m_rcv_bit_count_received > (m_rcv_bit_count - m_df_stop_bit_count))) + { + m_rcv_framing_error = true; + } + /* received all bits? */ if (m_rcv_bit_count_received==m_rcv_bit_count) { diff --git a/src/emu/diserial.h b/src/emu/diserial.h index 9615a7e3afc..9b5f233d1f2 100644 --- a/src/emu/diserial.h +++ b/src/emu/diserial.h @@ -116,6 +116,8 @@ protected: bool is_transmit_register_empty(); bool is_receive_register_synchronized() { return m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED; } bool is_receive_register_shifting() { return m_rcv_bit_count_received > 0; } + bool is_receive_framing_error() { return m_rcv_framing_error; } + bool is_receive_parity_error() { return m_rcv_parity_error; } UINT8 get_received_char() { return m_rcv_byte_received; } @@ -167,6 +169,9 @@ private: UINT8 m_rcv_bit_count; /* the byte of data received */ UINT8 m_rcv_byte_received; + + bool m_rcv_framing_error; + bool m_rcv_parity_error; // Transmit register /* data */ diff --git a/src/emu/machine/tms5501.c b/src/emu/machine/tms5501.c index f91df344285..c04736609ab 100644 --- a/src/emu/machine/tms5501.c +++ b/src/emu/machine/tms5501.c @@ -70,6 +70,7 @@ tms5501_device::tms5501_device(const machine_config &mconfig, const char *tag, d m_rr(0), m_tb(0), m_mr(0), + m_rcv(1), m_sens(0), m_xi7(0) { @@ -210,12 +211,21 @@ void tms5501_device::rcv_complete() receive_register_extract(); m_rb = get_received_char(); + if (is_receive_framing_error()) + { + m_sta |= STA_FE; + } + else + { + m_sta &= ~STA_FE; + } + if (m_sta & STA_RBL) { m_sta |= STA_OE; } - m_sta |= STA_RBL; + m_sta |= (STA_RBL | STA_SR); m_sta &= ~(STA_SBD | STA_FBD); set_interrupt(IRQ_RB); @@ -239,6 +249,9 @@ void tms5501_device::input_callback(UINT8 state) READ8_MEMBER( tms5501_device::rb_r ) { m_sta &= ~STA_RBL; + m_irq &= ~IRQ_RB; + + check_interrupt(); return m_rb; } @@ -277,7 +290,11 @@ READ8_MEMBER( tms5501_device::rst_r ) READ8_MEMBER( tms5501_device::sta_r ) { - return m_sta; + UINT8 data = m_sta; + + m_sta &= ~STA_OE; + + return data; } @@ -404,6 +421,8 @@ WRITE8_MEMBER( tms5501_device::mr_w ) if (LOG) logerror("TMS5501 '%s' Mask Register %02x\n", tag(), data); m_mr = data; + + check_interrupt(); } @@ -429,24 +448,17 @@ WRITE_LINE_MEMBER( tms5501_device::rcv_w ) device_serial_interface::rx_w(state); - if (m_rcv) - { - m_sta |= STA_SR; - } - else - { - m_sta &= ~STA_SR; - } - if (is_receive_register_synchronized()) { m_sta |= STA_SBD; + m_sta &= ~STA_SR; } if (is_receive_register_shifting()) { m_sta |= STA_FBD; } + //logerror("RCV %u SR %u SBD %u FBD %u FE %u OE %u\n",state,m_sta&STA_SR?1:0,m_sta&STA_SBD?1:0,m_sta&STA_FBD?1:0,m_sta&STA_FE?1:0,m_sta&STA_OE?1:0); } diff --git a/src/lib/formats/ccvf_dsk.c b/src/lib/formats/ccvf_dsk.c index fc4aa0b7002..7007a2da933 100644 --- a/src/lib/formats/ccvf_dsk.c +++ b/src/lib/formats/ccvf_dsk.c @@ -47,7 +47,7 @@ const char *ccvf_format::extensions() const const ccvf_format::format ccvf_format::file_formats[] = { { floppy_image::FF_35, floppy_image::SSSD, - (1./(9600*8))*1000000000, 10, 41, 1, 128, {}, 0, {/* 0,5,1,6,2,7,3,8,4,9*/ } + (1./(9600*8))*1000000000, 10, 41, 1, 128, {}, 0, { 0,5,1,6,2,7,3,8,4,9 } }, {} }; diff --git a/src/mess/drivers/compucolor.c b/src/mess/drivers/compucolor.c index fc300876567..1c875e432b6 100644 --- a/src/mess/drivers/compucolor.c +++ b/src/mess/drivers/compucolor.c @@ -225,7 +225,7 @@ static INPUT_PORTS_START( compucolor2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("e E BSC RST") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("u U INS LINE") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5 Y BAR X") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("AUTO") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("AUTO") PORT_CODE(KEYCODE_PGDN) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PRINT") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -336,29 +336,37 @@ READ8_MEMBER( compucolor2_state::xi_r ) { UINT8 data = 0xff; - switch (m_xo & 0x0f) + switch ((m_xo >> 4) & 0x03) { - case 0: data &= m_y0->read(); break; - case 1: data &= m_y1->read(); break; - case 2: data &= m_y2->read(); break; - case 3: data &= m_y3->read(); break; - case 4: data &= m_y4->read(); break; - case 5: data &= m_y5->read(); break; - case 6: data &= m_y6->read(); break; - case 7: data &= m_y7->read(); break; - case 8: data &= m_y8->read(); break; - case 9: data &= m_y9->read(); break; - case 10: data &= m_y10->read(); break; - case 11: data &= m_y11->read(); break; - case 12: data &= m_y12->read(); break; - case 13: data &= m_y13->read(); break; - case 14: data &= m_y14->read(); break; - case 15: data &= m_y15->read(); break; - } + case 0: + switch (m_xo & 0x0f) + { + case 0: data &= m_y0->read(); break; + case 1: data &= m_y1->read(); break; + case 2: data &= m_y2->read(); break; + case 3: data &= m_y3->read(); break; + case 4: data &= m_y4->read(); break; + case 5: data &= m_y5->read(); break; + case 6: data &= m_y6->read(); break; + case 7: data &= m_y7->read(); break; + case 8: data &= m_y8->read(); break; + case 9: data &= m_y9->read(); break; + case 10: data &= m_y10->read(); break; + case 11: data &= m_y11->read(); break; + case 12: data &= m_y12->read(); break; + case 13: data &= m_y13->read(); break; + case 14: data &= m_y14->read(); break; + case 15: data &= m_y15->read(); break; + } - if (BIT(m_xo, 7)) - { - data = (m_y128->read() & 0xf0) | (data & 0x0f); + if (BIT(m_xo, 7)) + { + data = (m_y128->read() & 0xf0) | (data & 0x0f); + } + break; + + default: + data = 0; } return data; diff --git a/src/mess/machine/compclr_flp.c b/src/mess/machine/compclr_flp.c index 14f68862ae8..61284658bdc 100644 --- a/src/mess/machine/compclr_flp.c +++ b/src/mess/machine/compclr_flp.c @@ -101,6 +101,9 @@ compucolor_floppy_device::compucolor_floppy_device(const machine_config &mconfig : device_t(mconfig, COMPUCOLOR_FLOPPY, "Compucolor floppy", tag, owner, clock, "compclr_flp", __FILE__), device_compucolor_floppy_port_interface(mconfig, *this), m_floppy(*this, "floppy:525sssd"), + m_rw(1), + m_stp(0), + m_sel(1), m_period(attotime::from_hz(9600*8)) { m_owner = dynamic_cast(this->owner());