TM03/TE16のサポート - Page 2

2003.12.10

というわけで、 取り敢えず pdp11_tu.c のスケルトンを作るところから始めます。


pdp11_sys.c に DEVICE を追加する
ここでは SIMH の新しいデバイス TU を追加することにします。 で、まず TU 部分の実装を始める前に、 SIMH 本体のインターフェースを追加します。 こうすれば、 インターフェースとして何を用意すればいいか良く分かるからね。

新しいデバイスのインターフェースを追加するためには、 エミュレートするコンピュータのシステム構成を定義している pdp11_sys.c にエントリを追加します。


$ cp ../PDP11/pdp11_sys.c .
$ cvs add pdp11_sys.c 
cvs add: scheduling file `pdp11_sys.c' for addition
cvs add: use 'cvs commit' to add this file permanently
$ cvs commit -m "from ../PDP11/pdp11_sys.c"
cvs commit: Examining .
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_sys.c,v
done
Checking in pdp11_sys.c;
/wrk/simh/cvs/src/simh/pdp11e/pdp11_sys.c,v  <--  pdp11_sys.c
initial revision: 1.1
done
$ vi pdp11_sys.c
	....
$ cvs diff -u
cvs diff: Diffing .
Index: pdp11_sys.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_sys.c,v
retrieving revision 1.1
diff -u -r1.1 pdp11_sys.c
--- pdp11_sys.c 9 Dec 2003 10:06:53 -0000       1.1
+++ pdp11_sys.c 9 Dec 2003 10:09:09 -0000
@@ -65,6 +65,7 @@
 extern DEVICE tq_dev;
 extern DEVICE xq_dev, xqb_dev;
 extern DEVICE xu_dev;
+extern DEVICE tu_dev;
 extern UNIT cpu_unit;
 extern REG cpu_reg[];
 extern uint16 *M;
@@ -113,6 +114,7 @@
        &xq_dev,
        &xqb_dev,
        &xu_dev,
+       &tu_dev,
        NULL };
 
 const char *sim_stop_messages[] = {

と2行追加するだけでOKです。
make すると、、、


$ make
cc  -o pdp11e  pdp11_fp.o pdp11_cpu.o pdp11_dz.o pdp11_cis.o pdp11_lp.o pdp11_rk.o pdp11_rl.o pdp11_rp.o pdp11_rx.o pdp11_stddev.o pdp11_sys.o pdp11_tc.o pdp11_tm.o pdp11_ts.o pdp11_io.o pdp11_rq.o pdp11_tq.o pdp11_pclk.o pdp11_ry.o pdp11_pt.o pdp11_hk.o pdp11_xq.o pdp11_xu.o scp.o scp_tty.o sim_sock.o sim_tmxr.o sim_ether.o sim_tape.o -lm
pdp11_sys.o: In function `sim_load':
/wrk/simh/src/simh/pdp11e/pdp11_sys.c:182: undefined reference to `tu_dev'
collect2: ld returned 1 exit status
make: *** [pdp11e] Error 1
$ 

DEVICE 構造体の tu_dev が未定義になってますよね?
SIMH のデバイスはは全てこの DEVICE 構造体を介してインターフェースされます。


pdp11_tu.c を追加する
デバイス TU を実装するソースファイル pdp11_tu.c を追加します。 もちろん Makefile にもエントリを追加します。


$ cat > pdp11_tu.c
/*
 *	$Id: page2.html,v 1.5 2003/12/12 08:14:51 fujita Exp $
 */


<CNTL-D>
$ cvs add pdp11_tu.c
cvs add pdp11_tu.c 
cvs add: scheduling file `pdp11_tu.c' for addition
cvs add: use 'cvs commit' to add this file permanently
$ cvs commit -m "New File"
cvs commit: Examining .
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
done
Checking in pdp11_tu.c;
/wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v  <--  pdp11_tu.c
initial revision: 1.1
done
$ vi Makefile
    ....
$ cvs diff -u
cvs diff: Diffing .
Index: Makefile
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/Makefile,v
retrieving revision 1.1
diff -u -r1.1 Makefile
--- Makefile    7 Dec 2003 11:07:11 -0000       1.1
+++ Makefile    9 Dec 2003 10:30:18 -0000
@@ -28,6 +28,7 @@
 SRCS+= pdp11_hk.c
 SRCS+= pdp11_xq.c
 SRCS+= pdp11_xu.c
+SRCS+= pdp11_tu.c
 SRCS+= scp.c
 SRCS+= scp_tty.c
 SRCS+= sim_sock.c
$ make
cc -g -DVM_PDP11 -I./ -I../ -I../PDP11   -c -o pdp11_tu.o pdp11_tu.c
cc  -o pdp11e  pdp11_fp.o pdp11_cpu.o pdp11_dz.o pdp11_cis.o pdp11_lp.o pdp11_rk.o pdp11_rl.o pdp11_rp.o pdp11_rx.o pdp11_stddev.o pdp11_sys.o pdp11_tc.o pdp11_tm.o pdp11_ts.o pdp11_io.o pdp11_rq.o pdp11_tq.o pdp11_pclk.o pdp11_ry.o pdp11_pt.o pdp11_hk.o pdp11_xq.o pdp11_xu.o pdp11_tu.o scp.o scp_tty.o sim_sock.o sim_tmxr.o sim_ether.o sim_tape.o -lm
pdp11_sys.o: In function `sim_load':
/wrk/simh/src/simh/pdp11e/pdp11_sys.c:182: undefined reference to `tu_dev'
collect2: ld returned 1 exit status
make: *** [pdp11e] Error 1
$ cvs commit -m "add pdp11_tu.c"
cvs commit: Examining .
Checking in Makefile;
/wrk/simh/cvs/src/simh/pdp11e/Makefile,v  <--  Makefile
new revision: 1.2; previous revision: 1.1
done
$ 

特に説明はいらないですよね?


tu_dev を定義する
次に tu_dev を定義します。 この構造体は SIMH の DEVICE 構造体として定義されていますが、 これはデバイスそのものを表す構造体です。 そのデバイスを要約している構造体でもありますから、 デバイスの種別によって定義の方法が若干違います。 ここではお隣の ../PDP10/pdp10_tu.c を参考にします。


$ vi pdp11_tu.c
    ....
$ cvs diff -u
cvs diff: Diffing .
Index: pdp11_tu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
retrieving revision 1.1
diff -u -r1.1 pdp11_tu.c
--- pdp11_tu.c  9 Dec 2003 10:29:09 -0000       1.1
+++ pdp11_tu.c  9 Dec 2003 10:46:11 -0000
@@ -2,4 +2,36 @@
  *     $Id: page2.html,v 1.5 2003/12/12 08:14:51 fujita Exp $
  */
 
+#include "pdp11_defs.h"
+#include "sim_tape.h"
 
+#define TU_NUMDR       8                               /* #drives */
+
+
+t_stat tu_reset(DEVICE *dptr);
+t_stat tu_boot(int32 unitno, DEVICE *dptr);
+t_stat tu_attach(UNIT *uptr, char *cptr);
+t_stat tu_detach(UNIT *uptr);
+
+
+DEVICE tu_dev = {
+       "TU",           // name
+       tu_unit,        // units
+       tu_reg,         // registers
+       tu_mod,         // modifiers
+       TU_NUMDR,       // #units
+       DEV_RDX,        // address radix
+       30,             // address width
+       1,              // addr increment
+       DEV_RDX,        // data radix
+       16,             // data width
+       NULL,           // examin routine
+       NULL,           // deposit routine
+       &tu_reset,      // reset routine
+       &tu_boot,       // boot routine
+       &tu_attach,     // attatch routine
+       &tu_detach,     // detatch routine
+       &tu_dib,        // context
+       (DEV_DISABLE | DEV_UBUS),       // flags
+       NULL            // memory size change
+};

見ての通り ../PDP10/pdp10_tu.c の内容をカット&ペーストしただけです。 で、この構造体が参照している 各ルーチンの定義は後回しにしたいので、 取り敢えず宣言だけしておきました。 make すると、、、


$ make
cc -g -DVM_PDP11 -I./ -I../ -I../PDP11   -c -o pdp11_tu.o pdp11_tu.c
pdp11_tu.c:19: `tu_unit' undeclared here (not in a function)
pdp11_tu.c:19: initializer element is not constant
pdp11_tu.c:19: (near initialization for `tu_dev.units')
pdp11_tu.c:20: `tu_reg' undeclared here (not in a function)
pdp11_tu.c:20: initializer element is not constant
pdp11_tu.c:20: (near initialization for `tu_dev.registers')
pdp11_tu.c:21: `tu_mod' undeclared here (not in a function)
pdp11_tu.c:21: initializer element is not constant
pdp11_tu.c:21: (near initialization for `tu_dev.modifiers')
pdp11_tu.c:30: `tu_reset' undeclared here (not in a function)
pdp11_tu.c:30: initializer element is not constant
pdp11_tu.c:30: (near initialization for `tu_dev.reset')
pdp11_tu.c:31: `tu_boot' undeclared here (not in a function)
pdp11_tu.c:31: initializer element is not constant
pdp11_tu.c:31: (near initialization for `tu_dev.boot')
pdp11_tu.c:32: `tu_attach' undeclared here (not in a function)
pdp11_tu.c:32: initializer element is not constant
pdp11_tu.c:32: (near initialization for `tu_dev.attach')
pdp11_tu.c:33: `tu_detach' undeclared here (not in a function)
pdp11_tu.c:33: initializer element is not constant
pdp11_tu.c:33: (near initialization for `tu_dev.detach')
pdp11_tu.c:34: `tu_dib' undeclared here (not in a function)
pdp11_tu.c:34: initializer element is not constant
pdp11_tu.c:34: (near initialization for `tu_dev.ctxt')
make: *** [pdp11_tu.o] Error 1
$ 

はい、未定義の構造体に関するエラーがでましたね。 では1つずつ定義していきましょう。


tu_unit を定義する
tu_unit はそのデバイスが管理するユニットを表す構造体です。 SIMH でのデバイスとは、 そのデバイスを制御するコントローラと 制御されるドライブあるいはメディアそのものを一体で定義します。 今回の場合は TM03 が「制御するコントローラ」に、 TE16 および それにマウントされるテープが 「ドライブ」と「メディア」になります。 したがって tu_unit には TE16 に相当する情報が定義されます。
もう少し分かり易い例をあげると SIMH を使う場合、 "set tuX ..." あるいは "show tuX ..." などとやる時に、 X として使える番号の範囲を決めることになります。 8台サポートするなら 0番から7番まで使えることになります。
で、これもお隣の ../PDP10/pdp10_tu.c を参考にします。


$ vi pdp11_tu.c
    ....
$ cvs diff -u
cvs diff: Diffing .
Index: pdp11_tu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
retrieving revision 1.2
diff -u -r1.2 pdp11_tu.c
--- pdp11_tu.c  9 Dec 2003 11:02:52 -0000       1.2
+++ pdp11_tu.c  9 Dec 2003 11:05:35 -0000
@@ -8,11 +8,22 @@
 #define TU_NUMDR       8                               /* #drives */
 
 
+t_stat tu_svc(UNIT *uptr);
 t_stat tu_reset(DEVICE *dptr);
 t_stat tu_boot(int32 unitno, DEVICE *dptr);
 t_stat tu_attach(UNIT *uptr, char *cptr);
 t_stat tu_detach(UNIT *uptr);
 
+UNIT tu_unit[] = {
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
+       { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) }
+};
 
 DEVICE tu_dev = {
        "TU",           // name
$ cvs commit -m "add tu_unit"
cvs commit: Examining .
Checking in pdp11_tu.c;
/wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v  <--  pdp11_tu.c
new revision: 1.3; previous revision: 1.2
done
$ 

エントリが8つありますが、 これは TM03 も最大8台の TE16 が接続できたことを反映したものです。 (でも Unix の ht ドライバは最初の1台しかサポートしませんので、 あまり意味はないのですが)

追加されたルーチン tu_svc() はユニットのタイムアウト発生時の振舞をエミュレートする関数らしいです。 やはり詳細はのちほどにして、ここでは宣言だけしておきましょう。


tu_reg を定義する
tu_reg はデバイスが内蔵するレジスタを表す構造体です。 今回の場合は TM03 がサポートするレジスタについて定義する必要がありますが、 のちほどレジスタの詳細を定義する際に 併せてこの構造体の中身も記述します。


$ vi pdp11_tu.c
    ....
$ cvs diff -u
cvs diff: Diffing .
Index: pdp11_tu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
retrieving revision 1.3
diff -u -r1.3 pdp11_tu.c
--- pdp11_tu.c  9 Dec 2003 11:33:15 -0000       1.3
+++ pdp11_tu.c  9 Dec 2003 11:35:04 -0000
@@ -25,6 +25,10 @@
        { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) }
 };
 
+REG tu_reg[] = {
+       { NULL }
+};
+
 DEVICE tu_dev = {
        "TU",           // name
        tu_unit,        // units
$ cvs commit -m "add tu_reg"
cvs commit: Examining .
Checking in pdp11_tu.c;
/wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v  <--  pdp11_tu.c
new revision: 1.4; previous revision: 1.3
done
$ 

ここでは空の配列だけを定義しました。


tu_mod を定義する
tu_mod は SIMH の show コマンドや set コマンドにおいて、 パラメータが付随した時の処理を定義するテーブルです。 ですから、個々のデバイス特有のパラメータを定義するときには、 このテーブルを使う事になります。
これもお隣の ../PDP10/pdp10_tu.c を参考にします。


$ vi pdp11_tu.c
    ....
$ cvs diff -u
cvs diff: Diffing .
Index: pdp11_tu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
retrieving revision 1.4
diff -u -r1.4 pdp11_tu.c
--- pdp11_tu.c	9 Dec 2003 11:37:11 -0000	1.4
+++ pdp11_tu.c	9 Dec 2003 11:53:57 -0000
@@ -13,6 +13,7 @@
 t_stat tu_boot(int32 unitno, DEVICE *dptr);
 t_stat tu_attach(UNIT *uptr, char *cptr);
 t_stat tu_detach(UNIT *uptr);
+t_stat tu_vlock(UNIT *uptr, int32 val, char *cptr, void *desc);
 
 UNIT tu_unit[] = {
 	{ UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
@@ -26,6 +27,52 @@
 };
 
 REG tu_reg[] = {
 	{ NULL }
 };
+
+MTAB tm_mod[] = {
+	{
+	  MTUF_WLK,		// mask
+	  0,			// match
+	  "write enabled",	// print string
+	  "WRITEENABLED",	// match string
+	  &tu_vlock		// validation routine
+	},
+	{
+	  MTUF_WLK,		// mask
+	  MTUF_WLK,		// match
+	  "write locked",	// print string
+	  "LOCKED",		// match string
+	  &tu_vlock		// validation routine
+	}, 
+	{
+	  MTAB_XTD|MTAB_VUN,	// mask
+	  0,			// match
+	  "FORMAT",		// print string
+	  "FORMAT",		// match string
+	  &sim_tape_set_fmt,	// validation routine
+	  &sim_tape_show_fmt,	// display routine
+	  NULL			// location descriptor
+	},
+	{
+	  MTAB_XTD|MTAB_VDV,	// mask
+	  020,			// match
+	  "ADDRESS",		// print string
+	  "ADDRESS",		// match string
+	  &set_addr,		// validation routine
+	  &show_addr,		// display routine
+	  NULL			// location descriptor
+	},
+	{
+	  MTAB_XTD|MTAB_VDV,	// mask
+	  0,			// match
+	  "VECTOR",		// print string
+	  "VECTOR",		// match string
+	  &set_vec,		// validation routine
+	  &show_vec,		// display routine
+	  NULL			// location descriptor
+	},
+ 	{ 0 }
+};
 

この例では5つのエントリがありますが、 これは5つのパラメータをサポートしていることを意味します。

最初の2つのエントリは、 パラメータ "WRITEENABLED""LOCKED" をサポートするものです。 これは TU デバイス固有のパラメータとしてサポートされ、 その処理ルーチンとして tu_vlock() が呼び出されます。

3番目のエントリは パラメータ "FORMAT" をサポートするものです。 これは SIMH のテープデバイス共通の機能で、 その処理ルーチンとして sim_tape_show_fmt()sim_tape_set_fmt() がテープエミュレーションライブラリでサポートされています。

4番目と5番目のエントリは パラメータ "ADDRESS""VECTOR" をサポートするもので、 これは SIMH PDP11 共通のパラメータです。 その処理ルーチンは ../PDP11/pdp11_io.c で定義されています。

詳細は後ほど説明します。


tu_dib を定義する
SIMH の DEVICE 構造体のメンバー ctxt は、 エミュレーションエンジンに依存する コンテキストへのポインタですが、 PDP-11 の場合は Device Information Block (DIB) 構造体をポイントしています。

DIB 構造体にはデバイスのレジスタが マッピングされるアドレスと長さ、 レジスタへアクセスするための関数、 および割り込みに関連する情報を設定します。 ここでは ../PDP11/pdp11_rp.c を参考にします。


$ vi pdp11_tu.c
    ....
$ cvs diff -u pdp11_tu.c
Index: pdp11_tu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
retrieving revision 1.5
diff -u -r1.5 pdp11_tu.c
--- pdp11_tu.c  9 Dec 2003 12:36:23 -0000       1.5
+++ pdp11_tu.c  9 Dec 2003 13:09:07 -0000
@@ -8,12 +8,14 @@
 #define TU_NUMDR       8                               /* #drives */
 
 
+t_stat tu_rd(int32 *data, int32 PA, int32 access);
+t_stat tu_wr(int32 data, int32 PA, int32 access);
 t_stat tu_svc(UNIT *uptr);
 t_stat tu_reset(DEVICE *dptr);
 t_stat tu_boot(int32 unitno, DEVICE *dptr);
 t_stat tu_attach(UNIT *uptr, char *cptr);
 t_stat tu_detach(UNIT *uptr);
 t_stat tu_vlock(UNIT *uptr, int32 val, char *cptr, void *desc);
 
 UNIT tu_unit[] = {
        { UDATA(&tu_svc, UNIT_ATTABLE + UNIT_DISABLE, 0) },
@@ -74,6 +75,17 @@
          NULL                  // location descriptor
        },
        { 0 }
 };
+
+DIB tu_dib = {
+       IOBA_TU,        /* base addr */
+       IOLN_TU,        /* length */
+       &tu_rd,         /* read routine */
+       &tu_wr,         /* write routine */
+       1,              /* vectors: number */
+       IVCL(TU),       /* locator */
+       VEC_TU,         /* value */
+       { NULL }        /* ack routines */
+};
 
 DEVICE tu_dev = {
$ make
cc -g -DVM_PDP11 -I./ -I../ -I../PDP11   -c -o pdp11_tu.o pdp11_tu.c
pdp11_tu.c:77: warning: initialization makes integer from pointer without a cast
pdp11_tu.c:81: `IOBA_TU' undeclared here (not in a function)
pdp11_tu.c:81: initializer element is not constant
pdp11_tu.c:81: (near initialization for `tu_dib.ba')
pdp11_tu.c:82: `IOLN_TU' undeclared here (not in a function)
pdp11_tu.c:82: initializer element is not constant
pdp11_tu.c:82: (near initialization for `tu_dib.lnt')
pdp11_tu.c:86: `IPL_TU' undeclared here (not in a function)
pdp11_tu.c:86: `INT_V_TU' undeclared here (not in a function)
pdp11_tu.c:86: initializer element is not constant
pdp11_tu.c:86: (near initialization for `tu_dib.vloc')
pdp11_tu.c:87: `VEC_TU' undeclared here (not in a function)
pdp11_tu.c:87: initializer element is not constant
pdp11_tu.c:87: (near initialization for `tu_dib.vec')
pdp11_tu.c:88: initializer element is not constant
pdp11_tu.c:88: (near initialization for `tu_dib.ack')
make: *** [pdp11_tu.o] Error 1
$ 

このまま make すると未定義エラーが発生しますね? 原因は割り込みに関連するマクロ定義が欠落しているためです。 pdp11_defs.h に必要なマクロを定義します。


$ vi 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.1
diff -u -r1.1 pdp11_defs.h
--- pdp11_defs.h        9 Dec 2003 12:41:12 -0000       1.1
+++ pdp11_defs.h        9 Dec 2003 13:10:14 -0000
@@ -357,6 +357,8 @@
 #define IOLN_RQ                004
 #define IOBA_APR       (IOPAGEBASE + 012200)           /* APRs */
 #define IOLN_APR       0200
+#define IOBA_TU                (IOPAGEBASE + 012440)           /* TU */
+#define IOLN_TU                044
 #define IOBA_MMR3      (IOPAGEBASE + 012516)           /* MMR3 */
 #define IOLN_MMR3      002
 #define IOBA_TM                (IOPAGEBASE + 012520)           /* TM11 */
@@ -432,6 +434,7 @@
 #define INT_V_XQ       12
 #define INT_V_XU       13
 #define INT_V_PIR5     14
+#define INT_V_TU       15
 
 #define INT_V_TTI      0                               /* BR4 */
 #define INT_V_TTO      1
@@ -464,6 +467,7 @@
 #define INT_XQ         (1u << INT_V_XQ)
 #define INT_XU         (1u << INT_V_XU)
 #define INT_PIR5       (1u << INT_V_PIR5)
+#define INT_TU         (1u << INT_V_TU)
 #define INT_PTR                (1u << INT_V_PTR)
 #define INT_PTP                (1u << INT_V_PTP)
 #define INT_TTI                (1u << INT_V_TTI)
@@ -491,6 +495,7 @@
 #define IPL_RY         5
 #define IPL_XQ         5
 #define IPL_XU         5
+#define IPL_TU         5
 #define IPL_PTR                4
 #define IPL_PTP                4
 #define IPL_TTI                4
@@ -525,6 +530,7 @@
 #define VEC_DTA                0214
 #define VEC_TM         0224
 #define VEC_TS         0224
+#define VEC_TU         0224
 #define VEC_RP         0254
 #define VEC_TQ         0260
 #define VEC_RX         0264

IOBA_TU はレジスタがマッピングされる先頭アドレスです。 Unix のデバイスドライバ ht.c で定義されているマクロ HTADDR から 0160000 を引いた値を使っています。 IOLN_TU はレジスタのバイト長です。 16 bit のレジスタが都合16本あるので、 8進の32である 040 になります。 IPL_TUTU デバイスの割り込み優先度です。 他のデバイスもみんな5になっていますね。 INT_V_TUINT_TU は割り込み優先度5のデバイスの中で TU デバイスを識別するビットフィールドの 位置を定義しています。 そして VEC_TU は割り込みベクターの値で、 Unix の /usr/sys/conf/mkconf が生成するスタブコード /usr/sys/conf/l.s のなかの _htintr の場所をから決めました。


ダミー関数を定義する
ここで SIMH のリンクができるよう、 未定義の関数のダミーを用意します。


$ vi pdp11_tu.c
$ cvs diff -u
cvs diff: Diffing .
Index: pdp11_tu.c
===================================================================
RCS file: /wrk/simh/cvs/src/simh/pdp11e/pdp11_tu.c,v
retrieving revision 1.6
diff -u -r1.6 pdp11_tu.c
--- pdp11_tu.c  10 Dec 2003 09:53:22 -0000      1.6
+++ pdp11_tu.c  10 Dec 2003 11:20:24 -0000
@@ -109,3 +109,51 @@
        (DEV_DISABLE | DEV_UBUS),       // flags
        NULL            // memory size change
 };
+
+
+t_stat
+tu_rd(int32 *data, int32 PA, int32 access)
+{
+       return(SCPE_OK);
+}
+
+t_stat
+tu_wr(int32 data, int32 PA, int32 access)
+{
+       return(SCPE_OK);
+}
+
+t_stat tu_svc(UNIT *uptr)
+{
+       return(SCPE_OK);
+}
+
+t_stat
+tu_reset(DEVICE *dptr)
+{
+       return(SCPE_OK);
+}
+
+t_stat
+tu_attach(UNIT *uptr, char *cptr)
+{
+       return(SCPE_OK);
+}
+
+t_stat
+tu_detach(UNIT *uptr)
+{
+       return(SCPE_OK);
+}
+
+t_stat
+tu_vlock(UNIT *uptr, int32 val, char *cptr, void *desc)
+{
+       return(SCPE_OK);
+}
+
+t_stat
+tu_boot(int32 unitno, DEVICE *dptr)
+{
+       return(SCPE_OK);
+}
$ make
cc -g -DVM_PDP11 -I./ -I../ -I../PDP11   -c -o pdp11_tu.o pdp11_tu.c
pdp11_tu.c:77: warning: initialization makes integer from pointer without a cast
cc  -o pdp11e  pdp11_fp.o pdp11_cpu.o pdp11_dz.o pdp11_cis.o pdp11_lp.o pdp11_rk.o pdp11_rl.o pdp11_rp.o pdp11_rx.o pdp11_stddev.o pdp11_sys.o pdp11_tc.o pdp11_tm.o pdp11_ts.o pdp11_io.o pdp11_rq.o pdp11_tq.o pdp11_pclk.o pdp11_ry.o pdp11_pt.o pdp11_hk.o pdp11_xq.o pdp11_xu.o pdp11_tu.o scp.o scp_tty.o sim_sock.o sim_tmxr.o sim_ether.o sim_tape.o -lm
$ 

これで無事コンパイル/リンクも通りました。 試しに動かしてみると、、、


$ ./pdp11e

PDP-11 simulator V3.0-2
sim> show dev
PDP-11 simulator configuration

CPU
PTR, address=17777550-17777553, vector=70
PTP, address=17777554-17777557, vector=74
TTI, address=17777560-17777563, vector=60
TTO, address=17777564-17777567, vector=64
LPT, address=17777514-17777517, vector=200
CLK, 60Hz, address=17777546-17777547, vector=100
PCLK, disabled
DZ, address=17760100-17760137*, vector=300-334, lines=32
RK, address=17777400-17777417, vector=220, 8 units
RL, address=17774400-17774411, vector=160, 4 units
HK, address=17777440-17777477, vector=210, 8 units
RX, address=17777170-17777173*, vector=264, 2 units
RY, disabled
RP, address=17776700-17776753, vector=254, 8 units
RQ, address=17772150-17772153*, no vector, 4 units
RQB, disabled
RQC, disabled
RQD, disabled
TC, address=17777340-17777351, vector=214, 8 units
TM, address=17772520-17772533, vector=224, 8 units
TS, disabled
TQ, TK50, address=17774500-17774503, no vector, 4 units
XQ, address=17774440-17774457, no vector, MAC=08-00-2B-AA-BB-CC, type=DELQA
XQB, disabled
XU, disabled
TU, address=17772440-17772477, vector=224, 8 units
sim> quit
Goodbye
$ 

ちゃんと TU デバイスが現れましたね?
でも、 まだ中身を書いていないので これ以上は動きません :-p


これで pdp11_tu.c のスケルトンは一通り完成です。
あとは個別に詳細を記述していきます。



PREV   NEXT