diff --git a/SDS/sds_io.c b/SDS/sds_io.c index dc5e7618..dea1a804 100644 --- a/SDS/sds_io.c +++ b/SDS/sds_io.c @@ -148,7 +148,7 @@ extern void set_dyn_map (void); Channels could, optionally, handle 12b or 24b characters. The simulator can support all widths. */ - + t_stat chan_show_reg (FILE *st, UNIT *uptr, int32 val, void *desc); struct aldisp { @@ -233,11 +233,11 @@ t_stat (*dev3_dsp[64])() = { NULL }; struct aldisp dev_alt[] = { { NULL, NULL }, { NULL, &pot_ilc }, { NULL, &pot_ilc }, - { NULL, &pot_ilc }, { NULL, &pot_ilc }, { NULL, &pot_ilc }, { NULL, &pot_ilc }, - { NULL, &pot_ilc }, { NULL, &pot_ilc }, + { NULL, &pot_ilc }, { NULL, &pot_ilc }, + { NULL, &pot_ilc }, { NULL, &pot_ilc }, + { NULL, &pot_dcr }, { NULL, &pot_dcr }, { NULL, &pot_dcr }, { NULL, &pot_dcr }, - { NULL, &pot_dcr }, { NULL, &pot_dcr }, { NULL, &pot_dcr }, { NULL, &pot_dcr }, { NULL, &pot_dcr }, { NULL, &pot_dcr }, { &pin_adr, NULL }, { &pin_adr, NULL }, @@ -330,15 +330,22 @@ switch (mod) { if (INV_DEV (dev, ch)) /* inv dev? err */ CRETDEV; chan_war[ch] = chan_cnt[ch] = 0; /* init chan */ - chan_flag[ch] = chan_dcr[ch] = 0; - chan_mode[ch] = chan_uar[ch] = 0; - if (ch >= CHAN_E) - chan_mode[ch] = CHM_CE; + chan_dcr[ch] = 0; + chan_uar[ch] = 0; + if (!(chan_flag[ch] & CHF_ILCE) && /* ignore if ilc */ + !QAILCE (alert)) { /* already alerted */ + chan_flag[ch] = chan_mode[ch] = 0; + if (ch >= CHAN_E) + chan_mode[ch] = CHM_CE; + } if ((r = dev_dsp[dev][ch] (IO_CONN, inst, NULL)))/* connect */ return r; - if ((inst & I_IND) || (ch >= CHAN_C)) { /* C-H? alert ilc */ - alert = POT_ILCY + ch; - chan_mar[ch] = chan_wcr[ch] = 0; + if (!(chan_flag[ch] & CHF_ILCE) && /* ignore if ilc */ + !QAILCE (alert)) { /* already alerted */ + if ((inst & I_IND) || (ch >= CHAN_C)) { /* C-H? alert ilc */ + alert = POT_ILCY + ch; + chan_mar[ch] = chan_wcr[ch] = 0; + } } if (chan_flag[ch] & CHF_24B) /* 24B? 1 ch/wd */ chan_cpw[ch] = 0; @@ -390,7 +397,7 @@ switch (mod) { } /* end else change scan */ } /* end else term output */ } /* end else chan EOM */ - break; + break; case 2: /* internal */ if (ch >= CHAN_E) { /* EOD? */ @@ -494,7 +501,7 @@ switch (mod) { case 3: /* special */ dev = I_GETDEV3 (inst); /* special device */ if (dev3_dsp[dev]) - dev3_dsp[dev] (IO_SKS, inst, dat); + dev3_dsp[dev] (IO_SKS, inst, dat); else CRETINS; } /* end case */ @@ -568,7 +575,7 @@ return SCPE_OK; Note that the channel can be disconnected if CHN_EOR is set, but must not be if XFR_REQ is set */ - + t_stat chan_read (int32 ch) { uint32 dat = 0; @@ -626,7 +633,7 @@ if (TST_EOR (ch)) { /* end record? */ } /* end else if cnt */ return chan_eor (ch); /* eot/eor int */ } -return r; +return r; } void chan_write_mem (int32 ch)