SCP: Add . pseudo symbol to reference the most recent address

Useful in EXAMINE and DEPOSIT.
This commit is contained in:
Mark Pizzolato 2016-09-26 18:23:55 -07:00
parent da3f5359bb
commit 9122a9f196
2 changed files with 24 additions and 10 deletions

Binary file not shown.

34
scp.c
View file

@ -493,6 +493,7 @@ volatile int32 stop_cpu = 0;
static char **sim_argv; static char **sim_argv;
t_value *sim_eval = NULL; t_value *sim_eval = NULL;
static t_value sim_last_val; static t_value sim_last_val;
static t_addr sim_last_addr;
FILE *sim_log = NULL; /* log file */ FILE *sim_log = NULL; /* log file */
FILEREF *sim_log_ref = NULL; /* log file file reference */ FILEREF *sim_log_ref = NULL; /* log file file reference */
FILE *sim_deb = NULL; /* debug file */ FILE *sim_deb = NULL; /* debug file */
@ -7528,17 +7529,27 @@ if (max && strncmp (cptr, "ALL", strlen ("ALL")) == 0) { /* ALL? */
*hi = max; *hi = max;
} }
else { else {
if (strncmp (cptr, "$", strlen ("$")) == 0) { /* $? */ if ((strncmp (cptr, ".", strlen (".")) == 0) && /* .? */
tptr = cptr + strlen ("$"); ((cptr[1] == '\0') ||
*hi = *lo = (t_addr)sim_last_val; (cptr[1] == '-') ||
(cptr[1] == ':') ||
(cptr[1] == '/'))) {
tptr = cptr + strlen (".");
*lo = *hi = sim_last_addr;
} }
else { else {
if (dptr && sim_vm_parse_addr) /* get low */ if (strncmp (cptr, "$", strlen ("$")) == 0) { /* $? */
*lo = sim_vm_parse_addr (dptr, cptr, &tptr); tptr = cptr + strlen ("$");
else *hi = *lo = (t_addr)sim_last_val;
*lo = (t_addr) strtotv (cptr, &tptr, rdx); }
if (cptr == tptr) /* error? */ else {
return NULL; if (dptr && sim_vm_parse_addr) /* get low */
*lo = sim_vm_parse_addr (dptr, cptr, &tptr);
else
*lo = (t_addr) strtotv (cptr, &tptr, rdx);
if (cptr == tptr) /* error? */
return NULL;
}
} }
if ((*tptr == '-') || (*tptr == ':')) { /* range? */ if ((*tptr == '-') || (*tptr == ':')) { /* range? */
cptr = tptr + 1; cptr = tptr + 1;
@ -7559,6 +7570,7 @@ else {
} }
else *hi = *lo; else *hi = *lo;
} }
sim_last_addr = *hi;
if (term && (*tptr++ != term)) if (term && (*tptr++ != term))
return NULL; return NULL;
return tptr; return tptr;
@ -9469,6 +9481,7 @@ t_stat sim_set_expect (EXPECT *exp, CONST char *cptr)
char gbuf[CBUFSIZE]; char gbuf[CBUFSIZE];
CONST char *tptr; CONST char *tptr;
CONST char *c1ptr; CONST char *c1ptr;
t_bool after_set = FALSE;
uint32 after = exp->after; uint32 after = exp->after;
int32 cnt = 0; int32 cnt = 0;
t_stat r; t_stat r;
@ -9488,13 +9501,14 @@ if ((!strncmp(gbuf, "HALTAFTER=", 10)) && (gbuf[10])) {
after = (uint32)get_uint (&gbuf[10], 10, 100000000, &r); after = (uint32)get_uint (&gbuf[10], 10, 100000000, &r);
if (r != SCPE_OK) if (r != SCPE_OK)
return sim_messagef (SCPE_ARG, "Invalid Halt After Value\n"); return sim_messagef (SCPE_ARG, "Invalid Halt After Value\n");
after_set = TRUE;
cptr = tptr; cptr = tptr;
} }
if ((*cptr != '"') && (*cptr != '\'')) if ((*cptr != '"') && (*cptr != '\''))
return sim_messagef (SCPE_ARG, "String must be quote delimited\n"); return sim_messagef (SCPE_ARG, "String must be quote delimited\n");
cptr = get_glyph_quoted (cptr, gbuf, 0); cptr = get_glyph_quoted (cptr, gbuf, 0);
return sim_exp_set (exp, gbuf, cnt, (after ? after : exp->after), sim_switches, cptr); return sim_exp_set (exp, gbuf, cnt, (after_set ? after : exp->after), sim_switches, cptr);
} }
/* Clear expect */ /* Clear expect */