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

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

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

第3章 第4節 なぜ可変長命令なのか

本書で製作するTD4EX2はROMアドレス空間の拡張のために可変長命令を採用します。ジャンプ命令(条件ジャンプ命令含む)だけを2バイト命令に拡張し、12ビットのアドレス空間を可能にします。その他の命令は1バイトのままとします。

なぜ可変長命令なのか。

近年のRISCブーム以来、可変長命令はすっかり不人気になってしまいましたが、4ビットCPUのような貧弱なCPUの場合には可変長命令がふさわしいと筆者は考えています。なぜなら命令コードを設計する上での柔軟性が得られるからです。

RISC CPUの多くが固定長命令を採用しているのは、命令デコーダーやCPU内部の設計を単純化し、パイプラインやスーパースカラー、あるいは分岐予測と言った技術による高速化をしやすくするためです。しかし自作の4ビットCPUに性能を求める人間なんていませんのでTD4EX2には関係のない話です。

性能は関係ないとしても、CPUの内部設計の単純化は自作CPUに相応しい、と言う方もいるでしょう。実際TD4は8ビット固定長命令で、僅か10個のICでCPUを作り上げているのですから、筆者も否定はしません。

多くの読者が恐れるのは、可変長命令にすることで命令デコーダーが複雑化する、という事でしょう。筆者もそれは危惧しました。そこで以下の対策を行う事で複雑さを減らしています。

最初の命令ワード(TD4EX2の場合はTD4と同じ8ビット)で命令の判別を行う

RISCブーム以降の多くの可変長命令CPUで使われている手法です。可変長命令であっても、最初の命令ワードを読み込んだ時点で命令の種類が判別でき、命令全体の長さを決定できるようにします。

TD4EX2の場合はジャンプ命令(条件ジャンプ命令含む)だけが2バイト命令ですから、命令の最初の1バイト目の上位2ビットを見れば何バイトの命令かを判別できます。

命令の第2ワード以降はオペランド・データのみとする

Z80や6809などの8ビットCPUは命令コードが非常に複雑で、命令の最初の1バイトを読み込んだだけでは何の命令かはもちろん、命令全体の長さすらも判別できませんでした。これは命令の2バイト目以降にオペコードそのものや、オペランドの長さを決定する要因が含まれていたからです。

TD4EX2ではオペコードは命令の1バイト目だけに存在する上、オペランドのバリエーションもありませんので、命令の2バイト目にはジャンプ命令のジャンプ先アドレスだけが含まれることになります。

結局のところTD4EX2では、命令の1バイト目を読み込んだところでジャンプ命令かどうかを判別し、ジャンプ命令の場合は命令の2バイト目を読み込むまでジャンプ命令の実行を延期する、という動作をしています。詳しくは次章で説明します。