#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) \
// 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)) && \
// (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 */
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
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
#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;
// 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");
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;
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;
}
}
fclose(fp);
}
- printf("can't xlate segment %s\n", name);
+ printf("can't xlate segname %s\n", name);
return 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);
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");
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;
}
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:
);
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,
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,
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,
}
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);
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);
);
// 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);
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 *)(
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,
}
// 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;
}