mirror of
https://github.com/open-simh/simh.git
synced 2026-04-25 20:01:33 +00:00
Notes For V3.5-0
The source set has been extensively overhauled. For correct viewing, set Visual C++ or Emacs to have tab stops every 4 characters. 1. New Features in 3.4-1 1.1 All Ethernet devices - Added Windows user-defined adapter names (from Timothe Litt) 1.2 Interdata, SDS, HP, PDP-8, PDP-18b terminal multiplexors - Added support for SET <unit>n DISCONNECT 1.3 VAX - Added latent QDSS support - Revised autoconfigure to handle QDSS 1.4 PDP-11 - Revised autoconfigure to handle more casees 2. Bugs Fixed in 3.4-1 2.1 SCP and libraries - Trim trailing spaces on all input (for example, attach file names) - Fixed sim_sock spurious SIGPIPE error in Unix/Linux - Fixed sim_tape misallocation of TPC map array for 64b simulators 2.2 1401 - Fixed bug, CPU reset was clearing SSB through SSG 2.3 PDP-11 - Fixed bug in VH vector display routine - Fixed XU runt packet processing (found by Tim Chapman) 2.4 Interdata - Fixed bug in SHOW PAS CONN/STATS - Fixed potential integer overflow exception in divide 2.5 SDS - Fixed bug in SHOW MUX CONN/STATS 2.6 HP - Fixed bug in SHOW MUX CONN/STATS 2.7 PDP-8 - Fixed bug in SHOW TTIX CONN/STATS - Fixed bug in SET/SHOW TTOXn LOG 2.8 PDP-18b - Fixed bug in SHOW TTIX CONN/STATS - Fixed bug in SET/SHOW TTOXn LOG 2.9 Nova, Eclipse - Fixed potential integer overflow exception in divide
This commit is contained in:
committed by
Mark Pizzolato
parent
ec60bbf329
commit
b7c1eae41f
352
LGP/lgp_sys.c
352
LGP/lgp_sys.c
@@ -19,11 +19,11 @@
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of Robert M Supnik shall not
|
||||
be used in advertising or otherwise to promote the sale, use or other dealings
|
||||
Except as contained in this notice, the name of Robert M Supnik shall not be
|
||||
used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
04-Jan-05 RMS Modified VM pointer setup
|
||||
04-Jan-05 RMS Modified VM pointer setup
|
||||
*/
|
||||
|
||||
#include "lgp_defs.h"
|
||||
@@ -48,12 +48,12 @@ extern t_addr (*sim_vm_parse_addr) (DEVICE *dptr, char *cptr, char **tptr);
|
||||
|
||||
/* SCP data structures and interface routines
|
||||
|
||||
sim_name simulator name string
|
||||
sim_PC pointer to saved PC register descriptor
|
||||
sim_emax maximum number of words for examine/deposit
|
||||
sim_devices array of pointers to simulated devices
|
||||
sim_stop_messages array of pointers to stop messages
|
||||
sim_load binary loader
|
||||
sim_name simulator name string
|
||||
sim_PC pointer to saved PC register descriptor
|
||||
sim_emax maximum number of words for examine/deposit
|
||||
sim_devices array of pointers to simulated devices
|
||||
sim_stop_messages array of pointers to stop messages
|
||||
sim_load binary loader
|
||||
*/
|
||||
|
||||
char sim_name[] = "LGP30";
|
||||
@@ -63,34 +63,36 @@ REG *sim_PC = &cpu_reg[0];
|
||||
int32 sim_emax = 1;
|
||||
|
||||
DEVICE *sim_devices[] = {
|
||||
&cpu_dev,
|
||||
&tti_dev,
|
||||
&tto_dev,
|
||||
&ptr_dev,
|
||||
&ptp_dev,
|
||||
NULL };
|
||||
&cpu_dev,
|
||||
&tti_dev,
|
||||
&tto_dev,
|
||||
&ptr_dev,
|
||||
&ptp_dev,
|
||||
NULL
|
||||
};
|
||||
|
||||
const char *sim_stop_messages[] = {
|
||||
"Unknown error",
|
||||
"STOP",
|
||||
"Breakpoint",
|
||||
"Arithmetic overflow" };
|
||||
|
||||
"Unknown error",
|
||||
"STOP",
|
||||
"Breakpoint",
|
||||
"Arithmetic overflow"
|
||||
};
|
||||
|
||||
/* Binary loader - implements a restricted form of subroutine 10.4
|
||||
|
||||
Switches:
|
||||
-t, input file is transposed Flex
|
||||
-n, no checksums on v commands (10.0 compatible)
|
||||
default is ASCII encoded Flex
|
||||
-t, input file is transposed Flex
|
||||
-n, no checksums on v commands (10.0 compatible)
|
||||
default is ASCII encoded Flex
|
||||
Commands (in bits 0-3):
|
||||
(blank) instruction
|
||||
+ command (not supported)
|
||||
; start fill
|
||||
/ set modifier
|
||||
. stop and transfer
|
||||
, hex words
|
||||
v hex fill (checksummed unless -n)
|
||||
8 negative instruction
|
||||
(blank) instruction
|
||||
+ command (not supported)
|
||||
; start fill
|
||||
/ set modifier
|
||||
. stop and transfer
|
||||
, hex words
|
||||
v hex fill (checksummed unless -n)
|
||||
8 negative instruction
|
||||
*/
|
||||
|
||||
/* Utility routine - read characters until ' (conditional stop) */
|
||||
@@ -101,14 +103,15 @@ int32 flex, c;
|
||||
|
||||
*wd = 0;
|
||||
while ((c = fgetc (fi)) != EOF) {
|
||||
if (sim_switches & SWMASK ('T'))
|
||||
flex = ((c << 1) | (c >> 5)) & 0x3F;
|
||||
else flex = ascii_to_flex[c & 0x7F];
|
||||
if ((flex == FLEX_CR) || (flex == FLEX_DEL) ||
|
||||
(flex == FLEX_UC) || (flex == FLEX_LC) ||
|
||||
(flex == FLEX_BS) || (flex < 0)) continue;
|
||||
if (flex == FLEX_CSTOP) return SCPE_OK;
|
||||
*wd = (*wd << 4) | ((flex >> 2) & 0xF); }
|
||||
if (sim_switches & SWMASK ('T'))
|
||||
flex = ((c << 1) | (c >> 5)) & 0x3F;
|
||||
else flex = ascii_to_flex[c & 0x7F];
|
||||
if ((flex == FLEX_CR) || (flex == FLEX_DEL) ||
|
||||
(flex == FLEX_UC) || (flex == FLEX_LC) ||
|
||||
(flex == FLEX_BS) || (flex < 0)) continue;
|
||||
if (flex == FLEX_CSTOP) return SCPE_OK;
|
||||
*wd = (*wd << 4) | ((flex >> 2) & 0xF);
|
||||
}
|
||||
return SCPE_FMT;
|
||||
}
|
||||
|
||||
@@ -137,59 +140,70 @@ t_stat sim_load (FILE *fi, char *cptr, char *fnam, int flag)
|
||||
uint32 wd, origin, amod, csum, cnt, tr, sc, ad, cmd;
|
||||
|
||||
origin = amod = 0;
|
||||
for (;;) { /* until stopped */
|
||||
if (load_getw (fi, &wd)) break; /* get ctrl word */
|
||||
cmd = (wd >> 28) & 0xF; /* get <0:3> */
|
||||
switch (cmd) { /* decode <0:3> */
|
||||
case 0x2: /* + command */
|
||||
return SCPE_FMT;
|
||||
case 0x3: /* ; start fill */
|
||||
if (load_geta (wd, &origin)) return SCPE_FMT; /* origin = addr */
|
||||
break;
|
||||
case 0x4: /* / set modifier */
|
||||
if (load_geta (wd, &amod)) return SCPE_FMT; /* modifier = addr */
|
||||
break;
|
||||
case 0x5: /* . transfer */
|
||||
if (load_geta (wd, &PC)) return SCPE_FMT; /* PC = addr */
|
||||
return SCPE_OK; /* done! */
|
||||
case 0x6: /* hex words */
|
||||
if (load_geta (wd, &cnt)) return SCPE_FMT; /* count = addr */
|
||||
if ((cnt == 0) || (cnt > 63)) return SCPE_FMT;
|
||||
while (cnt--) { /* fill hex words */
|
||||
if (load_getw (fi, &wd)) return SCPE_FMT;
|
||||
Write (origin, wd);
|
||||
origin = (origin + 1) & AMASK; }
|
||||
break;
|
||||
case 0x7: /* hex fill */
|
||||
cnt = (wd >> 16) & 0xFFF; /* hex count */
|
||||
tr = (wd >> 8) & 0xFF; /* hex track */
|
||||
sc = wd & 0xFF; /* hex sector */
|
||||
if ((cnt == 0) || (cnt > 0x7FF) || /* validate */
|
||||
(tr >= NTK_30) || (sc >= NSC_30)) return SCPE_ARG;
|
||||
ad = (tr * NSC_30) + sc; /* decimal addr */
|
||||
for (csum = 0; cnt; cnt--) { /* fill words */
|
||||
if (load_getw (fi, &wd)) return SCPE_FMT;
|
||||
Write (ad, wd);
|
||||
csum = (csum + wd) & MMASK;
|
||||
ad = (ad + 1) & AMASK; }
|
||||
if (!(sim_switches & SWMASK ('N'))) { /* unless -n, csum */
|
||||
if (load_getw (fi, &wd)) return SCPE_FMT;
|
||||
/* if ((csum ^wd) & MMASK) return SCPE_CSUM; */ }
|
||||
break;
|
||||
case 0x0: case 0x8: /* instructions */
|
||||
if (load_geta (wd, &ad)) return SCPE_FMT; /* get address */
|
||||
if ((wd & 0x00F00000) != 0x00900000) /* if not x, */
|
||||
ad = (ad + amod) & AMASK; /* modify */
|
||||
wd = (wd & (SIGN|I_OP)) + (ad << I_V_EA); /* instruction */
|
||||
default: /* data word */
|
||||
Write (origin, wd);
|
||||
origin = (origin + 1) & AMASK;
|
||||
break;
|
||||
} /* end case */
|
||||
} /* end for */
|
||||
for (;;) { /* until stopped */
|
||||
if (load_getw (fi, &wd)) break; /* get ctrl word */
|
||||
cmd = (wd >> 28) & 0xF; /* get <0:3> */
|
||||
switch (cmd) { /* decode <0:3> */
|
||||
|
||||
case 0x2: /* + command */
|
||||
return SCPE_FMT;
|
||||
|
||||
case 0x3: /* ; start fill */
|
||||
if (load_geta (wd, &origin)) return SCPE_FMT; /* origin = addr */
|
||||
break;
|
||||
|
||||
case 0x4: /* / set modifier */
|
||||
if (load_geta (wd, &amod)) return SCPE_FMT; /* modifier = addr */
|
||||
break;
|
||||
|
||||
case 0x5: /* . transfer */
|
||||
if (load_geta (wd, &PC)) return SCPE_FMT; /* PC = addr */
|
||||
return SCPE_OK; /* done! */
|
||||
|
||||
case 0x6: /* hex words */
|
||||
if (load_geta (wd, &cnt)) return SCPE_FMT; /* count = addr */
|
||||
if ((cnt == 0) || (cnt > 63)) return SCPE_FMT;
|
||||
while (cnt--) { /* fill hex words */
|
||||
if (load_getw (fi, &wd)) return SCPE_FMT;
|
||||
Write (origin, wd);
|
||||
origin = (origin + 1) & AMASK;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x7: /* hex fill */
|
||||
cnt = (wd >> 16) & 0xFFF; /* hex count */
|
||||
tr = (wd >> 8) & 0xFF; /* hex track */
|
||||
sc = wd & 0xFF; /* hex sector */
|
||||
if ((cnt == 0) || (cnt > 0x7FF) || /* validate */
|
||||
(tr >= NTK_30) || (sc >= NSC_30)) return SCPE_ARG;
|
||||
ad = (tr * NSC_30) + sc; /* decimal addr */
|
||||
for (csum = 0; cnt; cnt--) { /* fill words */
|
||||
if (load_getw (fi, &wd)) return SCPE_FMT;
|
||||
Write (ad, wd);
|
||||
csum = (csum + wd) & MMASK;
|
||||
ad = (ad + 1) & AMASK;
|
||||
}
|
||||
if (!(sim_switches & SWMASK ('N'))) { /* unless -n, csum */
|
||||
if (load_getw (fi, &wd)) return SCPE_FMT;
|
||||
/* if ((csum ^wd) & MMASK) return SCPE_CSUM; */
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0: case 0x8: /* instructions */
|
||||
if (load_geta (wd, &ad)) return SCPE_FMT; /* get address */
|
||||
if ((wd & 0x00F00000) != 0x00900000) /* if not x, */
|
||||
ad = (ad + amod) & AMASK; /* modify */
|
||||
wd = (wd & (SIGN|I_OP)) + (ad << I_V_EA); /* instruction */
|
||||
|
||||
default: /* data word */
|
||||
Write (origin, wd);
|
||||
origin = (origin + 1) & AMASK;
|
||||
break;
|
||||
} /* end case */
|
||||
} /* end for */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
|
||||
/* Symbol tables */
|
||||
|
||||
static const char opcode[] = "ZBYRIDNMPEUTHCAS";
|
||||
@@ -199,9 +213,9 @@ static const char hex_decode[] = "0123456789FGJKQW";
|
||||
void lgp_fprint_addr (FILE *st, DEVICE *dptr, t_addr addr)
|
||||
{
|
||||
if ((dptr == sim_devices[0]) &&
|
||||
((sim_switches & SWMASK ('T')) ||
|
||||
((cpu_unit.flags & UNIT_TTSS_D) && !(sim_switches & SWMASK ('N')))))
|
||||
fprintf (st, "%02d%02d", addr >> 6, addr & SCMASK_30);
|
||||
((sim_switches & SWMASK ('T')) ||
|
||||
((cpu_unit.flags & UNIT_TTSS_D) && !(sim_switches & SWMASK ('N')))))
|
||||
fprintf (st, "%02d%02d", addr >> 6, addr & SCMASK_30);
|
||||
else fprint_val (st, addr, dptr->aradix, dptr->awidth, PV_LEFT);
|
||||
return;
|
||||
}
|
||||
@@ -211,13 +225,15 @@ t_addr lgp_parse_addr (DEVICE *dptr, char *cptr, char **tptr)
|
||||
t_addr ad, ea;
|
||||
|
||||
if ((dptr == sim_devices[0]) &&
|
||||
((sim_switches & SWMASK ('T')) ||
|
||||
((cpu_unit.flags & UNIT_TTSS_D) && !(sim_switches & SWMASK ('N'))))) {
|
||||
ad = (t_addr) strtotv (cptr, tptr, 10);
|
||||
if (((ad / 100) >= NTK_30) || ((ad % 100) >= NSC_30)) {
|
||||
*tptr = cptr;
|
||||
return 0; }
|
||||
ea = ((ad / 100) * NSC_30) | (ad % 100); }
|
||||
((sim_switches & SWMASK ('T')) ||
|
||||
((cpu_unit.flags & UNIT_TTSS_D) && !(sim_switches & SWMASK ('N'))))) {
|
||||
ad = (t_addr) strtotv (cptr, tptr, 10);
|
||||
if (((ad / 100) >= NTK_30) || ((ad % 100) >= NSC_30)) {
|
||||
*tptr = cptr;
|
||||
return 0;
|
||||
}
|
||||
ea = ((ad / 100) * NSC_30) | (ad % 100);
|
||||
}
|
||||
else ea = (t_addr) strtotv (cptr, tptr, dptr->aradix);
|
||||
return ea;
|
||||
}
|
||||
@@ -228,64 +244,69 @@ sim_vm_fprint_addr = &lgp_fprint_addr;
|
||||
sim_vm_parse_addr = &lgp_parse_addr;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* Symbolic decode
|
||||
|
||||
Inputs:
|
||||
*of = output stream
|
||||
addr = current PC
|
||||
*val = pointer to data
|
||||
*uptr = pointer to unit
|
||||
sw = switches
|
||||
*of = output stream
|
||||
addr = current PC
|
||||
*val = pointer to data
|
||||
*uptr = pointer to unit
|
||||
sw = switches
|
||||
Outputs:
|
||||
return = status code
|
||||
return = status code
|
||||
*/
|
||||
|
||||
t_stat fprint_sym (FILE *of, t_addr addr, t_value *val,
|
||||
UNIT *uptr, int32 sw)
|
||||
UNIT *uptr, int32 sw)
|
||||
{
|
||||
int32 i, c;
|
||||
uint32 inst, op, ea;
|
||||
|
||||
inst = val[0];
|
||||
if (sw & SWMASK ('A')) { /* alphabetic? */
|
||||
if ((uptr == NULL) || !(uptr->flags & UNIT_ATT)) return SCPE_ARG;
|
||||
if (uptr->flags & UNIT_FLEX) { /* Flex file? */
|
||||
c = flex_to_ascii[inst]; /* get ASCII equiv */
|
||||
if (c <= 0) return SCPE_ARG; }
|
||||
else c = inst & 0x7F; /* ASCII file */
|
||||
fputc (c, of);
|
||||
return SCPE_OK; }
|
||||
if (sw & SWMASK ('A')) { /* alphabetic? */
|
||||
if ((uptr == NULL) || !(uptr->flags & UNIT_ATT)) return SCPE_ARG;
|
||||
if (uptr->flags & UNIT_FLEX) { /* Flex file? */
|
||||
c = flex_to_ascii[inst]; /* get ASCII equiv */
|
||||
if (c <= 0) return SCPE_ARG;
|
||||
}
|
||||
else c = inst & 0x7F; /* ASCII file */
|
||||
fputc (c, of);
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
if (uptr && (uptr != &cpu_unit)) return SCPE_ARG; /* must be CPU */
|
||||
if ((sw & SWMASK ('M')) && /* symbolic decode? */
|
||||
if (uptr && (uptr != &cpu_unit)) return SCPE_ARG; /* must be CPU */
|
||||
if ((sw & SWMASK ('M')) && /* symbolic decode? */
|
||||
((inst & ~(SIGN|I_OP|I_EA)) == 0)) {
|
||||
op = I_GETOP (inst);
|
||||
ea = I_GETEA (inst);
|
||||
if (inst & SIGN) fputc ('-', of);
|
||||
fprintf (of, "%c ", opcode[op]);
|
||||
lgp_fprint_addr (of, sim_devices[0], ea);
|
||||
return SCPE_OK; }
|
||||
ea = I_GETEA (inst);
|
||||
if (inst & SIGN) fputc ('-', of);
|
||||
fprintf (of, "%c ", opcode[op]);
|
||||
lgp_fprint_addr (of, sim_devices[0], ea);
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
if ((sw & SWMASK ('L')) || /* LGP hex? */
|
||||
if ((sw & SWMASK ('L')) || /* LGP hex? */
|
||||
((cpu_unit.flags & UNIT_LGPH_D) && !(sw & SWMASK ('H')))) {
|
||||
for (i = 0; i < 8; i++) {
|
||||
c = (inst >> (4 * (7 - i))) & 0xF;
|
||||
fputc (hex_decode[c], of); }
|
||||
return SCPE_OK; }
|
||||
for (i = 0; i < 8; i++) {
|
||||
c = (inst >> (4 * (7 - i))) & 0xF;
|
||||
fputc (hex_decode[c], of);
|
||||
}
|
||||
return SCPE_OK;
|
||||
}
|
||||
return SCPE_ARG;
|
||||
}
|
||||
|
||||
|
||||
/* Symbolic input
|
||||
|
||||
Inputs:
|
||||
*cptr = pointer to input string
|
||||
addr = current PC
|
||||
*uptr = pointer to unit
|
||||
*val = pointer to output values
|
||||
sw = switches
|
||||
*cptr = pointer to input string
|
||||
addr = current PC
|
||||
*uptr = pointer to unit
|
||||
*val = pointer to output values
|
||||
sw = switches
|
||||
Outputs:
|
||||
status = error status
|
||||
status = error status
|
||||
*/
|
||||
|
||||
t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw)
|
||||
@@ -293,30 +314,34 @@ t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw)
|
||||
int32 i, c;
|
||||
char *tptr;
|
||||
|
||||
while (isspace (*cptr)) cptr++; /* absorb spaces */
|
||||
while (isspace (*cptr)) cptr++; /* absorb spaces */
|
||||
if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) {
|
||||
if ((uptr == NULL) || !(uptr->flags & UNIT_ATT)) return SCPE_ARG;
|
||||
if (uptr->flags & UNIT_FLEX) { /* Flex file? */
|
||||
c = ascii_to_flex[*cptr & 0x7F]; /* get Flex equiv */
|
||||
if (c < 0) return SCPE_ARG;
|
||||
val[0] = ((c >> 1) | (c << 5)) & 0x3F; } /* transpose */
|
||||
else val[0] = *cptr & 0x7F; /* ASCII file */
|
||||
return SCPE_OK; }
|
||||
if ((uptr == NULL) || !(uptr->flags & UNIT_ATT)) return SCPE_ARG;
|
||||
if (uptr->flags & UNIT_FLEX) { /* Flex file? */
|
||||
c = ascii_to_flex[*cptr & 0x7F]; /* get Flex equiv */
|
||||
if (c < 0) return SCPE_ARG;
|
||||
val[0] = ((c >> 1) | (c << 5)) & 0x3F; /* transpose */
|
||||
}
|
||||
else val[0] = *cptr & 0x7F; /* ASCII file */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
if (uptr && (uptr != &cpu_unit)) return SCPE_ARG; /* must be CPU */
|
||||
if (!parse_sym_m (cptr, val, sw)) return SCPE_OK; /* symbolic parse? */
|
||||
if ((sw & SWMASK ('L')) || /* LGP hex? */
|
||||
if (uptr && (uptr != &cpu_unit)) return SCPE_ARG; /* must be CPU */
|
||||
if (!parse_sym_m (cptr, val, sw)) return SCPE_OK; /* symbolic parse? */
|
||||
if ((sw & SWMASK ('L')) || /* LGP hex? */
|
||||
((cpu_unit.flags & UNIT_LGPH_D) && !(sw & SWMASK ('H')))) {
|
||||
val[0] = 0;
|
||||
while (isspace (*cptr)) cptr++; /* absorb spaces */
|
||||
for (i = 0; i < 8; i++) {
|
||||
c = *cptr++; /* get char */
|
||||
if (c == 0) return SCPE_OK;
|
||||
if (islower (c)) c = toupper (c);
|
||||
if (tptr = strchr (hex_decode, c))
|
||||
val[0] = (val[0] << 4) | (tptr - hex_decode);
|
||||
else return SCPE_ARG; }
|
||||
if (*cptr == 0) return SCPE_OK; }
|
||||
val[0] = 0;
|
||||
while (isspace (*cptr)) cptr++; /* absorb spaces */
|
||||
for (i = 0; i < 8; i++) {
|
||||
c = *cptr++; /* get char */
|
||||
if (c == 0) return SCPE_OK;
|
||||
if (islower (c)) c = toupper (c);
|
||||
if (tptr = strchr (hex_decode, c))
|
||||
val[0] = (val[0] << 4) | (tptr - hex_decode);
|
||||
else return SCPE_ARG;
|
||||
}
|
||||
if (*cptr == 0) return SCPE_OK;
|
||||
}
|
||||
return SCPE_ARG;
|
||||
}
|
||||
|
||||
@@ -328,19 +353,20 @@ uint32 ea, sgn;
|
||||
char *tptr, gbuf[CBUFSIZE];
|
||||
|
||||
if (*cptr == '-') {
|
||||
cptr++;
|
||||
sgn = SIGN; }
|
||||
cptr++;
|
||||
sgn = SIGN;
|
||||
}
|
||||
else sgn = 0;
|
||||
cptr = get_glyph (cptr, gbuf, 0); /* get opcode */
|
||||
cptr = get_glyph (cptr, gbuf, 0); /* get opcode */
|
||||
if (gbuf[1] != 0) return SCPE_ARG;
|
||||
if (tptr = strchr (opcode, gbuf[0]))
|
||||
val[0] = ((tptr - opcode) << I_V_OP) | sgn; /* merge opcode */
|
||||
val[0] = ((tptr - opcode) << I_V_OP) | sgn; /* merge opcode */
|
||||
else return SCPE_ARG;
|
||||
cptr = get_glyph (cptr, gbuf, 0); /* get address */
|
||||
cptr = get_glyph (cptr, gbuf, 0); /* get address */
|
||||
ea = lgp_parse_addr (sim_devices[0], gbuf, &tptr);
|
||||
if ((tptr == gbuf) || (*tptr != 0) || (ea > AMASK))
|
||||
return SCPE_ARG;
|
||||
val[0] = val[0] | (ea << I_V_EA); /* merge address */
|
||||
return SCPE_ARG;
|
||||
val[0] = val[0] | (ea << I_V_EA); /* merge address */
|
||||
if (*cptr != 0) return SCPE_2MARG;
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user