SIM_CARD: cleaned up handling of binary cards.
Handling of first character ~ to simulate End of File, now only is treated as End of File if it appears on a line by itself.
This commit is contained in:
parent
d14243c858
commit
057120e0b3
3 changed files with 211 additions and 125 deletions
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
/* For Card reader, when set returns end of file at end of deck. */
|
/* For Card reader, when set returns end of file at end of deck. */
|
||||||
/* Reset after sent to system */
|
/* 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 cdr_mod[] = {
|
||||||
{MTAB_XTD | MTAB_VUN, 0, "FORMAT", "FORMAT",
|
{MTAB_XTD | MTAB_VUN, 0, "FORMAT", "FORMAT",
|
||||||
&sim_card_set_fmt, &sim_card_show_fmt, NULL,
|
&sim_card_set_fmt, &sim_card_show_fmt, NULL,
|
||||||
"Sets card format"},
|
"Sets card format"},
|
||||||
{MODE_EOF, MODE_EOF, "EOF", "EOF", NULL, NULL, NULL,
|
{MODE_EOF, MODE_EOF, "EOF", "EOF", NULL, NULL, NULL,
|
||||||
"Causes EOF to be set when reader empty"},
|
"Causes EOF to be set when reader empty"},
|
||||||
{0}
|
{0}
|
||||||
|
@ -169,7 +169,7 @@ UNIT cdp_unit[] = {
|
||||||
MTAB cdp_mod[] = {
|
MTAB cdp_mod[] = {
|
||||||
{MTAB_XTD | MTAB_VUN, 0, "FORMAT", "FORMAT",
|
{MTAB_XTD | MTAB_VUN, 0, "FORMAT", "FORMAT",
|
||||||
&sim_card_set_fmt, &sim_card_show_fmt, NULL,
|
&sim_card_set_fmt, &sim_card_show_fmt, NULL,
|
||||||
"Sets card format"},
|
"Sets card format"},
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ t_stat card_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc)
|
||||||
UNIT *uptr;
|
UNIT *uptr;
|
||||||
int u;
|
int u;
|
||||||
|
|
||||||
if (dev == CARD1_DEV)
|
if (dev == CARD1_DEV)
|
||||||
u = 0;
|
u = 0;
|
||||||
else if (dev == CARD2_DEV)
|
else if (dev == CARD2_DEV)
|
||||||
u = 1;
|
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 */
|
/* Check if card reader or card punch */
|
||||||
if (cmd & URCSTA_READ) {
|
if (cmd & URCSTA_READ) {
|
||||||
uptr = &cdr_unit[u];
|
uptr = &cdr_unit[u];
|
||||||
if ((uptr->flags & UNIT_ATT) == 0)
|
if ((uptr->flags & UNIT_ATT) == 0)
|
||||||
return SCPE_UNATT;
|
return SCPE_UNATT;
|
||||||
|
|
||||||
/* Are we currently tranfering? */
|
/* Are we currently tranfering? */
|
||||||
if (uptr->u5 & URCSTA_ACTIVE)
|
if (uptr->u5 & URCSTA_ACTIVE)
|
||||||
return SCPE_BUSY;
|
return SCPE_BUSY;
|
||||||
|
|
||||||
/* Check if we ran out of cards */
|
/* Check if we ran out of cards */
|
||||||
if (uptr->u5 & URCSTA_EOF) {
|
if (uptr->u5 & URCSTA_EOF) {
|
||||||
/* If end of file, return to system */
|
/* 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);
|
iostatus &= ~(CARD1_FLAG << u);
|
||||||
return SCPE_UNATT;
|
return SCPE_UNATT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd & URCSTA_BINARY) {
|
if (cmd & URCSTA_BINARY) {
|
||||||
uptr->u5 |= URCSTA_BIN;
|
uptr->u5 |= URCSTA_BIN;
|
||||||
*wc = 20;
|
*wc = 20;
|
||||||
|
@ -282,11 +282,11 @@ t_stat card_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc)
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
} else {
|
} else {
|
||||||
/* Talking to punch */
|
/* Talking to punch */
|
||||||
if (u != 0)
|
if (u != 0)
|
||||||
return SCPE_NXDEV;
|
return SCPE_NXDEV;
|
||||||
sim_debug(DEBUG_DETAIL, &cdr_dev, "cdp %d %d start\n", u, chan);
|
sim_debug(DEBUG_DETAIL, &cdr_dev, "cdp %d %d start\n", u, chan);
|
||||||
uptr = &cdp_unit[0];
|
uptr = &cdp_unit[0];
|
||||||
if ((uptr->flags & UNIT_ATT) == 0)
|
if ((uptr->flags & UNIT_ATT) == 0)
|
||||||
return SCPE_UNATT;
|
return SCPE_UNATT;
|
||||||
if (uptr->u5 & URCSTA_ACTIVE)
|
if (uptr->u5 & URCSTA_ACTIVE)
|
||||||
return SCPE_BUSY;
|
return SCPE_BUSY;
|
||||||
|
@ -314,7 +314,7 @@ cdr_srv(UNIT *uptr) {
|
||||||
uptr->u5 &= ~ URCSTA_EOF;
|
uptr->u5 &= ~ URCSTA_EOF;
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Check if new card requested. */
|
/* Check if new card requested. */
|
||||||
if (uptr->u4 == 0 && uptr->u5 & URCSTA_ACTIVE &&
|
if (uptr->u4 == 0 && uptr->u5 & URCSTA_ACTIVE &&
|
||||||
|
@ -344,7 +344,7 @@ cdr_srv(UNIT *uptr) {
|
||||||
uptr->u5 |= URCSTA_EOF;
|
uptr->u5 |= URCSTA_EOF;
|
||||||
chan_set_end(chan);
|
chan_set_end(chan);
|
||||||
break;
|
break;
|
||||||
case SCPE_OK:
|
case SCPE_OK:
|
||||||
uptr->u5 |= URCSTA_CARD;
|
uptr->u5 |= URCSTA_CARD;
|
||||||
sim_activate(uptr, 500);
|
sim_activate(uptr, 500);
|
||||||
break;
|
break;
|
||||||
|
@ -354,7 +354,7 @@ cdr_srv(UNIT *uptr) {
|
||||||
|
|
||||||
|
|
||||||
/* Copy next column over */
|
/* Copy next column over */
|
||||||
if (uptr->u5 & URCSTA_CARD &&
|
if (uptr->u5 & URCSTA_CARD &&
|
||||||
uptr->u4 <= ((uptr->u5 & URCSTA_BIN) ? 160 : 80)) {
|
uptr->u4 <= ((uptr->u5 & URCSTA_BIN) ? 160 : 80)) {
|
||||||
struct _card_data *data;
|
struct _card_data *data;
|
||||||
uint8 ch = 0;
|
uint8 ch = 0;
|
||||||
|
@ -363,7 +363,7 @@ cdr_srv(UNIT *uptr) {
|
||||||
data = (struct _card_data *)uptr->up7;
|
data = (struct _card_data *)uptr->up7;
|
||||||
|
|
||||||
if (uptr->u5 & URCSTA_BIN) {
|
if (uptr->u5 & URCSTA_BIN) {
|
||||||
ch = (data->image[uptr->u4 >> 1] >>
|
ch = (data->image[uptr->u4 >> 1] >>
|
||||||
((uptr->u4 & 1)? 0 : 6)) & 077;
|
((uptr->u4 & 1)? 0 : 6)) & 077;
|
||||||
} else {
|
} else {
|
||||||
ch = sim_hol_to_bcd(data->image[uptr->u4]);
|
ch = sim_hol_to_bcd(data->image[uptr->u4]);
|
||||||
|
@ -377,8 +377,8 @@ cdr_srv(UNIT *uptr) {
|
||||||
chan_set_parity(chan);
|
chan_set_parity(chan);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0111:
|
case 0111:
|
||||||
ch = 0;
|
ch = 0;
|
||||||
/* Handle invalid punch */
|
/* Handle invalid punch */
|
||||||
chan_set_parity(chan);
|
chan_set_parity(chan);
|
||||||
break; /* Translate ? to error*/
|
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, " 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, "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, "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_set_help(st, dptr);
|
||||||
fprint_show_help(st, dptr);
|
fprint_show_help(st, dptr);
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
@ -492,7 +492,7 @@ cdp_srv(UNIT *uptr) {
|
||||||
case SCPE_IOERR:
|
case SCPE_IOERR:
|
||||||
chan_set_error(chan);
|
chan_set_error(chan);
|
||||||
break;
|
break;
|
||||||
case SCPE_OK:
|
case SCPE_OK:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
uptr->u5 &= ~URCSTA_FULL;
|
uptr->u5 &= ~URCSTA_FULL;
|
||||||
|
@ -537,7 +537,7 @@ cdp_attach(UNIT * uptr, CONST char *file)
|
||||||
t_stat
|
t_stat
|
||||||
cdp_detach(UNIT * uptr)
|
cdp_detach(UNIT * uptr)
|
||||||
{
|
{
|
||||||
if (uptr->u5 & URCSTA_FULL)
|
if (uptr->u5 & URCSTA_FULL)
|
||||||
sim_punch_card(uptr, NULL);
|
sim_punch_card(uptr, NULL);
|
||||||
iostatus &= ~PUNCH_FLAG;
|
iostatus &= ~PUNCH_FLAG;
|
||||||
return sim_card_detach(uptr);
|
return sim_card_detach(uptr);
|
||||||
|
@ -568,7 +568,7 @@ cdp_description(DEVICE *dptr)
|
||||||
|
|
||||||
#if NUM_DEVS_LPR > 0
|
#if NUM_DEVS_LPR > 0
|
||||||
t_stat
|
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;
|
int i;
|
||||||
if (cptr == NULL)
|
if (cptr == NULL)
|
||||||
|
@ -619,10 +619,10 @@ print_line(UNIT * uptr, int unit)
|
||||||
/* Scan each column */
|
/* Scan each column */
|
||||||
for (i = 0; i < uptr->u3; i++) {
|
for (i = 0; i < uptr->u3; i++) {
|
||||||
int bcd = lpr_data[unit].lbuff[i] & 077;
|
int bcd = lpr_data[unit].lbuff[i] & 077;
|
||||||
|
|
||||||
out[i] = con_to_ascii[bcd];
|
out[i] = con_to_ascii[bcd];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Trim trailing spaces */
|
/* Trim trailing spaces */
|
||||||
for (--i; i > 0 && out[i] == ' '; i--) ;
|
for (--i; i > 0 && out[i] == ' '; i--) ;
|
||||||
out[i+1] = '\0';
|
out[i+1] = '\0';
|
||||||
|
@ -715,8 +715,8 @@ print_line(UNIT * uptr, int unit)
|
||||||
sim_fwrite("\f", 1, 1, uptr->fileref);
|
sim_fwrite("\f", 1, 1, uptr->fileref);
|
||||||
sim_fseek(uptr->fileref, 0, SEEK_CUR);
|
sim_fseek(uptr->fileref, 0, SEEK_CUR);
|
||||||
sim_debug(DEBUG_DETAIL, &lpr_dev, "lpr %d page\n", unit);
|
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;
|
UNIT *uptr;
|
||||||
int u;
|
int u;
|
||||||
|
|
||||||
if (dev == PRT1_DEV)
|
if (dev == PRT1_DEV)
|
||||||
u = 0;
|
u = 0;
|
||||||
else if (dev == PRT2_DEV)
|
else if (dev == PRT2_DEV)
|
||||||
u = 1;
|
u = 1;
|
||||||
|
@ -738,16 +738,16 @@ t_stat lpr_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc)
|
||||||
if (uptr->u5 & URCSTA_BUSY)
|
if (uptr->u5 & URCSTA_BUSY)
|
||||||
return SCPE_BUSY;
|
return SCPE_BUSY;
|
||||||
|
|
||||||
if ((uptr->flags & UNIT_ATT) == 0)
|
if ((uptr->flags & UNIT_ATT) == 0)
|
||||||
return SCPE_UNATT;
|
return SCPE_UNATT;
|
||||||
|
|
||||||
if (*wc == 0 && (cmd & URCSTA_INHIBIT) == 0)
|
if (*wc == 0 && (cmd & URCSTA_INHIBIT) == 0)
|
||||||
*wc = (cmd & URCSTA_DIRECT) ? 17 : 15;
|
*wc = (cmd & URCSTA_DIRECT) ? 17 : 15;
|
||||||
|
|
||||||
/* Remember not to drop the FULL */
|
/* Remember not to drop the FULL */
|
||||||
uptr->u5 &= ~((077 << URCSTA_CMD_V) | URCSTA_CHMASK);
|
uptr->u5 &= ~((077 << URCSTA_CMD_V) | URCSTA_CHMASK);
|
||||||
uptr->u5 |= URCSTA_BUSY|chan;
|
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;
|
<< URCSTA_CMD_V;
|
||||||
uptr->u3 = 0;
|
uptr->u3 = 0;
|
||||||
sim_debug(DEBUG_CMD, &lpr_dev, "%d: Cmd WRS %d %02o %o\n", u, chan,
|
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);
|
sim_activate(uptr, 20000);
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
} else {
|
} 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]);
|
lpr_data[u].lbuff[uptr->u3]);
|
||||||
uptr->u3++;
|
uptr->u3++;
|
||||||
}
|
}
|
||||||
|
@ -809,7 +809,7 @@ t_stat
|
||||||
lpr_detach(UNIT * uptr)
|
lpr_detach(UNIT * uptr)
|
||||||
{
|
{
|
||||||
int u = (uptr - lpr_unit);
|
int u = (uptr - lpr_unit);
|
||||||
if (uptr->u5 & URCSTA_FULL)
|
if (uptr->u5 & URCSTA_FULL)
|
||||||
print_line(uptr, u);
|
print_line(uptr, u);
|
||||||
iostatus &= ~(PRT1_FLAG << u);
|
iostatus &= ~(PRT1_FLAG << u);
|
||||||
return detach_unit(uptr);
|
return detach_unit(uptr);
|
||||||
|
@ -854,10 +854,10 @@ lpr_description(DEVICE *dptr)
|
||||||
|
|
||||||
|
|
||||||
#if NUM_DEVS_CON > 0
|
#if NUM_DEVS_CON > 0
|
||||||
/*
|
/*
|
||||||
* Console printer routines.
|
* Console printer routines.
|
||||||
*/
|
*/
|
||||||
t_stat
|
t_stat
|
||||||
con_ini(DEVICE *dptr) {
|
con_ini(DEVICE *dptr) {
|
||||||
UNIT *uptr = &con_unit[0];
|
UNIT *uptr = &con_unit[0];
|
||||||
uptr->u5 = 0;
|
uptr->u5 = 0;
|
||||||
|
@ -875,7 +875,7 @@ con_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc)
|
||||||
/* Are we currently tranfering? */
|
/* Are we currently tranfering? */
|
||||||
if (uptr->u5 & (URCSTA_READ|URCSTA_FILL|URCSTA_BUSY|URCSTA_INPUT))
|
if (uptr->u5 & (URCSTA_READ|URCSTA_FILL|URCSTA_BUSY|URCSTA_INPUT))
|
||||||
return SCPE_BUSY;
|
return SCPE_BUSY;
|
||||||
|
|
||||||
if (cmd & URCSTA_READ) {
|
if (cmd & URCSTA_READ) {
|
||||||
if (uptr->u5 & (URCSTA_INPUT|URCSTA_FILL))
|
if (uptr->u5 & (URCSTA_INPUT|URCSTA_FILL))
|
||||||
return SCPE_BUSY;
|
return SCPE_BUSY;
|
||||||
|
|
239
sim_card.c
239
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
|
Copyright (c) 2005, Richard Cornwell
|
||||||
|
|
||||||
|
@ -61,9 +61,9 @@
|
||||||
The card module uses up7 to hold a buffer for the card being translated
|
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.
|
and the backward translation table. Which is generated from the table.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(USE_SIM_CARD)
|
|
||||||
|
|
||||||
|
#if defined(USE_SIM_CARD)
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "sim_defs.h"
|
#include "sim_defs.h"
|
||||||
#include "sim_card.h"
|
#include "sim_card.h"
|
||||||
|
@ -344,6 +344,7 @@ static struct card_formats fmts[] = {
|
||||||
{MODE_BCD, "BCD"},
|
{MODE_BCD, "BCD"},
|
||||||
{MODE_CBN, "CBN"},
|
{MODE_CBN, "CBN"},
|
||||||
{MODE_EBCDIC,"EBCDIC"},
|
{MODE_EBCDIC,"EBCDIC"},
|
||||||
|
{MODE_OCTAL, "OCTAL"},
|
||||||
{0, 0},
|
{0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -476,7 +477,7 @@ static int cmpcard(const char *p, const char *s) {
|
||||||
t_stat
|
t_stat
|
||||||
sim_read_card(UNIT * uptr)
|
sim_read_card(UNIT * uptr)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i;
|
||||||
char c;
|
char c;
|
||||||
uint16 temp;
|
uint16 temp;
|
||||||
int mode;
|
int mode;
|
||||||
|
@ -499,11 +500,11 @@ sim_read_card(UNIT * uptr)
|
||||||
int ptr = data->ptr;
|
int ptr = data->ptr;
|
||||||
int start = 0;
|
int start = 0;
|
||||||
|
|
||||||
while (ptr < sizeof(data->cbuff))
|
while (ptr < data->len)
|
||||||
(data->cbuff)[start++] = (data->cbuff)[ptr++];
|
(data->cbuff)[start++] = (data->cbuff)[ptr++];
|
||||||
data->len -= data->ptr;
|
data->len -= data->ptr;
|
||||||
/* On eof, just return */
|
/* On eof, just return */
|
||||||
if (!feof(uptr->fileref))
|
if (!feof(uptr->fileref) && data->len < 512)
|
||||||
len = sim_fread(&data->cbuff[start], 1,
|
len = sim_fread(&data->cbuff[start], 1,
|
||||||
sizeof(data->cbuff) - start, uptr->fileref);
|
sizeof(data->cbuff) - start, uptr->fileref);
|
||||||
else
|
else
|
||||||
|
@ -534,7 +535,7 @@ sim_read_card(UNIT * uptr)
|
||||||
/* Clear image buffer */
|
/* Clear image buffer */
|
||||||
for (col = 0; col < 80; data->image[col++] = 0);
|
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 */
|
mode = MODE_TEXT; /* Default is text */
|
||||||
|
|
||||||
/* Check buffer to see if binary card in it. */
|
/* Check buffer to see if binary card in it. */
|
||||||
|
@ -571,18 +572,42 @@ sim_read_card(UNIT * uptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if modes match */
|
/* Check if modes match */
|
||||||
if ((uptr->flags & UNIT_MODE) != MODE_AUTO &&
|
if ((uptr->flags & UNIT_CARD_MODE) != MODE_AUTO &&
|
||||||
(uptr->flags & UNIT_MODE) != mode) {
|
(uptr->flags & UNIT_CARD_MODE) != mode) {
|
||||||
sim_debug(DEBUG_CARD, dptr, "invalid mode\n\r");
|
sim_debug(DEBUG_CARD, dptr, "invalid mode\n");
|
||||||
return SCPE_IOERR;
|
return SCPE_IOERR;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
mode = uptr->flags & UNIT_MODE;
|
mode = uptr->flags & UNIT_CARD_MODE;
|
||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case MODE_TEXT:
|
case MODE_TEXT:
|
||||||
sim_debug(DEBUG_CARD, dptr, "text: [");
|
sim_debug(DEBUG_CARD, dptr, "text: [");
|
||||||
/* Check for special codes */
|
/* 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")) {
|
if (cmpcard(&data->cbuff[0], "raw")) {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for(col = 0, i = 4; col < 80; i++) {
|
for(col = 0, i = 4; col < 80; i++) {
|
||||||
|
@ -624,12 +649,8 @@ sim_read_card(UNIT * uptr)
|
||||||
break;
|
break;
|
||||||
case '\n':
|
case '\n':
|
||||||
col = 80;
|
col = 80;
|
||||||
|
i--;
|
||||||
break;
|
break;
|
||||||
case '~': /* End of file mark */
|
|
||||||
if (col == 0) {
|
|
||||||
r = SCPE_EOF;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
sim_debug(DEBUG_CARD, dptr, "%c", c);
|
sim_debug(DEBUG_CARD, dptr, "%c", c);
|
||||||
if ((uptr->flags & MODE_LOWER) == 0)
|
if ((uptr->flags & MODE_LOWER) == 0)
|
||||||
|
@ -649,31 +670,33 @@ sim_read_card(UNIT * uptr)
|
||||||
if (temp & 0xf000)
|
if (temp & 0xf000)
|
||||||
r = SCPE_IOERR;
|
r = SCPE_IOERR;
|
||||||
data->image[col++] = temp & 0xfff;
|
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++;
|
i++;
|
||||||
|
}
|
||||||
if (data->cbuff[i] == '\r')
|
if (data->cbuff[i] == '\r')
|
||||||
i++;
|
i++;
|
||||||
sim_debug(DEBUG_CARD, dptr, "]\r\n");
|
if (data->cbuff[i] == '\n')
|
||||||
|
i++;
|
||||||
|
sim_debug(DEBUG_CARD, dptr, "]\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MODE_BIN:
|
case MODE_BIN:
|
||||||
temp = 0;
|
temp = 0;
|
||||||
sim_debug(DEBUG_CARD, dptr, "bin\r\n");
|
sim_debug(DEBUG_CARD, dptr, "bin\n");
|
||||||
if (size < 160)
|
if (size < 160)
|
||||||
return SCPE_IOERR;
|
return SCPE_IOERR;
|
||||||
/* Move data to buffer */
|
/* Move data to buffer */
|
||||||
for (j = i = 0; i < 160;) {
|
for (col = i = 0; i < 160;) {
|
||||||
temp |= data->cbuff[i];
|
temp |= data->cbuff[i];
|
||||||
data->image[j] = (data->cbuff[i++] >> 4) & 0xF;
|
data->image[col] = (data->cbuff[i++] >> 4) & 0xF;
|
||||||
data->image[j++] |= ((uint16)data->cbuff[i++]) << 4;
|
data->image[col++] |= ((uint16)data->cbuff[i++]) << 4;
|
||||||
}
|
}
|
||||||
/* Check if format error */
|
/* Check if format error */
|
||||||
if (temp & 0xF)
|
if (temp & 0xF)
|
||||||
|
@ -682,7 +705,7 @@ sim_read_card(UNIT * uptr)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MODE_CBN:
|
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 */
|
/* Check if first character is a tape mark */
|
||||||
if (size == 1 && ((uint8)data->cbuff[0]) == 0217) {
|
if (size == 1 && ((uint8)data->cbuff[0]) == 0217) {
|
||||||
r = SCPE_EOF;
|
r = SCPE_EOF;
|
||||||
|
@ -693,7 +716,7 @@ sim_read_card(UNIT * uptr)
|
||||||
data->cbuff[0] &= 0x7f;
|
data->cbuff[0] &= 0x7f;
|
||||||
|
|
||||||
/* Convert card and check for errors */
|
/* Convert card and check for errors */
|
||||||
for (j = i = 0; i < size;) {
|
for (col = i = 0; i < data->len && col < 80;) {
|
||||||
uint8 c;
|
uint8 c;
|
||||||
|
|
||||||
if (data->cbuff[i] & 0x80)
|
if (data->cbuff[i] & 0x80)
|
||||||
|
@ -701,18 +724,23 @@ sim_read_card(UNIT * uptr)
|
||||||
c = data->cbuff[i] & 077;
|
c = data->cbuff[i] & 077;
|
||||||
if (sim_parity_table[(int)c] == (data->cbuff[i++] & 0100))
|
if (sim_parity_table[(int)c] == (data->cbuff[i++] & 0100))
|
||||||
r = SCPE_IOERR;
|
r = SCPE_IOERR;
|
||||||
data->image[j] = ((uint16)c) << 6;
|
data->image[col] = ((uint16)c) << 6;
|
||||||
if (data->cbuff[i] & 0x80)
|
if (data->cbuff[i] & 0x80)
|
||||||
break;
|
break;
|
||||||
c = data->cbuff[i] & 077;
|
c = data->cbuff[i] & 077;
|
||||||
if (sim_parity_table[(int)c] == (data->cbuff[i++] & 0100))
|
if (sim_parity_table[(int)c] == (data->cbuff[i++] & 0100))
|
||||||
r = SCPE_IOERR;
|
r = SCPE_IOERR;
|
||||||
data->image[j++] |= c;
|
data->image[col++] |= c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If not full record, return error */
|
if (col >= 80 && (data->cbuff[i] & 0x80) == 0) {
|
||||||
if (size != 160) {
|
r = SCPE_IOERR;
|
||||||
r = SCPE_IOERR;
|
}
|
||||||
|
/* Record over length of card, skip until next */
|
||||||
|
while ((data->cbuff[i] & 0x80) == 0) {
|
||||||
|
if (i > data->len)
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -728,7 +756,7 @@ sim_read_card(UNIT * uptr)
|
||||||
data->cbuff[0] &= 0x7f;
|
data->cbuff[0] &= 0x7f;
|
||||||
|
|
||||||
/* Convert text line into card image */
|
/* 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)
|
if (data->cbuff[i] & 0x80)
|
||||||
break;
|
break;
|
||||||
c = data->cbuff[i] & 077;
|
c = data->cbuff[i] & 077;
|
||||||
|
@ -738,7 +766,19 @@ sim_read_card(UNIT * uptr)
|
||||||
/* Convert to top column */
|
/* Convert to top column */
|
||||||
data->image[col++] = sim_bcd_to_hol(c);
|
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;
|
break;
|
||||||
|
|
||||||
case MODE_EBCDIC:
|
case MODE_EBCDIC:
|
||||||
|
@ -799,10 +839,11 @@ sim_punch_card(UNIT * uptr, UNIT *stkuptr)
|
||||||
/* Else if binary or not convertable, dump as image */
|
/* Else if binary or not convertable, dump as image */
|
||||||
|
|
||||||
/* Try to convert to text */
|
/* Try to convert to text */
|
||||||
uint8 out[160];
|
uint8 out[512];
|
||||||
int i;
|
int i;
|
||||||
|
int outp;
|
||||||
FILE *fo = uptr->fileref;
|
FILE *fo = uptr->fileref;
|
||||||
int mode = uptr->flags & UNIT_MODE;
|
int mode = uptr->flags & UNIT_CARD_MODE;
|
||||||
int ok = 1;
|
int ok = 1;
|
||||||
struct _card_data *data;
|
struct _card_data *data;
|
||||||
DEVICE *dptr;
|
DEVICE *dptr;
|
||||||
|
@ -810,14 +851,15 @@ sim_punch_card(UNIT * uptr, UNIT *stkuptr)
|
||||||
if ((uptr->flags & UNIT_ATT) == 0) {
|
if ((uptr->flags & UNIT_ATT) == 0) {
|
||||||
if (stkuptr != NULL && stkuptr->flags & UNIT_ATT) {
|
if (stkuptr != NULL && stkuptr->flags & UNIT_ATT) {
|
||||||
fo = stkuptr->fileref;
|
fo = stkuptr->fileref;
|
||||||
if ((stkuptr->flags & UNIT_MODE) != MODE_AUTO)
|
if ((stkuptr->flags & UNIT_CARD_MODE) != MODE_AUTO)
|
||||||
mode = stkuptr->flags & UNIT_MODE;
|
mode = stkuptr->flags & UNIT_CARD_MODE;
|
||||||
} else
|
} else
|
||||||
return SCPE_UNATT; /* attached? */
|
return SCPE_UNATT; /* attached? */
|
||||||
}
|
}
|
||||||
|
|
||||||
data = (struct _card_data *)uptr->up7;
|
data = (struct _card_data *)uptr->up7;
|
||||||
dptr = find_dev_from_unit(uptr);
|
dptr = find_dev_from_unit(uptr);
|
||||||
|
outp = 0;
|
||||||
|
|
||||||
/* Fix mode if in auto mode */
|
/* Fix mode if in auto mode */
|
||||||
if (mode == MODE_AUTO) {
|
if (mode == MODE_AUTO) {
|
||||||
|
@ -828,79 +870,123 @@ sim_punch_card(UNIT * uptr, UNIT *stkuptr)
|
||||||
ok = 0;
|
ok = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mode = ok?MODE_TEXT:MODE_BIN;
|
mode = ok?MODE_TEXT:MODE_OCTAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
default:
|
default:
|
||||||
case MODE_TEXT:
|
case MODE_TEXT:
|
||||||
/* Scan each column */
|
/* Scan each column */
|
||||||
sim_debug(DEBUG_CARD, dptr, "text: [");
|
sim_debug(DEBUG_CARD, dptr, "text: [");
|
||||||
for (i = 0; i < 80; i++) {
|
for (i = 0; i < 80; i++, outp++) {
|
||||||
out[i] = data->hol_to_ascii[data->image[i]];
|
out[outp] = data->hol_to_ascii[data->image[i]];
|
||||||
if (out[i] == 0xff)
|
if (out[outp] == 0xff) {
|
||||||
out[i] = '?';
|
out[outp] = '?';
|
||||||
sim_debug(DEBUG_CARD, dptr, "%c", out[i]);
|
}
|
||||||
|
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 */
|
/* Trim off trailing spaces */
|
||||||
while (i > 0 && out[--i] == ' ') ;
|
while (outp > 0 && out[--outp] == ' ') ;
|
||||||
out[++i] = '\n';
|
out[++outp] = '\n';
|
||||||
out[++i] = '\0';
|
out[++outp] = '\0';
|
||||||
break;
|
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:
|
case MODE_BIN:
|
||||||
sim_debug(DEBUG_CARD, dptr, "bin\r\n");
|
sim_debug(DEBUG_CARD, dptr, "bin\n");
|
||||||
for (i = 0; i < 80; i++) {
|
for (i = 0; i < 80; i++) {
|
||||||
uint16 col = data->image[i];
|
uint16 col = data->image[i];
|
||||||
out[i*2] = (col & 0x00f) << 4;
|
out[outp++] = (col & 0x00f) << 4;
|
||||||
out[i*2+1] = (col & 0xff0) >> 4;
|
out[outp++] = (col & 0xff0) >> 4;
|
||||||
}
|
}
|
||||||
i = 160;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MODE_CBN:
|
case MODE_CBN:
|
||||||
sim_debug(DEBUG_CARD, dptr, "cbn\r\n");
|
sim_debug(DEBUG_CARD, dptr, "cbn\n");
|
||||||
/* Fill buffer */
|
/* Fill buffer */
|
||||||
for (i = 0; i < 80; i++) {
|
for (i = 0; i < 80; i++) {
|
||||||
uint16 col = data->image[i];
|
uint16 col = data->image[i];
|
||||||
out[i*2] = (col >> 6) & 077;
|
out[outp++] = (col >> 6) & 077;
|
||||||
out[i*2+1] = col & 077;
|
out[outp++] = col & 077;
|
||||||
}
|
}
|
||||||
/* Now set parity */
|
/* Now set parity */
|
||||||
for (i = 0; i < 160; i++)
|
for (i = 0; i < 160; i++)
|
||||||
out[i] |= 0100 ^ sim_parity_table[(int)out[i]];
|
out[i] |= 0100 ^ sim_parity_table[(int)out[i]];
|
||||||
out[0] |= 0x80; /* Set record mark */
|
out[0] |= 0x80; /* Set record mark */
|
||||||
i = 160;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MODE_BCD:
|
case MODE_BCD:
|
||||||
sim_debug(DEBUG_CARD, dptr, "bcd [");
|
sim_debug(DEBUG_CARD, dptr, "bcd [");
|
||||||
for (i = 0; i < 80; i++) {
|
for (i = 0; i < 80; i++, outp++) {
|
||||||
out[i] = sim_hol_to_bcd(data->image[i]);
|
out[outp] = sim_hol_to_bcd(data->image[i]);
|
||||||
if (out[i] != 0x7f)
|
if (out[outp] != 0x7f)
|
||||||
out[i] |= sim_parity_table[(int)out[i]];
|
out[outp] |= sim_parity_table[(int)out[outp]];
|
||||||
else
|
else
|
||||||
out[i] = 077;
|
out[outp] = 077;
|
||||||
sim_debug(DEBUG_CARD, dptr, "%c",
|
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 */
|
out[0] |= 0x80; /* Set record mark */
|
||||||
while (i > 0 && out[--i] == 0);
|
while (outp > 0 && out[--outp] == 0);
|
||||||
i++;
|
outp++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MODE_EBCDIC:
|
case MODE_EBCDIC:
|
||||||
sim_debug(DEBUG_CARD, dptr, "ebcdic\r\n");
|
sim_debug(DEBUG_CARD, dptr, "ebcdic\n");
|
||||||
/* Fill buffer */
|
/* Fill buffer */
|
||||||
for (i = 0; i < 80; i++) {
|
for (i = 0; i < 80; i++, outp++) {
|
||||||
uint16 col = data->image[i];
|
uint16 col = data->image[i];
|
||||||
out[i] = 0xff & hol_to_ebcdic[col];
|
out[outp] = 0xff & hol_to_ebcdic[col];
|
||||||
}
|
}
|
||||||
i = 80;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sim_fwrite(out, 1, i, fo);
|
sim_fwrite(out, 1, outp, fo);
|
||||||
memset(&data->image[0], 0, sizeof(data->image));
|
memset(&data->image[0], 0, sizeof(data->image));
|
||||||
return SCPE_OK;
|
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;
|
if (cptr == NULL) return SCPE_ARG;
|
||||||
for (f = 0; fmts[f].name != 0; f++) {
|
for (f = 0; fmts[f].name != 0; f++) {
|
||||||
if (strcmp (cptr, fmts[f].name) == 0) {
|
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;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -928,7 +1014,7 @@ t_stat sim_card_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
|
||||||
int f;
|
int f;
|
||||||
|
|
||||||
for (f = 0; fmts[f].name != 0; 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);
|
fprintf (st, "%s format", fmts[f].name);
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
@ -965,6 +1051,7 @@ sim_card_attach(UNIT * uptr, CONST char *cptr)
|
||||||
} else {
|
} else {
|
||||||
data = (struct _card_data *)uptr->up7;
|
data = (struct _card_data *)uptr->up7;
|
||||||
}
|
}
|
||||||
|
memset(data, 0, sizeof(struct _card_data));
|
||||||
|
|
||||||
for (i = 0; i < 4096; i++)
|
for (i = 0; i < 4096; i++)
|
||||||
hol_to_ebcdic[i] = 0x100;
|
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->ptr = 0; /* Set for initial read */
|
||||||
data->len = 0;
|
data->len = 0;
|
||||||
return SCPE_OK;
|
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;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* USE_SIM_CARD */
|
#endif /* USE_SIM_CARD */
|
||||||
|
|
29
sim_card.h
29
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
|
Copyright (c) 2005, Richard Cornwell
|
||||||
|
|
||||||
|
@ -69,19 +69,20 @@ extern "C" {
|
||||||
#define DEBUG_CARD 0x0000010 /* Show details */
|
#define DEBUG_CARD 0x0000010 /* Show details */
|
||||||
|
|
||||||
/* Flags for punch and reader. */
|
/* Flags for punch and reader. */
|
||||||
#define UNIT_V_MODE (UNIT_V_UF + 0)
|
#define UNIT_V_CARD_MODE (UNIT_V_UF + 0)
|
||||||
#define UNIT_MODE (7 << UNIT_V_MODE)
|
#define UNIT_CARD_MODE (7 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_AUTO (0 << UNIT_V_MODE)
|
#define MODE_AUTO (0 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_BIN (1 << UNIT_V_MODE)
|
#define MODE_BIN (1 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_TEXT (2 << UNIT_V_MODE)
|
#define MODE_TEXT (2 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_BCD (3 << UNIT_V_MODE)
|
#define MODE_BCD (3 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_CBN (4 << UNIT_V_MODE)
|
#define MODE_CBN (4 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_EBCDIC (5 << UNIT_V_MODE)
|
#define MODE_EBCDIC (5 << UNIT_V_CARD_MODE)
|
||||||
|
#define MODE_OCTAL (6 << UNIT_V_CARD_MODE)
|
||||||
/* Allow lower case letters */
|
/* Allow lower case letters */
|
||||||
#define MODE_LOWER (8 << UNIT_V_MODE)
|
#define MODE_LOWER (8 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_026 (0x10 << UNIT_V_MODE)
|
#define MODE_026 (0x10 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_029 (0x20 << UNIT_V_MODE)
|
#define MODE_029 (0x20 << UNIT_V_CARD_MODE)
|
||||||
#define MODE_CHAR (0x30 << UNIT_V_MODE)
|
#define MODE_CHAR (0x30 << UNIT_V_CARD_MODE)
|
||||||
|
|
||||||
|
|
||||||
struct _card_data
|
struct _card_data
|
||||||
|
@ -104,7 +105,7 @@ t_stat sim_card_detach(UNIT *uptr);
|
||||||
uint16 sim_bcd_to_hol(uint8 bcd);
|
uint16 sim_bcd_to_hol(uint8 bcd);
|
||||||
uint16 sim_ebcdic_to_hol(uint8 ebcdic);
|
uint16 sim_ebcdic_to_hol(uint8 ebcdic);
|
||||||
uint8 sim_hol_to_bcd(uint16 hol);
|
uint8 sim_hol_to_bcd(uint16 hol);
|
||||||
uint8 sim_hol_to_ebbcd(uint16 hol);
|
uint16 sim_hol_to_ebcdic(uint16 hol);
|
||||||
|
|
||||||
/* Format control routines. */
|
/* Format control routines. */
|
||||||
t_stat sim_card_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
|
t_stat sim_card_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
|
||||||
|
|
Loading…
Add table
Reference in a new issue