2024-12-28 21:11 — asano
カテゴリー:
先日のINMOS IMST805を書いていて思い出したことがあるので今回はそれについて書いてみます。
マイコンボードを作っていたりするといつかCPUそのものを作ってみたいと考えるようになります。
作り方としては74シリーズのような汎用ロジック・Am2900ファミリのようなビットスライス・FPGAなどがあり、さらには現物は諦めてソフトウェアによるエミュレーションなどもあり得ます。
どれを選ぶかはもちろん目的により異なり、アーキテクチャの研究などならFPGAやエミュレーションでしょうし、私のようにいわゆるマイコン登場前の状況の追体験的なものを目指すなら汎用ロジックか使ってもビットスライスまでと思います。
で当時の私は次のようなものを考えていました。
- 使用デバイスは74シリーズ、74181 ALU程度は使っても良いが74AS888などは不可
- メモリはUV-EPROM, SRAM使用可
- Tiny BASIC程度は動かせること
まだ気軽にプリント基板を作れる状況ではなかったので手配線が前提です。
この条件で命令セットを考えるわけですが、その前にビット幅を決めなくてはなりません。
BASICテキストを扱うことを考えるとデータ幅は最低でも6ビット、ラッチやバッファは8ビット品が多いので8ビットが良さそうです。
アドレス幅は12ビット(コードに3k, テキスト・変数で1k)あたりが最低ライン、データ幅の倍の16ビットあたりが良さそうです。
なんか一般的な8ビットCPUそのものですね。
さて、次は命令幅なのですが……
なるべくシンプルにしたいので命令長は固定で1回でフェッチ、命令によって追加のフェッチは行なわないという条件で考えてみます。PDP-8(12ビット)・MN1610(16ビット)などがこれです。ただ8ビットだとちょっと苦しいですね。
これで困るのが即値とアドレスの扱いです。命令の中にこれらを含めようとすると命令幅を大きくして(命令幅>データ幅)・(命令幅>アドレス幅)にしなくてはなりませんが、データメモリと命令メモリの幅を別にしないとこれは満たせません。
DSPなどでは命令メモリ幅を大きくしているものがあります。例えばuPD77P20の命令幅は23ビット(データ幅は16ビット)もあります。
命令幅をそのままにしてよくあるのは命令中に置ける数値の範囲を制限(例えば即値なら0~255・アドレスはPC相対8ビット)し、それを超える値が必要な時はメモリからのロード命令を使うことです。これの特殊な場合としてポストインクリメント付きPC間接として命令直後においてあたかも命令長を増やしたような(内部動作としてはちょっと違いますが)効果を得る手もあります。
そんな中で思いついたのが Reg←(Reg << 4) + Imm4 のような命令です。これを繰り返すことでどんな値でもいけるわけですが、効率悪いのでは、最初にRegをクリアする方法は、といったこともあってそのまま忘れていたのですが……
この度Transputerの命令セットを見て、意外とアリだったのかも、と思い出したのでした。
プリント基板作りやすくなったし、また構想してみたい気もしますね。
でも回路をシンプルにするのを優先すると様々なプロセッサの変なところばかり寄せ集めたようなものが出来てしまう気も……
コメントを追加