PC-E500のCPU

今回はPC-E500の独特なCPUについて説明しましょう。少し難しい話題になるかもしれませんが、他のCPUとの比較をしながら、ユニークな点を解説します。


PC-E500のCPU、SC62015は、6502と68000と8086のいいところを寄せ集めてまとめたような構造をしています。よくいえば強力な、悪くいえば思想の一貫性のない設計です。

設計者がどのような考え方を持っていたのかはわかりませんが、名前も似ていることから6502をベースにしたのではないかと疑っているのですが・・・・

目次

6502 に似た部分 68000 に似た部分 8086 に似た部分

SC62015のレジスタ構造

SC62015のアドレッシング

 定数 レジスタ 内部RAM 外部メモリ


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以上のプログラムではやはり特殊なジャンプ命令が使用されます。


SC62015のレジスタ構造

一般的な、さまざまなCPUの解説が終わったところで、SC62015の構造を紹介しましょう。

B(補助レジスタ)A(アキュムレータ)
IHIL(カウンタ)
X(ポインタ)
Y(ポインタ)
U(ユーザースタック)
S(システムスタック)
PSPC(プログラムカウンタ)

 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は捨てられます。これは定数以外の場合にも同様です。

レジスタ

レジスタには、A,BA,IL,I,X,Y,S,U,を指定でき、レジスタ毎にbit長が自動的に設定されます。


レジスタレジスタ間の転送などではレジスタのbit長をそろえる必要があることになっていますが、足りない場合には下位bitだけが書き変わり、多い場合には上位bitが捨てられるようです。

内部RAM

内部RAMのアドレッシングは、少し複雑です。

内部RAMアクセスの際には必ず直接アドレス指定を行うのですが、これでは配列などのデータ構造が作れません。そのため、内部RAM自体に内部RAMアドレスを修飾するレジスタが3本用意されています。

それぞれBP、PY、PXと呼ばれるレジスタで、BPはデータ転送元・先両方に使用できますが、PXは転送先のみ、PYは転送元のみにしか使用できません。このレジスタは内部RAMのアドレスEC、ED、EEの各番地に並んでいます。


結局、内部RAMを指定するのは以下の方法になります。直接アドレスがnの時、使える実行アドレスは

  • (n)
  • (BP+n)
  • (PX+n)または(PY+n)
  • (BP+PX)または(BP+PY)

(BP+PX)の時にはnは不要ですが、コード上は必要なため、適当な値を入れておきます。

これらの内部RAMアドレッシングの使い分けは、命令の前に1byteのプレコードを置くことによって行います(この方法はZ80に似ています)。


もしプレコードを置かなかった場合には(BP+n)が選ばれるのですが、最初はBPがどこを指しているかわからないので、実際のプログラムでは1度だけ(n)を指定してBPを0に書き換え、以降(BP+n)を使用するのが一般的でした。

外部メモリ

最後に外部メモリ空間のアドレッシングですが、これが一番豊富なものとなっています。

先ほどのように内部RAMを指定するには(n)という書き方をするのですが、外部メモリのアドレスを[ ]で括って書かれます。アドレッシングは以下のようになります。

  • [lmn]
  • [r]
  • [r++]
  • [--r]
  • [r+n]
  • [r-n]
  • [(n)]
  • [(m)+n]
  • [(m)-n]

ここで、l,m,nの文字はそれぞれ8bitの値です。[lmn]は20bit直接指定ということです。

rは20bitレジスタで、[r++]は「レジスタの指すアドレスをアクセス後、rを増加」、[--r]は「減少後アクセス」です。また[r+n][r-n]は、レジスタの値にオフセットを加えます。

[(n)]は、内部メモリのnから3byteのデータをアドレスとして取り出し、そのアドレスにアクセスします。[(m)+n][(m)-n]は、さらにオフセットを加えます。


[r++]と[--r]だけは、rにSレジスタを使用できます。それ以外のレジスタ間接アドレッシングでは、Sレジスタは使用できません。このことはSがシステムスタックで、変更に危険がともなうための処置の様です。(使用できる命令は、スタックのPUSH POPに相当する)


SC62015の主な構造は以上です。実際の命令を1つも取り上げていませんが、命令群に関しては他のCPUと似たり寄ったりですので、ユニークな特徴を紹介することがねらいの本連載では取り上げませんでした。詳しく知りたい方は青木充さんの「ポケコン裏技大辞典」をご覧ください。

(ページ作成 1996-12-01)
(最終更新  1999-03-31)

前へ     戻る     次へ

トップページへ

このページの誤字脱字発見・情報提供・意見などありましたら、下の一行掲示板へどうぞ。樫樹の広場から全体を見ることも出来ます。

名前 内容

【koj_4416】 大掃除でPC-E500発見。明日電池を買ってこよう。 (2007-02-10 23:55:00)

Google


Web 当サイト内