CPU実験室

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

386

割込み制御回路追加

CPLDに組み込んだ16ビットタイマのタイムアウト出力で386に対して割込みを かけられるようにしました。 空きロジック不足で割込みコントローラ8259のようにベクタを送出することができないので NMIへの割込みになっています。 最初、カウンタがALL0になるタ…

M-1グランプリ

386ボードでの処理時間は・・ 65分でした かなり残念。 まあ原因究明は後のこととしていままでの結果で順位を付けてみました 題して「マンデルブロ-1グランプリ」 [公式ルール] 複素平面上の点c=-0.762930339580937+0.0953017604935345iの周辺 実軸、虚…

比較テスト(80386/gcc)

ずいぶん回り道をしましたが、本来やろうとしていたマンデルブロ集合計算の スピードアップにたどり着きました。 まずは例によってmandel_chk()関数のコンパイル結果を見てみます .file "man386.c" gcc2_compiled.: ___gnu_compiled_c: .text .p2align 2 LC0…

GCCプログラミング(6)

問題はプログラムの中でsprintf()を使うと山のようにリンク未解決エラーが出ることです libc.a(malloc.o)(.text+0x1e):malloc.c: undefined reference to `__sbrk' libc.a(malloc.o)(.text+0x43):malloc.c: undefined reference to `__sbrk' libc.a(malloc.o…

GCCプログラミング(5)

PCでプロテクトモードに切替えるときは1Mバイト以上にあるメモリへのアクセスのため A20アドレスラインの有効化処理が必要ですがこのボードはRAM512kB、ROM512kBともともと 1Mバイト以下にしかメモリが無いので関係ありません。 早速ビルドして実行。 画面は…

GCCプログラミング(4)

プロテクトモードに切替えるといっても 何も特権機能や保護機能を使ったりマルチタスクを走らせようとかではありません。 単に32ビットセグメントを使いたいだけで、必要最小限の設定にとどめ、 実行後にリアルモードに復元させることもやりません。 手順と…

GCCプログラミング(3)

djgppで生成されるコードが変・・なんて云っていましたが 結論から言うと、このコードは80386のプロテクトモード上で動作するっていうことです。 本来、DOSのコマンドプロンプト上で実行させる場合は初期化ルーチンでプロテクトモードに切替え、 DOSエクステ…

GCCプログラミング(2)

動作しない原因をビルド時の中間ファイルを見ながら調査しました 1.まずはTEST.Cのコンパイル結果です。 単に文字列のアドレスをスタックに積んで文字列出力関数putstr()に渡すだけです .file "test.c" gcc2_compiled.: ___gnu_compiled_c: .text LC0: .asc…

GCCプログラミング

djgppはgccをMSDOS上に移植したコンパイラで、フリーで使用できます。 いままでdjgppでDOS窓上で動作するプログラムは作ったことがありますが はたしてスタンドアロンのCPUボードのプログラムを作れるでしょうか まずスタートアップルーチンの差し替えです。…

比較テスト(80486DX2)

486DX2(32MHz)ボード上で実行です。 コンパイラはLSIC-86なんで386と全く同じコードなんですが。 結局、これも午前中から4時間以上動かしていますが6割くらいしか終わっていません。 領域のの中央付近はマンデルブロ集合に含まれる(すなわち永久に発散し…

比較テスト(MC68040)

MC68040ボードでも同じパラメータで実行してみました MC68040は数値演算プロセッサMC68882のサブセットを内蔵しているので高速化が期待できます。 コンパイラはgcc-m68kで-mc68040オプション設定で内蔵FPU命令をインラインで生成させますが 生成されるコード…

比較テスト(TMS320C30)

マンデルブロ集合計算の同じプログラムを他のCPUボードで動かしてみました まずはテキサスのDSP TMS320C30です。 久しぶりに動かすのでプログラムのビルド方法をすっかり忘れていましたが なんとか実装完了。ソース自体はほとんど修正なしでOKでした。 コン…

387稼働率(2)

こんどはマンデルブロ集合を計算中のBUSY#をプローブしたところ コプロ命令が実行されるタイミングがばらばらのためカウンタで デジタル的に捉えるとデューティ比が10%とか200%とかむちゃくちゃな 表示になってしまいます。 そこでこんなものを作ってみまし…

387稼働率

まずソースの中で変数_8087に0をセットすると実行速度がさらに落ちるので 確かに80387の効果はあるようですが実際にはどれくらい稼動しているのでしょうか 次のようなプログラムでコプロ命令だけを連続動作させてみます 0000:2000 D9 FE LOOP0: FSIN 0000:20…

処理遅すぎで挫折

中心座標 c=-0.76293033+0.09530176iの周囲をスパン5.29E-5で計算をさせてみました。 ここも含めて親集合そっくりの子集合がいたるところに現れることがわかっていますが、 集合の境界では発散が非常に遅いため計算打切り回数を8192に増やしています。 この…

マンデルブロ集合(2)

マンデルブロ集合の一部領域を拡大してみました。 c=-0.745438-0.113018i付近を実軸、虚軸とも6.0e-6のスパンでスキャンしたものです。 前回の図を顕微鏡で50万倍に拡大したことになります フラクタル状に無限に続く渦巻きが見え、浮動小数点演算の精度が保…

マンデルブロ集合描画

PCのグラフィックでよくある例題、マンデルブロ集合の計算を386ボード上で行ってみました。 マンデルブロ集合は複素数Znが漸化式 n→∞の極限で無限大に発散しないという条件を満たす複素数 c 全体が作る集合で 以下の関数で複素平面上でc=a+biがマンデルブロ…

FPU動作確認

80387で超越関数の演算確認を行いました。 0~360度のsin(x)を求めて総和をとり、正常に計算されれば∫sin(x)dx[0~2π]で0になるはずです。 またシステム変数_8087を強制的にセットしてソフトエミュレーションとの速度比較をしています。 char str[64]; exter…

FPU実装

コプロセッサ30387DXに与える信号線が準備できたのでソケットに挿込みました まだ動作は確認できていませんがひとつチェックする方法があります。 ROMに焼きこんであるモニタはLSIC-86で記述していますが、ビルド時にリンクされる スタートアップルーチンの…

回路規模削減

ISE上で追加のピンと内部回路を定義したら 回路が入りきらないとエラーになってしまいました 回路図上で冗長なロジックなどを整理したのですが既にISE内部で最適化、圧縮が行われているので 出力は全く変わりません やむなくタイマの入力クロックを生成する…

CPLDフィッティング状況

現状、CPLD(XC95108)に実装している内部ロジックはこんな具合になっています まだまだ余裕があると思っていたのですが、16ビットタイマを組み込んだことで マクロセルの消費がぐっと増え98%に達していました。 あと80387インターフェース、キャラクタLCDイ…

タイマ実装

非同期プリセット付きのタイマをVHDLモジュール化して 最上位階層の回路図に配置しました。 8ビットタイマではすぐにオーバフローしてしまうので16ビットタイマになっています。 I/Oバスが8ビットなのでタイマ値の読み出し中に桁上がりが出る可能性がありま…

タイマ組込み

π計算を動かしているときに思いつきましたがハードウェアのタイマを用意しておくべきでした。 基板の空きスペースにSOPの8254をつけておけばよかったのですが後の祭り。 幸いCPLDにまだレジスタの空きがあるので組み込んでみます。 回路図入力でとりあえず8…

円周率計算

さらにメモリをこき使わせる負荷試験として多倍長精度のπ計算をやってみました。 マチンの公式 を変形したプログラムを、MSC/C++7.0AでコンパイルしDOS上で動作を確認した後 出力処理の部分を差し替え、LSIC-86ですんなりコンパイルが通りました。 ビルド後…

浮動小数点処理

ここまでくればハードの心配はほぼ無くなりました。 あとはCで好きにプログラミングしても実行は大丈夫そうです。 のっけから少し重いですがLSIC-86の浮動小数点ライブラリをリンクして キャラクタでサインウェイブを書いてみます。 char buf[]=": + :"; ch…

バスイネーブル修正

80386のマニュアルを読み直していましたが SRAMへのアクセス不良はどうもADS#の処理に問題があるようです。 タイミングチャートで見る限りアドレスとR/Wが同時期にVALIDになっており メモリのセットアップ時間が確保されていなかったようです 現状はCPUから…

メモリアクセス不調?

CプログラムをLSIC-86でコンパイルし ボードのRAMに転送して実行できるのですが なぜかsprintf()を使用したプログラムが正常に動きません 次のような簡単なプログラムが実行するとむちゃくちゃな文字列を吐き出して ロックしてしまいます #include <dos.h> #includ</dos.h>…

SRAMテスト中

SRAMの0x10000~0x7ffff番地にデータを書込み、後からベリファイチェックをする プログラムを走らせて試験をしていましたが、なんどか繰り返しているうちに データエラーが再現しなくなってしまいました 安定度に不安が残るのであとでアクセスタイミングを測…

ウェイト挿入

CPUがアドレスストローブADS#を出してから一定時間READY#を遅らす ロジックをCPLDに組込みウェイトを挿入するようにしました この回路ではCPUクロックは20MHzでSRAMに1ウェイト、ROM、周辺I/Oには12ウェイト入る ようになっています 12ウェイトは入れす…

SRAM調査中

どうもSRAMの動作が不安定のようです。 プログラムを置いたエリア以外のSRAMに一定パタンを書込み あとから読み出すとところどころデータエラーが発生します。 ハード原因のように見えるのでCPUCLKを落としたりウェイトを挿入したりしても状況が変わらないの…