PDP11, DZ: Properly set CSR bits character output processing.
Declare output unit to facilitate proper character output completion scheduling. Proper completion scheduling removes the need to sleeping waiting for character I/O completion. This should fix #521 and #504
This commit is contained in:
parent
611679a5cd
commit
55e211dd3d
1 changed files with 12 additions and 6 deletions
|
@ -302,7 +302,8 @@ DIB dz_dib = {
|
||||||
|
|
||||||
UNIT dz_unit[2] = {
|
UNIT dz_unit[2] = {
|
||||||
{ UDATA (&dz_svc, UNIT_IDLE|UNIT_ATTABLE|DZ_8B_DFLT, 0) },
|
{ UDATA (&dz_svc, UNIT_IDLE|UNIT_ATTABLE|DZ_8B_DFLT, 0) },
|
||||||
{ UDATA (&dz_xmt_svc, UNIT_DIS, 0), SERIAL_OUT_WAIT } };
|
{ UDATA (&dz_xmt_svc, UNIT_DIS, 0) }
|
||||||
|
};
|
||||||
|
|
||||||
REG dz_reg[] = {
|
REG dz_reg[] = {
|
||||||
{ BRDATADF (CSR, dz_csr, DEV_RDX, 16, MAX_DZ_MUXES, "control/status register", dz_csr_bits) },
|
{ BRDATADF (CSR, dz_csr, DEV_RDX, 16, MAX_DZ_MUXES, "control/status register", dz_csr_bits) },
|
||||||
|
@ -531,9 +532,11 @@ switch ((PA >> 1) & 03) { /* case on PA<2:1> */
|
||||||
line = (dz * DZ_LINES) + CSR_GETTL (dz_csr[dz]);
|
line = (dz * DZ_LINES) + CSR_GETTL (dz_csr[dz]);
|
||||||
lp = &dz_ldsc[line]; /* get line desc */
|
lp = &dz_ldsc[line]; /* get line desc */
|
||||||
c = sim_tt_outcvt (dz_tdr[dz], TT_GET_MODE (dz_unit[0].flags));
|
c = sim_tt_outcvt (dz_tdr[dz], TT_GET_MODE (dz_unit[0].flags));
|
||||||
if (c >= 0) /* store char */
|
if (c >= 0) { /* store char */
|
||||||
tmxr_putc_ln (lp, c);
|
tmxr_putc_ln (lp, c);
|
||||||
sim_activate (&dz_unit[1], dz_unit[1].wait);/* */
|
dz_update_xmti ();
|
||||||
|
sim_activate_after_abs (&dz_unit[1], lp->txdelta);/* */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -671,7 +674,8 @@ for (dz = 0; dz < dz_desc.lines/DZ_LINES; dz++) { /* loop thru muxes */
|
||||||
}
|
}
|
||||||
if ((dz_csr[dz] & CSR_TIE) && (dz_csr[dz] & CSR_TRDY)) /* ready plus int? */
|
if ((dz_csr[dz] & CSR_TIE) && (dz_csr[dz] & CSR_TRDY)) /* ready plus int? */
|
||||||
dz_set_txint (dz);
|
dz_set_txint (dz);
|
||||||
else dz_clr_txint (dz); /* no int req */
|
else
|
||||||
|
dz_clr_txint (dz); /* no int req */
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -792,11 +796,13 @@ return auto_config (dptr->name, ndev); /* auto config */
|
||||||
|
|
||||||
t_stat dz_attach (UNIT *uptr, CONST char *cptr)
|
t_stat dz_attach (UNIT *uptr, CONST char *cptr)
|
||||||
{
|
{
|
||||||
int32 dz, muxln;
|
int32 dz, muxln, ln;
|
||||||
t_stat r;
|
t_stat r;
|
||||||
|
|
||||||
if ((sim_switches & SWMASK ('M')) || dz_mctl) /* modem control? */
|
if ((sim_switches & SWMASK ('M')) || dz_mctl) /* modem control? */
|
||||||
tmxr_set_modem_control_passthru (&dz_desc);
|
tmxr_set_modem_control_passthru (&dz_desc);
|
||||||
|
for (ln = 0; ln < dz_desc.lines; ln++)
|
||||||
|
tmxr_set_line_output_unit (&dz_desc, ln, &dz_unit[1]);
|
||||||
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);
|
tmxr_clear_modem_control_passthru (&dz_desc);
|
||||||
|
|
Loading…
Add table
Reference in a new issue