Changed pdp11_dz to leverage the tmxr library's pass thru modem control capabilities.
Fixed reporting of DCD for dz lines beyond the first 4.
This commit is contained in:
parent
02cb620c9b
commit
0a46da5aa0
3 changed files with 123 additions and 24 deletions
|
@ -119,9 +119,26 @@ extern int32 int_req[IPL_HLVL];
|
||||||
#define RBUF_VALID 0100000 /* rcv valid */
|
#define RBUF_VALID 0100000 /* rcv valid */
|
||||||
#define RBUF_MBZ 0004000
|
#define RBUF_MBZ 0004000
|
||||||
|
|
||||||
|
char *dz_charsizes[] = {"5", "6", "7", "8"};
|
||||||
|
char *dz_baudrates[] = {"50", "75", "110", "134.5", "150", "300", "600", "1200",
|
||||||
|
"1800", "2000", "2400", "3600", "4800", "7200", "9600", "19200"};
|
||||||
|
char *dz_parity[] = {"N", "E", "N", "O"};
|
||||||
|
char *dz_stopbits[] = {"1", "2", "1", "1.5"};
|
||||||
|
|
||||||
/* DZLPR - 160102 - line parameter register, write only, word access only */
|
/* DZLPR - 160102 - line parameter register, write only, word access only */
|
||||||
|
|
||||||
#define LPR_V_LINE 0 /* line */
|
#define LPR_V_LINE 0 /* line */
|
||||||
|
#define LPR_V_SPEED 8 /* speed code */
|
||||||
|
#define LPR_M_SPEED 0007400 /* speed code mask */
|
||||||
|
#define LPR_V_CHARSIZE 3 /* char size code */
|
||||||
|
#define LPR_M_CHARSIZE 0000030 /* char size code mask */
|
||||||
|
#define LPR_V_STOPBITS 5 /* stop bits code */
|
||||||
|
#define LPR_V_PARENB 6 /* parity enable */
|
||||||
|
#define LPR_V_PARODD 7 /* parity odd */
|
||||||
|
#define LPR_GETSPD(x) dz_baudrates[((x) & LPR_M_SPEED) >> LPR_V_SPEED]
|
||||||
|
#define LPR_GETCHARSIZE(x) dz_charsizes[((x) & LPR_M_CHARSIZE) >> LPR_V_CHARSIZE]
|
||||||
|
#define LPR_GETPARITY(x) dz_parity[(((x) >> LPR_V_PARENB) & 1) | (((x) >> (LPR_V_PARODD-1)) & 2)]
|
||||||
|
#define LPR_GETSTOPBITS(x) dz_stopbits[(((x) >> LPR_V_STOPBITS) & 1) + (((((x) & LPR_M_CHARSIZE) >> LPR_V_CHARSIZE) == 5) ? 2 : 0)]
|
||||||
#define LPR_LPAR 0007770 /* line pars - NI */
|
#define LPR_LPAR 0007770 /* line pars - NI */
|
||||||
#define LPR_RCVE 0010000 /* receive enb */
|
#define LPR_RCVE 0010000 /* receive enb */
|
||||||
#define LPR_GETLN(x) (((x) >> LPR_V_LINE) & DZ_LNOMASK)
|
#define LPR_GETLN(x) (((x) >> LPR_V_LINE) & DZ_LNOMASK)
|
||||||
|
@ -281,6 +298,7 @@ static char *dz_wr_regs[] =
|
||||||
|
|
||||||
t_stat dz_rd (int32 *data, int32 PA, int32 access)
|
t_stat dz_rd (int32 *data, int32 PA, int32 access)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
int32 dz = ((PA - dz_dib.ba) >> 3) & DZ_MNOMASK; /* get mux num */
|
int32 dz = ((PA - dz_dib.ba) >> 3) & DZ_MNOMASK; /* get mux num */
|
||||||
|
|
||||||
switch ((PA >> 1) & 03) { /* case on PA<2:1> */
|
switch ((PA >> 1) & 03) { /* case on PA<2:1> */
|
||||||
|
@ -310,6 +328,20 @@ 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 */
|
||||||
|
int line;
|
||||||
|
int32 modem_bits;
|
||||||
|
TMLN *lp;
|
||||||
|
|
||||||
|
line = (dz * DZ_LINES) + i;
|
||||||
|
lp = &dz_ldsc[line]; /* get line desc */
|
||||||
|
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] |= ((modem_bits&TMXR_MDM_RNG) ? (1 << (MSR_V_RI + i)) : 0) |
|
||||||
|
((modem_bits&TMXR_MDM_DCD) ? (1 << (MSR_V_CD + i)) : 0);
|
||||||
|
}
|
||||||
*data = dz_msr[dz];
|
*data = dz_msr[dz];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -323,6 +355,7 @@ t_stat dz_wr (int32 data, int32 PA, int32 access)
|
||||||
{
|
{
|
||||||
int32 dz = ((PA - dz_dib.ba) >> 3) & DZ_MNOMASK; /* get mux num */
|
int32 dz = ((PA - dz_dib.ba) >> 3) & DZ_MNOMASK; /* get mux num */
|
||||||
int32 i, c, line;
|
int32 i, c, line;
|
||||||
|
char lineconfig[16];
|
||||||
TMLN *lp;
|
TMLN *lp;
|
||||||
|
|
||||||
sim_debug(DBG_REG, &dz_dev, "dz_wr(PA=0x%08X [%s], access=%d, data=0x%X)\n", PA, dz_wr_regs[(PA >> 1) & 03], access, data);
|
sim_debug(DBG_REG, &dz_dev, "dz_wr(PA=0x%08X [%s], access=%d, data=0x%X)\n", PA, dz_wr_regs[(PA >> 1) & 03], access, data);
|
||||||
|
@ -358,6 +391,11 @@ switch ((PA >> 1) & 03) { /* case on PA<2:1> */
|
||||||
if (dz_lpr[dz] & LPR_RCVE) /* rcv enb? on */
|
if (dz_lpr[dz] & LPR_RCVE) /* rcv enb? on */
|
||||||
lp->rcve = 1;
|
lp->rcve = 1;
|
||||||
else lp->rcve = 0; /* else line off */
|
else lp->rcve = 0; /* else line off */
|
||||||
|
if (dz_mctl) {
|
||||||
|
sprintf(lineconfig, "%s-%s%s%s", LPR_GETSPD(data), LPR_GETCHARSIZE(data), LPR_GETPARITY(data), LPR_GETSTOPBITS(data));
|
||||||
|
if (!lp->serconfig || (0 != strcmp(lp->serconfig, lineconfig))) /* config changed? */
|
||||||
|
tmxr_set_config_line (lp, lineconfig); /* set it */
|
||||||
|
}
|
||||||
tmxr_poll_rx (&dz_desc); /* poll input */
|
tmxr_poll_rx (&dz_desc); /* poll input */
|
||||||
dz_update_rcvi (); /* update rx intr */
|
dz_update_rcvi (); /* update rx intr */
|
||||||
break;
|
break;
|
||||||
|
@ -367,23 +405,20 @@ switch ((PA >> 1) & 03) { /* case on PA<2:1> */
|
||||||
(dz_tcr[dz] & 0377) | (data << 8):
|
(dz_tcr[dz] & 0377) | (data << 8):
|
||||||
(dz_tcr[dz] & ~0377) | data;
|
(dz_tcr[dz] & ~0377) | data;
|
||||||
if (dz_mctl) { /* modem ctl? */
|
if (dz_mctl) { /* modem ctl? */
|
||||||
dz_msr[dz] |= ((data & 0177400) & /* dcd |= dtr & ring */
|
int32 changed = data ^ dz_tcr[dz];
|
||||||
((dz_msr[dz] & DZ_LMASK) << MSR_V_CD));
|
|
||||||
dz_msr[dz] &= ~(data >> TCR_V_DTR); /* ring &= ~dtr */
|
for (i = 0; i < DZ_LINES; i++) {
|
||||||
if (dz_auto) { /* auto disconnect? */
|
if (0 == (changed & (1 << (TCR_V_DTR + i))))
|
||||||
int32 drop;
|
continue; /* line unchanged skip */
|
||||||
drop = (dz_tcr[dz] & ~data) >> TCR_V_DTR; /* drop = dtr & ~data */
|
line = (dz * DZ_LINES) + i; /* get line num */
|
||||||
for (i = 0; i < DZ_LINES; i++) { /* drop hangups */
|
lp = &dz_ldsc[line]; /* get line desc */
|
||||||
line = (dz * DZ_LINES) + i; /* get line num */
|
if (data & (1 << (TCR_V_DTR + i)))
|
||||||
lp = &dz_ldsc[line]; /* get line desc */
|
tmxr_set_get_modem_bits (lp, TMXR_MDM_DTR|TMXR_MDM_RTS, 0, NULL);
|
||||||
if (lp->conn && (drop & (1 << i))) {
|
else
|
||||||
tmxr_linemsg (lp, "\r\nLine hangup\r\n");
|
if (dz_auto)
|
||||||
tmxr_reset_ln (lp); /* reset line, cdet */
|
tmxr_set_get_modem_bits (lp, 0, TMXR_MDM_DTR|TMXR_MDM_RTS, NULL);
|
||||||
dz_msr[dz] &= ~(1 << (i + MSR_V_CD));
|
}
|
||||||
} /* end if drop */
|
}
|
||||||
} /* end for */
|
|
||||||
} /* end if auto */
|
|
||||||
} /* end if modem */
|
|
||||||
dz_tcr[dz] = data;
|
dz_tcr[dz] = data;
|
||||||
tmxr_poll_tx (&dz_desc); /* poll output */
|
tmxr_poll_tx (&dz_desc); /* poll output */
|
||||||
dz_update_xmti (); /* update int */
|
dz_update_xmti (); /* update int */
|
||||||
|
@ -423,7 +458,7 @@ return SCPE_OK;
|
||||||
|
|
||||||
t_stat dz_svc (UNIT *uptr)
|
t_stat dz_svc (UNIT *uptr)
|
||||||
{
|
{
|
||||||
int32 dz, t, newln;
|
int32 dz, t, newln, muxln;
|
||||||
|
|
||||||
for (dz = t = 0; dz < DZ_MUXES; dz++) /* check enabled */
|
for (dz = t = 0; dz < DZ_MUXES; dz++) /* check enabled */
|
||||||
t = t | (dz_csr[dz] & CSR_MSE);
|
t = t | (dz_csr[dz] & CSR_MSE);
|
||||||
|
@ -431,9 +466,10 @@ if (t) { /* any enabled? */
|
||||||
newln = tmxr_poll_conn (&dz_desc); /* poll connect */
|
newln = tmxr_poll_conn (&dz_desc); /* poll connect */
|
||||||
if ((newln >= 0) && dz_mctl) { /* got a live one? */
|
if ((newln >= 0) && dz_mctl) { /* got a live one? */
|
||||||
dz = newln / DZ_LINES; /* get mux num */
|
dz = newln / DZ_LINES; /* get mux num */
|
||||||
if (dz_tcr[dz] & (1 << (newln + TCR_V_DTR))) /* DTR set? */
|
muxln = newln % DZ_LINES; /* get line in mux */
|
||||||
dz_msr[dz] |= (1 << (newln + MSR_V_CD)); /* set cdet */
|
if (dz_tcr[dz] & (1 << (muxln + TCR_V_DTR))) /* DTR set? */
|
||||||
else dz_msr[dz] |= (1 << newln); /* set ring */
|
dz_msr[dz] |= (1 << (muxln + MSR_V_CD)); /* set cdet */
|
||||||
|
else dz_msr[dz] |= (1 << (muxln + MSR_V_RI)); /* set ring */
|
||||||
}
|
}
|
||||||
tmxr_poll_rx (&dz_desc); /* poll input */
|
tmxr_poll_rx (&dz_desc); /* poll input */
|
||||||
dz_update_rcvi (); /* upd rcv intr */
|
dz_update_rcvi (); /* upd rcv intr */
|
||||||
|
@ -627,13 +663,17 @@ return auto_config (dptr->name, ndev); /* auto config */
|
||||||
|
|
||||||
t_stat dz_attach (UNIT *uptr, char *cptr)
|
t_stat dz_attach (UNIT *uptr, char *cptr)
|
||||||
{
|
{
|
||||||
|
int32 dz, muxln;
|
||||||
t_stat r;
|
t_stat r;
|
||||||
extern int32 sim_switches;
|
extern int32 sim_switches;
|
||||||
|
|
||||||
dz_mctl = dz_auto = 0; /* modem ctl off */
|
if (sim_switches & SWMASK ('M')) /* modem control? */
|
||||||
|
tmxr_set_modem_control_passthru (&dz_desc);
|
||||||
r = tmxr_attach (&dz_desc, uptr, cptr); /* attach mux */
|
r = tmxr_attach (&dz_desc, uptr, cptr); /* attach mux */
|
||||||
if (r != SCPE_OK) /* error? */
|
if (r != SCPE_OK) { /* error? */
|
||||||
|
tmxr_clear_modem_control_passthru (&dz_desc);
|
||||||
return r;
|
return r;
|
||||||
|
}
|
||||||
if (sim_switches & SWMASK ('M')) { /* modem control? */
|
if (sim_switches & SWMASK ('M')) { /* modem control? */
|
||||||
dz_mctl = 1;
|
dz_mctl = 1;
|
||||||
printf ("Modem control activated\n");
|
printf ("Modem control activated\n");
|
||||||
|
@ -646,6 +686,18 @@ if (sim_switches & SWMASK ('M')) { /* modem control? */
|
||||||
fprintf (sim_log, "Auto disconnect activated\n");
|
fprintf (sim_log, "Auto disconnect activated\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (dz = 0; dz < DZ_MUXES; dz++) {
|
||||||
|
if (!dz_mctl || (0 == (dz_csr[dz] & CSR_MSE))) /* enabled? */
|
||||||
|
continue;
|
||||||
|
for (muxln = 0; muxln < DZ_LINES; muxln++) {
|
||||||
|
if (dz_tcr[dz] & (1 << (muxln + TCR_V_DTR))) {
|
||||||
|
TMLN *lp = &dz_ldsc[(dz * DZ_LINES) + muxln];
|
||||||
|
|
||||||
|
tmxr_set_get_modem_bits (lp, TMXR_MDM_DTR|TMXR_MDM_RTS, 0, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,6 +705,7 @@ return SCPE_OK;
|
||||||
|
|
||||||
t_stat dz_detach (UNIT *uptr)
|
t_stat dz_detach (UNIT *uptr)
|
||||||
{
|
{
|
||||||
|
dz_mctl = dz_auto = 0; /* modem ctl off */
|
||||||
return tmxr_detach (&dz_desc, uptr);
|
return tmxr_detach (&dz_desc, uptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
47
sim_tmxr.c
47
sim_tmxr.c
|
@ -71,6 +71,7 @@
|
||||||
tmxr_poll_tx - poll transmit
|
tmxr_poll_tx - poll transmit
|
||||||
tmxr_send_buffered_data - transmit buffered data
|
tmxr_send_buffered_data - transmit buffered data
|
||||||
tmxr_set_modem_control_passthru - enable modem control on a multiplexer
|
tmxr_set_modem_control_passthru - enable modem control on a multiplexer
|
||||||
|
tmxr_clear_modem_control_passthru - disable modem control on a multiplexer
|
||||||
tmxr_set_get_modem_bits - set and/or get a line modem bits
|
tmxr_set_get_modem_bits - set and/or get a line modem bits
|
||||||
tmxr_set_config_line - set port speed, character size, parity and stop bits
|
tmxr_set_config_line - set port speed, character size, parity and stop bits
|
||||||
tmxr_open_master - open master connection
|
tmxr_open_master - open master connection
|
||||||
|
@ -867,7 +868,6 @@ return SCPE_OK;
|
||||||
2 Calling this API enables the tmxr_set_get_modem_bits and
|
2 Calling this API enables the tmxr_set_get_modem_bits and
|
||||||
tmxr_set_config_line APIs.
|
tmxr_set_config_line APIs.
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
t_stat tmxr_set_modem_control_passthru (TMXR *mp)
|
t_stat tmxr_set_modem_control_passthru (TMXR *mp)
|
||||||
{
|
{
|
||||||
|
@ -875,6 +875,49 @@ mp->modem_control = TRUE;
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Disable modem control pass thru
|
||||||
|
|
||||||
|
Inputs:
|
||||||
|
none
|
||||||
|
|
||||||
|
Output:
|
||||||
|
none
|
||||||
|
|
||||||
|
Implementation note:
|
||||||
|
|
||||||
|
1 Calling this API enables this library's direct manipulation
|
||||||
|
of DTR (&RTS) on serial ports.
|
||||||
|
|
||||||
|
2 Calling this API disables the tmxr_set_get_modem_bits and
|
||||||
|
tmxr_set_config_line APIs.
|
||||||
|
|
||||||
|
3 This API will only change the state of the modem control processing
|
||||||
|
of this library if there are no listening ports, serial ports or
|
||||||
|
outgoing connecctions associated with the specified multiplexer
|
||||||
|
|
||||||
|
*/
|
||||||
|
t_stat tmxr_clear_modem_control_passthru (TMXR *mp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!mp->modem_control)
|
||||||
|
return SCPE_OK;
|
||||||
|
if (mp->master)
|
||||||
|
return SCPE_ALATT;
|
||||||
|
for (i=0; i<mp->lines; ++i) {
|
||||||
|
TMLN *lp;
|
||||||
|
|
||||||
|
lp = mp->ldsc + i;
|
||||||
|
if ((lp->master) ||
|
||||||
|
(lp->conn) ||
|
||||||
|
(lp->connecting) ||
|
||||||
|
(lp->serport))
|
||||||
|
return SCPE_ALATT;
|
||||||
|
}
|
||||||
|
mp->modem_control = FALSE;
|
||||||
|
return SCPE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* Manipulate the modem control bits of a specific line
|
/* Manipulate the modem control bits of a specific line
|
||||||
|
|
||||||
Inputs:
|
Inputs:
|
||||||
|
@ -2116,6 +2159,7 @@ if (lp->txlog == NULL) { /* error? */
|
||||||
free (lp->txlogname); /* free buffer */
|
free (lp->txlogname); /* free buffer */
|
||||||
return SCPE_OPENERR;
|
return SCPE_OPENERR;
|
||||||
}
|
}
|
||||||
|
lp->mp->uptr->filename = _mux_attach_string (lp->mp->uptr->filename, lp->mp);
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2138,6 +2182,7 @@ if (lp->txlog) { /* logging? */
|
||||||
lp->txlog = NULL;
|
lp->txlog = NULL;
|
||||||
lp->txlogname = NULL;
|
lp->txlogname = NULL;
|
||||||
}
|
}
|
||||||
|
lp->mp->uptr->filename = _mux_attach_string (lp->mp->uptr->filename, lp->mp);
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,7 @@ t_stat tmxr_close_master (TMXR *mp);
|
||||||
t_stat tmxr_attach (TMXR *mp, UNIT *uptr, char *cptr);
|
t_stat tmxr_attach (TMXR *mp, UNIT *uptr, char *cptr);
|
||||||
t_stat tmxr_detach (TMXR *mp, UNIT *uptr);
|
t_stat tmxr_detach (TMXR *mp, UNIT *uptr);
|
||||||
t_stat tmxr_set_modem_control_passthru (TMXR *mp);
|
t_stat tmxr_set_modem_control_passthru (TMXR *mp);
|
||||||
|
t_stat tmxr_clear_modem_control_passthru (TMXR *mp);
|
||||||
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 tmxr_set_config_line (TMLN *lp, char *config);
|
t_stat tmxr_set_config_line (TMLN *lp, char *config);
|
||||||
t_stat tmxr_set_line_unit (TMXR *mp, int line, UNIT *uptr_poll);
|
t_stat tmxr_set_line_unit (TMXR *mp, int line, UNIT *uptr_poll);
|
||||||
|
|
Loading…
Add table
Reference in a new issue