RCA 1802

RCA CDP1802とは、1976年はじめにRCAが初のシングルチップマイクロプロセッサとしてCOSMAC (Complementary Symmetry Monolithic Array Computer) アーキテクチャに基づき40ピンLSIパッケージの集積回路に実装した8ビットCMOSマイクロプロセッサである。それより以前（1970年代初め）には、RCAの内部では1801や1802マイクロプロセッサはしばしば "COSMAC" として言及された。ホビーストは通常1802と呼んだ。これは現在でもインターシルで高信頼性マイクロプロセッサとして製造され続けている。1802は他の大半の8ビットマイクロプロセッサとは異なるアーキテクチャを持つ。
1970年から1971年にかけて、ジョセフ・ウェイスベッカーは新しい8ビットアークテクチャのコンピュータを開発した。1975年のはじめにRCAはC-MOSプロセスを用いてウェイスベッカーの成果をCOSMAC 1801Uと1801Rの2チップ（TA6889/TA6890とTC1084/TC1805として知られる）として発売した。1976年にはジェリー・ヘルゾグの率いるチームが、この2つのチップを1つにまとめてCDP1802とした。
CDP1802の後続機種はCDP1804、CDP1805、CDP1806であり、命令セットの拡張や、その他の強化（オンチップRAM、ROM、タイマーの装備）が行われ、幾つかの版では顕著ではないにしても動作速度の向上が行われていた。一方でDMAオートブート機能など、削除された機能もあった。幾つかのピンの機能も変更された。

概要

CDP1802はスタティックCMOSで設計され、 クロック周波数の下限がなく、非常に遅いクロックで非常に低消費電力でも動作し、動作に影響を与えること無くクロックを停止してサスペンドさせることも出来る。独立した2つの8ビットバスを持ち、その1つは8ビット双方向データバスで、他方は16ビットのアドレスを上位と下位8ビットをクロックサイクル毎に時分割で交互に出力する多重化したアドレスバスである。
1802は、プログラマブルで参照可能な単一ビットの出力ポート（Q）と、分岐命令で直接参照できる4本の入力ポート（EF1-EF4）を持つ。
柔軟でプログラマブルなI/Oモードと、オンチップの単相クロック発振器を持つ。レジスタは16本の16ビットレジスタからなり、SEP Rn 命令で指定したいずれのレジスタでもプログラムカウンター （PC）とすることができ、複数のPCを持つことが容易で、簡単にサブルーチンコールを行える（下記のサブルーチンコールを参照）。 同様に、SEX Rn命令でインデックスレジスタ（Xレジスタ）となるレジスタを指定し、それをポインタや間接アドレッシングに使えるし、16本のレジスタを汎用レジスタとして使える。DMA入力ならびにDMA出力では特定のレジスタを使用する。

耐放射線強化

「バルク・シリコン」のC2L CMOS技術に加え、シリコン・オン・サファイア(SOS)半導体プロセス技術でも製作されており、ある程度の耐放射線および耐静電気放電(ESD)性を持つ。非常に低い消費電力で動作することから、このチップは宇宙用途や軍事用途に非常に適している（なお、1802が発表された時には市場にはほかに耐放射線強化のマイクロプロセッサは殆どなかった）。

宇宙用途

CDP1802は多くの宇宙機や宇宙実験プロジェクトやモジュールで使用されている。ガリレオでは20個に及ぶ1802マイクロプロセッサを使用した。しばしばバイキングやボイジャーにも使用されていると誤って言及されるが、これらの探査機が設計された時には1802はまだ存在せず、一次資料によればバイキングやボイジャーのコンピュータはマイクロプロセッサベースではなく、1802とは全く異なるアーキテクチャであるとしている。1802は地球周回衛星（AMSAT Phase 3-D）、幾つかのOSCAR衛星、UoSAT-C、 MAGSATに主コンピュータとして幅広く使われ、1990年代以降は複雑度の低い飛行制御および通信システムコンピュータへの使用が主流となった。前身の2チップの1801と、1チップの1802は早期のAMSAT衛星に使用された。NASAの資料からもハッブル宇宙望遠鏡、マゼランの金星プローブ、ユリシーズに使用されていることが確認されている。また、1980年代はじめのMASCOT（MIT Astronomical Spectrometer/Camera for Optical Telescopes）の多数の望遠鏡の制御装置にも使われた。スペースシャトルにより打ち上げられ回収されたNASAの長時間暴露施設 (LDEF) の57の実験装置の少なくとも1つ、熱制御表面実験 (TCSE) で1802を使用した。1802をベースにしたセキュリティデバイスである "Electronic Fill Device" は米国のスペースシャトルのセキュアな通信システムとして、打ち上げ前に地上基地の暗号化/復号システムから最高機密のミッションキーを複数のシャトルや地上基地へ伝達するのに使われた。

マイコンシステム

初期のマイクロコンピュータでは1802をベースとしていたものが多くあった。例えば、COSMAC ELF(1976)、Netronics ELF II、Quest SuperELF、COSMAC VIP、Comx-35、フィンランドの Telmac1800 と Oscom Nano、ユーゴスラビアのPecom32と64、また1970年代後半にMontgomery Wardを通じて販売されたCybervisionシステムはRCA Studio II ビデオゲームコンソールとなり、ビットマップグラフィックを最初期に使用したコンソールであった。
1802の Retrocomputing のホビーストの成果として、近年（2000年以降）はAltoidsの容器に収まる「Membership Card マイクロコンピューターキット」 や "Spare Time Gizmos Elf2000(Elf2K)"などが製作されている。その他のシステムについてはエミュレータ-シミュレータを参照のこと。

製品

CDP1802はまた多くの製品やシステム、科学用途の機材や他の商用製品にも使われた。例えばNASAと他の連邦政府機関のジョイントベンチャーで開発されたRemote Deployable Water Quality Monitoring System (WQMS)では2つの1802を使用していた。他の例としては1980〜1985年のSinar Moisture Metersのうち初期の2品種が挙げられる。1980年代中頃には Infocel TimeTrac 時間追跡デバイスの設計では1802を使用している。1980年以降はクライスラーや関連する自動車のモデルでは第2世代の電子リーンバーンシステムの電子点火制御装置に1802が使われ、最初期のコンピュータベースの自動制御システムの一つとなった。スペインでは多くのピンボールマシンやビデオアーケケードゲームの製造に用いられた。合衆国の多くの特許では1802プロセッサを参照している（キーワード CDP1802, RCA1802, 或いは COSMACで検索せよ）。カリフォルニア大学バークレー校の地球科学部門であるローレンス・バークレー国立研究所がアメリカ合衆国エネルギー省のために自動地震計 (Automated Seismic Processor, ASP) のMicroearthquake検出解析システムにおいて複数の1802がマスタースレーブ構成の設計で用いられた。1802はボーイング737のデジタル・クロノメーターに使用された。1980年代はじめに南極に配置された多くの自動測候所 (Automated Weather Stations, AWS) は1802を使用した。
早くから1802向けに使用できた高級言語としてはForth Inc.が1976年に提供したForthがあった。その他に使えるインタプリタやコンパイラのプログラム言語としては、CHIP-8とその変種、リー・ハートが開発したForth系の言語である8th、トム・ピットマンのTiny BASIC、C、幾つかのアセンブラやクロスアセンブラ、などである。NASAや、その施設、AMES、ゴダード、ラングレー、マーシャル、およびジェット推進研究所 (JPL) では、HAL/S クロスコンパイラ、Forthに似た言語であるSTOIC、その他の専用の言語が使用された。

エミュレータ、およびシミュレータ

ホビーストたちは1802チップや、それを使ったコンピュータをハードウェアやソフトウェアでエミュレートないしシミュレートしている。デザインの1つではFPGA向けにVHDLで記述されている。バスの動作まで正確でCOSMAC Elfと同じ速度のクローンがCDP1802マイクロプロセッサとCDP1861ビデオチップを用ずPIC マイコンを用いて作られている。JavaScriptで記述された、拡張されたCOSMAC Elfのオンラインシミュレータは、ダウンロードすることなく手許のブラウザで実行できる。

レジスタ及びI/O

CDP1802は、8ビットを1バイトとするバイトアーキテクチャであり、2バイト操作を行う最小限の16ビットオペレーションもサポートする。主アキュムレータは、8ビットのDレジスタ（データ・レジスタ）である。フラグとしては1ビットのキャリーフラグであるDF（データ・フラグ）がある。算術、論理、メモリ参照ロード、ストアを含む大半のオペレーションではDレジスタを使用する。16ビットの処理では必要に応じてキャリーやボローをDFに格納し、Dレジスタを介してまず下位バイトを処理し次に上位バイトを処理する。命令により16本の16ビットレジスタの上位バイトや下位バイトからDレジスタを介して取り出したり置いたりできる。一方で16ビットレジスタは1命令でインクリメントしたりデクリメントできるし、LDA (load advance) やSTXD (store via X and decrement) のように自動的にインクリメントしたりデクリメントする命令も幾つかある。16ビットレジスタと値の比較は、Dレジスタを介して複数の命令を組み合わせて実行する必要がある。
1802の重要な特徴は16本の16ビット幅レジスタの構成にある。R0-RF（しばしばRを省略して0-Fで表現される）と呼ばれる16本のレジスタのいずれでもSEP命令によりプログラムカウンタにでき、SEX命令によりインデックスレジスタにできる。レジスタR0は内蔵DMAコントローラが処理対象とするメモリアドレスを保持する専用の役割も持つ。レジスタR1は割り込み処理ルーチンのプログラムカウンタを保持する専用の役割も持つ。
プロセッサは5つのI/O専用線を持つ。単一のQ出力はSEQ命令でセットでき、REQ命令でリセットできる。EF1、EF2、EF3、EF4の4本の入力があり、これらの入力の状態を参照する8つの条件分岐命令がある。また、インデックスレジスタとDアキュムレータを使用して入出力を行う、7つの入力命令と7つの出力命令がある。
ホビーストのコンピュータではEF1〜4入力とQ出力は有用で扱い易いことから複数のインターフェースに使われた。典型的にはQ出力はステータスLED、カセットインタフェース、RS-232インターフェイスの駆動に用いられた。これにより、音量制御が実装されていない場合にはRS-232やカセットにデータが転送されているのをユーザーが実際に耳で聞くことができた。COSMAC Elfのシリーズでは伝統的にEF4入力は押しボタンに接続された。他のシステムでは他の入力も使われる。
この他に、いくつかの他の特別なレジスタとフラグがある。内部処理に用いられるものと、プログラマが使用できるもので、4ビットのN、P、X、Iレジスタ、8ビットのTレジスタ、および1ビットのIEレジスタがある。

分岐

CDP1802には3種類の無条件分岐と条件分岐がある。ショートブランチ、ロングブランチ、スキップである。
ショートブランチは2バイト命令で、1バイトのオペコードと1バイトのアドレスバイトを持ち、ページ絶対アドレッシングにおいて0から255（16進でFF）の256バイトの範囲に用いる。相対分岐命令は無く、2つの例外を除いてショートブランチではページを跨ぐことができないことに注意しなければならない。その例外はショートブランチを実行する際の副作用を前提にしたもので、1つはショートブランチ命令のオペコードをページの最後のバイトに置く方法、もう1つはショートブランチ命令のアドレスバイトをページの最後のバイトに置く方法である。前者の場合はアドレスバイトが次のページの最初に置かれており、それを読み取った時点でPCは次のページを指している。後者の場合は場合はアドレスバイトを読み取った後にPCがインクリメントされ、次のページを指す。いずれの場合も分岐命令はショートブランチ命令のオペコードが置かれていたページではなく、次のページを対象に実行される。
ロングブランチは16ビットアドレスを用いて64Kのメモリアドレス空間をサポートし、これだけが3バイト命令である。
スキップ命令は、PCを1つすすめる無条件ショートスキップか、2つすすめるロングスキップがある。ロングスキップにのみ条件分岐がある。

サブルーチンコール

CDP1802は他のプロセッサに見られるサブルーチンCALL命令やRET命令を持たないが、SEP命令を用いてシミュレートできる。16本レジスタ構成の設計と、SEP命令により興味深いサブルーチンコールとリターンの仕組みが構成され、一般的なコーディングに比べて小規模なプログラムに適している。
頻用される少数のサブルーチンについては16本のレジスタの1つにそのアドレスを保持しておくことで高速に呼び出すことができる。ただし、呼ばれたサブルーチンは「リターン」命令を実行するためにSEP命令を実行するので、呼んだ側のPCがどのレジスタに割り当てられていたかを知らなければならず、またSEP命令ではPCに指定するレジスタ番号をハードコーティングせざるを得ないので、呼ぶ側のPCのレジスタ番号は固定される。あるSEP命令は16ビットレジスタの1つが保持するアドレスから始まるサブルーチンを呼び出すのに使用され、別のSEP命令が呼び出した側に戻るために使われる。サブルーチンから戻る前に、そのエントリポイントの直前にジャンプし、SEP「リターン」命令を実行して制御を呼び出し側に戻したときに、レジスタが次の使用に備えて正しい値になるようにする。プロセッサは実行する命令を参照した後、次に実行する命令を拾うためにPCをインクリメントするので、前述のようなテクニックが使える。
SCRT（Standard CALL and RETURN Technique / 標準CALLとRETURNテクニック）と呼ばれる良く知られる手続きがあり、これにより引数をインラインで渡すことのできる汎用のサブルーチンが記述できる。ただしこのテクニックを使うには幾つかのレジスタがこの用途のために占有される。CDP1802のユーザーマニュアルに記載されたRCA提供のルーチンの多くでは、R2をスタックポインタに、R3をプログラムカウンタに、R4をサブルーチンコールのアドレス保持に、R5をリターンアドレスの保持に、R6を引数へのポインタ（非破壊）に割り当てることを推奨している。この割り当てではR0をDMA用に、R1を割り込み用にでき、R7からRF（"F" は16進数で15を意味するので、7番〜15番の9本のレジスタ）を汎用レジスタとして使用できる。ただし、一般のマイクロプロセッサではCALLやRET命令はアーキテクチャの設計の一部となっているのに対して、1802における、この手続きは実行速度においてオーバーヘッドとなる。

アドレッシングモード

CDP1802は16ビットアドレス、8ビットデータバス、16ビット幅の16本の汎用レジスタを持つが、アキュムレータは8ビットである。このためアキュムレータがボトルネックになりがちである。1つのレジスタの内容を別のレジスタに写すには4命令が必要となる。レジスタの上位バイトについてGetとPutが必要であり、下位バイトについても同様である。新しい定数をレジスタにロードする、例えば新しいサブルーチンジャンプのためのアドレスや、データ変数のアドレスをロードする場合も4命令が必要となる。
アドレッシングモードとしては、レジスタ間接モードと、自動インクリメント付きレジスタ間接モードの2つがあり、アキュムレータを使った8ビット演算を行ううえではかなり有効である。しかし、その他のアドレッシングモードはなく、他のプロセッサに見られるダイレクトアドレッシングモードは、前述の定数をレジスタにロードする要領で空いているレジスタにメモリアドレスを読む4つの命令を置き、続けてインデックスレジスタを指定する命令を置き、最後にそのアドレスが指し示すデータに関する命令を置いて、これを実行することでエミュレートする必要がある。

DMAとロードモード

CDP1802は入力要求と出力要求の2本の要求線を持つDMAコントローラを内蔵し、R0がDMA処理を行う対象アドレスを示すアドレスポインタとなる。
DMAコントローラには、プロセッサのCLEARとWAIT入力が同時にアクティブである間にメモリにロードできる特別な「ロードモード」がある。これを使うとROMベースのブートストラップなしでプログラムをロードできる。COSMAC Elfマイクロコンピュータやその後継機では、ソフトウェアや最小限のハードウェアを必要とせずトグルスイッチや16進キーボードからプログラムをロードするのに使われる。

命令タイミング

大半の8ビットマイクロプロセッサに比較するとCDP1802のクロックサイクル効率はかなり劣る。1マシンサイクルは8クロックサイクルからなる。大半の命令は実行に2マシンサイクル (16クロックサイクル) を要し、一部の命令は3マシンサイクル (24クロックサイクル) を要する。これに対し、MOS Technology 6502では1命令実行に2ないし7クロックサイクルを要し、Intel 8080では4ないし18クロックサイクルを要する。

コードの例

この例のコードは ALU (算術論理ユニット) の動作を診断するルーチンである。

..  TEST ALU OPS
0000 90         GHI 0     .. SET UP R6
0001 B6         PHI 6
0002 F829       LDI DOIT  .. FOR INPUT OF OPCODE
0004 A6         PLO 6
0005 E0         SEX 0     .. (X=0 ALREADY)
0006 6400       OUT 4,00  .. ANNOUNCE US READY
0008 E6         SEX 6     .. NOW X=6
0009 3F09       BN4 *     .. WAIT FOR IT
000B 6C         INP 4     .. OK, GET IT
000C 64         OUT 4     .. AND ECHO TO DISPLAY
000D 370D       B4 *      .. WAIT FOR RELEASE
000F F860       LDI #60   .. NOW GET READY FOR
0011 A6         PLO 6     .. FIRST OPERAND
0012 E0         SEX 0     .. SAY SO
0013 6401       OUT 4,01
0015 3F15       BN4 *
0017 E6         SEX 6     .. TAKE IT IN AND ECHO
0018 6C         INP 4     .. (TO 0060)
0019 64         OUT 4     .. (ALSO INCREMENT R6)
001A 371A       B4 *
001C E0         SEX 0     .. DITTO SECOND OPERAND
001D 6402       OUT 4,02
001F E6         SEX 6
0020 3F20 LOOP: BN4 *     .. WAIT FOR IT
0022 6C         INP 4     .. GET IT (NOTE: X=6)
0023 64         OUT 4     .. ECHO IT
0024 3724       B4 *      .. WAIT FOR RELEASE
0026 26         DEC 6     .. BACK UP R6 TO 0060
0027 26         DEC 6
0028 46         LDA 6     .. GET 1ST OPERAND TO D
0029 C4   DOIT: NOP       .. DO OPERATION
002A C4         NOP       .. (SPARE)
002B 26         DEC 6     .. BACK TO 0060
002C 56         STR 6     .. OUTPUT RESULT
002D 64         OUT 4     .. (X=6 STILL)
002E 7A         REQ       .. TURN OFF Q
002F CA0020     LBNZ LOOP .. THEN IF ZERO,
0032 7B         SEQ       .. TURN IT ON AGAIN
0033 3020       BR LOOP   .. REPEAT IN ANY CASE
注釈：上記のルーチンではCDP1802マイクロプロセッサが初期リセット状態、あるいは同等な状態にあることを前提に動作する。ここで、プログラムカウンタ (PC) とインデックスレジスタは両方とも16ビットレジスタR0に割り当てられている。それゆえ、PCとXが両方R0であるので、例の中の OUT 4,00 で即値を出力できる。即ち、PCはメモリから OUT 4 命令を読み取った後にインクリメントされるため、命令を実行する時点では PC であり且つインデックスレジスタである R0 は次のバイト、即ち00を指している。この状態でOUT命令が実行されるので00が出力される。OUT命令はまたXレジスタ、即ちR0をインクリメントするが、これはまたPCでもあるので、即値の次のアドレスにある命令から実行が続けられる。これが、このルーチンでXレジスタを必要に応じてSEX命令でR6やR0に設定する理由である。また、OUT命令が逐次RXレジスタをインクリメントするので連続したメモリの内容を容易に出力できるのに対して、INP命令はそうしないことにも注意。これは値をRXが指すメモリとDレジスタに入れるが、RXを変更しない。
このルーチンでは、また、OUT 4でCPUシステム内の値が8ビットのLEDか2桁の16進ディスプレイに表示され、IN 4で8個のトグルスイッチの値（または16進キーボード）を読み取ると仮定している。BN4命令、ここでは "LOOP: BN4 *" と表記されるが、オペランドの*(アスタリスク)はこの命令の置かれているアドレスを指す。つまり、条件が成立する間はスピンループする。これは「EF4入力がLOであったら分岐」する命令で、すなわち「入力」押しボタンが押される瞬間を待つ。同様にB4命令（もしHIなら分岐）ループはボタンが離されるのを待つ。SEQとREQはQ出力をONまたはOFFにする。Q出力には大抵LEDが接続されており、これでLEDを点けたり消したりする。
1802は「バイトマシン」だが、16ビットレジスタを16本、R0-RF（しばしばRを省略して0-Fで表現される）を持つ。16ビットレジスタを扱うにはプログラマはDレジスタを介して上位バイトや下位バイトの値をGet（上位バイトならGHI、下位バイトならGLO）やPut（同様にPHIやPLO）しなければならない。16本のレジスタのこれら上位バイトと下位バイトはしばしばRn.0（下位バイト）とRn.1（上位バイト）として言及される。ショートブランチは256バイトアドレス境界内の絶対ページアドレスで、ロングブランチは3バイト命令で16ビットアドレスで示される64KBのメモリ空間の何処にでも分岐できる。
これらの情報は、「擬似コード」を読む充分な知識はあるが、アセンブラやマシン語プログラムに不慣れなコンピュータプログラマがよりルーチンを深く理解するのに役立てられる。