t_stat read_card (int32 ilnt, int32 mod) { int32 i; t_stat r; if (sim_is_active (&cdr_unit)) { /* busy? */ sim_cancel (&cdr_unit); /* cancel */ if (r = cdr_svc (&cdr_unit)) return r; /* process */ } if (((cdp_unit.flags & UNIT_ATT) != 0 || (stack_unit[0].flags & UNIT_ATT) != 0) && /* Punch is attached and */ (cdr_unit.flags & UNIT_ATT) == 0) { /* reader is not --- */ for (i = 0; i < 80; i++) { /* Assume blank cards in hopper */ PutMem(DAR, 0x40); DAR++; } sim_activate (&cdr_unit, cdr_unit.wait); /* activate */ return SCPE_OK; } if ((cdr_unit.flags & UNIT_ATT) == 0) return SCPE_UNATT; /* attached? */ lastcard = carderr = notready = s1sel = s2sel = 0; /* default stacker */ for (i = 0; i < CBUFSIZE; i++) rbuf[i] = 0x20; /* clear buffer */ if (mod) { for (i = 0; i < 80; i++) { rbuf[i] = fgetc(cdr_unit.fileref); /* Read EBCDIC */ } } else { fgets (rbuf, CBUFSIZE, cdr_unit.fileref); /* read Ascii */ } if (feof (cdr_unit.fileref)) { /* eof? */ notready = 1; return STOP_NOCD; } if (ferror (cdr_unit.fileref)) { /* error? */ perror ("Card reader I/O error"); clearerr (cdr_unit.fileref); carderr = 1; return SCPE_OK; } cdr_unit.pos = ftell (cdr_unit.fileref); /* update position */ i = getc (cdr_unit.fileref); /* see if more */ if (feof (cdr_unit.fileref)) lastcard = 1; /* eof? set flag */ fseek (cdr_unit.fileref, cdr_unit.pos, SEEK_SET); for (i = 0; i < 80; i++) { if (mod == 0) { /* If ASCII mode... */ if (rbuf[i] == '\n' || /* remove ASCII CR/LF */ rbuf[i] == '\r' || rbuf[i] == 0x00) rbuf[i] = ' '; rbuf[i] = ascii_to_ebcdic[rbuf[i]]; /* convert to EBCDIC */ } PutMem(DAR, rbuf[i]); /* Copy to main memory */ DAR++; } sim_activate (&cdr_unit, cdr_unit.wait); /* activate */ return SCPE_OK; }
t_stat read_card (int32 ilnt, int32 mod) { int32 i, cbn, c1, c2; t_stat r; if (sim_is_active (&cdr_unit)) { /* busy? */ sim_cancel (&cdr_unit); /* cancel */ if (r = cdr_svc (&cdr_unit)) /* process */ return r; } if ((cdr_unit.flags & UNIT_ATT) == 0) /* attached? */ return SCPE_UNATT; ind[IN_READ] = ind[IN_LST] = s1sel = s2sel = 0; /* default stacker */ cbn = ((ilnt == 2) || (ilnt == 5)) && (mod == BCD_C); /* col binary? */ for (i = 0; i < 2 * CBUFSIZE; i++) /* clear extended buf */ rbuf[i] = 0; fgets (rbuf, (cbn)? 2 * CBUFSIZE: CBUFSIZE, /* rd bin/char card */ cdr_unit.fileref); if (feof (cdr_unit.fileref)) /* eof? */ return STOP_NOCD; if (ferror (cdr_unit.fileref)) { /* error? */ ind[IN_READ] = 1; perror ("Card reader I/O error"); clearerr (cdr_unit.fileref); if (iochk) return SCPE_IOERR; return SCPE_OK; } cdr_unit.pos = ftell (cdr_unit.fileref); /* update position */ if (ssa) { /* if last cd on */ getc (cdr_unit.fileref); /* see if more */ if (feof (cdr_unit.fileref)) /* eof? set flag */ ind[IN_LST] = 1; fseek (cdr_unit.fileref, cdr_unit.pos, SEEK_SET); } if (cbn) { /* column binary */ for (i = 0; i < CDR_WIDTH; i++) { if (conv_old) { c1 = ascii2bcd (rbuf[i]); c2 = ascii2bcd (rbuf[CDR_WIDTH + i]); } else { c1 = ascii2bcd (rbuf[2 * i]); c2 = ascii2bcd (rbuf[(2 * i) + 1]); } M[CD_CBUF1 + i] = (M[CD_CBUF1 + i] & WM) | c1; M[CD_CBUF2 + i] = (M[CD_CBUF2 + i] & WM) | c2; M[CDR_BUF + i] = colbin_to_bcd ((c1 << 6) | c2); } /* end for i */ } /* end if col bin */ else { /* normal read */ for (i = 0; i < CDR_WIDTH; i++) { /* cvt to BCD */ rbuf[i] = ascii2bcd (rbuf[i]); M[CDR_BUF + i] = (M[CDR_BUF + i] & WM) | rbuf[i]; } } M[CDR_BUF - 1] = 060; /* mem mark */ sim_activate (&cdr_unit, cdr_unit.wait); /* activate */ return SCPE_OK; }
t_stat read_card (int32 ilnt, int32 mod) { int32 i, cbn, c1, c2, cbufsz; t_stat r; if (sim_is_active (&cdr_unit)) { /* busy? */ sim_cancel (&cdr_unit); /* cancel */ if ((r = cdr_svc (&cdr_unit))) /* process */ return r; } ind[IN_READ] = ind[IN_LST] = s1sel = s2sel = 0; /* default stacker */ cbn = ((ilnt == 2) || (ilnt == 5)) && (mod == BCD_C); /* col binary? */ cbufsz = (cbn)? 2 * CBUFSIZE: CBUFSIZE; /* buffer size */ for (i = 0; i < (2 * CBUFSIZE) + 1; i++) /* clear extended buf */ cdr_buf[i] = 0; if ((cdr_unit.flags & UNIT_ATT) != 0) /* attached? */ r = cdr_read_file (cdr_buf, cbufsz); /* read from file */ else if ((cdr_unit.flags & UNIT_CONS) != 0) /* default to console? */ r = cdr_read_cons (cdr_buf, cbufsz); /* read from console */ else return SCPE_UNATT; /* else can't read */ if (r != SCPE_OK) /* read error? */ return r; /* can't read */ if (cbn) { /* column binary? */ for (i = 0; i < CDR_WIDTH; i++) { if (conv_old) { c1 = ascii2bcd (cdr_buf[i]); c2 = ascii2bcd (cdr_buf[CDR_WIDTH + i]); } else { c1 = ascii2bcd (cdr_buf[2 * i]); c2 = ascii2bcd (cdr_buf[(2 * i) + 1]); } M[CD_CBUF1 + i] = (M[CD_CBUF1 + i] & WM) | c1; M[CD_CBUF2 + i] = (M[CD_CBUF2 + i] & WM) | c2; M[CDR_BUF + i] = colbin_to_bcd ((c1 << 6) | c2); } } /* end if col bin */ else { /* normal read */ for (i = 0; i < CDR_WIDTH; i++) { /* cvt to BCD */ c1 = ascii2bcd (cdr_buf[i]); M[CDR_BUF + i] = (M[CDR_BUF + i] & WM) | c1; } } M[CDR_BUF - 1] = 060; /* mem mark */ sim_activate (&cdr_unit, cdr_unit.wait); /* activate */ return SCPE_OK; }