SDS: Alter display and entering of ASCII data

SDS internal ASCII differs from standard external ASCII. Alter the examine and deposit functions with -A switch to properly adjust between the two forms. Also allow strings rather than one-character per word as was in the original code.  Clean up six-bit character display logic to use a loop.

Remove superfluous trailing blanks from lines in file.
This commit is contained in:
Mark Emmer 2014-03-02 22:44:35 -06:00
parent 0c6c4c7916
commit 614fe87af4

View file

@ -430,17 +430,17 @@ va = inst & VA_MASK;
shf = inst & I_SHFMSK; shf = inst & I_SHFMSK;
nonop = inst & 077777; nonop = inst & 077777;
if (sw & SWMASK ('A')) { /* ASCII? */ if (sw & SWMASK ('A')) { /* SDS internal ASCII? */
if (inst > 0377) for (i = 16; i >= 0; i -= 8) {
return SCPE_ARG; ch = (inst >> i) & 0377; /* map printable chars */
fprintf (of, FMTASC (inst & 0177)); ch = ch <= 0137 ? ch += 040 : '.'; /* from int. to ext. ASCII */
fprintf (of, "%c", ch);
}
return SCPE_OK; return SCPE_OK;
} }
if (sw & SWMASK ('C')) { /* character? */ if (sw & SWMASK ('C')) { /* six-bit character? */
fprintf (of, "%c", sds_to_ascii[(inst >> 18) & 077]); for (i = 18; i >= 0; i -= 6)
fprintf (of, "%c", sds_to_ascii[(inst >> 12) & 077]); fprintf (of, "%c", sds_to_ascii[(inst >> i) & 077]);
fprintf (of, "%c", sds_to_ascii[(inst >> 6) & 077]);
fprintf (of, "%c", sds_to_ascii[inst & 077]);
return SCPE_OK; return SCPE_OK;
} }
if (!(sw & SWMASK ('M'))) return SCPE_ARG; if (!(sw & SWMASK ('M'))) return SCPE_ARG;
@ -539,7 +539,7 @@ return cptr; /* no change */
t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw) t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw)
{ {
int32 i, j, k; int32 i, j, k, ch;
t_value d, tag; t_value d, tag;
t_stat r; t_stat r;
char gbuf[CBUFSIZE]; char gbuf[CBUFSIZE];
@ -554,10 +554,21 @@ for (i = 1; (i < 4) && (cptr[i] != 0); i++) {
if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */ if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */
if (cptr[0] == 0) /* must have 1 char */ if (cptr[0] == 0) /* must have 1 char */
return SCPE_ARG; return SCPE_ARG;
val[0] = (t_value) cptr[0] | 0200; for (i = j = 0, val[0] = 0; i < 3; i++) {
if (cptr[i] == 0) /* latch str end */
j = 1;
ch = cptr[i] & 0377;
if (ch <= 037 || ch >= 0200)
k = -1;
else
k = ch - 040; /* map ext. to int. ASCII */
if (j || (k < 0)) /* bad, end? spc */
k = 0;
val[0] = (val[0] << 8) | k;
}
return SCPE_OK; return SCPE_OK;
} }
if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* string? */ if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* string of 6-bit chars? */
if (cptr[0] == 0) /* must have 1 char */ if (cptr[0] == 0) /* must have 1 char */
return SCPE_ARG; return SCPE_ARG;
for (i = j = 0, val[0] = 0; i < 4; i++) { for (i = j = 0, val[0] = 0; i < 4; i++) {