t_stat punch_card (int32 ilnt, int32 mod) { int32 i, cbn, c1, c2; static char pbuf[(2 * CDP_WIDTH) + 1]; /* + null */ t_bool use_h; UNIT *uptr; if (s8sel) /* stack 8? */ uptr = &stack_unit[2]; else if (s4sel) /* stack 4? */ uptr = &stack_unit[4]; else uptr = &cdp_unit; /* normal output */ if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ return SCPE_UNATT; use_h = uptr->flags & UNIT_PCH; ind[IN_PNCH] = s4sel = s8sel = 0; /* clear flags */ cbn = ((ilnt == 2) || (ilnt == 5)) && (mod == BCD_C); /* col binary? */ M[CDP_BUF - 1] = 012; /* set prev loc */ if (cbn) { /* column binary */ for (i = 0; i < CDP_WIDTH; i++) { c1 = bcd2ascii (M[CD_CBUF1 + i] & CHAR, use_h); c2 = bcd2ascii (M[CD_CBUF2 + i] & CHAR, use_h); if (conv_old) { pbuf[i] = c1; pbuf[i + CDP_WIDTH] = c2; } else { pbuf[2 * i] = c1; pbuf[(2 * i) + 1] = c2; } } for (i = 2 * CDP_WIDTH - 1; (i >= 0) && (pbuf[i] == ' '); i--) pbuf[i] = 0; pbuf[2 * CDP_WIDTH] = 0; /* trailing null */ } else { /* normal */ for (i = 0; i < CDP_WIDTH; i++) pbuf[i] = bcd2ascii (M[CDP_BUF + i] & CHAR, use_h); for (i = CDP_WIDTH - 1; (i >= 0) && (pbuf[i] == ' '); i--) pbuf[i] = 0; pbuf[CDP_WIDTH] = 0; /* trailing null */ } fputs (pbuf, uptr->fileref); /* output card */ fputc ('\n', uptr->fileref); /* plus new line */ uptr->pos = ftell (uptr->fileref); /* update position */ if (ferror (uptr->fileref)) { /* error? */ perror ("Card punch I/O error"); clearerr (uptr->fileref); if (iochk) return SCPE_IOERR; ind[IN_PNCH] = 1; } return SCPE_OK; }
t_stat cdr_svc (UNIT *uptr) { int32 i; if (s1sel) /* stacker 1? */ uptr = &stack_unit[1]; else if (s2sel) /* stacker 2? */ uptr = &stack_unit[2]; else uptr = &stack_unit[0]; /* then default */ if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ return SCPE_OK; for (i = 0; i < CDR_WIDTH; i++) rbuf[i] = bcd2ascii (rbuf[i], uptr->flags & UNIT_PCH); for (i = CDR_WIDTH - 1; (i >= 0) && (rbuf[i] == ' '); i--) rbuf[i] = 0; rbuf[CDR_WIDTH] = 0; /* null at end */ fputs (rbuf, uptr->fileref); /* write card */ fputc ('\n', uptr->fileref); /* plus new line */ uptr->pos = ftell (uptr->fileref); /* update position */ if (ferror (uptr->fileref)) { /* error? */ perror ("Card stacker I/O error"); clearerr (uptr->fileref); if (iochk) return SCPE_IOERR; } return SCPE_OK; }
t_stat punch_card (int32 ilnt, int32 mod) { int32 i, cbn, c1, c2; t_bool use_h; t_stat r; r = cdp_npr (NULL, 0, NULL, NULL); /* write card */ if (r != SCPE_OK) return r; use_h = cdp_unit.flags & UNIT_PCH; ind[IN_PNCH] = s4sel = s8sel = 0; /* clear flags */ cbn = ((ilnt == 2) || (ilnt == 5)) && (mod == BCD_C); /* col binary? */ M[CDP_BUF - 1] = 012; /* set prev loc */ if (cbn) { /* column binary */ for (i = 0; i < CDP_WIDTH; i++) { c1 = bcd2ascii (M[CD_CBUF1 + i] & CHAR, use_h); c2 = bcd2ascii (M[CD_CBUF2 + i] & CHAR, use_h); if (conv_old) { cdp_buf[i] = c1; cdp_buf[i + CDP_WIDTH] = c2; } else { cdp_buf[2 * i] = c1; cdp_buf[(2 * i) + 1] = c2; } } for (i = (2 * CDP_WIDTH) - 1; (i >= 0) && (cdp_buf[i] == ' '); i--) cdp_buf[i] = 0; cdp_buf[2 * CDP_WIDTH] = 0; /* trailing null */ } else { /* normal */ for (i = 0; i < CDP_WIDTH; i++) cdp_buf[i] = bcd2ascii (M[CDP_BUF + i] & CHAR, use_h); for (i = CDP_WIDTH - 1; (i >= 0) && (cdp_buf[i] == ' '); i--) cdp_buf[i] = 0; cdp_buf[CDP_WIDTH] = 0; /* trailing null */ } cdp_buf_full = 1; /* card buffer full */ return SCPE_OK; }
t_stat inq_io (int32 flag, int32 mod) { int32 i, t, wm_seen = 0; t_bool use_h = inq_unit.flags & UNIT_PCH; ind[IN_INC] = 0; /* clear inq clear */ switch (mod) { /* case on mod */ case BCD_R: /* input */ /* if (ind[IN_INR] == 0) */ /* return SCPE_OK; *//* return if no req */ ind[IN_INR] = 0; /* clear req */ inq_puts ("[Enter]\r\n"); /* prompt */ for (i = 0; M[BS] != (BCD_GRPMRK + WM); i++) { /* until GM + WM */ while (((t = sim_poll_kbd ()) == SCPE_OK) || (t & SCPE_BREAK)) { if (stop_cpu) /* interrupt? */ return SCPE_STOP; } if (t < SCPE_KFLAG) /* if not char, err */ return t; t = t & 0177; if ((t == '\r') || (t == '\n')) break; if (t == inq_char) { /* cancel? */ ind[IN_INC] = 1; /* set indicator */ inq_puts ("\r\n[Canceled]\r\n"); return SCPE_OK; } if (i && ((i % INQ_WIDTH) == 0)) inq_puts ("\r\n"); sim_putchar (t); /* echo */ if (flag == MD_WM) { /* word mark mode? */ if ((t == '~') && (wm_seen == 0)) wm_seen = WM; else { M[BS] = wm_seen | ascii2bcd (t); wm_seen = 0; } } else M[BS] = (M[BS] & WM) | ascii2bcd (t); if (!wm_seen) BS++; if (ADDR_ERR (BS)) { BS = BA | (BS % MAXMEMSIZE); return STOP_NXM; } } inq_puts ("\r\n"); M[BS++] = BCD_GRPMRK + WM; break; case BCD_W: /* output */ for (i = 0; (t = M[BS++]) != (BCD_GRPMRK + WM); i++) { if ((flag == MD_WM) && (t & WM)) { if (i && ((i % INQ_WIDTH) == 0)) inq_puts ("\r\n"); if (conv_old) sim_putchar ('~'); else sim_putchar ('`'); } if (i && ((i % INQ_WIDTH) == 0)) inq_puts ("\r\n"); sim_putchar (bcd2ascii (t & CHAR, use_h)); if (ADDR_ERR (BS)) { BS = BA | (BS % MAXMEMSIZE); return STOP_NXM; } } inq_puts ("\r\n"); break; default: /* invalid mod */ return STOP_INVM; } return SCPE_OK; }