2026/02/02

separate I&Dのプログラムが起動しない問題 その1

これまでの調査結果

 2.11BSDのインストール時に使用されるテープ上のプログラムの一つにrestorがあります。

このプログラムは命令領域のサイズが大きいため、 separate I&D(SID)としてリンクされています。一方、サイズの小さいmkfsなどのプログラムは命令とデータは単一のアドレス空間で動作します。

SIDプログラムも単一アドレス空間のプログラムもファイル上は.text, .dataの順番に配置されていることに違いはないのですが、2.11BSDのbootプログラムは、SIDプログラムに限っては、.data, .textの順番にメモリに読み込みます。したがって、テープデバイスに対しては以下のような動作を行います。

  1. .dataセクションの先頭まで順方向にシークする
  2. .dataを読み込む
  3. .textセクションの先頭まで 逆方向にシークする
  4. .textを読み込む
TangConsoleDCJ11MEMの現時点の実装ではテープデバイスのファイル単位のシークは実装されていますが、レコード単位でのシークは対応していません。したがって、上記の1.や2.の「ファイルの途中までシークする」という操作はファイル単位のシークとして実行されます。
 
以上から、SIDプログラムを起動するためにはレコード単位のシークも実装する必要があることがわかりました。 
 

テープデバイスのデータフォーマットの概略

 

前提知識としてテープデバイスのデータフォーマットについてごく簡単に書いておきます。
 
バイナリデータファイルは可変長のレコードに分割されて格納されます。一つのファイルは複数のレコードによって構成され、テープマークによってファイルの終わりが示されます。
 
テープデバイスはレコード単位やファイル単位で順方向/逆方向のシークが可能です。
 

 TM11コントローラの機能

 

 TM11のシーク関係のコマンドは、レコード単位の移動(Space forward, Space reverse)しかありません。よって、2BSDのドライバではファイル単位のシークを実現するためには以下のような工夫(?)をしています。
  1. ファイル単位のシークが要求されたらレコード単位のシークを実行する。この際、レコード数のパラメータとして極端に大きな値を設定する。
  2. TM11は指定された方向にシークを開始し、テープマークを検出することでシークを終了する。結果的にファイル単位でシークできる。
 「極端に大きな値」としては、0と-32760(8進数で100010)が使用されているので、TM11のエミュレーションではこのマジックナンバーで 見分けてファイル単位のシークとレコード単位のシークを区別すればよさそうです。
 
2026年2月14日追記
 
この方法はあくまでも2BSDに合わせた実装なので、マジックナンバーで見分けられない場合には意図した通りには動作しません。汎用性を持たせようとするとSIMHのテープイメージフォーマットのように、レコード長やテープマークの情報を付加するような方式が必要です。 
 

現在の状況

 

以上の調査結果を元にTM11のエミュレーション部を変更してレコード単位のシークが動作するようになったと思ったのですが、メモリダンプを調べるとSIDプログラムが正しく読み込まれていませんでした。この問題について調査中です。 

0 件のコメント:

コメントを投稿

TangConsoleDCJ11MEMにおける2BSDの誤動作の調査 その3

誤動作の原因の二つ目が判明しました。 符号なし2進数と符号付2進数の比較 後述するSOFUB_MAPの実装に符号なし2進数と符号付2進数を比較しているコードがありました。直接の比較ではありませんでしたが、符号なし整数の値を符号付整数の変数に代入し、その変数と定数を比較していたため...