あんたCPUなんか創ってどうするのよ?! Vol.1 第3章 第1節

~TD4とかいうCPUがあまりにも残念だったので拡張してみた~

2016/8/14
コミックマーケット C90 3日目 西g16b

第3章 第1節 TD8をより深くディスってみる

第1章でTD8について簡単に書きましたが、技術的な観点から改めてTD8 を評価してみます。

① 最大プログラムサイズを256 ステップに拡大

これについては異論ありません。TD4はたった16 ステップしかプログラムサイズがありませんので、まともなプログラムは作れませんでした。TD4を拡張するならばアドレス空間の拡大は必須と言えます。

ただしTD8で達成している256 ステップで十分かどうかは議論の余地があります。

② データ幅を8 ビットに拡大

最大プログラムサイズを拡大するための手段としてデータ幅を拡大しています。これには反対です。無意味に部品点数が増えるからです。純粋にデータ処理能力を増強する必要がある場合にのみデータ幅を拡大すべきです。

③ 必要なIC の数が倍近い

データ幅を拡大した結果、必要なIC の数が倍近い17 個になりました。増えた数に見合うだけの機能が増強されていれば納得できますが、残念ながらTD8 は全く機能不足です。

以下にTD4 とTD8 の部品一覧を示します。

ICTD4TD8ICの機能使用箇所
74HC1614個8個4ビットカウンタレジスタA とB, プログラムカウンタ, OUTポート
74HC1532個4個4ビットセレクタ加算器への入力選択
74HC2831個2個4ビット加算器加算回路
74HC741個1個フリップフロップキャリーフラグ
74HC101個1個3入力NAND命令デコーダー
74HC321個1個2入力OR命令デコーダー
合計10個17個  

④ 全ての命令が12ビット幅に増える

元々のTD4の命令のうち、アドレスに関係するのはジャンプ命令と条件ジャンプ命令だけです。従ってアドレス区間の拡大に伴って、この2つの命令の長さが増えるのは当然でしょう。しかしTD8ではアドレス空間の拡大の手段としてデータ幅を拡大してしまいました。その結果、すべての命令の長さが12ビットになってしまっています。

これは無駄です。

特にAレジスタとBレジスタの間のデータ転送のように、イミディエイトデータを使わない命令も12ビット幅なのは全くの無駄です。

以下にTD8の命令一覧を示します。

表2 TD4の命令コード (bit7とbit6の意味)
命令命令コード説明
bit 11~8bit 7~0
ADD A, Im0000ImAレジスタの内容に命令中で指定された定数(Im)を加算
MOV A,B000100000000AレジスタにBレジスタの内容を転送
IN A001000000000入力ポートからデータを取り込み、Aレジスタに格納
MOV A, Im0011ImAレジスタに命令中で指定された定数(Im)を格納
MOV B,A010000000000BレジスタにAレジスタの内容を転送
ADD B, Im0101ImBレジスタの内容に命令中で指定された定数(Im)を加算
IN B011000000000入力ポートからデータを取り込み、Bレジスタに格納
MOV B, Im0111ImBレジスタに命令中で指定された定数(Im)を格納
OUT B100100000000Bレジスタの内容を出力ポートに出力
OUT Im1011Im命令中で指定された定数(Im)を出力ポートに出力
JNC Im1110Imキャリー(C)がゼロならば指定アドレス(Im)にジャンプ
JMP Im1111Im指定アドレス(Im)にジャンプ

付け加えるなら、市販の半導体のROM のほとんどが8 ビット幅だという問題もあります。命令幅を12ビットにしてしまうと、8 ビット幅のROM を2 個並列にして使うしかないため、事実上16 ビット幅と変わらなくなってしまいます。

⑤ イミディエイトデータ(Im)との加算しか出来ない

ビット幅を拡張したものの、演算回路を全く改良していないので、結局のところ演算機能はイミディエイトデータ(Im)との加算のみという、TD4 からの欠点は全く変わりません。

⑥ 命令も機能も全く増えない

命令デコーダーを改良していないため、何の命令も追加されていませんし、何の機能も増えていません。せめてイミディエイトデータ(Im)との加算しか出来ない問題は修正して欲しかったと思います。