6502 シリーズとよく似た命令セットを持つ SPC700 は、 メモリ空間は 64 キロが用途別にアドレス区分され、 アドレス 0000H ~ 00FFH を 0 ページ、 アドレス 0100H ~ 01FFH を 1 ページと呼びます。 この領域のデータについては、プログラム・ステイタス・ワード内の ダイレクト・ページ・フラグ(P)でダイレクト・ページ指定を行うと、 多様なアドレシング・モードで、かつ少ないサイクル数でデータ処理を 行うことが出来ます。
CPUにはA,X,Yの汎用レジスタ、各種フラグの集合の プログラム・ステイタス・ワード(PSW)、プログラム・カウンタ(PC)、 スタック・ポインタ(SP)があります。
Aレジスタは最も多くの命令で操作され、8ビット演算のアキュムレータになります。 16ビット演算時にはYレジスタとペアになり16ビット・アキュムレータの 下位8ビットのレジスタとなります。X,Yレジスタは汎用レジスタとしての 機能の他、各種インデックス・アドレッシング・モードの インデックス・レジスタとしての機能や2アドレス命令の ソース、ディスティネーション・アドレス・レジスタ機能など多様な操作に使用されます。
命令セットには A レジスタを中心として算術・論理演算が行われる1アドレス命令と、 ダイレクトページ内の任意のアドレスをソース・アドレスと ディスティネーション・アドレスに指定できる2アドレス命令があります。
制御用途に多様されるビット処理に対しては、アドレス 0000H ~ 1FFFH の 8Kバイトの広範囲のデータに対してブーリアン・ビット操作命令が適用できます。
さらにダイレクト・ペード内のビットに対しては、セット,リセット, ビット条件相対ジャンプが使用できます。64Kバイトの全空間のデータに対しては、 複数ビットのテスト・アンド・セット,テスト・アンド・リセット命令が用意されています。 精度を必要とするデータや、高速にデータ処理を行うため、16ビット・データを 1命令で操作できます。ダイレクト・ペード内の連続する2バイトの 16ビットデータとYレジスタとAレジスタのペアとの間で、 加算,減算,比較,転送が出来ます。 また、ダイレクト・ページ内の連続する16ビット・データのインクリメント, デクリメントも可能です。
高速データ処理と多様な形式のデータを処理するため、乗算,除算命令があります。 乗算は符号なし8ビット×8ビットで被乗算をYレジスタに、乗算をAレジスタに 格納し、結果はY,Aの16ビットアキュムレータに入ります。 除算は符号なし16ビット÷8ビットで、被除数は、Y,Aの 16ビット・アキュムレータに、除数はXレジスタに格納され、 結果の商はAレジスタに入り、余りがYレジスタに入ります。 10進データの処理には、加減算両方の結果に対し10進(加,減算)補正命令があります。
ブランチ系の命令には各種ステイタス・フラグの状態による相対ブランチ命令、 ダイレクト・ページ内の任意のビットのセット,リセット状態による ブランチ命令などがあります。また、ループ系のブランチ命令には比較ブランチ, 減算ブランチ命令がありそれぞれについて2種類のアドレシング・モードがあります。 サブルーチン・コール命令には64Kバイト内の サブルーチン・アドレス直接指定の3バイトコール命令、 特定エリアをサブルーチン・コールする2バイト・コール命令、 コール・テーブルを用いる16個の1バイト・コール命令があり、 サブルーチンの使用頻度に応じて使い分けるとバイト効率を向上することが出来ます。
CPU 内部には各種の命令実行に必要なレジスタがあります。A レジスタ (主に 8 ビット・アキュムレータとして機能), X レジスタ, Yレジスタ (インデックス・レジスタとしても使える汎用8ビット・レジスタ), PSW(プログラム・ステータス・ワード), SP(スタック・ポインタ)等です。 これらは、8ビット・レジスタですが、PC(プログラム・カウンタ)は 16ビットで構成されています。
15-8 | 7-0 | 名前 | 幅 |
PC | プログラムカウンタ | 16bit | |
A | A レジスタ | 8bit | |
Y | A | Y, A ペア (16bitアキュームレータ) | 16bit |
X | X レジスタ | 8bit | |
Y | Y レジスタ | 8bit | |
SP | スタックポインタ | 8bit | |
PSW | プログラムステータスワード | 8bit |
PSW | |||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
N | V | P | - | H | - | Z | C |
N : ネガティブフラグ V : オーバーフローフラグ P : ダイレクトページフラグ H : ハーフキャリーフラグ Z : ゼロフラグ C : キャリーフラグ (ビットアキュームレータ)
プログラム・ステイタス・ワードは8ビットのレジスタで命令の実行結果より、セット, リセットされるフラグ類とCPUの動作を決定するフラグ類から構成されています。 リセット時には ”000-0-00”になります。
ネガティブフラグ 演算実行後、MSBの結果の値が”1”のときセットされ、”0”のときリセット されます。 条件分岐命令でテストすることが出来ます。
オーバーフローフラグ 算術演算実行後、オーバー・フロー、アンダー・フローが生じた時セットされます。 その際、Hフラグも同時に影響をうけます。 条件分岐命令でテストすることが出来ます。
ダイレクトページフラグ ダイレクト・ページ・アドレシングなど多くのアドレシング・モードが適用される ダイレクトページを指定するフラグです。”0”のときはアドレス0000h~ 00FFhの領域、”1”のときはアドレス0100h~01FFhの領域が ダイレクト・ページになります。STEP命令によってセットされ、CLRP命令 によってリセットされます。
ハーフキャリーフラグ 演算実行後、ALUのビット3からビット4へキャリーがあった時、または ボローがなかった時にセットされます。セットする命令はありませんが、CLRV 命令によってリセットされます。その際、オーバー・フロー・フラグもセット されます。
ゼロフラグ 演算実行後、結果がゼロのときにセットされ、ゼロでない時リセットされます。 16ビット演算命令でもゼロの検出が行なわれます。条件分岐命令でテストする ことが出来ます。
キャリーフラグ 演算実行後、算術論理ユニット(ALU)の再上段ビットからキャリーがあった時、 またはボローが無かった時にリセットされます。シフト、ローテイト命令でも変化 します。ブーリアンビット操作命令のビット・アキュムレータとしても機能します。 SETC命令でセットされ、CLRC命令でリセットされます。また、NOTC 命令でキャリー・フラグは反転します。 条件分岐命令でテストすることが出来ます。
プログラム・カウンタは16ビットで構成され64Kバイトのアドレス領域を 持ちます。上位の8ビットをPCH、下位の8ビットをPCLと呼びます。 通常は、次に実行するアドレスを持っていて、フェッチした命令に必要なバイト数 だけインクリメントされます。 プログラムの途中に分岐命令があるとプログラム・カウンタには、分岐先のアドレス が格納されます。リセット(ノットPOR)入力があるとアドレスFFFFhと FFFEhにあるリセット・ベクタがそれぞれPCH、PCLに入り、分岐します。
8ビットのアキュムレータとして使用されるレジスタです。 16ビット演算命令時にはYレジスタとペアで構成する16ビットアキュムレータの Lowバイト・データを保持するレジスタになります。演算命令時には乗数レジスタと なり、積のLowバイト・データが入ります。除数命令時にはYレジスタとペアで 被除数を構成し、結果の商が入ります。
Xレジスタは汎用のデータ・レジスタとしての役割の他にインデックス・アドレシング時の インデックス・レジスタとして機能します。また、2アドレス命令の ディスティネーション・アドレス・レジスタ、Xレジスタ間接アドレス・レジスタに 使われます。 除算命令時には除数レジスタになります。
Yレジスタは汎用のデータ・レジスタとしての役割の他にインデックス・ アドレシング時のインデックス・レジスタとして機能します。また、2アドレス命令 のソース・アドレスとして使われます。 16ビット演算命令時にはAレジスタとペアで構成する16ビットアキュムレータの Highバイト・データを保持するレジスタになります。乗算命令時には被除数 レジスタになり、積のHighバイト・データが入ります。 除算命令時にはAレジスタとペアで被除数を構成し、結果の余りが入ります。 条件ジャンプ時のループ・カウンタにも使われます。
スタック・ポインタは割り込みや、サブルーチン・コール、プッシュ(PUSH)、 ポップ(POP)、リターン(RET)命令時にデータをRAM上に退避したり、 RAM上から復帰するために使用されます。スタック・ポインタの示すアドレス領域は 1ページ内(アドレス0100h~01FFh)です。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │0│0│0│0│0│0│0│1│ SPの値 │ └─┴─┴─┴─┴─┴─┴─┴─┴───────────────┘ └───────────────┴───────────────┘ ハードで設定 プログラムで設定
*サブルーチン・コール時 スタック・アドレス 動作 退避後のSPの値 SP PCH退避 SP-1 SP-1 PCL退避 SP-2 *サブルーチンからの復帰時 スタック・アドレス 動作 退避後のSPの値 SP+1 PCL退避 SP+1 SP+2 PCLH避 SP+2 Aレジスタ、Xレジスタ、Yレジスタ、PSWをスタックに退避,復帰するには PUSH,POP命令を使えます。 *PUSH A(X,Y,PSW) スタック・アドレス 動作 退避後のSPの値 SP A(X,Y,PSW)の退避 SP-1 *POP A(X,Y,PSW) スタック・アドレス 動作 退避後のSPの値 SP+1 A(X,Y,PSW)の退避 SP+1