uint32 ptpio (DIB *dibptr, IOCYCLE signal_set, uint32 stat_data) { IOSIGNAL signal; IOCYCLE working_set = IOADDSIR (signal_set); /* add ioSIR if needed */ while (working_set) { signal = IONEXT (working_set); /* isolate next signal */ switch (signal) { /* dispatch I/O signal */ case ioCLF: /* clear flag flip-flop */ ptp.flag = ptp.flagbuf = CLEAR; break; case ioSTF: /* set flag flip-flop */ case ioENF: /* enable flag */ ptp.flag = ptp.flagbuf = SET; break; case ioSFC: /* skip if flag is clear */ setstdSKF (ptp); break; case ioSFS: /* skip if flag is set */ setstdSKF (ptp); break; case ioIOI: /* I/O data input */ if ((ptp_unit.flags & UNIT_ATT) == 0) /* not attached? */ stat_data = IORETURN (SCPE_OK, PTP_LOW); /* report as out of tape */ else stat_data = IORETURN (SCPE_OK, 0); break; case ioIOO: /* I/O data output */ ptp_unit.buf = IODATA (stat_data); /* clear supplied status */ break; case ioPOPIO: /* power-on preset to I/O */ ptp.flag = ptp.flagbuf = SET; /* set flag and flag buffer */ ptp_unit.buf = 0; /* clear output buffer */ break; case ioCRS: /* control reset */ case ioCLC: /* clear control flip-flop */ ptp.control = CLEAR; break; case ioSTC: /* set control flip-flop */ ptp.control = SET; sim_activate (&ptp_unit, ptp_unit.wait); break; case ioSIR: /* set interrupt request */ setstdPRL (ptp); /* set standard PRL signal */ setstdIRQ (ptp); /* set standard IRQ signal */ setstdSRQ (ptp); /* set standard SRQ signal */ break; case ioIAK: /* interrupt acknowledge */ ptp.flagbuf = CLEAR; break; default: /* all other signals */ break; /* are ignored */ } working_set = working_set & ~signal; /* remove current signal from set */ } return stat_data; }
uint32 lptio (DIB *dibptr, IOCYCLE signal_set, uint32 stat_data) { uint16 data; IOSIGNAL signal; IOCYCLE working_set = IOADDSIR (signal_set); /* add ioSIR if needed */ while (working_set) { signal = IONEXT (working_set); /* isolate next signal */ switch (signal) { /* dispatch I/O signal */ case ioCLF: /* clear flag flip-flop */ lpt.flag = lpt.flagbuf = CLEAR; break; case ioSTF: /* set flag flip-flop */ case ioENF: /* enable flag */ lpt.flag = lpt.flagbuf = SET; break; case ioSFC: /* skip if flag is clear */ setstdSKF (lpt); break; case ioSFS: /* skip if flag is set */ setstdSKF (lpt); break; case ioIOI: /* I/O data input */ data = 0; if (lpt_unit.flags & UNIT_POWEROFF) /* power off? */ data = LPT_PWROFF; else if (!(lpt_unit.flags & UNIT_OFFLINE)) { /* online? */ if (lpt_unit.flags & UNIT_ATT) { /* paper loaded? */ data = LPT_RDY; if (!sim_is_active (&lpt_unit)) /* printer busy? */ data = data | LPT_NBSY; } else if (lpt_lcnt == LPT_PAGELNT - 1) /* paper out, at BOF? */ data = LPT_PAPO; } stat_data = IORETURN (SCPE_OK, data); /* merge in return status */ break; case ioIOO: /* I/O data output */ lpt_unit.buf = IODATA (stat_data) & (LPT_CTL | 0177); break; case ioPOPIO: /* power-on preset to I/O */ lpt.flag = lpt.flagbuf = SET; /* set flag and flag buffer */ lpt_unit.buf = 0; /* clear output buffer */ break; case ioCRS: /* control reset */ case ioCLC: /* clear control flip-flop */ lpt.control = CLEAR; break; case ioSTC: /* set control flip-flop */ lpt.control = SET; sim_activate (&lpt_unit, /* schedule op */ (lpt_unit.buf & LPT_CTL)? lpt_ptime: lpt_ctime); break; case ioSIR: /* set interrupt request */ setstdPRL (lpt); /* set standard PRL signal */ setstdIRQ (lpt); /* set standard IRQ signal */ setstdSRQ (lpt); /* set standard SRQ signal */ break; case ioIAK: /* interrupt acknowledge */ lpt.flagbuf = CLEAR; break; default: /* all other signals */ break; /* are ignored */ } working_set = working_set & ~signal; /* remove current signal from set */ } return stat_data; }
uint32 clkio (DIB *dibptr, IOCYCLE signal_set, uint32 stat_data) { IOSIGNAL signal; IOCYCLE working_set = IOADDSIR (signal_set); /* add ioSIR if needed */ while (working_set) { signal = IONEXT (working_set); /* isolate next signal */ switch (signal) { /* dispatch I/O signal */ case ioCLF: /* clear flag flip-flop */ clk.flag = clk.flagbuf = CLEAR; break; case ioSTF: /* set flag flip-flop */ case ioENF: /* enable flag */ clk.flag = clk.flagbuf = SET; break; case ioSFC: /* skip if flag is clear */ setstdSKF (clk); break; case ioSFS: /* skip if flag is set */ setstdSKF (clk); break; case ioIOI: /* I/O data input */ stat_data = IORETURN (SCPE_OK, clk_error); /* merge in return status */ break; case ioIOO: /* I/O data output */ clk_select = IODATA (stat_data) & 07; /* save select */ sim_cancel (&clk_unit); /* stop the clock */ clk.control = CLEAR; /* clear control */ working_set = working_set | ioSIR; /* set interrupt request (IOO normally doesn't) */ break; case ioPOPIO: /* power-on preset to I/O */ clk.flag = clk.flagbuf = SET; /* set flag and flag buffer */ break; case ioCRS: /* control reset */ case ioCLC: /* clear control flip-flop */ clk.control = CLEAR; sim_cancel (&clk_unit); /* deactivate unit */ break; case ioSTC: /* set control flip-flop */ clk.control = SET; if (clk_unit.flags & UNIT_DIAG) /* diag mode? */ clk_unit.flags = clk_unit.flags & ~UNIT_IDLE; /* not calibrated */ else clk_unit.flags = clk_unit.flags | UNIT_IDLE; /* is calibrated */ if (!sim_is_active (&clk_unit)) { /* clock running? */ clk_tick = clk_delay (0); /* get tick count */ if ((clk_unit.flags & UNIT_DIAG) == 0) /* calibrated? */ if (clk_select == 2) /* 10 msec. interval? */ clk_tick = sync_poll (INITIAL); /* sync poll */ else sim_rtcn_init (clk_tick, TMR_CLK); /* initialize timer */ sim_activate (&clk_unit, clk_tick); /* start clock */ clk_ctr = clk_delay (1); /* set repeat ctr */ } clk_error = 0; /* clear error */ break; case ioSIR: /* set interrupt request */ setstdPRL (clk); /* set standard PRL signal */ setstdIRQ (clk); /* set standard IRQ signal */ setstdSRQ (clk); /* set standard SRQ signal */ break; case ioIAK: /* interrupt acknowledge */ clk.flagbuf = CLEAR; break; default: /* all other signals */ break; /* are ignored */ } working_set = working_set & ~signal; /* remove current signal from set */ } return stat_data; }
uint32 ttyio (DIB *dibptr, IOCYCLE signal_set, uint32 stat_data) { uint16 data; IOSIGNAL signal; IOCYCLE working_set = IOADDSIR (signal_set); /* add ioSIR if needed */ while (working_set) { signal = IONEXT (working_set); /* isolate next signal */ switch (signal) { /* dispatch I/O signal */ case ioCLF: /* clear flag flip-flop */ tty.flag = tty.flagbuf = CLEAR; break; case ioSTF: /* set flag flip-flop */ case ioENF: /* enable flag */ tty.flag = tty.flagbuf = SET; break; case ioSFC: /* skip if flag is clear */ setstdSKF (tty); break; case ioSFS: /* skip if flag is set */ setstdSKF (tty); break; case ioIOI: /* I/O data input */ data = (uint16) tty_buf; if (!(tty_mode & TM_KBD) && sim_is_active (&tty_unit[TTO])) data = data | TP_BUSY; stat_data = IORETURN (SCPE_OK, data); /* merge in return status */ break; case ioIOO: /* I/O data output */ data = IODATA (stat_data); /* clear supplied status */ if (data & TM_MODE) tty_mode = data & (TM_KBD|TM_PRI|TM_PUN); tty_buf = data & 0377; break; case ioCRS: /* control reset */ tty.control = CLEAR; /* clear control */ tty.flag = tty.flagbuf = SET; /* set flag and flag buffer */ tty_mode = TM_KBD; /* set tty, clear print/punch */ tty_shin = 0377; /* input inactive */ tty_lf = 0; /* no lf pending */ break; case ioCLC: /* clear control flip-flop */ tty.control = CLEAR; break; case ioSTC: /* set control flip-flop */ tty.control = SET; if (!(tty_mode & TM_KBD)) /* output? */ sim_activate (&tty_unit[TTO], tty_unit[TTO].wait); break; case ioSIR: /* set interrupt request */ setstdPRL (tty); /* set standard PRL signal */ setstdIRQ (tty); /* set standard IRQ signal */ setstdSRQ (tty); /* set standard SRQ signal */ break; case ioIAK: /* interrupt acknowledge */ tty.flagbuf = CLEAR; break; default: /* all other signals */ break; /* are ignored */ } working_set = working_set & ~signal; /* remove current signal from set */ } return stat_data; }