SC/MP

初期のNational Semiconductor社(以下NS社)はアナログ系の個別半導体や集積回路の方に少し重心が寄っていたような気もしますが、アナログ・デジタル両面にわたりラジオやテレビ用などの家電から産業用まで非常に幅広い分野に半導体製品を供給していた企業です。
1970年代のNS社はマイクロプロセッサ関係ではあまりぱっとせず、ここで紹介するSC/MP系列の独自8 bitマイクロプロセッサの製造とともにIntel社の8080Aのセカンドソース供給なども行っていました。1980年代になると、他社と比べても早い時期に本格的32 bitマイクロプロセッサのNS32016やNS32032を発表し注目されましたが、あまり広く使われたともいえないようです。
SC/MPというのはSimple Cost-effective MicroProcessorの略ということで、組み込み用の4 bitシングルチップコンピュータと8080などの性能が高めだけれど外付け部品も多いプロセッサの中間あたりに位置する、少数の部品で組み込みに対応するためのプロセッサです。部品としての名称はISP-8A/500となっています。1976年発表で、p-MOSプロセスによる製造です。最高1 MHzクロックで動作し、クロック発振回路も内蔵しています。

ISP-8A/500
クリアパルス(株)の森様よりの頂きものです。評価用キットのSC/MP KITの未組立てのものを頂きまして、まだラミネートパッケージの中で少しばかり写真が見にくいですけど。

SC/MPのプログラマから見たレジスタモデルはこのようになっています。
SC/MP registers

ACが8 bitアキュムレータです。基本的に演算はこのACとメモリオペランドの間で実行されます。EはExtension RegisterでACの補助として使われるほか、シリアル入出力にも使用されます。
SRはStatus Registerで、フラグ類の集合体です。CY/Lビットはキャリーフラグとシフト・ローテート時のリンクビットとして使われます。OVはオーバーフローフラグです。SAとSBはプロセッサのSense AとSense Bという名称の信号線の状態がそのまま反映されます。入力ポートとして使えるように用意された信号の読み取り用ですね。ただし、Sense AにはIEが1のときに正論理レベル入力の割り込み要求信号としての役割もあります。IEは割り込みイネーブルで、1になっているときに割り込み許可を表します。割り込みが受け付けられると自動的にクリアされます。F0, F1, F2はFlag0, Flag1, Flag2というプロセッサの信号線に出力される値を保持します。出力ポート用のビットです。
その下の4本の16 bitレジスタはポインタレジスタで、PC, P1, P2, P3という名前で呼ばれます。PCにはP0という別名もあります。

SC/MPは16 bitで表現されるメモリ空間を持ちますが、命令は1 Byte命令と2 Byte命令だけで3 Byte命令はありません。1 Byteは命令種別を表すオペコードに必ず使われますから、メモリオペランドの指定には1 Byte分しか残りません。そのため、直接16 bitアドレスを指示するダイレクトアドレッシングは存在せず、基本的にインデックスアドレッシングとその変種によってメモリオペランドを指示します。
さらにメモリ空間が16 bitで表現されるといっても、フラットな16 bitアドレス空間ではありません。16 bitアドレスの上位4 bitがページアドレス、下位12 bitがページディスプレースメントと呼ばれ、実効アドレスの計算やプログラムカウンタの命令フェッチ時のインクリメント動作で影響を受けるのはページディスプレースメントだけです。特に命令の配置には注意が必要で、2 Byte命令がページ境界をはさむように配置されても、正常にフェッチされることはありません。
SC/MPのアドレッシングには、PC相対、インデックス、イミディエート、オートインデックスの4種類があります。このうち、PC相対アドレッシングはP0を用いたインデックスアドレッシングですから、ここではインデックスアドレッシングにまとめて説明します。
インデックスアドレッシングは4種のポインタレジスタのうちの任意のひとつに符号付き8 bitディスプレースメントを加算してオペランドアドレスを求めるモードです。仮に実効アドレスの計算でページディスプレースメントから桁上がりが生じても、ページアドレスは変化しないことに注意しなくてはなりません。
イミディエートアドレッシングは2 Byte命令の2バイト目の8 bitデータをそのまま定数として使用するモードです。
オートインデックスアドレッシングはインデックスアドレッシングと似たものですが、実効アドレスをポインタレジスタにも書きこんでしまうところが違います。細かい動作はディスプレースメントの符号によって異なり、ディスプレースメントが負だと最初に実効アドレスの計算が行われ、メモリの参照が行われます。ディスプレースメントが正だと、まずポインタレジスタを単なるポインタとして使用してメモリ参照を行い、それから実効アドレスを計算してポインタレジスタを書き換えます。これによってプリデクリメントとポストインクリメントが自然に行われて、スタックデータ構造などを実装しやすくなっています。
さらにイミディエートアドレッシング以外の、ディスプレースメントを使用するモードでは、ディスプレースメントが-128の値をとる場合に限って、特別な動作が行われます。ディスプレースメントに-128が指定されると、定数ディスプレースメントのかわりにEレジスタがポインタレジスタの内容に加算されて実効アドレスが計算されます。
アドレッシングモードのアセンブリ言語表記については、次の表をご覧ください。
モード 修飾値 アセンブリ言語表記
PC相対 0 label
インデックス 1, 2, 3 disp(ptr)
イミディエート 4 constant
オートインデックス 5, 6, 7 @disp(ptr)
ここで修飾値とは、後の命令表でメモリ参照命令においてオペコードに加算される定数です。インデックスおよびオートインデックスモードの場合には、使用されるポインタレジスタがP1, P2, P3に対応して1, 2, 3または5, 6, 7が使われます。
アセンブリ言語表記に関して、PC相対ではラベルを単純に書くだけです。インデックスアドレッシングの場合にはディスプレースメントのあとに、使用するポインタを()でくくって表記します。イミディエートアドレッシングの場合には定数をただ書くだけ。オートインデックスアドレッシングの場合にはインデックスアドレッシングの表記の前に@を加えます。

SC/MPの命令はアセンブリ言語のニーモニックを数えると46種類あります。アセンブリ言語ではニーモニックに続いてオペランドが0ないし1個続く形式だけです。オペランドを2個指示する命令はありません。命令は8種類に分類されています。それを具体的に見ていきます。
最初にメモリ参照命令から。
Mne.  Op Cy N  CO  動作
LD    C0 18 2      AC <- (EA)
ST    C8 18 2      EA <- (AC)
AND   D0 18 2      AC <- (AC) & (EA)
OR    D8 18 2      AC <- (AC) | (EA)
XOR   E0 18 2      AC <- (AC) ^ (EA)
DAD   E8 23 2  *   AC <- (AC) + (EA) + (CY/L) {BCD format}
ADD   F0 19 2  **  AC <- (AC) + (EA) + (CY/L)
CAD   F8 20 2  **  AC <- (AC) + !(EA) + (CY/L)
最初に命令表の見方ですが、Mne.がアセンブリ言語表記のニーモニックです。Opがオペコード、Cyが命令実行サイクル数、Nはバイト数です。COはCがCY/LフラグでOはOVフラグを意味して、*が記入されていると命令実効にともなって変化することを表します。印がなければ変化しません。動作は命令の動作を簡潔に表現したものですが、EAは実効アドレスを表します。なお、命令実行サイクル数はメモリにウェイトサイクルが入らないと想定して記入してあり、1 MHzクロック動作時に1命令実行サイクルは2 usかかります。
これらのメモリ参照命令の場合、アドレッシングモードに応じて先に示した表の修飾値を加算しなくてはなりません。イミディエートアドレッシングに関しては別のグループに分類されていますから、PC相対、インデックス、オートインデックスの3種類のモードをメモリ参照命令は使用できます。アドレッシングモードに関らず、命令実行サイクル数は変化しません。
LD命令とST命令はアキュムレータとメモリ間のデータ転送です。
AND命令、OR命令、XOR命令は論理演算命令です。
DAD命令はDecimal Addの略で、BCDデータの加算を行います。必ずキャリーが加算されるため、必要に応じて前もってキャリーをクリアしなくてはなりません。BCDデータの減算命令はありません。この命令はSC/MPの命令セットの中でもっとも命令実行時間が長く、最高速でも46 usかかります。
ADD命令は2進数の加算命令で、これもキャリーが加算されます。キャリーフラグのほか、オーバーフローフラグも変化します。
CAD命令はComplement and Addの略で、オペランドをビット反転してからキャリーとともにアキュムレータに加算します。この名称では何を行う命令かはっきりしませんが、事実上の2進数減算命令です。実行前にキャリーをセットしておけば、通常の意味での減算命令となります。この命令の場合、キャリーはボローの反転として考えることができます。MCS6502のSBC命令と同じものですね。

次にイミディエート命令を紹介します。
Mne.  Op Cy N  CO  動作
LDI   C4 10 2      AC <- (data)
ANI   D4 10 2      AC <- (AC) & (data)
ORI   DC 10 2      AC <- (AC) | (data)
XRI   E4 10 2      AC <- (AC) ^ (data)
DAI   EC 15 2  *   AC <- (AC) + (data) + (CY/L) {BCD format}
ADI   F4 11 2  **  AC <- (AC) + (data) + (CY/L)
CAI   FC 12 2  **  AC <- (AC) + !(data) + (CY/L)
イミディエート命令はニーモニックの末尾にIが付いています。当然ながらST命令のイミディエート版は存在しませんが、それ以外のメモリ参照命令には対応するイミディエート命令が存在します。オペコードをよく調べると、イミディエート命令のオペコードの上位5 bitは対応するメモリ参照命令のオペコードと共通で、下位3 bit分が4になっていることがわかります。また、命令実行サイクル数はメモリ参照命令から8だけ少ないことがわかります。

分岐命令は少なくて4種類しかありません。
Mne.  Op  Cy  N  CO  動作
JMP   90  11  2      PC <- EA
JP    94 9/11 2      If (AC) >= 0, PC <- EA
JZ    98 9/11 2      If (AC) = 0, PC <- EA
JNZ   9C 9/11 2      If (AC) != 0, PC <- EA
この分岐命令では、PC相対かインデックスアドレッシングしか使えません。イミディエートはもちろんオートインデックスも意味がないので、当然といえば当然です。
さらに、無条件分岐命令がひとつに、条件分岐命令が3命令に分けられます。条件分岐が成立したときに11サイクル、不成立の場合に9サイクルの命令実行サイクル数が消費されます。
この条件分岐命令は、どれもアキュムレータの内容に関係するもので、フラグ類とは無関係という点は、特徴的です。逆にいえば、キャリーフラグによって分岐するような場合、後述のCSA命令とANI命令を組み合わせてアキュムレータの内容に反映させてから条件分岐命令を使用せねばならず、面倒です。

メモリの増減命令というのも存在します。
Mne.  Op Cy N  CO  動作
ILD   A8 22 2      AC, EA <- (EA) + 1
DLD   B8 22 2      AC, EA <- (EA) - 1
この命令も、PC相対アドレッシングかインデックスアドレッシングに限定されています。メモリの内容をインクリメントないしデクリメントして書き換え、ついでにアキュムレータにも同じ値をロードします。
これらの命令は、条件分岐命令と組み合わせてループ制御に使いやすくなっています。ループカウンタを作業メモリ上に確保して、ループカウンタをデクリメントした結果が0かどうかで分岐すれば、指定回数のループを行わせられます。
SC/MPのオペコードは、1 Byte命令か2 Byte命令か、簡単に判別が付くようになっています。オペコードのMSBが1なら2 Byte命令で、0なら1 Byte命令となっていますから。これまでに紹介した命令と最後に紹介するDLY命令が2 Byte命令のすべてです。なお、MSBが1なのに正規の2 Byte命令のビットパターンに含まれないオペコードは、2 Byte NOP命令として扱われ、プログラム上は無視されます。

Eレジスタ関係は次の8種類。
Mne.  Op Cy N  CO  動作
LDE   40  6 1      AC <- (E)
XAE   01  7 1      (AC) <-> (E)
ANE   50  6 1      AC <- (AC) & (E)
ORE   58  6 1      AC <- (AC) | (E)
XRE   60  6 1      AC <- (AC) ^ (E)
DAE   68 11 1  *   AC <- (AC) + (E) + (CY/L) {BCD format}
ADE   70  7 1  **  AC <- (AC) + (E) + (CY/L)
CAE   78  8 1  **  AC <- (AC) + !(E) + (CY/L)
基本的にニーモニックはイミディエート命令のニーモニック末尾のIをEに取り替えただけとなっていますが、STE命令は存在せず、上の表のSTE命令が書き込まれているはずのところはXAE命令となっています。これはExchange AC and Extensionの略で、アキュムレータとEレジスタの交換命令となっています。オペコードもXAE命令だけ特別扱いです。Eレジスタにデータを転送するだけの命令は存在せず、このXAE命令を用いなくてはなりません。さらに、Eレジスタに定数をロードするようなイミディエートモードのロード命令もありません。
ほかはメモリオペランドの代わりにEレジスタが使用されるだけの差しかありません。

ポインタレジスタの移動命令はこれだけです。
Mne.  Op Cy N  CO  動作
XPAL  30  8 1      (AC) <-> (PL)
XPAH  34  8 1      (AC) <-> (PH)
XPPC  3C  7 1      (PC) <-> (PTR)
XPAL命令はExchange Pointer Lowということでポインタレジスタの下位8 bitをACの内容と交換する命令です。XPAH命令はポインタレジスタ上位8 bitとACの内容を交換する命令です。XPPCはExchange Pointer with PCで、ポインタレジスタとPCの内容を入れ換えます。
ポインタレジスタとそれ以外の場所とのデータ転送命令は、このグループに属する3種類しかありません。直接16 bit定数をポインタレジスタにロードするどころか、8 bit単位でロードすることもできません。ポインタレジスタに値を設定するには、1 ByteずつアキュムレータにロードしてXPAL命令やXPAH命令でポインタレジスタにロードしなくてはなりません。 ポインタレジスタの内容を変更する際、アキュムレータの内容が必要なら、なんらかの退避処理命令がよけいに必要となるのも面倒そうです。
しかし最大級の問題はXPPC命令にあります。実はPCの内容をメモリやレジスタに保存すると同時にジャンプする命令は、XPPC命令しかありません。つまり、XPPC命令だけがサブルーチンジャンプに使える命令なのです。したがって、サブルーチン呼び出しするためには、LDI命令とXPAL, XPAH命令を用いてP1, P2, P3のいずれかのポインタレジスタにサブルーチンアドレス(正確には後で説明しますがアドレス-1)をロードしてからXPPC命令を実行しなくてはなりません。サブルーチンから戻るには、戻りアドレスがポインタレジスタに入っていますから、もう一度XPPC命令を実行するだけです。しかし、これではサブルーチンのネスティングができません。サブルーチンの中からさらにサブルーチンを呼び出すには、戻りアドレスが入っているポインタレジスタをメモリ上に退避させてから同じことを行わなくてはなりません。そのため、標準的にはP2あたりをスタックポインタとして使用して、オートインデックスアドレッシングで戻りアドレスをスタックにプッシュします。具体的には、サブルーチンの先頭アドレス-1をSUBR1とすると、
    LDI    L(SUBR1)
    XPAL   P1
    ST     @-1(P2)
    LDI    H(SUBR1)
    XPAH   P1
    ST     @-1(P2)
    XPPC   P1
というようになります。ここで、L(x)はxの下位8 bitを、H(x)はxの上位8 bitを取り出すアセンブリ言語表現です。この場合のサブルーチンから戻る操作は、逆にスタックからポップしてポインタレジスタに戻りアドレスを入れてからXPPC命令ということになります。このように、サブルーチンネストを行う場合にはアドレスのセットからスタック処理までコーディングしなくてはならず、繁雑となります。

シフト・ローテート関係の命令も少数しかありません。
Mne.  Op Cy N  CO  動作
SIO   19  5 1      Serial Input/Output
SR    1C  5 1      Shift Right
SRL   1D  5 1      Shift Right with Link
RR    1E  5 1      Rotate Right
RRL   1F  5 1  *   Rotate Right with Link
どの命令も右シフト系、つまりMSBからLSBへ向かっての移動しかありません。左側への移動はありませんから、どうしても必要なら加算命令を利用することになります。
SIO命令はシリアル入出力のための特別なシフト命令です。アキュムレータの右シフトを行うと同時にMSBにはSIN端子の値が入り、LSBから押し出されたビットはSOUT端子に出力されます。
SR命令は単純右シフト命令で、MSBには0が入り、LSBのデータは失われます。それに対してSRL命令はMSBにCY/Lフラグの値が入りますが、やはりLSBのデータは失われます。
RR命令は単純ローテート命令で、アキュムレータの8 bitが右にローテートされるだけです。つまりLSBから押し出されたデータがMSBに入ります。RRL命令はアキュムレータとCY/Lフラグを接続したローテート命令で、MSBにはCY/Lフラグの内容が入り、LSBのデータはCY/Lフラグに入ります。

残りは次の9命令だけとなりました。
Mne.  Op Cy N  CO  動作
HALT  00  8 1      Output Halt pulse
CCL   02  5 1      CY/L <- 0
SCL   03  5 1      CY/L <- 1
IEN   05  6 1      IE <- 1
DINT  04  6 1      IE <- 0
CSA   06  5 1      AC <- (SR)
CAS   07  6 1      SR <- (AC)
NOP   08  5 1      No operation
DLY   8F ?? 2      Delay
HALT命令は名称とは異なり、厳密にはそれ自体ではCPUを停止させる命令ではありません。ステータス情報としてHFLGにHパルスを出力するだけの命令です。文字通りCPUを停止させるには、そのパルスを検出してSC/MPの動作を制御するCONT信号を操作する外部回路が必要です。その外部回路が付いている場合に限り、普通のプロセッサと同様のCPU停止命令として動作します。ところで、そのHパルスを外部回路で検出して出力ポートの一種として使用することも可能なわけで、その時はHALT命令という名称でもぜんぜん別の意味となります。また、HFLGのパルスを検出する外部回路がなければ、NOP命令と同じように意味のある動作をしない命令となります。SC/MPを採用したコンピュータの回路構成によって、意味が異なる場合があるということには注意しなくてはなりません。まぁ、本当にどんなシステムでもプロセッサを停止させたいなら、自分自身へのジャンプ命令を実行すれば良いわけです。プロセッサをCONT端子操作で停止させても消費電力が特に減るわけでもなし、HALT命令用の回路を省略した応用も多かったはずです。しかも、HALT命令がNOP命令と同じ意味になれば、オペコードのビットパターンが00なのでEPROMに書き込んだプログラムコードの一部を書き潰すのに都合がよいという利点まで出てきてしまいます。
CCL命令とSCL命令はそれぞれCY/Lフラグのクリアとセットを行うものです。IEN命令とDINT命令はIEフラグのセットとリセットを行うものです。後者は、ニーモニックが変に非対称ですね。
CSA命令とCAS命令はステータスレジスタとアキュムレータ間のデータ転送命令で、Copy Status to ACおよびCopy AC to Statusの略とされています。これらの命令で、CY/LフラグやIEフラグのほか、SA, SBビットの状態を調べたり、F0, F1, F2ビットのセットやリセットを行うことができます。OVフラグがセットされているかの検出も専用の命令がなく、CSA命令で一度アキュムレータに移動してからでないとできません。
NOP命令は何もしない命令ですが、オペコードのビットパターンが08なのでEPROMに書き込まれたコードの上書きには使いにくくなっています。なお、SC/MPでは未定義命令でオペコードのMSBが0の場合には、NOP命令と同じ動作を行います。MSBが1の場合には、2 ByteのNOP命令として処理されます。
DLY命令は時間待ちを行うための命令で、2 Byte目のオペランドとアキュムレータの内容に応じたサイクル数を消費します。そのサイクル数は、オペランドをdispと表記すると、13 + 2 (AC) + 514 dispという数式で表現されます。つまり、最小13サイクル、最大131593サイクルの時間待ちを指定できます。1 MHzクロックのとき、0.26秒少しまで、ほぼ4 us単位で待ち合わせができるので、キースキャンとか、LEDのダイナミック表示のタイミングを、特に時間待ち専用のサブルーチンを利用することなく直接コーディングできるわけです。ただし、割り込み応答まで命令実効が完了するまで待たされてしまいます。

ソフトウェアから眺めたアーキテクチャからプロセッサの信号を中心にハードウエア面に視点を移してみましょう。ピン配置は次のようになっています。
NWDS     1      40 VGG
NRDS     2      39 NADS
ENIN     3      38 X2
ENOUT    4      37 X1
BREQ     5      36 AD11
NHOLD    6      35 AD10
NRST     7      34 AD09
CONT     8      33 AD08
DB7(MSB) 9      32 AD07
DB6     10      31 AD06
DB5     11      30 AD05
DB4     12      29 AD04
DB3     13      28 AD03
DB2     14      27 AD02
DB1     15      26 AD01
DB0(LSB)16      25 AD00(LSB)
SENSE A 17      24 SIN
SENSE B 18      23 SOUT
FLAG0   19      22 FLAG2
VSS     20      21 FLAG1
NS社の表記では負論理の信号名はNで始まることになっています。
VSSとVGGが電源です。入出力信号をTTLレベルで扱うには、VSSに+5 Vを、VGGに-7 Vを与えます。
X1とX2が水晶発振子接続用の端子で、ここに1 MHz以下の水晶発振子を接続すれば内部発振回路によってクロック信号を生成されます。周波数精度が必要でない場合には500 pF程度のコンデンサを接続するだけでも発振するようです。
AD11 - AD0がアドレスバスでDB7 - DB0がデータバスです。直接プロセッサから出力されているアドレス信号は12本しかありません。これは16 bit分のアドレス信号のうちの下位12 bitに相当します。上位4 bitはというと、NADS (Address Strobe)信号によって示されるタイミングでデータ転送に先立ってDB7 - DB0に他のステータス信号とともに出力されます。その情報は次の表のようになっています。
 
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
HFLG DFLG IFLG RFLG AD15 AD14 AD13 AD12

したがって、DB3 - DB0をNADS信号のタイミングでラッチしてアドレス上位4 bit分の信号を得ることができます。
なお、他のステータス信号の意味は、HFLGがHALT命令実行時にHになるステータスで、DFLGがDLY命令実行中を示すステータス、IFLGが命令の第1バイトをフェッチすることを表すステータス、RFLGがリードサイクル時にHになるステータスです。IFLGは1命令ずつのステップ実行のコントロールに、RFLGはデータバスバッファなどの制御に利用できます。
NWDSとNRDSはそれぞれライトストローブとリードストローブで読み書きのタイミング信号です。
BREQ, ENIN, ENOUTはバス使用権の決定用信号です。SC/MPではディジーチェーン方式で優先順位を決定します。複数のSC/MPを用いたマルチプロセッサシステムの場合、BREQ信号はすべて接続して抵抗でプルダウン、最高優先度のSC/MPのENINは共通BREQ信号線に接続、その最高優先度のSC/MPのENOUTを次に優先順位の高いSC/MPのENINにという具合に、優先順位の高い順にENOUTとENINを接続していけば、バスの共有が可能となります。BREQを出しているプロセッサのうちでENINがHレベルのプロセッサがバスを使用すること、自分がバスを使用するつもりならENOUTをLのままにして使わないならENINと同じレベルを出力するという規則でディジーチェーンを実現しています。一般のDMA回路を外付けする場合、しぐるプロセッサならBREQとENINを用いてバスアービタを実装します。
NHOLD信号はバスサイクルタイミングを延長するための信号です。特に延長しなくても1 MHzクロックの場合にメモリなどのアクセスタイムは1.5 us許容されますから、よほど遅いp-MOSメモリでも使用しない限りは使う必要はありません。しかし、この信号を用いてバスサイクルを延長した形でシングルステップ実行回路を作成すれば、アドレスやデータを確認しながらのステップ実行が可能ですから、デバッグには有効です。
NRSTはリセット信号。
CONTはcontinueの略で、プロセッサの継続動作を指示します。Lレベルだと、実行中の命令が完了した後で、次の命令フェッチサイクルに入るのを待ち続けます。DMAに利用できそうですが、CONT信号の場合にはDMA許可信号を作成するのが困難です。普通はシングルステップのためか、HALT命令によるプロセッサ停止回路のために利用されます。
SENSE A, SENSE B信号は入力ポートの一種で、この端子のレベルがステータスレジスタの対応ビットに反映されます。割り込みイネーブル状態においては、SENSE A信号は正論理レベル入力の割り込み要求信号としても動作します。FLAG0, FLAG1, FLAG2は出力ポートで、ステータスレジスタの対応ビットの状態を反映します。
SINおよびSOUT信号はSIO命令で使用される入出力端子です。EIA-232のようなシリアル入出力インターフェースに使うほか、SINやSOUTにシフトレジスタのデータ端子を接続しFLAG0やFLAG1などを同じシフトレジスタのクロック信号やロード信号に使用して、多数のパラレル入出力を付加するのにも利用できます。
なお、ほとんどの入力端子にはプルアップ抵抗が内蔵されています。

PCと命令フェッチの動作には、SC/MP系列以外にはみられない変わった点があります。通常のプロセッサでは命令をフェッチしてからPCをインクリメントしますが、SC/MP系列ではPCをインクリメントしてから命令をフェッチします。順序が逆です。特にリセット時にこの違いが色濃く出ます。リセット時にはPCが0にクリアされ、それから命令フェッチと実行を繰り返します。そのため、SC/MP系列のプロセッサがリセット後に最初に実行する命令は0001番地に格納されている命令となっています。
このほか、同じことがJMP命令やXPPC命令にもいえて、機械語では本来ジャンプすべきアドレスより1だけ小さなアドレス値をオペランドに用います。JMP命令のPC相対アドレッシングの計算についてはアセンブラが適切に処理してくれますが、XPPC命令のような場合には、ポインタレジスタにアドレスをロードする時点では他のデータと区別が付きませんからアセンブラで対処することができません。したがってプログラマが注意しながらプログラミングしなくてはなりません。
割り込みも少し困った仕様です。割り込み許可状態ではSENSE A信号がHになると割り込み処理が発生しますが、この割込み処理とはXPPC 3という命令の強制自動実行だけです。つまり割り込み許可状態では必ずP3に割り込みサービスルーチンの先頭アドレスより1少ない値を格納しておかなければならないのです。P2をスタックポインタとして利用することにしたら、それ以外の用途に自由に利用できるポインタはP1ひとつになってしまいます。当時のマイクロプロセッサでインデックスアドレッシングに利用できるポインタレジスタを3組持っているのは珍しく、強力なアーキテクチャに感じられますが、スタックポインタや割り込みなど他のプロセッサで比較的簡単に利用できることと同じことをしようとすると、とたんにポインタレジスタが不足気味になります。

全体的にみて、SC/MPかなり小規模な応用に向いたマイクロプロセッサといえるでしょう。複雑なことをしようとしたら、すぐにプログラムが長くなって実行時間もやたらかかるでしょうし。せいぜいROMが2 KByteにRWMが256 Byte程度で済むようなアプリケーションなら、上位アドレスをラッチする必要もページ境界に悩む必要もありません。多重割り込みとか深いサブルーチンなどあきらめて2, 3レベル程度の深さのサブルーチンネスティングで済むような組み込み用途なら、それなりに便利に使えます。ちょうどメモリ外付けのPICのような感じでしょうか。
後にn-MOSプロセスで高速化したSC/MP IIが発表されますが、速度と電源電圧が異なるほかはアーキテクチャは同一です。

Return to IC Collection