SCP: Avoid unexpected breakpoint interaction in revised RUN/GO commands
This commit is contained in:
parent
d21a344757
commit
a6e6968cfd
1 changed files with 14 additions and 4 deletions
18
scp.c
18
scp.c
|
@ -520,6 +520,7 @@ typedef enum {
|
|||
SW_NUMBER /* Numeric Value */
|
||||
} SWITCH_PARSE;
|
||||
SWITCH_PARSE get_switches (const char *cptr, int32 *sw_val, int32 *sw_number);
|
||||
void put_rval_pcchk (REG *rptr, uint32 idx, t_value val, t_bool pc_chk);
|
||||
void put_rval (REG *rptr, uint32 idx, t_value val);
|
||||
void fprint_help (FILE *st);
|
||||
void fprint_stopped (FILE *st, t_stat r);
|
||||
|
@ -8604,6 +8605,8 @@ if (sim_runlimit_enabled && /* If the run limit has
|
|||
GET_SWITCHES (cptr); /* get switches */
|
||||
sim_step = 0;
|
||||
if ((flag == RU_RUN) || (flag == RU_GO)) { /* run or go */
|
||||
t_bool new_pc = FALSE;
|
||||
|
||||
new_pcv = orig_pcv = get_rval (sim_PC, 0); /* get current PC value */
|
||||
if (*cptr != 0) { /* argument? */
|
||||
cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */
|
||||
|
@ -8615,11 +8618,12 @@ if ((flag == RU_RUN) || (flag == RU_GO)) { /* run or go */
|
|||
if ((tptr == gbuf) || (*tptr != 0) || /* error? */
|
||||
(new_pcv > width_mask[sim_PC->width]))
|
||||
return SCPE_ARG;
|
||||
new_pc = TRUE;
|
||||
}
|
||||
}
|
||||
if ((flag == RU_RUN) && /* run? */
|
||||
((r = sim_run_boot_prep (flag)) != SCPE_OK)) { /* reset sim */
|
||||
put_rval (sim_PC, 0, orig_pcv); /* restore original PC */
|
||||
put_rval_pcchk (sim_PC, 0, orig_pcv, FALSE); /* restore original PC */
|
||||
return r;
|
||||
}
|
||||
if ((*cptr) || (MATCH_CMD (gbuf, "UNTIL") == 0)) { /* should be end */
|
||||
|
@ -8649,7 +8653,7 @@ if ((flag == RU_RUN) || (flag == RU_GO)) { /* run or go */
|
|||
}
|
||||
sim_switches = saved_switches;
|
||||
}
|
||||
put_rval (sim_PC, 0, new_pcv); /* Save in PC */
|
||||
put_rval_pcchk (sim_PC, 0, new_pcv, new_pc); /* Save in PC */
|
||||
}
|
||||
|
||||
else if ((flag == RU_STEP) ||
|
||||
|
@ -9406,7 +9410,7 @@ return SCPE_OK;
|
|||
none
|
||||
*/
|
||||
|
||||
void put_rval (REG *rptr, uint32 idx, t_value val)
|
||||
void put_rval_pcchk (REG *rptr, uint32 idx, t_value val, t_bool pc_chk)
|
||||
{
|
||||
size_t sz;
|
||||
t_value mask;
|
||||
|
@ -9417,7 +9421,7 @@ uint32 *ptr;
|
|||
(sz)((*(((sz *) rp->loc) + id) & \
|
||||
~((m) << (rp)->offset)) | ((v) << (rp)->offset))
|
||||
|
||||
if (rptr == sim_PC)
|
||||
if (pc_chk && (rptr == sim_PC))
|
||||
sim_brk_npc (0);
|
||||
sz = SZ_R (rptr);
|
||||
mask = width_mask[rptr->width];
|
||||
|
@ -9471,6 +9475,12 @@ else PUT_RVAL (uint32, rptr, idx, val, mask);
|
|||
#endif
|
||||
}
|
||||
|
||||
void put_rval (REG *rptr, uint32 idx, t_value val)
|
||||
{
|
||||
put_rval_pcchk (rptr, idx, val, TRUE);
|
||||
}
|
||||
|
||||
|
||||
/* Examine address routine
|
||||
|
||||
Inputs: (sim_eval is an implicit argument)
|
||||
|
|
Loading…
Add table
Reference in a new issue