PDP-10 の実装
以下は、一連のユーザールーチンとしても、モニタに UUO として組み込んでも実装できますが(われわれの最初の実装は前者です)、説明の目的では後者の版を用います。UUO は次のとおりです。
| UUO | オペランド | 説明 |
|---|---|---|
| PUTF | CH, E | フラグを置く |
| PUTD | CH, E | データを置く |
| PUT | CH, E | レコードを置く |
| GETFD | CH, E | フラグまたはデータを得る |
| GET | CH, E | レコードを得る |
上記において、「CH」は論理チャネル番号です。チャネルを開くには、通常の OPEN または INIT UUO を用います。標準形式のユーザーバッファが割り当てられます。しかし、リングヘッダとバッファヘッダは非標準的な仕方で用いられるため、データモード 12 が Network のバッファリングで使うために割り当てられ、入力のためにはファイル状態ビット 31 がオンでなければなりません。(DSK、DTA、MTA、IMP のいずれのデバイスもこのモードで使えます)。
Harvard の NCP および HOST-HOST プロトコルの実装では、ユーザーバッファはメッセージに直接対応していません。出力では、各ユーザーバッファが一つのメッセージに整形されます。入力では、一つのメッセージが一つまたは二つのユーザーバッファ分になることがあります(ディスクサービスルーチンの機能を最大限に活用するために、128 ワードのバッファが用いられます)。
PUTF UUO
この UUO は、出力バッファにフラグを置きます。実効アドレスは、あるワードの位置です。
XWD operation, count
ブロックフラグの場合、カウントは無視されます。というのも、カウントは次の PUTF の使用前にバッファに実際に置かれたバイト数から計算されるからです。PUTF と PUTD は、各バッファがいっぱいになるたびに EOM フラグを自動的に挿入します。もしそのとき PUTD によってデータバイトがバッファに置かれている最中であれば、バッファ内の直前のブロックフラグのカウントを計算した後に EOM フラグを挿入し、その時点のバイトサイズを述べる SIZE フラグを挿入した上で、同じタイプの新しいブロックフラグを次のバッファの先頭に置きます。
PUTD UUO
この UUO は、出力バッファにデータを置きます。実効アドレスは、データバイトの位置(バイトサイズが 36 未満の場合)、またはバッファに置かれる次の 36 ビットワードのデータの位置です。前者の場合、バイトはアドレスされたワードの下位部分にあるものと見なされます。後者の場合、バイトの最後のビットを含むデータワードはそれらをワードの上位部分に含み、次のデータバイトは PDP-10 の記憶域において新しいワードを開始します。したがって、バイトサイズ 64 の場合、伝送されるバイトごとに PUTD への 2 回のエントリが用いられ、最初が 36 ビットを、二番目が 28 ビットを、左詰めで含むことになります。この方針により、PDP-10 のバイト操作命令を最大限に活用できます。
PUT UUO
この UUO は、論理レコード全体を出力バッファに置きます。実効アドレスは、あるワードの位置です。
IOWD count, location
適切な SIZE フラグを出力するために、PUTF UUO が使われていなければなりません。その後、PUT の各使用は、BLOCK フラグを出力し、[3] ユーザーデータ領域の位置とサイズを知るために IOWD を用いて PUTD への多数の呼び出しをシミュレートし、次いでレコードの終わりを示すために RS フラグを出力します。
バイトサイズが 36 ビット未満の場合、PUT は ILDB 命令を用いて、PUTD によって出力されるべきバイトを取り出します。したがって、標準の PDP-10 のバイト操作形式が用いられ、IOWD のカウント部分は総ワード数ではなく総バイト数となります。
上記の UUO は、エラーリターンと正常リターンの両方をもっています。
GETFD UUO
この UUO の呼び出しシーケンスは次のとおりです。
GETFD CH, E
error return
whyte flag return
block flag return
data return
実効アドレスは、フラグまたはデータが返される位置です。フラグは PUTF と同じ形式で返され、データは PUTD と同じ形式で返されます。ある種のフラグ(NUL、IGNORE、EOM)は完全に UUO の内部で処理され、ユーザーには報告されません。SYS は最終的にはこのように処理されるべきですが、当初はユーザーによって処理されます。
GET UUO
この UUO の呼び出しシーケンスは次のとおりです。
GET CH, E
error return
end of file return
end of group return
normal return
GET は、PUT と同じ形式の IOWD とともに GETFD を用いて、次の論理レコードをユーザーに伝送します。レコードの終わりより前に IOWD のカウントが尽きた場合、レコードの残りは読み飛ばされます。いずれの場合も、どれだけのデータが伝送または読み飛ばされたかをユーザーに知らせるために、更新された IOWD が UUO の実効アドレスに返されます。