CPU実験室

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

386

CPU換装

あらたに80386CPUをオークションで入手しました ロゴがこんな感じでかわいいので思わずゲット 80386は16ビットバス版80386SXが発売されるにあたって80386DXとなりその後、各社が互換CPUを発売し出したので商標登録の関係で…

ひさびさ通電

暫らくぶりに386CPUボードを持ってきて通電してみました。 放って置くとひっそりと故障してたりすることがあるんで・・・ 無事起動するのを確認してから、CPUを元々のIntel製のものに戻してあります。 サイリックスのキャッチーで派手なロゴデザインよりも…

フラットケーブル接続

CPUにヒートシンクを乗せると、いままで親子亀式についていたLCDが乗りません。 セパレートにして間をフラットケーブルに置換えになりますが、コネクタの圧接方法で 簡単にできると思っていた偶数ピンと奇数ピンの入れ替えは、コネクタを逆に付けよう…

速度比較(2)

CyrixのCPUでM-1に参戦です。 ・・・しかし、あえなくテキサスのDSPに敗退。 たしかに80386+80387に比べ2倍くらい速くなっていますがキャッシュの効果がほとんど出ていません。 FPUを多用するからなのか、コードサイズの問題な…

速度比較

前の予備試験でCX486DRX2がi80386の36倍速い・・なんて結果が出たのは 時間計測用のCPLDに組み込んだタイマがオーバフローしていたための勘違いでした 再度ベンチマークプログラムを作り直して速度比較をやってみました CPU:i80386/CX486DRX2 FPU:i80387/C…

キャッシュ制御(3)

ボード上のI/Oアドレスのベースを80hになるようにライブラリを修正し CPLDのロジックも書き換えて20-2Fhが空きになるようにしました。 この状態でCX486のキャッシュ関連のレジスタをセットする関数を用意しました void cache_init(void) { int x; putst…

キャッシュ制御(2)

ベクターにCX486のキャッシュ制御デバイスドライバがあったので 添付されていたソースファイルを見せてもらいました。 どうもCX486にはi80486コンパチの制御レジスタの他に独自のレジスタを持っているようです。 サイリックスのデータシート…

キャッシュ制御

CX486のキャッシュが有効に働いているか確認してみました このCPUはi80386互換ですがi80486相当の制御レジスタを持っているのでキャッシュの制御も486と同じと考えられます。 386ではReservedになっている制御レジスタCR0のCD,NW…

CPU換装

FPUを換装しましたが、本来はCPUの換装が先でしょう。 というわけでサイリックスの互換CPUをオークションで入手しました。 Cx486DRX2 1kバイトの内部キャッシュが追加され、さらにクロックダブラにより内部コアが倍速で動作します。 (i38…

DLL処理変更

ROMモニタの機能でRAM上にコードを転送できますが、このときベタのバイナリデータを送っています。 先頭にデータサイズがセットされていたり、終端コードがあるわけではないので ターミナルからファイルを転送すると、最後の1バイトを送り終わった後永久待…

FPU換装

80386CPUがパソコンに使われていた頃、互換CPUに載せ換えるのがけっこう流行りましたが、最も有名なのがサイリックスのCX486DLCです。同時に387数値演算コプロにも互換品が出回って一気に低価格化し普及した感があります。 もっとも当…

ICSPプログラム(3)

フラッシュROMの指定アドレスにデータを書き込む関数はこんな具合になります。 関数の後半はポーリングにより書換えが完了したかのチェックになっています int amd_write(char far *adr,unsigned char data) { char far *p; long chip; unsigned char x; …

ICSPプログラム(2)

フラッシュROMへのデータ書込みはコマンドシーケンスをROMの決められたアドレスに与えることで実行できます下の図のように ①0x5555番地に0xAA ②0x2AAA番地に0x55 ③0x5555番地に0xA0 ④書き込みたいアドレスに書き込みたいデータ とアクセスすると1バイ…

ICSPプログラム

今時のマイクロコントローラでは当たり前の機能ですが、このボードでもICSP(インサーキットシリアルプログラミング)が出来るようにしてみます。 ROMを抜かずにボード上の自己書換えでROMモニタのバージョンアップが可能になります まず、このボード…

PLCC抜き

シリアルI/F初期化のデバッグのため、ここのところROM上のモニタプログラムを修正してはROM焼きを繰り返しています。 本来、モニタでRAM上にコードをダウンロードしてそこでデバッグすればよいのですがシリアルが異常だとダウンロードが出来ず、一度シリアル…

シリアル送信波形

文字がバケバケのときのシリアル送信波形をモニタしてみました。 起動後にタイトル文字列を出力しますがその先頭でトリガをかけます まず文字列の先頭「*」は正常にターミナルに出力されています。 このスタートストップビット含め全10ビットの送出時間は26…

CPLD交換

入力ピンをオープンにしていたためにラッチアップで壊れたのか・・でもプログラムは問題なくできるし と首をひねりつつ、JTAGピンのプルアップをした上で念のためXC95108を交換してみました ・・・ところが、やはり最初文字化けで電源再投入で正常と現象が全…

JTAGピン処理

MPSCへアクセスするときのウェイトを増やそうとCPLDのロジックを書き換えてみたのですが 文字化けは変わりません。 ところがたまたまJTAGプログラマを接続したままCPUボードを再起動したら一発でMPSCの 初期化がうまく行くのに気づきました。 手抜きでCPLD(…

MPSCプログラミング

この386ボードに前から気になっていた不具合が1つあります。 電源ON時にモニタのオープニングメッセージをターミナルに出力するのですが、初め必ず文字化けします。 ボーレートが合ってないのかターミナルからの入力もききません。 何回かリセットボタンを…

CPUID取得

CUPIDはプロセッサの諸元を取り出す命令ですが、386ボードで実行しようとしたら動きません。 調べてみたらCPUIDを正式にサポートしているのはPentium以降、Intel486プロセッサでは 後期のものだけで、386で実行すると無効オペコード例外になってしまうようで…

レイトレーシング計算

ホストプログラムをさらに汎化してパラメータをコマンドファイルで指定できるようにしました。 これにより大量の入力が必要な処理も可能になります。さらに出力も256色ビットマップに 加え24ビットフルカラービットマップにも対応しました。 次にCPUボード側…

ホスト側修正

マンデルブロ集合を描画するソフトウェアはいろいろ公開されていますが それらと同じパラメータで実行させて出来上がりの図を比べてみると、 どうも座標がずれていることがわかりました。 ボード側で受け取ったパラメータ値をエコーバックしてホストに送り返…

ジュリア集合描画

ホストプログラムにパラメータを送出する機能を付け加えました。 計算範囲等を入力すると文字列としてボード側に送信し、atof()で実数に変換して プログラムの初期値として使用できます。 ボード側プログラムをまた少し変更してジュリア集合の描画をしてみま…

387制御修正(2)

ROMに焼きこんだモニタプログラムはスタートアップ時に80x87検出のために いくつかのFPUのインストラクションを実行しますが、その後、コマンド待ちのループでは 一切FPUはアクセスしないはずです。 ところが387のERROR#信号を見ながらメモリダンプ等のモニ…

387制御修正

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

制御APL作成

ボードへのプログラムの転送、パラメータセット、実行、出力データの吸い上げ イメージ表示を一括して管理するホストプログラムを作りました ボタン1つでコマンドをボードに送り、結果を確認することができます マンデルブロ集合プログラムに少し手を加え、…

LCD取り付け

最後に残っていたキャラクタLCDを取り付けました。 せっかくの386CPUが隠れちゃいますが、動作は一発でOK。 ちょっと高めの青バック白文字のLCDなんですが、 クッキリ見える濃度の調整範囲がシビアで視野角も狭くいまいちです 基板の四隅にゴム足を取り付け…

割込み処理(3)

これで下地ができたので割込み処理ルーチンを用意します。 これは画面に"#"を出すだけの単純な処理です。 最初のoutp文はタイムアウトでNMIに対して1を出力したフリップフロップを0にクリアするためです void intr2(void) { outp(TMR_LAT,0x00); /* End Of I…

割込み処理(2)

調べてみるとプロテクトモードでは割込みベクタテーブルの代わりに「割込みディスクリプタテーブル」 を用意しなければならないとあります。 これはゲートディスクリプタを並べたもので「割込みゲート」「トラップゲート」「タスクゲート」の 3種類があり・…

割込み処理

アドレス0番地から配置されているx86CPUの割込みベクタテーブルには タイプ0からタイプ255までの割込み先のアドレスがセグメント:オフセットの 形で4バイトずつセットされます そこで次の関数に割込みタイプと処理先の関数のアドレスを渡してテーブルに セ…