CPU実験室

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

8087動作テスト

8087がコードを処理する小さいプログラムで動作を確認していきます。
 
8086がESCコードを検出すると/RQ・/GTピンで8087とローカルバス使用権の調停を行い、自身は次のWAIT命令をフェッチして待機中にとなります。
一方8087はコードをデコードして処理を開始すると自身のBUSYピンをHにして処理中を8086へ通知しますが8086はこれが解除されるまでWAIT状態のままのため処理の同期が取れることになります
 
最小プログラムはこんな感じになるでしょうか。
8087でのNOP(FNOP)をCPUがWAIT状態で待ち、抜けてきたら先頭に戻るというループです。
 
イメージ 1
ボード上のモニタにはアセンブル機能がないので別にDOS窓を開いてその中でSYMDEBを起動させ1行アセンブルしそのコードをモニタから手打ちしています。
これを実行させているときの8087のBUSYピンの波形です。
この波形がHの時は8087が動作中、Lのときは8086が動作中とみることができます
イメージ 4

FNOPの処理時間は約2μsということになります。一方8086が命令を実行しているLの期間は5μs。
このときのBUSYのデューティ比が8087の稼働率と読み替えることもできるのでこの場合は2/(2+5)=28%となります
 
今度はもっと処理に時間のかかる8087コードでやってみます
8087のインストラクションセットを見てみるとやはり三角関数や指数対数関数といった超越関数系ですね。
 
イメージ 2
その中でもっともクロック数が多そうな「FYL2X」(2を底とする対数関数)でやってみます。
イメージ 3
アセンブル結果をメモリにセットして実行

イメージ 5
BUSYがHの期間がどっと増えて8087が一生懸命計算していることが判ります。
8086の処理部分は変わらないので、この時の8087稼働率は 152/(152+5)=97%になります。