t_stat mux_vlines (UNIT *uptr, int32 val, char *cptr, void *desc) { int32 newln, i, t; t_stat r; if (cptr == NULL) return SCPE_ARG; newln = get_uint (cptr, 10, MUX_LINES, &r); if ((r != SCPE_OK) || (newln == MUX_NUMLIN)) return r; if (newln == 0) return SCPE_ARG; if (newln < MUX_NUMLIN) { for (i = newln, t = 0; i < MUX_NUMLIN; i++) t = t | mux_ldsc[i].conn; if (t && !get_yn ("This will disconnect users; proceed [N]?", FALSE)) return SCPE_OK; for (i = newln; i < MUX_NUMLIN; i++) { if (mux_ldsc[i].conn) { tmxr_linemsg (&mux_ldsc[i], "\r\nOperator disconnected line\r\n"); tmxr_reset_ln (&mux_ldsc[i]); /* reset line */ } muxl_unit[i].flags = muxl_unit[i].flags | UNIT_DIS; mux_reset_ln (i); } } else { for (i = MUX_NUMLIN; i < newln; i++) { muxl_unit[i].flags = muxl_unit[i].flags & ~UNIT_DIS; mux_reset_ln (i); } } MUX_NUMLIN = newln; return SCPE_OK; }
t_stat dtc_setnl (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { int32 newln, i, t; t_stat r; if (cptr == NULL) return SCPE_ARG; newln = (int32) get_uint (cptr, 10, DTC_MLINES, &r); if ((r != SCPE_OK) || (newln == dtc_desc.lines)) return r; if ((newln == 0) || (newln > DTC_MLINES)) return SCPE_ARG; if (newln < dtc_desc.lines) { for (i = newln-1, t = 0; i < dtc_desc.lines; i++) t = t | dtc_ldsc[i].conn; if (t && !get_yn ("This will disconnect users; proceed [N]?", FALSE)) return SCPE_OK; for (i = newln-1; i < dtc_desc.lines; i++) { if (dtc_ldsc[i].conn) { tmxr_linemsg (&dtc_ldsc[i], "\r\nOperator disconnected line\r\n"); tmxr_send_buffered_data (&dtc_ldsc[i]); } tmxr_detach_ln (&dtc_ldsc[i]); /* completely reset line */ } } if (dtc_desc.lines < newln) memset (dtc_ldsc + dtc_desc.lines, 0, sizeof(*dtc_ldsc)*(newln-dtc_desc.lines)); dtc_desc.lines = newln; return dtc_reset (&dtc_dev); /* setup lines and auto config */ }
/* * Set the number of lines for the PORTS mux. This will add or remove * cards as necessary. The number of lines must be a multiple of 4. */ t_stat ports_setnl(UNIT *uptr, int32 val, CONST char *cptr, void *desc) { int32 newln, i, t; t_stat r = SCPE_OK; if (cptr == NULL) { return SCPE_ARG; } newln = (int32) get_uint(cptr, 10, (MAX_PORTS_CARDS * PORTS_LINES), &r); if ((r != SCPE_OK) || (newln == ports_desc.lines)) { return r; } if ((newln == 0) || LPORT(newln) != 0) { return SCPE_ARG; } if (newln < ports_desc.lines) { for (i = newln, t = 0; i < ports_desc.lines; i++) { t = t | ports_ldsc[i].conn; } if (t && !get_yn("This will disconnect users; proceed [N]?", FALSE)) { return SCPE_OK; } for (i = newln; i < ports_desc.lines; i++) { if (ports_ldsc[i].conn) { tmxr_linemsg(&ports_ldsc[i], "\r\nOperator disconnected line\r\n"); tmxr_send_buffered_data(&ports_ldsc[i]); } /* completely reset line */ tmxr_detach_ln(&ports_ldsc[i]); if (LPORT(i) == (PORTS_LINES - 1)) { /* Also drop the corresponding card from the CIO array */ cio_clear(LCID(i)); } } } ports_desc.ldsc = ports_ldsc = (TMLN *)realloc(ports_ldsc, newln*sizeof(*ports_ldsc)); ports_state = (PORTS_LINE_STATE *)realloc(ports_state, newln*sizeof(*ports_state)); if (ports_desc.lines < newln) { memset(ports_ldsc + ports_desc.lines, 0, sizeof(*ports_ldsc)*(newln-ports_desc.lines)); memset(ports_state + ports_desc.lines, 0, sizeof(*ports_state)*(newln-ports_desc.lines)); } ports_desc.lines = newln; /* setup lines and auto config */ ports_conf = FALSE; return ports_reset(&ports_dev); }