CPU実験室

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

NS320xx

ポーリングでLEDチカチカ

本当の割込み処理の確認はいつかやることとして、ここでは簡単にポーリングによるタイマ待ちでやってみました。 タイマ割込みは実際に割込み処理が行われなくてもリクエスト状態であることを示すステータスビットが立つようです twait()関数はCICTL(COUNTER …

NS32000割込み

マニュアルをぼちぼち読んでいたのですが、だんだんヤバそうなことに気付いてきました。 まずCPU:NS32032はマスカブル割り込みが発生すると、絶対アドレス0xFFFE00から8ビットのベクタ番号を読取るとあります。ベクタ番号を与えるのは外部接続したICU:NS32…

こちらも割込みテスト

最近の開発モノではNS32kボードでも実は割込みを確認していませんでした。このボードではCPUそのものの機能というよりは外付けのNS32202 Interrupt Control Unitのプログラミングに拠るところが大にはなりますが。 このチップに関しては機能のごく一部である…

NS32000用GCC(5)

一応、整数型のCソースは問題なくコンパイルでき、遅いですが実行もできたので今度は浮動小数点演算を試してみました。 例題は最初にアセンブラでNS32081のテストをした時と同じ処理です。 TEST2.C これをコンパイルしアセンブラコードを生成します ns32k-pc…

NS32000用GCC(4)

コンパイルはできるようになりましたが、一つ問題があります。最初に実行されるmain()関数は必ずしもコードの先頭にはならず、プログラム次第で実行開始アドレスが変わってしまうことです。固定データや前方参照されるサブルーチン含む場合にそうなりますが…

NS32000用GCC(3)

ツール類がそろったので早速テストしてみました。 これも一番簡単なプログラムとしてLEDチカチカから。0x800200番地のパラレルポートにインクリメントデータを出力します。 ソースファイル TEST1.C 久しぶりにcygwin上でテキスト編集をしますがUNIXでは改行…

NS32000用GCC(2)

まずbinutilsからビルドします。 落としてきたファイルを解凍し、生成されたディレクトリに移動してからcofigureスクリプトを実行します。 tar zxf binutils-2.27.tar.gz cd binutils-2.27 ./configure --prefix=/usr/local/ns32k --target=ns32k-pc532-netb…

NS32000用GCC

TLCS-90がCで開発できるようになったのでこれに味をしめて、開発環境が今アセンブラしかないCPUにもCを使いたくなってきました。 GNU-C/C++(GCC/G++)はNS32000シリーズをサポートするらしいのはわかっていましたがビルドとかめんどくさそうなので後回しにな…

処理時間

NMAXを減らしたので処理時間が短くなったというのは正確ではなく、この領域に大きなマンデルブロ集合がない(解像度以下の無数の集合はあるでしょうが)ということです。 N=1000~8000の残り10%の領域での分布をみると頻度は激減しているのでNMAXを大きくし…

原子ジャガイモ

プログラムの修正ができたので早速、超微細領域での計算をやってみます。PC上のシミュレーションで10^-11領域で見えてきたジャガイモ的な何かにスコープを合わせます 中心座標:実軸 -1.26740983598069 虚軸: 0.35552711382890 まずシミュレーションの結果…

倍精度化処理

NS32Kアセンブラでのマンデルブロ集合計算を倍精度化しました。 やることは命令セットを倍精度用のものに差し替えることと使用する浮動小数点レジスタをF0,F2,F4,F6の4本に絞ることです。計算対象の複素座標c=a+biの実部aをF0,虚部bをF2、ループさせる漸化式…

倍精度演算(2)

NS32Kシリーズのチップをさがしていた時、コプロセッサNS32081といっしょにその上位チップのNS32381も入手していました パッケージ上にパスコン?がついています。チャージポンプかも。 ソフトウェア上位互換でレジスタセットを見ると64bitレジスタが8本フル…

倍精度演算

NS32kは遅い、精度悪いではあんまりなので精度のほうは改善してみます。以下はNS32081の四則演算命令セットですがニーモニックが~Fの32bit単精度版と~Lの64bit倍精度版が用意されているので今のソースコード上で~Fをそっくり~Lに書き換えればいいは…

演算精度

これまでは計算速度ばかり気にしていたのですが、いまさら重大な問題に気付きました。Cで書いたベンチマークは変数をdouble型(倍精度)としていましたがNS32Kアセンブラによるプログラムはaddf、mulfといった単精度グループの命令で書いてしまっていました…

打切り回数

NS32032の演算速度が遅いことは露呈してしまったのですが、単にマンデルブロ集合を描画するだけであれば計算打ち切りまでのループを減らしてもう少し早く結果を出すことはできます。 今回の256×256メッシュ=65536点でのmandel_chkの返り値のヒストグラムです…

浮動小数点演算(3)

NS32032ボードが他のCPUに比べてどれくらいの演算性能なのかいつものベンチマーク条件で実行してみました。 マンデルブロ集合の飛び地の一つ約5×10^-5の領域を拡大して計算させますが集合近傍では急速に発散速度が遅くなるので打切り回数NMAXを8192まで大き…

浮動小数点演算(2)

低解像度でのmandel_chkルーチンの動作が問題ないのでメッシュを256×256にしてみました。 結果はメモリ上に256*256*8bit=64kbyteのバッファを用意して蓄えておき計算完了後にシリアルを通してホストPCに返すようにしてあります。PC上でヘッダ、適当なパレッ…

浮動小数点演算

NS32032ボードでマンデルブロ集合の計算をやってみました。NS32k用のCコンパイラはGCCがあるようですがコンパイラ自体をビルドする準備か大変そうなのでまずアセンブラで書いてみます。 前にi386ボードでも動かしたプログラムですが複素数c=a+biがマンデルブ…

FPUテスト

最後まで残っていたFPU:NS32081をソケットに挿入しました モニタも起動するのでデバッグは容易です。まず単純にFPUのレジスタに値が代入できること、簡単な演算ができるかテストプログラムで確認しました 1行目のsetcfg [F]はCPU内のCFGレジスタにFPUが存在…

挿入部品完了

基板に実装する部品で残っていたボックスコネクタ10p,14p,20pを取付けて部品のはんだ付けはすべて終わりました。 あとはコプロセッサNS32081をソケットに差し込めば完成です。 パラレル出力の20ピンコネクタにデバッグ用LED基板を差し込んでチカチカさせてい…

パラレル出力テスト

モニタを使ってRAM領域にプログラムをロードできるのでデバッグが一気に楽になりました。ROMを外してプログラムを書き込んでまた挿入、これが32bitなので毎回4度繰り返さないといけない環境と比べると雲泥の差です。 ただちょっと気になるのがプログラムはRA…

モニタ暫定完成

ロードと実行だけできる原始モニタをROMに焼き込み、電源ONで起動できるようになりました。この状態で0xF80000番地からのRAM上にユーザプログラムを転送し実行できます。先ずは原始モニタ自体にいくつかの機能を拡張しユーザプログラムとして実行、問題なけ…

bin2hexコレクション

いままでいろいろなボードコンピュータ用に作ってきたモニタを見てみると、もちろんCPUアーキテクチャの違いはもちろんですが、その時のスキル、そのCPUへの理解度で様々な書き方をしていました。メモリダンプ表示にはかかせず、共通に含まれていているBIN→H…

条件判断

これは実際にとっかえひっかえして動かすとすぐにわかるのですが意外にも「LT」(Less Than)が正解なのです。R0レジスタと10を比べてR0の値が同じか大きければ分岐させたいので直感的には「GE」(Greater Than or Equal)なんですがそれをやると前回のダンプ…

条件分岐

原始モニタの機能はプログラムのロード[L]と実行[G]さえできれば十分なのですが今回初めてのハードなのでRAMにちゃんとプログラムがセットされるか確かめられるようにメモリダンプ[D]も作り込みました RAMの先頭0xF80000番地から256バイトを16進ダンプ…

モニタ作成

いちおう1文字出力(入力は確認できてないけどたぶん大丈夫)とSRAMの動作ができているので原始モニタのコーディングを始めました。ROMの抜き差しをしなくて済むようにバイナリコードをシリアルからSRAM上に展開(「L」:ロード)とコードの実行先頭番地へ…

シリアルテスト

シリアルコントローラからインクリメントデータを垂れ流すプログラムを書いてみました。一気に本格的なコーディングのようですが中身はコントローラの初期化追加とLチカループに1文字送信ルーチンを挿入しただけです このプログラムで重要なのはシリアルコ…

シリアル実装

CPUの正常動作が確認できたので周辺デバイスのデバッグがやっとできます。最初はモニタを搭載するためやはりシリアルコントローラからです デバイスはTL16C550をつかっています。 転送用のクロックはCPUクロックを流用してもいいのですが、標準的なボーレー…

ピン終端処理

初期のCPUやDRAMでは+5V、+12V、-5Vとか複数の電源を要求するものがありましたが、やはり扱いにくいのですぐに単電源動作が当たり前になったのだと思います。ですが内部的にはどうしてもバイアス電圧が必要な場合があるのでしょう。ただこういうBBGのように…

BBG電位

BBGで生成された負電圧はシリコンダイのサブストレート電位として与えられるようですが、これはMOSFETの物理的な動作原理そのものにかかわるわけで、いままでCPUが曲がりなりにも動作できていたのが不思議です。 間違った接続でもメモリからのコードフェッチ…