From 0b1050853efb5c1cb52f5ad24d6423d6e4a6f69d Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 10 Oct 2014 08:03:22 -0700 Subject: [PATCH] SCP: Allow for the potential of a breakpoint action to remove the establishing breakpoint while still completing pending actions --- AltairZ80/altairz80_cpu.c | 4 +--- scp.c | 31 +++++++++++++++++++++---------- scp.h | 2 ++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/AltairZ80/altairz80_cpu.c b/AltairZ80/altairz80_cpu.c index 30f9af9e..1716bf64 100644 --- a/AltairZ80/altairz80_cpu.c +++ b/AltairZ80/altairz80_cpu.c @@ -1942,8 +1942,6 @@ void PutByteDMA(const uint32 Addr, const uint32 Value) { static int32 sim_brk_lookup (const t_addr loc, const int32 btyp) { extern t_bool sim_brk_pend[SIM_BKPT_N_SPC]; extern t_addr sim_brk_ploc[SIM_BKPT_N_SPC]; - extern int32 sim_do_depth; - extern char *sim_brk_act[]; BRKTAB *bp; if ((bp = sim_brk_fnd (loc)) && /* entry in table? */ (btyp & bp -> typ) && /* type match? */ @@ -1951,7 +1949,7 @@ static int32 sim_brk_lookup (const t_addr loc, const int32 btyp) { (--(bp -> cnt) <= 0)) { /* count reach 0? */ bp -> cnt = 0; /* reset count */ sim_brk_ploc[0] = loc; /* save location */ - sim_brk_act[sim_do_depth] = bp -> act; /* set up actions */ + sim_brk_setact (bp -> act); /* set up actions */ sim_brk_pend[0] = TRUE; /* don't do twice */ return TRUE; } diff --git a/scp.c b/scp.c index 9f52aa10..00b0f309 100644 --- a/scp.c +++ b/scp.c @@ -392,7 +392,6 @@ t_stat sim_brk_clrall (int32 sw); t_stat sim_brk_show (FILE *st, t_addr loc, int32 sw); t_stat sim_brk_showall (FILE *st, int32 sw); char *sim_brk_getact (char *buf, int32 size); -void sim_brk_clract (void); void sim_brk_npc (uint32 cnt); BRKTAB *sim_brk_new (t_addr loc); FILE *stdnul; @@ -469,6 +468,7 @@ uint32 sim_brk_summ = 0; uint32 sim_brk_types = 0; uint32 sim_brk_dflt = 0; char *sim_brk_act[MAX_DO_NEST_LVL]; +char *sim_brk_act_buf[MAX_DO_NEST_LVL]; BRKTAB *sim_brk_tab = NULL; int32 sim_brk_ent = 0; int32 sim_brk_lnt = 0; @@ -2548,9 +2548,9 @@ do { (stat != SCPE_OK) && (stat != SCPE_STEP)) { if ((stat <= SCPE_MAX_ERR) && sim_on_actions[sim_do_depth][stat]) - sim_brk_act[sim_do_depth] = sim_on_actions[sim_do_depth][stat]; + sim_brk_setact (sim_on_actions[sim_do_depth][stat]); else - sim_brk_act[sim_do_depth] = sim_on_actions[sim_do_depth][0]; + sim_brk_setact (sim_on_actions[sim_do_depth][0]); } if (sim_vm_post != NULL) (*sim_vm_post) (TRUE); @@ -7460,7 +7460,7 @@ sim_brk_tab = (BRKTAB *) calloc (sim_brk_lnt, sizeof (BRKTAB)); if (sim_brk_tab == NULL) return SCPE_MEM; sim_brk_ent = sim_brk_ins = 0; -sim_brk_act[sim_do_depth] = NULL; +sim_brk_clract (); sim_brk_npc (0); return SCPE_OK; } @@ -7681,7 +7681,7 @@ if ((bp = sim_brk_fnd (loc)) && (btyp & bp->typ)) { /* in table, and type ma bp->cnt = 0; /* reset count */ sim_brk_ploc[spc] = loc; /* save location */ sim_brk_pend[spc] = TRUE; /* don't do twice */ - sim_brk_act[sim_do_depth] = bp->act; /* set up actions */ + sim_brk_setact (bp->act); /* set up actions */ return (btyp & bp->typ); } sim_brk_pend[spc] = FALSE; @@ -7699,8 +7699,9 @@ if (sim_brk_act[sim_do_depth] == NULL) /* any action? */ return NULL; while (isspace (*sim_brk_act[sim_do_depth])) /* skip spaces */ sim_brk_act[sim_do_depth]++; -if (*sim_brk_act[sim_do_depth] == 0) /* now empty? */ - return (sim_brk_act[sim_do_depth] = NULL); +if (*sim_brk_act[sim_do_depth] == 0) { /* now empty? */ + return sim_brk_clract (); + } if ((ep = strchr (sim_brk_act[sim_do_depth], ';'))) { /* cmd delimiter? */ lnt = ep - sim_brk_act[sim_do_depth]; /* cmd length */ memcpy (buf, sim_brk_act[sim_do_depth], lnt + 1); /* copy with ; */ @@ -7709,16 +7710,26 @@ if ((ep = strchr (sim_brk_act[sim_do_depth], ';'))) { /* cmd delimiter? */ } else { strncpy (buf, sim_brk_act[sim_do_depth], size); /* copy action */ - sim_brk_act[sim_do_depth] = NULL; /* no more */ + sim_brk_clract (); /* no more */ } return buf; } /* Clear pending actions */ -void sim_brk_clract (void) +char *sim_brk_clract (void) { -sim_brk_act[sim_do_depth] = NULL; +free (sim_brk_act_buf[sim_do_depth]); +return sim_brk_act[sim_do_depth] = sim_brk_act_buf[sim_do_depth] = NULL; +} + +/* Set up pending actions */ + +void sim_brk_setact (const char *action) +{ +sim_brk_act_buf[sim_do_depth] = realloc (sim_brk_act_buf[sim_do_depth], strlen (action) + 1); +strcpy (sim_brk_act_buf[sim_do_depth], action); +sim_brk_act[sim_do_depth] = sim_brk_act_buf[sim_do_depth]; } /* New PC */ diff --git a/scp.h b/scp.h index 56cf4d27..23fc9ed3 100644 --- a/scp.h +++ b/scp.h @@ -138,6 +138,8 @@ t_stat get_aval (t_addr addr, DEVICE *dptr, UNIT *uptr); BRKTAB *sim_brk_fnd (t_addr loc); uint32 sim_brk_test (t_addr bloc, uint32 btyp); void sim_brk_clrspc (uint32 spc); +char *sim_brk_clract (void); +void sim_brk_setact (const char *action); char *match_ext (char *fnam, char *ext); t_stat show_version (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); t_stat set_dev_debug (DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr);