From a6e6968cfd279d1f57d32d39bf008ed179c28b86 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 1 Dec 2020 12:05:42 -0800 Subject: [PATCH] SCP: Avoid unexpected breakpoint interaction in revised RUN/GO commands --- scp.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/scp.c b/scp.c index 2aca151b..e3fb9a8c 100644 --- a/scp.c +++ b/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)