ここからはデバッグを始めるのですが、 その前に SIMH のログ機能を使うため、 幾つかの追加コードを入れましょう。
● pdp11_tu.c に対する追加
$ cvs diff -u pdp11_tu.c
cvs diff: Diffing .
Index: pdp11_tu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
retrieving revision 1.21
diff -u -r1.21 pdp11_tu.c
--- pdp11_tu.c 12 Dec 2003 05:49:11 -0000 1.21
+++ pdp11_tu.c 12 Dec 2003 07:45:49 -0000
@@ -10,7 +10,8 @@
extern int32 cpu_18b, cpu_ubm, cpu_rh11;
extern int32 int_req[IPL_HLVL];
extern int32 int_vec[IPL_HLVL][32];
-
+extern int32 cpu_log;
+extern FILE *sim_log;
#define TU_NUMDR 8 // #drives
#define USTAT u3 // unit status
@@ -274,6 +275,63 @@
0 // 07 Reserved
};
+char *reg_name[] = {
+ "TUCS1",
+ "TUWC ",
+ "TUBA ",
+ "TUFC ",
+ "TUCS2",
+ "TUFS ",
+ "TUER ",
+ "TUAS ",
+ "TUCC ",
+ "TUDB ",
+ "TUMR ",
+ "TUDT ",
+ "TUSN ",
+ "TUTC ",
+ "TUBAE",
+ "TUCS3",
+ NULL
+};
+
+char *fnc_name[] = {
+ "FNC_NOP",
+ "FNC_UNLOAD",
+ "002",
+ "FNC_REWIND",
+ "FNC_FCLR",
+ "005",
+ "006",
+ "007",
+ "FNC_RIP",
+ "011",
+ "FNC_ERASE",
+ "FNC_WREOF",
+ "FNC_SPACEF",
+ "FNC_SPACER",
+ "016",
+ "017",
+ "020",
+ "021",
+ "022",
+ "023",
+ "FNC_WCHKF",
+ "025",
+ "026",
+ "FNC_WCHKR",
+ "FNC_WRITE",
+ "031",
+ "032",
+ "033",
+ "FNC_READF",
+ "035",
+ "036",
+ "FNC_READR",
+ NULL
+};
+
+
static uint8 *xbuf = NULL; // xfer buffer
@@ -470,6 +528,10 @@
int32
tu_inta(void)
{
+#if 1
+if (DBG_LOG(LOG_TU))
+fprintf(sim_log, "# tu_inta()\n");
+#endif
tucs1 &= ~CS1_IE; // clear int enable
tuiff = 0; // clear CSTB INTR
return(VEC_TU); // acknowledge
@@ -528,7 +590,10 @@
t_mtrlnt tbc;
t_stat st;
t_stat r = SCPE_OK;
-
+#if 1
+if (DBG_LOG(LOG_TU))
+fprintf(sim_log, "# tu_svc(uptr)\n");
+#endif
drv = uptr - tu_dev.units; // get drive #
if (uptr->USTAT & FS_REW) { // rewind or unload?
sim_tape_rewind(uptr); // rewind tape
@@ -543,7 +608,11 @@
ba = (tubae << 16) | tuba; // get byte addr
wc = 0200000 - tuwc; // get word count
fc = 0200000 - tufc; // get frame count
-
+#if 1
+if (DBG_LOG(LOG_TU))
+fprintf(sim_log, "# f = 0%o, fmt = 0%o, ba = 0%o, wc = %d, fc = %d\n",
+f, fmt, ba, wc, fc);
+#endif
uptr->USTAT = 0; // clear status
switch (f) { // case on function
@@ -685,7 +754,10 @@
{
int32 fnc, den, space_test = FS_BOT;
UNIT *uptr;
-
+#if 1
+if (DBG_LOG(LOG_TU))
+ fprintf(sim_log, "# tu_go(drv = %d)\n", drv);
+#endif
fnc = GET_FNC(tucs1); // get function
den = GET_DEN(tutc); // get density
uptr = tu_dev.units + drv; // get unit
@@ -702,7 +774,10 @@
tufs &= ~FS_ATA; // clear attention
tutc &= ~TC_SAC; // clear addr change
-
+#if 1
+if (DBG_LOG(LOG_TU))
+ fprintf(sim_log, "# tu_go: tucs1 = 0%06o [%s]\n", tucs1, fnc_name[fnc]);
+#endif
switch (fnc) { // case on function
case FNC_FCLR: // drive clear
tuer = 0; // clear errors
@@ -779,14 +854,26 @@
case FNC_READF: // read
DATA_XFER:
if ((uptr->flags & UNIT_ATT) == 0) { // unattached?
+#if 1
+if (DBG_LOG(LOG_TU))
+ fprintf(sim_log, "# tu_go: unattached\n");
+#endif
tuer |= ER_UNS;
break;
}
if (fmt_test[GET_FMT(tutc)] == 0) { // invalid format?
+#if 1
+if (DBG_LOG(LOG_TU))
+ fprintf(sim_log, "# tu_go: invalid format\n");
+#endif
tuer |= ER_FER;
break;
}
if (den_test[den] == 0) { // invalid density?
+#if 1
+if (DBG_LOG(LOG_TU))
+ fprintf(sim_log, "# tu_go: invalid density\n");
+#endif
tuer |= ER_NXF;
break;
}
@@ -917,7 +1004,10 @@
update_tucs(0, drv);
break;
}
-
+#if 1
+if (DBG_LOG(LOG_TU))
+ fprintf(sim_log, "# tu_rd: %s: 0%06o\n", reg_name[j], *data);
+#endif
return(SCPE_OK);
}
@@ -939,7 +1029,10 @@
tuer = tuer | ER_RMR; // won't write
update_tucs (0, drv);
return SCPE_OK; }
-
+#if 1
+if (DBG_LOG(LOG_TU))
+ fprintf(sim_log, "# tu_wr: %s: 0%06o\n", reg_name[j], data);
+#endif
switch (j) { // decode PA<4:1>
case 000: // MTCS1
if ((access == WRITEB) && (PA & 1)) {
@@ -1100,7 +1193,8 @@
int32 u;
UNIT *uptr;
#if 1
-printf("# tu_reset(dptr)\r\n");
+if (DBG_LOG(LOG_TU))
+fprintf(sim_log, "# tu_reset(dptr)\n");
#endif
tucs1 = CS1_DVA | CS1_DONE;
tuba = 0;
@@ -1138,7 +1232,8 @@
int32 drv = uptr - tu_dev.units;
t_stat r;
#if 1
-printf("# tu_attach(uptr, cptr =\"%s\")\r\n", cptr);
+if (DBG_LOG(LOG_TU))
+fprintf(sim_log, "# tu_attach(uptr, cptr =\"%s\")\n", cptr);
#endif
r = sim_tape_attach(uptr, cptr);
if (r != SCPE_OK) {
@@ -1165,7 +1260,8 @@
{
int32 drv = uptr - tu_dev.units;
#if 1
-printf("# tu_detach(uptr)\r\n");
+if (DBG_LOG(LOG_TU))
+fprintf(sim_log, "# tu_detach(uptr)\n");
#endif
if (sim_is_active(uptr)) { // unit active?
sim_cancel(uptr); // cancel operation
$
● pdp11_defs.h に対する追加
$ cvs diff -u pdp11_defs.h Index: pdp11_defs.h =================================================================== RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_defs.h,v retrieving revision 1.3 diff -u -r1.3 pdp11_defs.h --- pdp11_defs.h 11 Dec 2003 11:26:09 -0000 1.3 +++ pdp11_defs.h 12 Dec 2003 06:06:30 -0000 @@ -565,20 +565,21 @@ /* Logging */ -#define LOG_CPU_I 0x0001 -#define LOG_TM 0x0008 -#define LOG_RP 0x0010 -#define LOG_TS 0x0020 -#define LOG_RQ 0x0040 -#define LOG_TQ 0x0080 -#define LOG_XQ0 0x0100 -#define LOG_XQ1 0x0200 -#define LOG_XQ2 0x0400 -#define LOG_XQ3 0x0800 -#define LOG_TC_MS 0x1000 -#define LOG_TC_RW 0x2000 -#define LOG_TC_BL 0x4000 -#define LOG_HK 0x8000 +#define LOG_CPU_I 0x00001 +#define LOG_TM 0x00008 +#define LOG_RP 0x00010 +#define LOG_TS 0x00020 +#define LOG_RQ 0x00040 +#define LOG_TQ 0x00080 +#define LOG_XQ0 0x00100 +#define LOG_XQ1 0x00200 +#define LOG_XQ2 0x00400 +#define LOG_XQ3 0x00800 +#define LOG_TC_MS 0x01000 +#define LOG_TC_RW 0x02000 +#define LOG_TC_BL 0x04000 +#define LOG_HK 0x08000 +#define LOG_TU 0x18000 #define DBG_LOG(x) (sim_log && (cpu_log & (x))) $
● pdp11_cpu.c に対する追加
$ cvs diff -u pdp11_cpu.c
Index: pdp11_cpu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_cpu.c,v
retrieving revision 1.1
diff -u -r1.1 pdp11_cpu.c
--- pdp11_cpu.c 12 Dec 2003 06:07:27 -0000 1.1
+++ pdp11_cpu.c 12 Dec 2003 06:08:15 -0000
@@ -415,7 +415,7 @@
{ ORDATA (STOP_TRAPS, stop_trap, TRAP_V_MAX) },
{ FLDATA (STOP_VECA, stop_vecabort, 0) },
{ FLDATA (STOP_SPA, stop_spabort, 0) },
- { HRDATA (DBGLOG, cpu_log, 16), REG_HIDDEN },
+ { HRDATA (DBGLOG, cpu_log, 32), REG_HIDDEN },
{ ORDATA (FAC0H, FR[0].h, 32) },
{ ORDATA (FAC0L, FR[0].l, 32) },
{ ORDATA (FAC1H, FR[1].h, 32) },
$
● ログ機能の動作確認
|
|