Allow --af for active function, if not given runs normally (tries to do I/O), impleme...
authorNick Downing <nick@ndcode.org>
Mon, 21 Oct 2019 11:22:05 +0000 (22:22 +1100)
committerNick Downing <nick@ndcode.org>
Mon, 21 Oct 2019 11:22:33 +0000 (22:22 +1100)
Makefile
dps8/dps8_cpu.c
dps8/dps8_faults.c
dps8/dps8_ins.c
dps8/dps8_simh.h
dps8/dps8_sys.c
dps8/scp.h
multics_sim.c

index a4057b2..35dec3f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-CFLAGS=-g -std=c99 -U__STRICT_ANSI__ -IdecNumber -Idps8 -D_GNU_SOURCE -DUSE_READER_THREAD -DUSE_INT64 -DTESTING -DEMULATOR_ONLY=1 -Wall -Wno-comment -Wno-unused-label -Wno-unused-result -Wno-unused-value -Wno-unused-variable -Wno-unused-function
+CFLAGS=-g -std=c99 -U__STRICT_ANSI__ -IdecNumber -Idps8 -D_GNU_SOURCE -DUSE_READER_THREAD -DUSE_INT64 -DTESTING -DEMULATOR_ONLY=1 -Wall -Wno-address -Wno-comment -Wno-unused-label -Wno-unused-result -Wno-unused-value -Wno-unused-variable -Wno-unused-function
 #-O3
 
 all: multics_sim dump_entries dump_segments
index de3f970..3f13401 100644 (file)
@@ -3166,7 +3166,7 @@ int32 core_read (/*word24*/word36 addr, word36 *data, const char * ctx)
       }
 #else
 #ifndef LOCKLESS
- printf("addr %012llo\n", addr);
//printf("addr %012llo\n", addr);
     if (M[(addr >> 18) & 077777][addr & 0777777] & MEM_UNINITIALIZED)
       {
         sim_debug (DBG_WARN, & cpu_dev,
index 7295818..e186fb5 100644 (file)
@@ -378,7 +378,6 @@ else if (faultNumber == FAULT_ACV)
                "Fault %d(0%0o), sub %"PRIu64"(0%"PRIo64"), dfc %c, '%s'\n", 
                faultNumber, faultNumber, subFault.bits, subFault.bits, 
                cpu . bTroubleFaultCycle ? 'Y' : 'N', faultMsg);
- abort();
 #ifdef HDBG
     hdbgFault (faultNumber, subFault, faultMsg);
 #endif
@@ -386,6 +385,7 @@ else if (faultNumber == FAULT_ACV)
     if_sim_debug (DBG_FAULT, & cpu_dev)
       traceInstruction (DBG_FAULT);
 #endif
+ abort();
 
     PNL (cpu.DACVpDF = faultNumber >=  FAULT_DF0 && faultNumber <= FAULT_ACV;)
 
index 088f5f1..3ef542b 100644 (file)
@@ -272,8 +272,8 @@ static void read_tra_op (void)
         // ISOLTS 870-02f
         //cpu.PPR.PSR = 0;
       }
-    sim_debug (DBG_TRACE, & cpu_dev, "%s %05o:%06o\n",
-               __func__, cpu.PPR.PSR, cpu.PPR.IC);
+//    sim_debug (DBG_TRACE, & cpu_dev, "%s %05o:%06o\n",
+//               __func__, cpu.PPR.PSR, cpu.PPR.IC);
     if (cpu.PPR.IC & 1)
       {
        cpu.cu.IWB   = cpu.CY;
@@ -1145,7 +1145,7 @@ void traceInstruction (uint flag)
 force:;
         char * compname;
         word18 compoffset;
- char *where = "somewhere";
+ char *where = NULL;
  //        char * where = lookup_address (cpu.PPR.PSR, cpu.PPR.IC, & compname,
  //                                       & compoffset);
         bool isBAR = TST_I_NBAR ? false : true;
@@ -1258,7 +1258,6 @@ force:;
                   GET_TD (cpu.currentInstruction.tag) & 017);
               }
           }
- fflush(stdout);
       }
 
   }
index 1bbf247..46fffd2 100644 (file)
@@ -23,11 +23,10 @@ extern DEVICE scu_dev;
 #endif
 #endif
 
-#define if_sim_debug(dbits, dptr)
-//#ifdef SPEED
-//#define if_sim_debug(dbits, dptr) if ((0))
-//
-//#else
+#ifdef SPEED
+#define if_sim_debug(dbits, dptr) if ((0))
+
+#else
 //      // ((dptr != & cpu_dev) || current_running_cpu_idx == 1) && 
 //
 //#define if_sim_debug(dbits, dptr) \
@@ -35,7 +34,7 @@ extern DEVICE scu_dev;
 //      sim_deb && \
 //      isISOLTS && \
 //      (((dptr)->dctrl & (dbits)) || (dbits) == 0) && \
-//      ((dptr != & cpu_dev) || ((1 << current_running_cpu_idx) & dbgCPUMask)) && \
+//      ((dptr != & cpu_dev) || ((1 << current_running_cpu_idx) & dbgCPUMask)) &&*/ \
 //      ((dptr != & cpu_dev) || (((dptr)->dctrl & (DBG_INTR | DBG_FAULT))) || (! sim_deb_segno_on) || sim_deb_segno[cpu.PPR.PSR & (DEBUG_SEGNO_LIMIT - 1)]) && \
 //      ((dptr != & cpu_dev) || sim_deb_ringno == NO_SUCH_RINGNO || sim_deb_ringno == cpu . PPR. PRR) && \
 //      ((dptr != & cpu_dev) || (! sim_deb_bar) || (! TST_I_NBAR)) && \
@@ -44,26 +43,33 @@ extern DEVICE scu_dev;
 //      (sim_deb_mme_cntdwn == 0) && \
 //      ((dptr != & cpu_dev) | (((dbits) & DBG_TRACE) ? (sim_deb_skip_cnt ++ >= sim_deb_skip_limit) : (sim_deb_skip_cnt >= sim_deb_skip_limit))) \
 //    ) 
-//#endif
-//
-//#if !defined(THREADZ) && !defined(LOCKLESS)
-//#define dps8_sim_debug _sim_debug
-//#endif
-//
-//#undef sim_debug
-//#if defined(THREADZ) || defined(LOCKLESS)
-//#define sim_debug(dbits, dptr, ...) \
-//  if_sim_debug((dbits), dptr) \
-//    dps8_sim_debug ((dbits), dptr, DBG_CTR, __VA_ARGS__); \
-//  else \
-//    (void) 0
-//#else
-//#define sim_debug(dbits, dptr, ...) \
-//  if_sim_debug((dbits), dptr) \
-//    dps8_sim_debug ((dbits), dptr, __VA_ARGS__); \
-//  else \
-//    (void) 0
-//#endif
+#define if_sim_debug(dbits, dptr) \
+  if ( \
+      sim_deb && \
+      isISOLTS && \
+      (((dptr)->dctrl & (dbits)) || (dbits) == 0) \
+    )
+
+#endif
+
+#if !defined(THREADZ) && !defined(LOCKLESS)
+#define dps8_sim_debug _sim_debug
+#endif
+
+#undef sim_debug
+#if defined(THREADZ) || defined(LOCKLESS)
+#define sim_debug(dbits, dptr, ...) \
+  if_sim_debug((dbits), dptr) \
+    dps8_sim_debug ((dbits), dptr, DBG_CTR, __VA_ARGS__); \
+  else \
+    (void) 0
+#else
+#define sim_debug(dbits, dptr, ...) \
+  if_sim_debug((dbits), dptr) \
+    dps8_sim_debug ((dbits), dptr, __VA_ARGS__); \
+  else \
+    (void) 0
+#endif
 
 /* scp Debug flags */
 
index c8e678e..d2e2d81 100644 (file)
@@ -2,6 +2,7 @@
 #include <stdio.h>
 #include "dps8_sys.h"
 
+FILE *sim_deb;
 FILE *sim_log;
 
 #ifndef SCUMEM
@@ -9,3 +10,11 @@ FILE *sim_log;
 #endif
 
 uint64 sim_deb_mme_cntdwn = 0;
+
+GCC_FMT_ATTR(3, 4)
+void _sim_debug (uint32 dbits, DEVICE* dptr, const char *fmt, ...) {
+  va_list ap;
+  va_start(ap, fmt);
+  vfprintf(sim_deb, fmt, ap);
+  va_end(ap);
+}
index 80e8bf4..30bf49c 100644 (file)
@@ -228,7 +228,7 @@ void sim_debug_bits (uint32 dbits, DEVICE* dptr, BITFIELD* bitdefs,
 void sim_debug (uint32 dbits, void* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4);\r
 #else\r
 void _sim_debug (uint32 dbits, void* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4);\r
-#define sim_debug(dbits, dptr, ...) do { if (sim_deb && dptr && ((dptr)->dctrl & dbits)) _sim_debug (dbits, dptr, __VA_ARGS__);} while (0)\r
+#define sim_debug(dbits, dptr, ...) do { if (sim_deb && (dptr) && ((dptr)->dctrl & (dbits))) _sim_debug (dbits, dptr, __VA_ARGS__);} while (0)\r
 #endif\r
 #else\r
 #ifdef CANT_USE_MACRO_VA_ARGS\r
@@ -236,8 +236,10 @@ void _sim_debug (uint32 dbits, void* dptr, const char *fmt, ...) GCC_FMT_ATTR(3,
 void sim_debug (uint32 dbits, DEVICE* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4);\r
 #else\r
 void _sim_debug (uint32 dbits, DEVICE* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4);\r
-//#define sim_debug(dbits, dptr, ...) do { if (sim_deb && dptr && ((dptr)->dctrl & dbits)) _sim_debug (dbits, dptr, __VA_ARGS__);} while (0)\r
-#define sim_debug(dbits, dptr, ...) printf(__VA_ARGS__)\r
+// proper way:\r
+#define sim_debug(dbits, dptr, ...) do { if (sim_deb && (dptr) && ((dptr)->dctrl & (dbits))) _sim_debug (dbits, dptr, __VA_ARGS__);} while (0)\r
+// hack to enable all debugging output:\r
+//#define sim_debug(dbits, dptr, ...) printf(__VA_ARGS__)\r
 #endif\r
 #endif\r
 void fprint_stopped_gen (FILE *st, t_stat v, REG *pc, DEVICE *dptr);\r
index 031f579..84d0b20 100644 (file)
@@ -11,6 +11,7 @@
 #include "definition_dcls.h"
 #include "dps8/dps8.h"
 #include "dps8/dps8_cpu.h"
+#include "dps8/dps8_simh.h"
 #include "dps8/dps8_sys.h"
 #include "linkdcl.h"
 #include "object_map.h"
 #include "stack_frame.h"
 #include "stack_header.h"
 
+#define NAME_LEN 0x20
+#define LINE_LEN 0x100
+#define PATH_LEN 0x1000
+#define RESULT_LEN 0x400 // must be multiple of 4
+
 struct arg_list {
   uint64_t pad0 : 18;
   uint64_t desc_count : 18;
@@ -134,7 +140,7 @@ const char *xlate_segment(const char *name) {
   // search for segment in path
   int path_index;
   for (path_index = 0; path_index < N_PATHS; ++path_index) {
-    char path[0x1000];
+    char path[PATH_LEN];
     rassert(strlen(paths[path_index]) + 6 < sizeof(path));
     strcpy(path, paths[path_index]);
     strcat(path, ".xlate");
@@ -144,8 +150,8 @@ const char *xlate_segment(const char *name) {
       fprintf(stderr, "can't find index %s\n", path);
       exit(EXIT_FAILURE);
     }
-    static char line[0x100];
-    while (fgets(line, 0x100, fp)) {
+    static char line[LINE_LEN];
+    while (fgets(line, sizeof(line), fp)) {
       char *q = strchr(line, ' ');
       if (q) {
         *q++ = 0;
@@ -154,7 +160,7 @@ const char *xlate_segment(const char *name) {
           char *r = strchr(q, '\n');
           if (r)
             *r = 0;
-          printf("xlate segment %s to %s\n", name, q);
+          printf("xlate segname %s to %s\n", name, q);
           return q;
         }
       }
@@ -162,7 +168,7 @@ const char *xlate_segment(const char *name) {
     fclose(fp);
   }
 
-  printf("can't xlate segment %s\n", name);
+  printf("can't xlate segname %s\n", name);
   return name;
 }
 
@@ -180,13 +186,13 @@ struct loaded_segment *load_segment(const char *name) {
   rassert(p->name);
 
   p->segment = allocate_segment();
-  printf("loading segment name %s into segment %06o\n", name, p->segment);
+  printf("load segname %s into segment %06o\n", name, p->segment);
   loaded_segment_xref[p->segment] = p;
 
   // search for segment in path
   int path_index;
   for (path_index = 0; path_index < N_PATHS; ++path_index) {
-    char path[0x1000];
+    char path[PATH_LEN];
     rassert(strlen(paths[path_index]) + strlen(name) < sizeof(path));
     strcpy(path, paths[path_index]);
     strcat(path, name);
@@ -207,12 +213,12 @@ struct loaded_segment *load_segment(const char *name) {
       goto found_segment;
     }
   }
-  fprintf(stderr, "can't find segment name %s in paths list\n", name);
+  fprintf(stderr, "can't find segname %s in paths list\n", name);
   exit(EXIT_FAILURE);
 
 found_segment:
   ;
-  char path[0x1000];
+  char path[PATH_LEN];
   rassert(strlen(paths[path_index]) + 4 < sizeof(path));
   strcpy(path, paths[path_index]);
   strcat(path, ".dir");
@@ -222,8 +228,8 @@ found_segment:
     fprintf(stderr, "can't find index %s\n", path);
     exit(EXIT_FAILURE);
   }
-  char line[0x100];
-  while (fgets(line, 0x100, fp)) {
+  char line[LINE_LEN];
+  while (fgets(line, sizeof(line), fp)) {
     char *q = strchr(line, ' ');
     if (q) {
       *q++ = 0;
@@ -236,7 +242,7 @@ found_segment:
   }
   fclose(fp);
 
-  fprintf(stderr, "can't find segment name %s in index %s\n", name, path);
+  fprintf(stderr, "can't find segname %s in index %s\n", name, path);
   exit(EXIT_FAILURE);
 
 found_bitcount:
@@ -329,7 +335,7 @@ int find_entry(
         );
       rassert(segname_definition->class == CLASS_SEGNAME);
 
-      char segname[0x20];
+      char segname[NAME_LEN];
       get_acc_string(
         (uint64_t *)definition_header + segname_definition->name_relp,
         segname,
@@ -338,7 +344,7 @@ int find_entry(
 
       if (strcmp(segname, entry_segname) == 0) {
 #endif
-        char name[0x20];
+        char name[NAME_LEN];
         get_acc_string(
           (uint64_t *)definition_header + definition->name_relp,
           name,
@@ -430,14 +436,14 @@ bool snap_link(void) {
   switch (type_pair->type) {
   case LINK_REFNAME_OFFSETNAME:
     {
-      char segname[0x20];
+      char segname[NAME_LEN];
       get_acc_string(
         (uint64_t *)definition_header + type_pair->segname_relp,
         segname,
         sizeof(segname)
       );
 
-      char offsetname[0x20];
+      char offsetname[NAME_LEN];
       get_acc_string(
         (uint64_t *)definition_header + type_pair->offsetname_relp,
         offsetname,
@@ -471,9 +477,15 @@ bool snap_link(void) {
 }
 
 int main(int argc, char **argv) {
+  bool af = false;
+  if (argc >= 2 && strcmp(argv[1], "--af") == 0) {
+    af = true;
+    memmove(argv + 1, argv + 2, (argc - 2) * sizeof(char **));
+    --argc;
+  }
   if (argc < 2) {
     printf(
-      "usage: %s entry_segname$entry_name [arguments]\n",
+      "usage: %s [--af] entry_segname$entry_name [arguments]\n",
       argv[0]
     );
     exit(EXIT_FAILURE);
@@ -490,6 +502,38 @@ int main(int argc, char **argv) {
   char **args = argv + 2;
 
   // initialize CPU
+  sim_deb = stderr;
+  cpu_dev.dctrl =
+    //DBG_TRACE |
+    //DBG_MSG |
+    //DBG_REGDUMPAQI |
+    //DBG_REGDUMPIDX |
+    //DBG_REGDUMPPR |
+    //DBG_REGDUMPPPR |
+    //DBG_REGDUMPDSBR |
+    //DBG_REGDUMPFLT |
+    //DBG_REGDUMP |
+    //DBG_REGDUMP |
+    //DBG_ADDRMOD |
+    //DBG_APPENDING |
+    //DBG_TRACEEXT |
+    //DBG_WARN |
+    //DBG_DEBUG |
+    //DBG_INFO |
+    //DBG_NOTIFY |
+    //DBG_SIM_USES_16 |
+    //DBG_SIM_USES_17 |
+    //DBG_SIM_USES_18 |
+    //DBG_ERR |
+    //DBG_ALL |
+    DBG_FAULT |
+    //DBG_INTR |
+    //DBG_CORE |
+    //DBG_CYCLE |
+    //DBG_CAC |
+    //DBG_FINAL |
+    //DBG_AVC |
+    0;
   cpu_reset_unit_idx(0, false);
   set_addr_mode(APPEND_mode);
 
@@ -572,13 +616,11 @@ int main(int argc, char **argv) {
   );
 
   // append command line to first stack frame
-  int arg_list_offset = allocate_stack(6 + n_args * 4, 2);
+  int n_args_af = n_args + af;
+  int arg_list_offset = allocate_stack(2 + n_args_af * 4, 2);
   struct arg_list *arg_list = (struct arg_list *)(
     M[stack_segment] + arg_list_offset
   );
-  //arg_list->arg_count = n_args + 1;
-  //arg_list->code = 4;
-  //arg_list->desc_count = n_args;
 
   for (int i = 0; i < n_args; ++i) {
     int arg_offset = allocate_stack((strlen(args[i]) + 3) >> 2, 1);
@@ -593,7 +635,7 @@ int main(int argc, char **argv) {
       sizeof(struct arg_desc) / sizeof(uint64_t),
       1
     );
-    arg_list->args[n_args + 1 + i] =
+    arg_list->args[n_args_af + i] =
       its_pointer(stack_segment, arg_desc_offset);
 
     struct arg_desc *arg_desc = (struct arg_desc *)(
@@ -606,24 +648,27 @@ int main(int argc, char **argv) {
     arg_desc->size = strlen(args[i]);
   }
 
-  int result_offset = allocate_stack(0x101, 1); // 1 kbyte of output
-  arg_list->args[n_args] = its_pointer(stack_segment, result_offset + 1);
+  int result_offset = 0; // shuts up compiler
+  if (af) {
+    result_offset = allocate_stack(((RESULT_LEN + 3) >> 2) + 1, 1);
+    arg_list->args[n_args] = its_pointer(stack_segment, result_offset + 1);
 
-  int arg_desc_offset = allocate_stack(
-    sizeof(struct arg_desc) / sizeof(uint64_t),
-    1
-  );
-  arg_list->args[n_args * 2 + 1] =
-    its_pointer(stack_segment, arg_desc_offset);
+    int arg_desc_offset = allocate_stack(
+      sizeof(struct arg_desc) / sizeof(uint64_t),
+      1
+    );
+    arg_list->args[n_args_af + n_args] =
+      its_pointer(stack_segment, arg_desc_offset);
 
-  struct arg_desc *arg_desc = (struct arg_desc *)(
-    M[stack_segment] + arg_desc_offset
-  );
-  arg_desc->flag = 1; // version 2 descriptor
-  arg_desc->type = 22; // varying character string
-  arg_desc->packed = 0;
-  arg_desc->number_dims = 0;
-  arg_desc->size = 0x400; // 1 kbyte of output
+    struct arg_desc *arg_desc = (struct arg_desc *)(
+      M[stack_segment] + arg_desc_offset
+    );
+    arg_desc->flag = 1; // version 2 descriptor
+    arg_desc->type = 22; // varying character string
+    arg_desc->packed = 0;
+    arg_desc->number_dims = 0;
+    arg_desc->size = RESULT_LEN;
+  }
 
   stack_header->stack_end_ptr = its_pointer(
     stack_segment,
@@ -670,15 +715,17 @@ int main(int argc, char **argv) {
   }
 
   // print result string
-  char text[0x401];
-  uint64_t *result = (uint64_t *)(M[stack_segment] + result_offset);
-  int len = (int)(*result++ & 0777777);
-  rassert(len < sizeof(result));
-  static int shifts[4] = {27, 18, 9, 0};
-  for (int i = 0; i < len; ++i)
-    text[i] = (char)(result[i >> 2] >> shifts[i & 3]);
-  text[len] = 0;
-  printf("%s\n", text);
+  if (af) {
+    char text[RESULT_LEN + 1];
+    uint64_t *result = (uint64_t *)(M[stack_segment] + result_offset);
+    int len = (int)(*result++ & 0777777);
+    rassert(len < sizeof(text));
+    static int shifts[4] = {27, 18, 9, 0};
+    for (int i = 0; i < len; ++i)
+      text[i] = (char)(result[i >> 2] >> shifts[i & 3]);
+    text[len] = 0;
+    printf("%s\n", text);
+  }
 
   return 0;
 }