CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

387制御修正

ここ最近、386ボードにマンデルブロ集合の計算をやらせていましたが
実は数回に1回くらいの割合で浮動小数点計算を実行した直後にCPUがロックするという障害が
起きていました。
同じバイナリでも動く場合と動かない場合がありどうも不安定です。

まず一点、CPLDの修正。
80387が出力するREADY0#信号を使用していませんでしたが、これをメモリ、I/OのWAIT信号との
論理和をとってCPUのREADY#に与えるようにしました。
CPLDの内部ロジックを修正。

イメージ 1


これがマニュアルどおりの接続ですが、かえってロックする頻度が増えてしまいました。
そこでオシロで387のERROR#信号を観測してみるとリセット後、モニタプログラム実行中に
何故かERROR#がアサートされる場合があります。
この状態で387のインストラクションを実行させようとすると固まってしまうようです。

イメージ 2


原因がはっきりしませんが387を初期化するためにFNINIT命令を実行する関数を作り、
アプリケーションの先頭で呼んでERROR#を払うようにしたらロックが発生しなくなったので
とりあえずOKとします

void init_fpu(void)
{
  asm("fninit");
}