Fix DZ issue which didn't report modem bits to the host unless the attach was made with -M.

This commit is contained in:
Mark Pizzolato 2013-01-23 19:33:42 -08:00
parent e6eae9194f
commit f4dd30709f
2 changed files with 24 additions and 24 deletions

View file

@ -337,20 +337,19 @@ switch ((PA >> 1) & 03) { /* case on PA<2:1> */
break; break;
case 03: /* MSR */ case 03: /* MSR */
if (dz_mctl) for (i=0; i<DZ_LINES; ++i) { /* Gather line status bits for each line */
for (i=0; i<DZ_LINES; ++i) { /* Gather line status bits for each line */ int line;
int line; int32 modem_bits;
int32 modem_bits; TMLN *lp;
TMLN *lp;
line = (dz * DZ_LINES) + i;
line = (dz * DZ_LINES) + i; lp = &dz_ldsc[line]; /* get line desc */
lp = &dz_ldsc[line]; /* get line desc */ tmxr_set_get_modem_bits (lp, 0, 0, &modem_bits);
tmxr_set_get_modem_bits (lp, 0, 0, &modem_bits);
dz_msr[dz] &= ~((1 << (MSR_V_RI + i)) | (1 << (MSR_V_CD + i))); dz_msr[dz] &= ~((1 << (MSR_V_RI + i)) | (1 << (MSR_V_CD + i)));
dz_msr[dz] |= ((modem_bits&TMXR_MDM_RNG) ? (1 << (MSR_V_RI + i)) : 0) | dz_msr[dz] |= ((modem_bits&TMXR_MDM_RNG) ? (1 << (MSR_V_RI + i)) : 0) |
((modem_bits&TMXR_MDM_DCD) ? (1 << (MSR_V_CD + i)) : 0); ((modem_bits&TMXR_MDM_DCD) ? (1 << (MSR_V_CD + i)) : 0);
} }
*data = dz_msr[dz]; *data = dz_msr[dz];
break; break;
} }

View file

@ -1053,29 +1053,30 @@ return SCPE_OK;
*/ */
t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits) t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits)
{ {
t_stat r = SCPE_OK;
tmxr_debug_trace_line (lp, "tmxr_set_get_modem_bits()"); tmxr_debug_trace_line (lp, "tmxr_set_get_modem_bits()");
if (!lp->mp->modem_control) /* This API ONLY works on modem_control enabled multiplexers */
return SCPE_IERR;
if ((bits_to_set & ~(TMXR_MDM_OUTGOING)) || /* Assure only settable bits */ if ((bits_to_set & ~(TMXR_MDM_OUTGOING)) || /* Assure only settable bits */
(bits_to_clear & ~(TMXR_MDM_OUTGOING)) || (bits_to_clear & ~(TMXR_MDM_OUTGOING)) ||
(bits_to_set & bits_to_clear)) /* and can't set and clear the same bits */ (bits_to_set & bits_to_clear)) /* and can't set and clear the same bits */
return SCPE_ARG; return SCPE_ARG;
if (lp->serport)
return sim_control_serial (lp->serport, bits_to_set, bits_to_clear, incoming_bits);
if (lp->sock) {
if (bits_to_clear&TMXR_MDM_DTR) /* drop DTR? */
tmxr_reset_ln (lp);
}
if (incoming_bits) { if (incoming_bits) {
if (lp->sock) if (lp->sock)
*incoming_bits = TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR; *incoming_bits = TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR;
else else
*incoming_bits = lp->mp->master ? (TMXR_MDM_CTS | TMXR_MDM_DSR) : 0; *incoming_bits = lp->mp->master ? (TMXR_MDM_CTS | TMXR_MDM_DSR) : 0;
} }
return r; if (lp->mp->modem_control) { /* This API ONLY works on modem_control enabled multiplexers */
if (lp->serport)
return sim_control_serial (lp->serport, bits_to_set, bits_to_clear, incoming_bits);
if (lp->sock) {
if (bits_to_clear&TMXR_MDM_DTR) /* drop DTR? */
tmxr_reset_ln (lp);
}
return SCPE_OK;
}
if (lp->serport)
sim_control_serial (lp->serport, 0, 0, incoming_bits);
return SCPE_IERR;
} }
t_stat tmxr_set_config_line (TMLN *lp, char *config) t_stat tmxr_set_config_line (TMLN *lp, char *config)