見出し画像

究極の8bitCPU - 6809

究極の8bitCPUとしてデビューした6809ですが、ミニコンCPUのアーキテクチャを意識しつつ、6800の命令セットを拡張したような命令体型を備えていました。

レジスタは6800の倍になるように拡張され、アキュムレータはAとBの2つ、インデックスレジスタもXに加えてY、さらにスタックポインタもSとUの2つを備えています。また6502に影響されたのか、任意の上位バイトへのメモリアクセスを効率よく行うためのダイレクトページ(DP)レジスタも追加されました。アキュムレータは16bitのDレジスタとしても使うことができて、あたかも16bitCPUに見えるほどでした。

命令セットで特筆すべきなのはMULで、遂に加減算だけではなく乗算までハードウェアで実行できるようになりました。他にも6800で不便であった相対分岐の分岐先が8bit長に制限されていたものが16bit長を指定できるようになったり、複雑なアドレス計算が行えるように実効アドレスをインデックスに読み込むための命令も追加されました。

アドレッシングモードも大幅に拡張され、メモリアクセスもDPレジスタを使うことで、命令長を減らせるダイレクトモードや多彩なインデックスモードとメモリの値をアドレスとして使うインダイレクトモードがあり、分岐するときもメモリをアクセスするときも絶対アドレスを使わずに相対値だけでアクセスできるリロケータブルなコードを作成できるようになりました。また実行するたびに同時にインデックスレジスタの値を変化させることができるオートインクリメント・デクリメントモードが使えるようになりました。

目立たないところでは、割り込みもレジスタが増えて通常の割り込みには時間がかかるようになったので、一部のレジスタしか退避しないFIRQであるとか、ソフトウェアで割り込み処理に入れるSWIなど、実に痒いところに手が届く仕様になっています。

リロケータブルなコードにすることができるようになり、今までのように必ず決まったメモリアドレスにプログラムを格納しなくても良くなり、サブルーチンなどで利用するバイナリも、そのままで使い回すこともできるようになりました。

これらの機能は、同時に複数のプログラムを動作させるようなOSを利用するために必須の機能で、これを活かすためにFLEXであるとかOS-9が登場し、8bitの世界にも本格的なOSがやってくることになりました。

6809は他の8bitCPUと同じようにアドレスは16bitなので64Kまでのメモリしか扱うことができませんでしたが、外付けのMMU(メモリマネジメントユニット)を追加することで、仮想アドレスを使い2Mまでのメモリを扱うようにできました。

さて、ここまで薔薇色の話ばかり並びましたが、実際に使い始めるとなかなか苦労することも多かったです。

拡張されたレジスタ、例えばYレジスタを使う場合、命令長が増えます。この影響もあり実効サイクルも変わってしまいます。ソフトウェア的には対称性のある命令体系であるにも関わらず、バイナリのサイズや実行速度はレジスタによって変わってしまうのです。そこでレジスタの利用頻度を考慮して使うレジスタを選ばないとならないですし、複雑なアドレッシングモードは命令コードだけでは収まらずポストバイトと呼ばれる追加コードを必要としました。さらに面倒なのは値が5bitに収まれば値自身をポストバイトに押し込める機能が、いつも5bitを意識しなければならず、少しばかりありがた迷惑でもありました。

このような豊富な命令セットは、当然のようにハードウェアで、そのまま実装されているのではなく、マイクロコードと呼ばれるハードウェアを実行するためのソフトウェアで実装されているので、実行速度に関しては、さほど褒められた成績は出ていませんでした。

実際に6502で書かれたコードを移植すると、アセンブラの行数こそ大幅に減るのですが、出来上がったバイナリのサイズはむしろ大きくなり、実効サイクルに関しても単純なコードに関しては悪化することが普通でした。そういった意味でもゴリゴリとチューンするような用途ではなく、大規模な高級言語で書かれたコードを使ってこそ能力を発揮するCPUなんだと思います(そういった意味では6502は、マイクロコードを手で書いているような気がします)。

ほぼ完全なリロケータブルなコードを作ることができる能力は、それを活かしたOS-9を使うことでこそ、発揮されました。この能力を前提として、OSはプログラムを任意の位置において実行できますし、MMUによる仮想アドレスも活用しやすくなります。ただI/Oアドレスなどのアドレスだけは常に決まったアドレスを必要としますし、デバッグの際にも実際のアドレスがどこを指しているのか計算する必要があり、十分な支援ソフトを使わないとなかなか厳しいものが有りました。MMUは、結局、実際に使ったシステムを見たことは無いのですが、コードは書いたことがあって、実アドレスと仮想アドレスのセットアップが、それなりに大変でした。MMUのレジスタは値を設定してから、それなりのクロックサイクルを待たないと、値が反映されないので、その間にレジスタをいじることはできるとはいえ、命令の実行サイクルを指折り数えてタイミングを計るのは勘弁してほしかったです。

こういった話もモニタプログラムを書くのに必要なだけで、高級言語から使う分には何の関係もありません。もっとも高級言語から使うのであれば、どのCPUであるかは関係ないのかもしれませんが。

6809と付き合ったおかげで、ミニコンのアーキテクチャや、いわゆるOSの考え方に触れることが出来て良い経験になりました。もっとも殆のCPUでリロケータブルなバイナリを作ることはなくて、別な方法でコードを自由なメモリ位置に配置するようにしています。これを実現するためのバイナリローダの仕組みを調べると結構たいへんで、どちらが良いのかは悩み深いのですが、結局、過去の資産を活かせる方法が生き残るのですね。

MC6809

FM-8

FLEX (operating system)

FLEX の移植 AP10 版 その1(6809 および RAM のアクセス方法)

OS-9


この記事が気に入ったらサポートをしてみませんか?