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 件のコメント:

コメントを投稿

最強のOS-9マシン復活プロジェクト ~原理試作~

 プロジェクトのフェーズ0として、原理試作を行いました。  FM-130バスの仕様書は書庫からは見つかりませんでした。8bitパソコンの時代のマシンやマニュアル類、雑誌などもすべて姿を消していたので、処分したのだと思います(忘却の彼方)。  遭遇した不具合(1) 導通の不安定 原...