From 06ec6217540293be3b6417183c827b14af146d0c Mon Sep 17 00:00:00 2001 From: Timothe Litt Date: Wed, 10 Jul 2013 12:58:46 -0400 Subject: [PATCH] DUP: Modem change bits The modem change bits are specified to: o Reset when RXCSR is read, on bus init and device reset. o Set when modem signals change This corrects the implementation. Previously, the change bits were both set and cleared whenever modem status was polled, which happens every dup_svc poll. --- PDP11/pdp11_dup.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PDP11/pdp11_dup.c b/PDP11/pdp11_dup.c index 6dc05dcb..73bab5a0 100644 --- a/PDP11/pdp11_dup.c +++ b/PDP11/pdp11_dup.c @@ -469,6 +469,7 @@ switch ((PA >> 1) & 03) { /* case on PA<2:1> */ case 00: /* RXCSR */ dup_get_modem (dup); *data = dup_rxcsr[dup]; + dup_rxcsr[dup] &= ~(RXCSR_M_DSCHNG|RXCSR_M_BDATSET); break; case 01: /* RXDBUF */ @@ -596,6 +597,7 @@ static t_stat dup_get_modem (int32 dup) int32 modem_bits; int32 old_rxcsr_a_modem_bits, new_rxcsr_a_modem_bits, old_rxcsr_b_modem_bits, new_rxcsr_b_modem_bits; TMLN *lp = &dup_desc.ldsc[dup]; +t_bool new_modem_change = FALSE; old_rxcsr_a_modem_bits = dup_rxcsr[dup] & RXCSR_A_MODEM_BITS; old_rxcsr_b_modem_bits = dup_rxcsr[dup] & RXCSR_B_MODEM_BITS; @@ -606,17 +608,15 @@ new_rxcsr_a_modem_bits = (((modem_bits & TMXR_MDM_RNG) ? RXCSR_M_RING : 0) | new_rxcsr_b_modem_bits = ((modem_bits & TMXR_MDM_DSR) ? RXCSR_M_DSR : 0); dup_rxcsr[dup] &= ~(RXCSR_A_MODEM_BITS | RXCSR_B_MODEM_BITS); dup_rxcsr[dup] |= new_rxcsr_a_modem_bits | new_rxcsr_b_modem_bits; -if (old_rxcsr_a_modem_bits != new_rxcsr_a_modem_bits) +if (old_rxcsr_a_modem_bits != new_rxcsr_a_modem_bits) { dup_rxcsr[dup] |= RXCSR_M_DSCHNG; -else - dup_rxcsr[dup] &= ~RXCSR_M_DSCHNG; -if (old_rxcsr_b_modem_bits != new_rxcsr_b_modem_bits) + new_modem_change = TRUE; + } +if (old_rxcsr_b_modem_bits != new_rxcsr_b_modem_bits) { dup_rxcsr[dup] |= RXCSR_M_BDATSET; -else - dup_rxcsr[dup] &= ~RXCSR_M_BDATSET; -if (dup_modem_change_callback[dup] && - ((dup_rxcsr[dup] & RXCSR_M_DSCHNG) || - (dup_rxcsr[dup] & RXCSR_M_BDATSET))) + new_modem_change = TRUE; + } +if (dup_modem_change_callback[dup] && new_modem_change) dup_modem_change_callback[dup](dup); if ((dup_rxcsr[dup] & RXCSR_M_DSCHNG) && (dup_rxcsr[dup] & RXCSR_M_DSCIE))