From b4f3d6c6d8bb3ba106d4e2486f8d7905a3ffab91 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 26 Aug 2016 14:35:00 -0700 Subject: [PATCH] SCP: Breakpoint cleanup. - Add detailed error message info while parsing breakpoint commands - Properly limit breakpoint class values to reflect available mask bits - Declare globally sim_brk_npc since it is a documented API - Revise simh_breakpoints.doc to reflect current behavior --- doc/simh_breakpoints.doc | Bin 34816 -> 39424 bytes scp.c | 52 ++++++++++++++++++++++++++++++++------- scp.h | 1 + sim_defs.h | 5 ++-- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/doc/simh_breakpoints.doc b/doc/simh_breakpoints.doc index 103d2d6391a5e30a33961581ce1a921f9f3e4b7e..f40b6b6197378c84a57f99d6e3b4885b6ecd5e2e 100644 GIT binary patch delta 9792 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, max, 0); if (tptr == NULL) - return SCPE_ARG; + return sim_messagef (SCPE_ARG, "Invalid address specifier: %s\n", gbuf); if (*tptr == '[') { cnt = (int32) strtotv (tptr + 1, &t1ptr, 10); if ((tptr == t1ptr) || (*t1ptr != ']') || (flg != SSH_ST)) - return SCPE_ARG; + return sim_messagef (SCPE_ARG, "Invalid repeat count specifier: %s\n", tptr + 1); tptr = t1ptr + 1; } else cnt = 0; if (*tptr != 0) - return SCPE_ARG; + return sim_messagef (SCPE_ARG, "Unexpected argument: %s\n", tptr); if ((lo == 0) && (hi == max)) { if (flg == SSH_CL) sim_brk_clrall (sim_switches); @@ -6157,6 +6157,7 @@ if ((flag == RU_RUN) || (flag == RU_GO)) { /* run or go */ if (sim_switches == 0) sim_switches = sim_brk_dflt; sim_switches |= BRK_TYP_TEMP; /* make this a one-shot breakpoint */ + sim_brk_types |= BRK_TYP_TEMP; r = ssh_break (NULL, cptr, SSH_ST); if (r != SCPE_OK) return sim_messagef (r, "Unable to establish breakpoint at: %s\n", cptr); @@ -8120,6 +8121,35 @@ while (*cptr) { /* loop through modifier return cptr; } +/* put_switches put switches into string + + Inputs: + buf = pointer to string buffer + bufsize = size of string buffer + sw = switch bit mask + Outputs: + buf = buffer with switches converted to text +*/ + +char *put_switches (char *buf, size_t bufsize, int32 sw) +{ +char *optr = buf; +size_t i = 0; +int32 bit; + +memset (buf, 0, bufsize); +if ((sw == 0) || (bufsize < 3)) + return buf; +--bufsize; /* leave room for terminating NUL */ +*optr++ = '-'; +for (bit=0; bit <= ('Z'-'A'); bit++) + if (sw & (1 << bit)) + if ((size_t)(optr - buf) < bufsize) + *optr++ = 'A' + bit; +return buf; +} + + /* Match file extension Inputs: @@ -8996,9 +9026,13 @@ t_stat sim_brk_set (t_addr loc, int32 sw, int32 ncnt, CONST char *act) { BRKTAB *bp; -if (sw == 0) sw = sim_brk_dflt; -if ((sim_brk_types & sw) == 0) - return SCPE_NOFNC; +if ((sw == 0) || (sw == BRK_TYP_DYN_STEPOVER)) + sw |= sim_brk_dflt; +if (~sim_brk_types & sw) { + char gbuf[CBUFSIZE]; + + return sim_messagef (SCPE_NOFNC, "Unknown breakpoint type; %s\n", put_switches(gbuf, sizeof(gbuf), sw & ~sim_brk_types)); + } if ((sw & BRK_TYP_DYN_ALL) && act) /* can't specify an action with a dynamic breakpoint */ return SCPE_ARG; bp = sim_brk_fnd (loc); /* present? */ @@ -9105,7 +9139,7 @@ if (sw & SWMASK ('C')) { else fprint_val (st, loc, dptr->aradix, dptr->awidth, PV_LEFT); } if (bp->cnt > 0) - fprintf (st, " [%d]", bp->cnt); + fprintf (st, "[%d]", bp->cnt); if (bp->act != NULL) fprintf (st, "; %s", bp->act); fprintf (st, "\n"); diff --git a/scp.h b/scp.h index 8d995b30..5bd9e930 100644 --- a/scp.h +++ b/scp.h @@ -184,6 +184,7 @@ 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); +void sim_brk_npc (uint32 cnt); char *sim_brk_clract (void); void sim_brk_setact (const char *action); t_stat sim_send_input (SEND *snd, uint8 *data, size_t size, uint32 after, uint32 delay); diff --git a/sim_defs.h b/sim_defs.h index 60e04d85..d96aef86 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -301,8 +301,8 @@ typedef uint32 t_addr; /* Breakpoint spaces definitions */ -#define SIM_BKPT_N_SPC 16 /* max number spaces */ -#define SIM_BKPT_V_SPC 28 /* location in arg */ +#define SIM_BKPT_N_SPC (1 << (32 - SIM_BKPT_V_SPC)) /* max number spaces */ +#define SIM_BKPT_V_SPC (BRK_TYP_MAX + 1) /* location in arg */ /* Extended switch definitions (bits >= 26) */ @@ -718,6 +718,7 @@ struct BRKTAB { #define BRK_TYP_DYN_USR (SWMASK ('Z'+2)) #define BRK_TYP_DYN_ALL (BRK_TYP_DYN_USR|BRK_TYP_DYN_STEPOVER) /* Mask of All Dynamic types */ #define BRK_TYP_TEMP (SWMASK ('Z'+3)) /* Temporary (one-shot) */ +#define BRK_TYP_MAX (('Z'-'A')+3) /* Maximum breakpoint type */ int32 cnt; /* proceed count */ char *act; /* action string */ };