diff --git a/B5500/b5500_urec.c b/B5500/b5500_urec.c index cf59744c..b603c78b 100644 --- a/B5500/b5500_urec.c +++ b/B5500/b5500_urec.c @@ -38,7 +38,7 @@ /* For Card reader, when set returns end of file at end of deck. */ /* Reset after sent to system */ -#define MODE_EOF (0x40 << UNIT_V_MODE) +#define MODE_EOF (0x40 << UNIT_V_CARD_MODE) @@ -144,8 +144,8 @@ UNIT cdr_unit[] = { MTAB cdr_mod[] = { {MTAB_XTD | MTAB_VUN, 0, "FORMAT", "FORMAT", - &sim_card_set_fmt, &sim_card_show_fmt, NULL, - "Sets card format"}, + &sim_card_set_fmt, &sim_card_show_fmt, NULL, + "Sets card format"}, {MODE_EOF, MODE_EOF, "EOF", "EOF", NULL, NULL, NULL, "Causes EOF to be set when reader empty"}, {0} @@ -169,7 +169,7 @@ UNIT cdp_unit[] = { MTAB cdp_mod[] = { {MTAB_XTD | MTAB_VUN, 0, "FORMAT", "FORMAT", &sim_card_set_fmt, &sim_card_show_fmt, NULL, - "Sets card format"}, + "Sets card format"}, {0} }; @@ -236,7 +236,7 @@ t_stat card_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc) UNIT *uptr; int u; - if (dev == CARD1_DEV) + if (dev == CARD1_DEV) u = 0; else if (dev == CARD2_DEV) u = 1; @@ -245,13 +245,13 @@ t_stat card_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc) /* Check if card reader or card punch */ if (cmd & URCSTA_READ) { uptr = &cdr_unit[u]; - if ((uptr->flags & UNIT_ATT) == 0) + if ((uptr->flags & UNIT_ATT) == 0) return SCPE_UNATT; /* Are we currently tranfering? */ if (uptr->u5 & URCSTA_ACTIVE) return SCPE_BUSY; - + /* Check if we ran out of cards */ if (uptr->u5 & URCSTA_EOF) { /* If end of file, return to system */ @@ -265,7 +265,7 @@ t_stat card_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc) iostatus &= ~(CARD1_FLAG << u); return SCPE_UNATT; } - + if (cmd & URCSTA_BINARY) { uptr->u5 |= URCSTA_BIN; *wc = 20; @@ -282,11 +282,11 @@ t_stat card_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc) return SCPE_OK; } else { /* Talking to punch */ - if (u != 0) + if (u != 0) return SCPE_NXDEV; sim_debug(DEBUG_DETAIL, &cdr_dev, "cdp %d %d start\n", u, chan); uptr = &cdp_unit[0]; - if ((uptr->flags & UNIT_ATT) == 0) + if ((uptr->flags & UNIT_ATT) == 0) return SCPE_UNATT; if (uptr->u5 & URCSTA_ACTIVE) return SCPE_BUSY; @@ -314,7 +314,7 @@ cdr_srv(UNIT *uptr) { uptr->u5 &= ~ URCSTA_EOF; return SCPE_OK; } - + /* Check if new card requested. */ if (uptr->u4 == 0 && uptr->u5 & URCSTA_ACTIVE && @@ -344,7 +344,7 @@ cdr_srv(UNIT *uptr) { uptr->u5 |= URCSTA_EOF; chan_set_end(chan); break; - case SCPE_OK: + case SCPE_OK: uptr->u5 |= URCSTA_CARD; sim_activate(uptr, 500); break; @@ -354,7 +354,7 @@ cdr_srv(UNIT *uptr) { /* Copy next column over */ - if (uptr->u5 & URCSTA_CARD && + if (uptr->u5 & URCSTA_CARD && uptr->u4 <= ((uptr->u5 & URCSTA_BIN) ? 160 : 80)) { struct _card_data *data; uint8 ch = 0; @@ -363,7 +363,7 @@ cdr_srv(UNIT *uptr) { data = (struct _card_data *)uptr->up7; if (uptr->u5 & URCSTA_BIN) { - ch = (data->image[uptr->u4 >> 1] >> + ch = (data->image[uptr->u4 >> 1] >> ((uptr->u4 & 1)? 0 : 6)) & 077; } else { ch = sim_hol_to_bcd(data->image[uptr->u4]); @@ -377,8 +377,8 @@ cdr_srv(UNIT *uptr) { chan_set_parity(chan); } break; - case 0111: - ch = 0; + case 0111: + ch = 0; /* Handle invalid punch */ chan_set_parity(chan); break; /* Translate ? to error*/ @@ -453,7 +453,7 @@ cdr_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) fprintf (st, " sim> SET CRn EOF\n"); fprintf (st, "This flag is cleared each time a deck has been read, so it must be set\n"); fprintf (st, "again after each deck. MCP does not require this to be set as long as\n"); - fprintf (st, "the deck includes a ?END card\n"); + fprintf (st, "the deck includes a ?END card\n"); fprint_set_help(st, dptr); fprint_show_help(st, dptr); return SCPE_OK; @@ -492,7 +492,7 @@ cdp_srv(UNIT *uptr) { case SCPE_IOERR: chan_set_error(chan); break; - case SCPE_OK: + case SCPE_OK: break; } uptr->u5 &= ~URCSTA_FULL; @@ -537,7 +537,7 @@ cdp_attach(UNIT * uptr, CONST char *file) t_stat cdp_detach(UNIT * uptr) { - if (uptr->u5 & URCSTA_FULL) + if (uptr->u5 & URCSTA_FULL) sim_punch_card(uptr, NULL); iostatus &= ~PUNCH_FLAG; return sim_card_detach(uptr); @@ -568,7 +568,7 @@ cdp_description(DEVICE *dptr) #if NUM_DEVS_LPR > 0 t_stat -lpr_setlpp(UNIT *uptr, int32 val, CONST char *cptr, void *desc) +lpr_setlpp(UNIT *uptr, int32 val, CONST char *cptr, void *desc) { int i; if (cptr == NULL) @@ -619,10 +619,10 @@ print_line(UNIT * uptr, int unit) /* Scan each column */ for (i = 0; i < uptr->u3; i++) { int bcd = lpr_data[unit].lbuff[i] & 077; - + out[i] = con_to_ascii[bcd]; } - + /* Trim trailing spaces */ for (--i; i > 0 && out[i] == ' '; i--) ; out[i+1] = '\0'; @@ -715,8 +715,8 @@ print_line(UNIT * uptr, int unit) sim_fwrite("\f", 1, 1, uptr->fileref); sim_fseek(uptr->fileref, 0, SEEK_CUR); sim_debug(DEBUG_DETAIL, &lpr_dev, "lpr %d page\n", unit); - } - + } + } @@ -726,7 +726,7 @@ t_stat lpr_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc) UNIT *uptr; int u; - if (dev == PRT1_DEV) + if (dev == PRT1_DEV) u = 0; else if (dev == PRT2_DEV) u = 1; @@ -738,16 +738,16 @@ t_stat lpr_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc) if (uptr->u5 & URCSTA_BUSY) return SCPE_BUSY; - if ((uptr->flags & UNIT_ATT) == 0) + if ((uptr->flags & UNIT_ATT) == 0) return SCPE_UNATT; - - if (*wc == 0 && (cmd & URCSTA_INHIBIT) == 0) + + if (*wc == 0 && (cmd & URCSTA_INHIBIT) == 0) *wc = (cmd & URCSTA_DIRECT) ? 17 : 15; /* Remember not to drop the FULL */ uptr->u5 &= ~((077 << URCSTA_CMD_V) | URCSTA_CHMASK); uptr->u5 |= URCSTA_BUSY|chan; - uptr->u5 |= (cmd & (URCSTA_SKIP|URCSTA_SINGLE|URCSTA_DOUBLE)) + uptr->u5 |= (cmd & (URCSTA_SKIP|URCSTA_SINGLE|URCSTA_DOUBLE)) << URCSTA_CMD_V; uptr->u3 = 0; sim_debug(DEBUG_CMD, &lpr_dev, "%d: Cmd WRS %d %02o %o\n", u, chan, @@ -781,7 +781,7 @@ lpr_srv(UNIT *uptr) { sim_activate(uptr, 20000); return SCPE_OK; } else { - sim_debug(DEBUG_DATA, &lpr_dev, "lpr %d: Char < %02o\n", u, + sim_debug(DEBUG_DATA, &lpr_dev, "lpr %d: Char < %02o\n", u, lpr_data[u].lbuff[uptr->u3]); uptr->u3++; } @@ -809,7 +809,7 @@ t_stat lpr_detach(UNIT * uptr) { int u = (uptr - lpr_unit); - if (uptr->u5 & URCSTA_FULL) + if (uptr->u5 & URCSTA_FULL) print_line(uptr, u); iostatus &= ~(PRT1_FLAG << u); return detach_unit(uptr); @@ -854,10 +854,10 @@ lpr_description(DEVICE *dptr) #if NUM_DEVS_CON > 0 -/* +/* * Console printer routines. */ -t_stat +t_stat con_ini(DEVICE *dptr) { UNIT *uptr = &con_unit[0]; uptr->u5 = 0; @@ -875,7 +875,7 @@ con_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc) /* Are we currently tranfering? */ if (uptr->u5 & (URCSTA_READ|URCSTA_FILL|URCSTA_BUSY|URCSTA_INPUT)) return SCPE_BUSY; - + if (cmd & URCSTA_READ) { if (uptr->u5 & (URCSTA_INPUT|URCSTA_FILL)) return SCPE_BUSY; diff --git a/sim_card.c b/sim_card.c index a0a05366..945c9dc4 100644 --- a/sim_card.c +++ b/sim_card.c @@ -1,4 +1,4 @@ -/* Card read/punch routines for 7000 simulators. +/* Generic Card read/punch routines for simulators. Copyright (c) 2005, Richard Cornwell @@ -61,9 +61,9 @@ The card module uses up7 to hold a buffer for the card being translated and the backward translation table. Which is generated from the table. */ - -#if defined(USE_SIM_CARD) +#if defined(USE_SIM_CARD) + #include #include "sim_defs.h" #include "sim_card.h" @@ -344,6 +344,7 @@ static struct card_formats fmts[] = { {MODE_BCD, "BCD"}, {MODE_CBN, "CBN"}, {MODE_EBCDIC,"EBCDIC"}, + {MODE_OCTAL, "OCTAL"}, {0, 0}, }; @@ -476,7 +477,7 @@ static int cmpcard(const char *p, const char *s) { t_stat sim_read_card(UNIT * uptr) { - int i, j; + int i; char c; uint16 temp; int mode; @@ -499,11 +500,11 @@ sim_read_card(UNIT * uptr) int ptr = data->ptr; int start = 0; - while (ptr < sizeof(data->cbuff)) + while (ptr < data->len) (data->cbuff)[start++] = (data->cbuff)[ptr++]; data->len -= data->ptr; /* On eof, just return */ - if (!feof(uptr->fileref)) + if (!feof(uptr->fileref) && data->len < 512) len = sim_fread(&data->cbuff[start], 1, sizeof(data->cbuff) - start, uptr->fileref); else @@ -534,7 +535,7 @@ sim_read_card(UNIT * uptr) /* Clear image buffer */ for (col = 0; col < 80; data->image[col++] = 0); - if ((uptr->flags & UNIT_MODE) == MODE_AUTO) { + if ((uptr->flags & UNIT_CARD_MODE) == MODE_AUTO) { mode = MODE_TEXT; /* Default is text */ /* Check buffer to see if binary card in it. */ @@ -571,18 +572,42 @@ sim_read_card(UNIT * uptr) } /* Check if modes match */ - if ((uptr->flags & UNIT_MODE) != MODE_AUTO && - (uptr->flags & UNIT_MODE) != mode) { - sim_debug(DEBUG_CARD, dptr, "invalid mode\n\r"); + if ((uptr->flags & UNIT_CARD_MODE) != MODE_AUTO && + (uptr->flags & UNIT_CARD_MODE) != mode) { + sim_debug(DEBUG_CARD, dptr, "invalid mode\n"); return SCPE_IOERR; } } else - mode = uptr->flags & UNIT_MODE; + mode = uptr->flags & UNIT_CARD_MODE; switch(mode) { case MODE_TEXT: sim_debug(DEBUG_CARD, dptr, "text: ["); /* Check for special codes */ + if (data->cbuff[0] == '~') { + int f = 1; + for(col = i = 1; col < 80 && f; i++) { + c = data->cbuff[i]; + switch (c) { + case '\n': + case '\0': + case '\r': + col = 80; + case ' ': + break; /* Ignore these */ + case '\t': + col = (col | 7) + 1; /* Mult of 8 */ + break; + default: + f = 0; + break; + } + } + if (f) { + r = SCPE_EOF; + goto end_card; + } + } if (cmpcard(&data->cbuff[0], "raw")) { int j = 0; for(col = 0, i = 4; col < 80; i++) { @@ -624,12 +649,8 @@ sim_read_card(UNIT * uptr) break; case '\n': col = 80; + i--; break; - case '~': /* End of file mark */ - if (col == 0) { - r = SCPE_EOF; - break; - } default: sim_debug(DEBUG_CARD, dptr, "%c", c); if ((uptr->flags & MODE_LOWER) == 0) @@ -649,31 +670,33 @@ sim_read_card(UNIT * uptr) if (temp & 0xf000) r = SCPE_IOERR; data->image[col++] = temp & 0xfff; - /* Eat cr if line exactly 80 columns */ - if (col == 80) { - if (data->cbuff[i + 1] == '\n') - i++; - } } } } - if (data->cbuff[i] == '\n') + end_card: + sim_debug(DEBUG_CARD, dptr, "-%d-", i); + + /* Scan to end of line, ignore anything after last column */ + while (data->cbuff[i] != '\n' && data->cbuff[i] != '\r' && i < data->len) { i++; + } if (data->cbuff[i] == '\r') i++; - sim_debug(DEBUG_CARD, dptr, "]\r\n"); + if (data->cbuff[i] == '\n') + i++; + sim_debug(DEBUG_CARD, dptr, "]\n"); break; case MODE_BIN: temp = 0; - sim_debug(DEBUG_CARD, dptr, "bin\r\n"); + sim_debug(DEBUG_CARD, dptr, "bin\n"); if (size < 160) return SCPE_IOERR; /* Move data to buffer */ - for (j = i = 0; i < 160;) { + for (col = i = 0; i < 160;) { temp |= data->cbuff[i]; - data->image[j] = (data->cbuff[i++] >> 4) & 0xF; - data->image[j++] |= ((uint16)data->cbuff[i++]) << 4; + data->image[col] = (data->cbuff[i++] >> 4) & 0xF; + data->image[col++] |= ((uint16)data->cbuff[i++]) << 4; } /* Check if format error */ if (temp & 0xF) @@ -682,7 +705,7 @@ sim_read_card(UNIT * uptr) break; case MODE_CBN: - sim_debug(DEBUG_CARD, dptr, "cbn\r\n"); + sim_debug(DEBUG_CARD, dptr, "cbn\n"); /* Check if first character is a tape mark */ if (size == 1 && ((uint8)data->cbuff[0]) == 0217) { r = SCPE_EOF; @@ -693,7 +716,7 @@ sim_read_card(UNIT * uptr) data->cbuff[0] &= 0x7f; /* Convert card and check for errors */ - for (j = i = 0; i < size;) { + for (col = i = 0; i < data->len && col < 80;) { uint8 c; if (data->cbuff[i] & 0x80) @@ -701,18 +724,23 @@ sim_read_card(UNIT * uptr) c = data->cbuff[i] & 077; if (sim_parity_table[(int)c] == (data->cbuff[i++] & 0100)) r = SCPE_IOERR; - data->image[j] = ((uint16)c) << 6; + data->image[col] = ((uint16)c) << 6; if (data->cbuff[i] & 0x80) break; c = data->cbuff[i] & 077; if (sim_parity_table[(int)c] == (data->cbuff[i++] & 0100)) r = SCPE_IOERR; - data->image[j++] |= c; + data->image[col++] |= c; } - /* If not full record, return error */ - if (size != 160) { - r = SCPE_IOERR; + if (col >= 80 && (data->cbuff[i] & 0x80) == 0) { + r = SCPE_IOERR; + } + /* Record over length of card, skip until next */ + while ((data->cbuff[i] & 0x80) == 0) { + if (i > data->len) + break; + i++; } break; @@ -728,7 +756,7 @@ sim_read_card(UNIT * uptr) data->cbuff[0] &= 0x7f; /* Convert text line into card image */ - for (col = 0, i = 0; col < 80 && i < size; i++) { + for (col = 0, i = 0; col < 80 && i < data->len; i++) { if (data->cbuff[i] & 0x80) break; c = data->cbuff[i] & 077; @@ -738,7 +766,19 @@ sim_read_card(UNIT * uptr) /* Convert to top column */ data->image[col++] = sim_bcd_to_hol(c); } - sim_debug(DEBUG_CARD, dptr, "]\r\n"); + + if (col >= 80 && (data->cbuff[i] & 0x80) == 0) { + r = SCPE_IOERR; + } + + /* Record over length of card, skip until next */ + while ((data->cbuff[i] & 0x80) == 0) { + if (i > data->len) + break; + i++; + } + + sim_debug(DEBUG_CARD, dptr, "]\n"); break; case MODE_EBCDIC: @@ -799,10 +839,11 @@ sim_punch_card(UNIT * uptr, UNIT *stkuptr) /* Else if binary or not convertable, dump as image */ /* Try to convert to text */ - uint8 out[160]; + uint8 out[512]; int i; + int outp; FILE *fo = uptr->fileref; - int mode = uptr->flags & UNIT_MODE; + int mode = uptr->flags & UNIT_CARD_MODE; int ok = 1; struct _card_data *data; DEVICE *dptr; @@ -810,14 +851,15 @@ sim_punch_card(UNIT * uptr, UNIT *stkuptr) if ((uptr->flags & UNIT_ATT) == 0) { if (stkuptr != NULL && stkuptr->flags & UNIT_ATT) { fo = stkuptr->fileref; - if ((stkuptr->flags & UNIT_MODE) != MODE_AUTO) - mode = stkuptr->flags & UNIT_MODE; + if ((stkuptr->flags & UNIT_CARD_MODE) != MODE_AUTO) + mode = stkuptr->flags & UNIT_CARD_MODE; } else return SCPE_UNATT; /* attached? */ } data = (struct _card_data *)uptr->up7; dptr = find_dev_from_unit(uptr); + outp = 0; /* Fix mode if in auto mode */ if (mode == MODE_AUTO) { @@ -828,79 +870,123 @@ sim_punch_card(UNIT * uptr, UNIT *stkuptr) ok = 0; } } - mode = ok?MODE_TEXT:MODE_BIN; + mode = ok?MODE_TEXT:MODE_OCTAL; } switch(mode) { default: case MODE_TEXT: - /* Scan each column */ + /* Scan each column */ sim_debug(DEBUG_CARD, dptr, "text: ["); - for (i = 0; i < 80; i++) { - out[i] = data->hol_to_ascii[data->image[i]]; - if (out[i] == 0xff) - out[i] = '?'; - sim_debug(DEBUG_CARD, dptr, "%c", out[i]); + for (i = 0; i < 80; i++, outp++) { + out[outp] = data->hol_to_ascii[data->image[i]]; + if (out[outp] == 0xff) { + out[outp] = '?'; + } + sim_debug(DEBUG_CARD, dptr, "%c", out[outp]); } - sim_debug(DEBUG_CARD, dptr, "]\r\n"); + sim_debug(DEBUG_CARD, dptr, "]\n"); /* Trim off trailing spaces */ - while (i > 0 && out[--i] == ' ') ; - out[++i] = '\n'; - out[++i] = '\0'; + while (outp > 0 && out[--outp] == ' ') ; + out[++outp] = '\n'; + out[++outp] = '\0'; break; + + case MODE_OCTAL: + sim_debug(DEBUG_CARD, dptr, "octal: ["); + out[outp++] = '~'; + for (i = 80; i > 0; i--) { + if (data->image[i] != 0) + break; + } + /* Check if special card */ + if (i == 0) { + out[outp++] = 'e'; + out[outp++] = 'o'; + if (data->image[0] == 07) { + out[outp++] = 'r'; + out[outp++] = '\n'; + sim_debug(DEBUG_CARD, dptr, "eor\n"); + break; + } + if (data->image[0] == 015) { + out[outp++] = 'f'; + out[outp++] = '\n'; + sim_debug(DEBUG_CARD, dptr, "eof\n"); + break; + } + if (data->image[0] == 017) { + out[outp++] = 'f'; + out[outp++] = '\n'; + sim_debug(DEBUG_CARD, dptr, "eoi\n"); + break; + } + } + out[outp++] = 'r'; + out[outp++] = 'a'; + out[outp++] = 'w'; + for (i = 0; i < 80; i++) { + uint16 col = data->image[i]; + out[outp++] = ((col >> 9) & 07) + '0'; + out[outp++] = ((col >> 6) & 07) + '0'; + out[outp++] = ((col >> 3) & 07) + '0'; + out[outp++] = (col & 07) + '0'; + } + out[outp++] = '\n'; + sim_debug(DEBUG_CARD, dptr, "%s", &out[4]); + break; + + case MODE_BIN: - sim_debug(DEBUG_CARD, dptr, "bin\r\n"); + sim_debug(DEBUG_CARD, dptr, "bin\n"); for (i = 0; i < 80; i++) { uint16 col = data->image[i]; - out[i*2] = (col & 0x00f) << 4; - out[i*2+1] = (col & 0xff0) >> 4; + out[outp++] = (col & 0x00f) << 4; + out[outp++] = (col & 0xff0) >> 4; } - i = 160; break; case MODE_CBN: - sim_debug(DEBUG_CARD, dptr, "cbn\r\n"); + sim_debug(DEBUG_CARD, dptr, "cbn\n"); /* Fill buffer */ for (i = 0; i < 80; i++) { uint16 col = data->image[i]; - out[i*2] = (col >> 6) & 077; - out[i*2+1] = col & 077; + out[outp++] = (col >> 6) & 077; + out[outp++] = col & 077; } /* Now set parity */ for (i = 0; i < 160; i++) out[i] |= 0100 ^ sim_parity_table[(int)out[i]]; out[0] |= 0x80; /* Set record mark */ - i = 160; break; case MODE_BCD: sim_debug(DEBUG_CARD, dptr, "bcd ["); - for (i = 0; i < 80; i++) { - out[i] = sim_hol_to_bcd(data->image[i]); - if (out[i] != 0x7f) - out[i] |= sim_parity_table[(int)out[i]]; + for (i = 0; i < 80; i++, outp++) { + out[outp] = sim_hol_to_bcd(data->image[i]); + if (out[outp] != 0x7f) + out[outp] |= sim_parity_table[(int)out[outp]]; else - out[i] = 077; + out[outp] = 077; sim_debug(DEBUG_CARD, dptr, "%c", - sim_six_to_ascii[(int)out[i]]); + sim_six_to_ascii[(int)out[outp]]); } - sim_debug(DEBUG_CARD, dptr, "]\r\n"); + sim_debug(DEBUG_CARD, dptr, "]\n"); out[0] |= 0x80; /* Set record mark */ - while (i > 0 && out[--i] == 0); - i++; + while (outp > 0 && out[--outp] == 0); + outp++; break; case MODE_EBCDIC: - sim_debug(DEBUG_CARD, dptr, "ebcdic\r\n"); + sim_debug(DEBUG_CARD, dptr, "ebcdic\n"); /* Fill buffer */ - for (i = 0; i < 80; i++) { + for (i = 0; i < 80; i++, outp++) { uint16 col = data->image[i]; - out[i] = 0xff & hol_to_ebcdic[col]; + out[outp] = 0xff & hol_to_ebcdic[col]; } - i = 80; break; } - sim_fwrite(out, 1, i, fo); + sim_fwrite(out, 1, outp, fo); memset(&data->image[0], 0, sizeof(data->image)); return SCPE_OK; } @@ -914,7 +1000,7 @@ t_stat sim_card_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc) if (cptr == NULL) return SCPE_ARG; for (f = 0; fmts[f].name != 0; f++) { if (strcmp (cptr, fmts[f].name) == 0) { - uptr->flags = (uptr->flags & ~UNIT_MODE) | fmts[f].mode; + uptr->flags = (uptr->flags & ~UNIT_CARD_MODE) | fmts[f].mode; return SCPE_OK; } } @@ -928,7 +1014,7 @@ t_stat sim_card_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc) int f; for (f = 0; fmts[f].name != 0; f++) { - if ((uptr->flags & UNIT_MODE) == fmts[f].mode) { + if ((uptr->flags & UNIT_CARD_MODE) == fmts[f].mode) { fprintf (st, "%s format", fmts[f].name); return SCPE_OK; } @@ -965,6 +1051,7 @@ sim_card_attach(UNIT * uptr, CONST char *cptr) } else { data = (struct _card_data *)uptr->up7; } + memset(data, 0, sizeof(struct _card_data)); for (i = 0; i < 4096; i++) hol_to_ebcdic[i] = 0x100; @@ -996,7 +1083,6 @@ sim_card_attach(UNIT * uptr, CONST char *cptr) } } - memset(data, 0, sizeof(struct _card_data)); data->ptr = 0; /* Set for initial read */ data->len = 0; return SCPE_OK; @@ -1035,5 +1121,4 @@ t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, cons return SCPE_OK; } - #endif /* USE_SIM_CARD */ diff --git a/sim_card.h b/sim_card.h index 0dcf4e7e..8cdd5a7c 100644 --- a/sim_card.h +++ b/sim_card.h @@ -1,4 +1,4 @@ -/* Card read/punch routines for 7000 simulators. +/* Generic Card read/punch routines for simulators. Copyright (c) 2005, Richard Cornwell @@ -69,19 +69,20 @@ extern "C" { #define DEBUG_CARD 0x0000010 /* Show details */ /* Flags for punch and reader. */ -#define UNIT_V_MODE (UNIT_V_UF + 0) -#define UNIT_MODE (7 << UNIT_V_MODE) -#define MODE_AUTO (0 << UNIT_V_MODE) -#define MODE_BIN (1 << UNIT_V_MODE) -#define MODE_TEXT (2 << UNIT_V_MODE) -#define MODE_BCD (3 << UNIT_V_MODE) -#define MODE_CBN (4 << UNIT_V_MODE) -#define MODE_EBCDIC (5 << UNIT_V_MODE) +#define UNIT_V_CARD_MODE (UNIT_V_UF + 0) +#define UNIT_CARD_MODE (7 << UNIT_V_CARD_MODE) +#define MODE_AUTO (0 << UNIT_V_CARD_MODE) +#define MODE_BIN (1 << UNIT_V_CARD_MODE) +#define MODE_TEXT (2 << UNIT_V_CARD_MODE) +#define MODE_BCD (3 << UNIT_V_CARD_MODE) +#define MODE_CBN (4 << UNIT_V_CARD_MODE) +#define MODE_EBCDIC (5 << UNIT_V_CARD_MODE) +#define MODE_OCTAL (6 << UNIT_V_CARD_MODE) /* Allow lower case letters */ -#define MODE_LOWER (8 << UNIT_V_MODE) -#define MODE_026 (0x10 << UNIT_V_MODE) -#define MODE_029 (0x20 << UNIT_V_MODE) -#define MODE_CHAR (0x30 << UNIT_V_MODE) +#define MODE_LOWER (8 << UNIT_V_CARD_MODE) +#define MODE_026 (0x10 << UNIT_V_CARD_MODE) +#define MODE_029 (0x20 << UNIT_V_CARD_MODE) +#define MODE_CHAR (0x30 << UNIT_V_CARD_MODE) struct _card_data @@ -104,7 +105,7 @@ t_stat sim_card_detach(UNIT *uptr); uint16 sim_bcd_to_hol(uint8 bcd); uint16 sim_ebcdic_to_hol(uint8 ebcdic); uint8 sim_hol_to_bcd(uint16 hol); -uint8 sim_hol_to_ebbcd(uint16 hol); +uint16 sim_hol_to_ebcdic(uint16 hol); /* Format control routines. */ t_stat sim_card_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc);