というわけで、 取り敢えず 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_TU は TU デバイスの割り込み優先度です。 他のデバイスもみんな5になっていますね。 INT_V_TU と INT_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
のスケルトンは一通り完成です。
あとは個別に詳細を記述していきます。