PC-E500のCPU
今回はPC-E500の独特なCPUについて説明しましょう。少し難しい話題になるかもしれませんが、他のCPUとの比較をしながら、ユニークな点を解説します。
PC-E500のCPU、SC62015は、6502と68000と8086のいいところを寄せ集めてまとめたような構造をしています。よくいえば強力な、悪くいえば思想の一貫性のない設計です。
設計者がどのような考え方を持っていたのかはわかりませんが、名前も似ていることから6502をベースにしたのではないかと疑っているのですが・・・・
目次
6502に似た部分
まず6502について説明しましょう。
6502はAPPLE//やファミコンなどのCPUとして使われた8bitCPUです。
もともとは組み込み機器用に設計されたCPUで、CPUのレジスタ数を思いきって減らし、命令を簡略化することで値段を安くしていました。
A(アキュムレータ) | |
X(インデックス) | |
Y(インデックス) | |
PC(プログラムカウンタ) | |
S(スタック) | |
P(フラグ) |
自由に使えるレジスタは、上図のようにアキュムレータA(数値計算用)、インデックスレジスタXY(アドレス計算用)の3つしかありません。スタックはデータ退避命令で自動的に使用されるものですし、プログラムカウンタPCとフラグレジスタPは、現在実行中のアドレスを示したり、実行制御に使うものなので、自由に使うことはできません。
汎用レジスタが1本しかありませんので、計算は全てレジスタとメモリの間で行われます。しかし、計算の度にいちいち16bitもあるアドレスを指定するのは無駄ですから、6502には特殊なアドレッシング(アドレス指定)モードが用意されています。
それが0ページアドレッシングと呼ばれるもので、メモリの先頭256byteは簡単・高速にアクセスできるようになっています。このため6502のプログラムは一般的に「先頭の256byteをレジスタのように使う」という作法で作られており、考えようによっては6502はレジスタを256本ももっている、とすることもできます。
先頭の256byteが「0ページ」と呼ばれるように、メモリは256byteごとに区切って0〜255ページという名前で呼ばれます。このうち0ページは上の説明でもあるようにレジスタ替わりに、1ページはスタック領域に使用されます。
インデックスレジスタXYも、それぞれ8bitの幅しか持っていません。よって、インデックス相対アドレッシング(あるアドレスからの相対値でアドレスを指定する方法:配列などを作るのに役立つ)でも、自由にアクセスできるのは256byte以内ということになります。
さて、それではSC62015はどのように6502に似ているのでしょうか?
まず、SC62015には0ページに相当する256byteのメモリがあります。これはCPU内部に搭載された高速RAMなのですが、後半にはI/OポートやCPU自体の動作を変更する特殊レジスタも配置されています。
レジスタは6502に比べると多く、バス幅も広いのですが、アキュムレータA、インデックスXY、を中心とする構成になっています。(詳しくは後述)
68000に似た部分
6502と同じく、まず68000について説明しましょう。
68000は初期のマッキントッシュや、シャープのX68000、コモドールのAmigaなどに使用されたCPUです。これらのコンピューターに共通して言えることに、「グラフィックに強い」ということがありますが、それは68000が(当時の)他のCPUに比べて広いメモリ空間を持っていたからです。(グラフィックには大きなメモリが必要になります)
68000の特徴は、広いメモリ空間と、そのメモリを使いやすくする豊富なアドレッシングモードでしょう。また、このアドレッシングモードに支えられて、レジスタの汎用性が非常に高くなっています。
68000ではレジスタは「データ」と「アドレス」の2つの種類しかありません。そして、それぞれの用途のレジスタが8本づつあります。
アドレッシングはこのレジスタを駆使したものが多く、たとえば「レジスタの示すアドレスをアクセスした後、レジスタの値を増やす」なんていうのが1命令でできます。
逆に「レジスタを減らしてからアクセス」というのもあるので、この組みあわせでPUSH/POPという、CPUの基本的命令を実現できます。68000ではスタックすらも汎用レジスタで作るのです。
もっとも、スタックはサブルーチン呼びだしなどで暗黙のうちに使用されることもあります。このため、68000ではアドレスレジスタのうちの1本をスタックに割り振っています。このレジスタは2重構造で、必要に応じてさらに「システムスタック」と「ユーザースタック」が入れ替わります。
システムスタックはOSなどが使用するためのもので、ユーザースタックはアプリケーションが使用するものです。先ほど書いたようにスタック自体は汎用レジスタで作られていますので、ユーザーが書き換えを行うのも簡単です。
SC62015でも、68000のような強力なアドレッシングが使用できます。レジスタこそ豊富ではありませんが、ユーザーが必要に応じてスタックを作ることも自由です。
システムが用意しているスタックポインタもシステムとユーザーの2つにわかれています。もっとも、これらのスタックポインタ自身は命令コードの上から見た場合、「特殊なインデックスレジスタ」という扱いで、68000と同じようにアドレッシングによってスタックとしての役目を果たす形になっています。
8086に似た部分
8086はインテルの作った16bitCPUで、現在のペンティアムへと進化した系譜の最初のCPUです。思想的には8bitの8080や、Z80を、ソースレベルでちょっと手直しをすれば互換になるように作られており、資産を継承した代償に8bitを引きずった形になっています。
8086では、8bitとの互換性のためにメモリ空間は64Kbyte毎に区切られています。これが後々まで悪評高かった「セグメント」で、アクセスできるメモリは必ず「セグメントの先頭から」16bitで示されるアドレスとなります。
セグメントを示すレジスタ自体も16bitのため、アドレス空間は32bit・・・といいたいところなのですが、「セグメントは16byte毎に区切られる」というようになっているのでアドレス空間は20bit(1Mbyte)です。これはどうも、高価な「メモリ」を有効に使えるように、セグメントを自由な位置にもてるように工夫した結果のようです。
セグメントをまたいでプログラムを実行する場合は、アドレスと同時にセグメント自体も移動しなくてはならないため、特殊なジャンプ命令を使います。
SC62015でも、メモリ空間は20bitで、64Kbyteごとに区切られています。もっとも、このメモリの取り方はセグメントではなくページなのですが、64K以上のプログラムではやはり特殊なジャンプ命令が使用されます。
2016.7.20追記
この記事を書いたのは20年前で、当時僕が使ったことのある CPU と比較して記事を書きました。
しかし、今調べ直すと、68000 の特徴と 6502 の特徴は、合わせて「6809 の特徴」と言ってよいように思います。
モトローラ社に 6800 という 8bit CPU があり、この機能を簡素にして安くしたのが 6502 です。
0 ページアドレッシングは 6800 に由来するものです。
6800 は、インデックスレジスタを1本しか持ちませんでしたが、16bit でした。
6502 は、インデックスレジスタが2本に増えていますが、8bit です。
6809 は、インデックスレジスタが2本で、16bit でした。
6809 はもともと 16bit の PDP-11 を元にして作られた 8bit CPU でしたが、同じモトローラが PDP-11 を元に 16bit CPU を作ったのが 68000 になります。
2本のスタックや豊富なアドレッシングモードを 68000 の特徴としましたが、実はこれらは 6809 の特徴でもありました。
記述時点では 6502/68000/8086 に似ている、としていましたが、以上の理由から 6809/8086 に似ている、で特徴的には十分かと思います。
SC62015のレジスタ構造
一般的な、さまざまなCPUの解説が終わったところで、SC62015の構造を紹介しましょう。
B(補助レジスタ) | A(アキュムレータ) | |
IH | IL(カウンタ) | |
X(ポインタ) | ||
Y(ポインタ) | ||
U(ユーザースタック) | ||
S(システムスタック) | ||
PS | PC(プログラムカウンタ) |
SC62015には、上図のように8bitのレジスタ4本、20bitのレジスタ4本、16bitのプログラムカウンタと4bitのページセグメントレジスタが各1本、それに2bitのフラグがあります。
8bitのレジスタは、事実上は2つ組みで16bitと考えたほうが良いでしょう。そのため、上位に位置するBレジスタとIHレジスタを単独で使うことはできません。
アキュムレータA、またはBAは、演算用に使われます。カウンタIL、またはIHとあわせてIレジスタは、ループ命令で暗黙に使用されます。
ポインタXYUSは、それぞれ20bitのメモリ空間を自由にアクセス可能です。このうちUはユーザースタックとしての使用を想定して用意されており、Sはシステムスタックとして、サブルーチン呼び出し時のアドレス保持などに暗黙に利用されます。
ページセグメントレジスタPSと、プログラムカウンタPCはあわせて20bitのプログラムカウンタとして使用されます。ただし、PCがページ境界を超える(FFFFHから0000Hに変わる)時、PSは影響を受けません。そのため、64Kbyteを超えるプログラムではPSも同時に変更するジャンプ命令を使用する必要があります。
SC62015のアドレッシング
命令は一般的なものがそろっているのですが、そのアドレッシングモードは非常にユニークです。おおざっぱにわけると、対象とするメモリによって以下の4種類のアドレッシングがあります。
これらのメモリ間は、ほぼ自由にデータのやりとりが可能ですが、定数に向けての代入はできません(当然)。また、定数〜外部メモリ間の直接転送も用意されていません。
さらに細かくアドレッシングをみていきましょう。
定数
定数には8,16,20bitのサイズがあります。20bitの場合には3byte(24bit)が割り振られ、あまった4bitは捨てられます。これは定数以外の場合にも同様です。