究極の8bit CPUを考える
モトローラのMC6809のことを「究極の8bit」と最初に呼んだのは月刊ASCII誌1980年10月号の特集「究極の8bitマイクロプロセッサ MC6809」だと思う。特集では、1980年5月に発表されたベーシックマスターレベル3(6809搭載の8bit機)、ハード・ソフトウェアアーキテクチャー、自作コンピュータ記事が掲載された。翌1981年5月に6809を2つ搭載した富士通FM-8が発表され、1984年には書籍も出版された。
当時高校生だった私はすっかり感化されてしまって大学に入学してすぐにFM-8を買ったものだ(そしたら直後にFM-7が出て大ショックであったが、それはさておき)。
6809はアセンブラでプログラミングするには便利なCPUで、6800にあった欠点(IXレジスタが1本しかない、16bit演算ができない)が解消された良いCPUだと思ったし、今もそう思っている。
ただ、現代の目からすると「なんとかならなかったか」と思う面はあって、本当に究極だったのか?と思ったりもする。
MC6809
- 6809.net - 6809命令表 - 6809 命令表
- Analysis of the M6809 instruction set | Proceedings of the May 16-19, 1983, national computer conference(1983年の論文)
MC6309
1982年に日立から出た6809互換CPU。6809に比べて様々な強化が行われている。
-
アキュムレーターの追加 (E,Fの2本。連結して16bitレジスタWとしても使える)
-
D,Wを連結して32bitレジスタQとして使える
-
ゼロレジスタ、-1レジスタの追加
-
E,F,Wをインデックスアクセスのオフセットとして利用できる
-
Wをベースレジスタとして使える
-
符号付き乗除算、16bit演算の強化、ブロック転送命令の強化
-
bit演算命令の追加
-
https://colorcomputerarchive.com/repo/Documents/Microprocessors/HD6309/Oh!FM,%20April%201988%20(Japanese).pdf
それは8bit CPUなのだろうか
6809も複雑な命令では命令長が長くなる。インデックスレジスタとしてY/U/Sを使うとプリバイトが付くし、複雑なアドレッシングではポストバイトが付く。(5バイトが最長だっけ?覚えてない)。 6309の新設命令ではさらにプリバイトが1バイト付く。x86の進化を見ているようだ。
8bit CPUなので命令長はなるべく1バイトにして欲しいし、2バイトのアドレス付けて3バイトが上限だと思う。
Analysis of the M6809 instruction set | Proceedings of the May 16-19, 1983, national computer conferenceによると、平均命令長は以下の通り。意外に短い?
|Class Average|Size |Numeric|2.16 bytes |Monitor|2.27 bytes |Compiler|2.30 bytes |Application|2.40 bytes |Compiled|2.43 bytes |All|2.35 bytes
命令bit数が足りない
命令長が8bitしかないのが厄介。レジスタ数は4個では足りないので仮に8個にすると、レジスタ指定に3bitを消費する。レジスタレジスタ転送を1命令に納めると、これだけで6bit使ってしまい、命令に残す余地が2bitしかない。6809ではレジスタ転送命令は2バイト(TFR+ポストバイト)になっているし、6309のTFRはポストバイトを使い切ってしまっている。
8080は8bitレジスタ8個(Mもレジスタと見なす)で、レジスタ間転送のMOV命令で命令セットの1/4(64個分)を消費している。2レジスタ命令は転送命令だけであり、他の命令は暗黙のうちにレジスタ指定が行われている。
いまどきのCPUっぽくレジスタレジスタ演算をメインにしようとすると、とにかく命令ビット数が足りない。それなら16bit CPUにした方が素直で良さそうである(H8みたいに)。
RISC-Vのように、16bit命令を標準にして、使用頻度の高い命令/レジスタは短縮命令を用意するのが良いのか?(それ、ポストバイトの逆だな)。
オペコード空間
RISC/CISC
同様のことを考えている人
- mc6809/super6809.md at master · cavnex/mc6809
- 6502.org • View topic - How would YOU extend the 6502?