1
0
mirror of https://github.com/simh/simh.git synced 2026-01-25 19:56:25 +00:00

Notes For V3.8

The makefile now works for Linux and most Unix's. Howevr, for Solaris
and MacOS, you must first export the OSTYPE environment variable:

> export OSTYPE
> make

Otherwise, you will get build errors.

1. New Features

1.1 3.8-0

1.1.1 SCP and Libraries

- BREAK, NOBREAK, and SHOW BREAK with no argument will set, clear, and
  show (respectively) a breakpoint at the current PC.

1.2 GRI

- Added support for the GRI-99 processor.

1.3 HP2100

- Added support for the BACI terminal interface.
- Added support for RTE OS/VMA/EMA, SIGNAL, VIS firmware extensions.

1.4 Nova

- Added support for 64KW memory (implemented in third-party CPU's).

1.5 PDP-11

- Added support for DC11, RC11, KE11A, KG11A.
- Added modem control support for DL11.
- Added ASCII character support for all 8b devices.

2. Bugs Fixed

Please see the revision history on http://simh.trailing-edge.com or
in the source module sim_rev.h.
This commit is contained in:
Bob Supnik
2008-06-24 14:21:00 -07:00
committed by Mark Pizzolato
parent 3cb7c60d5d
commit 59aa4a73b1
136 changed files with 57039 additions and 10915 deletions

114
scp.c
View File

@@ -1,6 +1,6 @@
/* scp.c: simulator control program
Copyright (c) 1993-2007, Robert M Supnik
Copyright (c) 1993-2008, Robert M Supnik
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
@@ -23,6 +23,9 @@
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert M Supnik.
31-Mar-08 RMS Fixed bug in local/global register search (found by Mark Pizzolato)
Fixed bug in restore of RO units (from Mark Pizzolato)
06-Feb-08 RMS Added SET/SHO/NO BR with default argument
18-Jul-07 RMS Modified match_ext for VMS ext;version support
28-Apr-07 RMS Modified sim_instr invocation to call sim_rtcn_init_all
Fixed bug in get_sim_opt
@@ -173,11 +176,6 @@
#include <signal.h>
#include <ctype.h>
#if defined (HAVE_READLINE)
#include <readline/readline.h>
#include <readline/history.h>
#endif
#define EX_D 0 /* deposit */
#define EX_E 1 /* examine */
#define EX_I 2 /* interactive */
@@ -329,6 +327,7 @@ t_stat attach_err (UNIT *uptr, t_stat stat);
t_stat detach_all (int32 start_device, t_bool shutdown);
t_stat assign_device (DEVICE *dptr, char *cptr);
t_stat deassign_device (DEVICE *dptr);
t_stat ssh_break_one (FILE *st, int32 flg, t_addr lo, int32 cnt, char *aptr);
t_stat run_boot_prep (void);
t_stat exdep_reg_loop (FILE *ofile, SCHTAB *schptr, int32 flag, char *cptr,
REG *lowr, REG *highr, uint32 lows, uint32 highs);
@@ -352,6 +351,7 @@ FILE *sim_ofile = NULL;
SCHTAB *sim_schptr = FALSE;
DEVICE *sim_dfdev = NULL;
UNIT *sim_dfunit = NULL;
int32 sim_opt_out = 0;
int32 sim_is_running = 0;
uint32 sim_brk_summ = 0;
uint32 sim_brk_types = 0;
@@ -525,7 +525,7 @@ static CTAB cmd_table[] = {
"set console arg{,arg...} set console options\n"
"set break <list> set breakpoints\n"
"set nobreak <list> clear breakpoints\n"
"set throttle x{M|K|%} set simulation rate\n"
"set throttle x{M|K|%%} set simulation rate\n"
"set nothrottle set simulation rate to maximum\n"
"set <dev> OCT|DEC|HEX set device display radix\n"
"set <dev> ENABLED enable device\n"
@@ -1372,10 +1372,11 @@ return;
t_stat show_version (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr)
{
int32 vmaj = SIM_MAJOR, vmin = SIM_MINOR, vpat = SIM_PATCH;
int32 vmaj = SIM_MAJOR, vmin = SIM_MINOR, vpat = SIM_PATCH, vdelt = SIM_DELTA;
if (cptr && (*cptr != 0)) return SCPE_2MARG;
fprintf (st, "%s simulator V%d.%d-%d", sim_name, vmaj, vmin, vpat);
if (vdelt) fprintf (st, "(%d)", vdelt);
if (flag) fprintf (st, " [%s, %s, %s]", sim_si64, sim_sa64, sim_snet);
fprintf (st, "\n");
return SCPE_OK;
@@ -1585,13 +1586,16 @@ t_stat r;
t_addr lo, hi, max = uptr->capac - 1;
int32 cnt;
if (*cptr == 0) return SCPE_2FARG;
if (sim_brk_types == 0) return SCPE_NOFNC;
if ((dptr == NULL) || (uptr == NULL)) return SCPE_IERR;
if (aptr = strchr (cptr, ';')) { /* ;action? */
if (flg != SSH_ST) return SCPE_ARG; /* only on SET */
*aptr++ = 0; /* separate strings */
}
if (*cptr == 0) { /* no argument? */
lo = (t_addr) get_rval (sim_PC, 0); /* use PC */
return ssh_break_one (st, flg, lo, 0, aptr);
}
while (*cptr) {
cptr = get_glyph (cptr, gbuf, ',');
tptr = get_range (dptr, gbuf, &lo, &hi, dptr->aradix, max, 0);
@@ -1611,24 +1615,7 @@ while (*cptr) {
}
else {
for ( ; lo <= hi; lo = lo + 1) {
switch (flg) {
case SSH_ST:
r = sim_brk_set (lo, sim_switches, cnt, aptr);
break;
case SSH_CL:
r = sim_brk_clr (lo, sim_switches);
break;
case SSH_SH:
r = sim_brk_show (st, lo, sim_switches);
break;
default:
return SCPE_ARG;
}
r = ssh_break_one (st, flg, lo, cnt, aptr);
if (r != SCPE_OK) return r;
}
}
@@ -1636,6 +1623,27 @@ while (*cptr) {
return SCPE_OK;
}
t_stat ssh_break_one (FILE *st, int32 flg, t_addr lo, int32 cnt, char *aptr)
{
switch (flg) {
case SSH_ST:
return sim_brk_set (lo, sim_switches, cnt, aptr);
break;
case SSH_CL:
return sim_brk_clr (lo, sim_switches);
break;
case SSH_SH:
return sim_brk_show (st, lo, sim_switches);
break;
default:
return SCPE_ARG;
}
}
/* Reset command and routines
re[set] reset all devices
@@ -2176,7 +2184,6 @@ if (v32) { /* [V3.2+] time as strin
else READ_I (sim_time); /* sim time */
READ_I (sim_rtime); /* [V2.6+] sim rel time */
sim_switches = SIM_SW_REST; /* flag restore */
for ( ;; ) { /* device loop */
READ_S (buf); /* read device name */
if (buf[0] == 0) break; /* last? */
@@ -2194,6 +2201,7 @@ for ( ;; ) { /* device loop */
dptr->flags = (dptr->flags & ~DEV_RFLAGS) | /* restore ctlr flags */
(flg & DEV_RFLAGS);
for ( ;; ) { /* unit loop */
sim_switches = SIM_SW_REST; /* flag rstr, clr RO */
READ_I (unitno); /* unit number */
if (unitno < 0) break; /* end units? */
if ((uint32) unitno >= dptr->numunits) { /* too big? */
@@ -2551,8 +2559,9 @@ for (gptr = gbuf, reason = SCPE_OK;
continue;
}
if ((lowr = find_reg (gptr, &tptr, tdptr)) ||
(lowr = find_reg_glob (gptr, &tptr, &tdptr))) {
if ((lowr = find_reg (gptr, &tptr, tdptr)) || /* local reg or */
(!(sim_opt_out & CMD_OPT_DFT) && /* no dflt, global? */
(lowr = find_reg_glob (gptr, &tptr, &tdptr)))) {
low = high = 0;
if ((*tptr == '-') || (*tptr == ':')) {
highr = find_reg (tptr + 1, &tptr, tdptr);
@@ -2705,7 +2714,7 @@ sz = SZ_R (rptr);
if ((rptr->depth > 1) && (rptr->flags & REG_CIRC)) {
idx = idx + rptr->qptr;
if (idx >= rptr->depth) idx = idx - rptr->depth;
}
}
if ((rptr->depth > 1) && (rptr->flags & REG_UNIT)) {
uptr = ((UNIT *) rptr->loc) + idx;
#if defined (USE_INT64)
@@ -3051,21 +3060,7 @@ char *read_line (char *cptr, int32 size, FILE *stream)
{
char *tptr;
#if !defined (HAVE_READLINE)
cptr = fgets (cptr, size, stream); /* get cmd line */
#else
if (stream != stdin) cptr = fgets (cptr, size, stream);
else {
char *tmpc = readline (NULL);
if (tmpc == NULL) cptr = NULL;
else {
strncpy (cptr, tmpc, size);
free (tmpc);
}
}
#endif
if (cptr == NULL) {
clearerr (stream); /* clear error */
return NULL; /* ignore EOF */
@@ -3503,7 +3498,6 @@ return cptr;
char *get_sim_opt (int32 opt, char *cptr, t_stat *st)
{
int32 t;
t_bool dfdu;
char *svptr, gbuf[CBUFSIZE];
DEVICE *tdptr;
UNIT *tuptr;
@@ -3517,7 +3511,7 @@ sim_stab.mask = 0;
sim_stab.comp = 0;
sim_dfdev = sim_dflt_dev;
sim_dfunit = sim_dfdev->units;
dfdu = FALSE; /* no default yet */
sim_opt_out = 0; /* no options yet */
*st = SCPE_OK;
while (*cptr) { /* loop through modifiers */
svptr = cptr; /* save current position */
@@ -3526,12 +3520,15 @@ while (*cptr) { /* loop through modifier
fclose (sim_ofile); /* one per customer */
*st = SCPE_ARG;
return NULL;
}
}
cptr = get_glyph_nc (cptr + 1, gbuf, 0);
sim_ofile = sim_fopen (gbuf, "a"); /* open for append */
if (sim_ofile) continue; /* if ok, look for more */
*st = SCPE_OPENERR; /* open failed */
return NULL;
if (sim_ofile == NULL) { /* open failed? */
*st = SCPE_OPENERR;
return NULL;
}
sim_opt_out |= CMD_OPT_OF; /* got output file */
continue;
}
cptr = get_glyph (cptr, gbuf, 0);
if ((t = get_switches (gbuf)) != 0) { /* try for switches */
@@ -3542,14 +3539,17 @@ while (*cptr) { /* loop through modifier
sim_switches = sim_switches | t; /* or in new switches */
}
else if ((opt & CMD_OPT_SCH) && /* if allowed, */
get_search (gbuf, sim_dfdev->dradix, &sim_stab)) /* try for search */
get_search (gbuf, sim_dfdev->dradix, &sim_stab)) { /* try for search */
sim_schptr = &sim_stab; /* set search */
else if ((opt & CMD_OPT_DFT) && !dfdu && /* if allowed, none yet*/
sim_opt_out |= CMD_OPT_SCH; /* got search */
}
else if ((opt & CMD_OPT_DFT) && /* default allowed? */
((sim_opt_out & CMD_OPT_DFT) == 0) && /* none yet? */
(tdptr = find_unit (gbuf, &tuptr)) && /* try for default */
(tuptr != NULL)) {
sim_dfdev = tdptr; /* set as default */
sim_dfunit = tuptr;
dfdu = TRUE; /* indicate dflt seen */
sim_opt_out |= CMD_OPT_DFT; /* got default */
}
else return svptr; /* not rec, break out */
}
@@ -3575,11 +3575,11 @@ pptr = strrchr (fnam, '.'); /* find last . */
if (pptr) { /* any? */
for (fptr = pptr + 1, eptr = ext; /* match characters */
#if defined (VMS) /* VMS: stop at ; or null */
(*fptr != 0) && (*fptr != ';');
(*fptr != 0) && (*fptr != ';');
#else
*fptr != 0; /* others: stop at null */
*fptr != 0; /* others: stop at null */
#endif
fptr++, eptr++) {
fptr++, eptr++) {
if (toupper (*fptr) != toupper (*eptr))
return NULL;
}