RCA CDP1802 (COSMAC)
|
RCA CDP1802 Data 8/16bit / Address Bus 16bit Cycle 3.2MHz〜6.4MHz (1976) |
初期型:「CDP1801」
初期生産時は「CDP1801R,U」であったが、後に「CDP1802」に統合された。
廉価型:「CDP1802CE」
保証動作電圧を4〜6.5Vに限定したもの。
後継型:「CDP1804」
命令を追加し、2kBの内蔵マスクROMと64Bの内蔵RAMを持っている。
また、8bitのカウンタとタイマが追加された。
後継型:「CDP1805」
「CDP1804」から内蔵マスクROMを取り除いたもの。
後継型:「CDP1806」
「CDP1805」から内蔵RAMを取り除いたもの。
●CDP1802のピン配列
| CLOCK | 1 | 40 | Vdd | |
| WAIT | 2 | 39 | XTAL | |
| CLEAR | 3 | 38 | DMA-IN | |
| Q | 4 | 37 | DMA-OUT | |
| SC1 | 5 | 36 | INT | |
| SC0 | 6 | 35 | MWR | |
| MRD | 7 | 34 | TPA | |
| BUS7 | 8 | 33 | TPB | |
| BUS6 | 9 | 32 | MA7 | |
| BUS5 | 10 | 31 | MA6 | |
| BUS4 | 11 | 30 | MA5 | |
| BUS3 | 12 | 29 | MA4 | |
| BUS2 | 13 | 28 | MA3 | |
| BUS1 | 14 | 27 | MA2 | |
| BUS0 | 15 | 26 | MA1 | |
| Vcc | 16 | 25 | MA0 | |
| N2 | 17 | 24 | EF1 | |
| N1 | 18 | 23 | EF2 | |
| N0 | 19 | 22 | EF3 | |
| Vss | 20 | 21 | EF4 |
●CDP1802の特徴
「COSMAC」(Complementary Symmetry Monolithic Array Computer)アーキテクチャに基づいて設計されたCPUである。
クロック周波数の下限は実際には存在せず、非常に遅いクロックでも動作し、低消費電力での動作が可能である。
アドレスバスも2つの独立した8bitバスを持っており、片方は8bit双方向、もう片方は16bitのアドレスを上下8bitで区切ったものをタイムシェアリングで交互に使用することにより多重化を実現している。
ハード的には耐放射線、耐静電気放電に加え。許容使用温度が-40〜85℃(-55〜125℃まで許容したものもある)といった耐久性を重視したものになっている。
また、低クロック動作時における低電力消費という特徴があることから、宇宙関連や軍事用途といった特殊な環境での利用が行われた。
(初期のAMSAT衛星やハッブル宇宙望遠鏡、木星探査機「ガリレオ」などに使用されている)
レジスタセットは以下の構成となっている。
いくつかの特殊レジスタと16個の上下8bitで分割できる汎用レジスタを持っている。
汎用レジスタは「R(m).n」と表記され、m=0〜F(15),n=0/1(上位下位)となっている。
その中でR(0)とR(2)は通常のデータレジスタとしても使用できるが、ポインタレジスタとして使用するように設計されている。
| 特殊レジスタ | ||
|---|---|---|
| D | 8bit | →Data Register(Accumulator) |
| DF | 1bit | →Data Flag |
| IE | 1bit | →Interrupt Enable Flag |
| P | 4bit(Lower) | →Program Counter(このレジスタが示す値のRレジスタを使用) |
| X | 4bit(Higher) | このレジスタが示す値のRレジスタが汎用ポインタレジスタとなる |
| T | 8bit | 割込時にX,Pレジスタの内容が保持される |
| N | 4bit | 実行中の命令下位4bitが設定される(ポインタレジスタ指定に使用) |
| I | 4bit | 実行中の命令上位4bitが設定される |
| Q | 1bit | Qポートへの出力内容が設定される |
| 一般レジスタ [R(0).n〜R(F).n] | ||
| R(m).0 | 8bit(Lower) | →Register |
| R(m).1 | 8bit(Higher) | →Register |
動作モードを持っており、入力ポート「CLEAR*」「WAIT*」の状態により変化する。
| CLEAR* | WAIT* | mode | 説明 |
|---|---|---|---|
| L | L | LOAD | 外部からDMA機能を介してプログラムをメモリに格納 |
| L | H | RESET | P,X,R(0)レジスタを0クリアし、Qレジスタをリセット、IEレジスタに1をセット |
| H | L | PAUSE | 内部クロックを停止し、実行を一時停止 |
| H | H | RUN | 通常のプログラム動作モード |
アドレッシングモードは以下の通りである。
●CDP1802の命令
基本的には命令(ニーモニック)のみの構成となっている。
(レジスタ指定時は命令の下位4bitが汎用レジスタ番号を示している)
Pレジスタを参照する命令は命令に続く1byteの値を参照(イミディエイト指定)するため、実質2byteの命令長となる。
絶対アドレス分岐命令は続く2byteの値が分岐先のアドレスになるため、実質3byteの命令長となる。
●データ転送命令 (Memory→Register)
| ニーモニック | 動作 |
|---|---|
| LDN | R(n)が示すメモリからDレジスタに転送 (n≠0) |
| LDA | LDNと同じ動作をした後、R(n)をインクリメント |
| LDX | Xレジスタの値を汎用レジスタの番号として、その値が示すメモリからDレジスタに転送 |
| LDXA | LDXと同じ動作をした後、汎用レジスタをインクリメント |
| LDI | Xレジスタの値を汎用レジスタの番号として、その値が示すメモリからDレジスタに転送した後、汎用レジスタをインクリメント |
| STR | DレジスタからR(n)が示すメモリに転送 |
| STXD | Xレジスタの値を汎用レジスタの番号として、Dレジスタからその値が示すメモリに転送した後、汎用レジスタをデクリメント |
●レジスタ操作命令
| ニーモニック | 動作 |
|---|---|
| INC | R(n)をインクリメント |
| IRX | Xレジスタをインクリメント |
| DEC | R(n)をデクリメント |
| GLO | R(n)下位の値をDレジスタに転送 |
| PLO | Dレジスタの値をR(n)下位に転送 |
| GHI | R(n)上位の値をDレジスタに転送 |
| PHI | Dレジスタの値をR(n)上位に転送 |
●算術演算命令
| ニーモニック | 動作 |
|---|---|
| ADD | Xレジスタが示すメモリの値とDレジスタの値を加算し、Dレジスタに格納、桁あふれ(Carry)が発生した場合はDFレジスタに格納 |
| ADI | Pレジスタが示すメモリの値とDレジスタの値を加算し、Dレジスタに格納、Carryが発生した場合はDFレジスタに格納し、Pレジスタをインクリメント |
| ADC | Xレジスタが示すメモリの値とDレジスタの値とDFレジスタの値を加算し、Dレジスタに格納、Carryが発生した場合はDFレジスタに格納 |
| ADI | Pレジスタが示すメモリの値とDレジスタの値とDFレジスタの値を加算し、Dレジスタに格納、Carryが発生した場合はDFレジスタに格納、Pレジスタをインクリメント |
| SD | Xレジスタが示すメモリの値からDレジスタの値を減算し、Dレジスタに格納、桁の繰り下がり(Borrow)が発生した場合はDFレジスタに格納 |
| SDI | Pレジスタが示すメモリの値からDレジスタの値を減算し、Dレジスタに格納、Borrowが発生した場合はDFレジスタに格納、Pレジスタをインクリメント |
| SDB | Xレジスタが示すメモリの値からDレジスタの値とDFレジスタの否定値を減算し、Dレジスタに格納、Borrowが発生した場合はDFレジスタに格納 |
| SDBI | Pレジスタが示すメモリの値からDレジスタの値とDFレジスタの否定値を減算し、Dレジスタに格納、Borrowが発生した場合はDFレジスタに格納、Pレジスタをインクリメント |
| SM | Dレジスタの値からXレジスタが示すメモリの値を減算し、Dレジスタに格納、Borrowが発生した場合はDFレジスタに格納 |
| SMI | Dレジスタの値からPレジスタが示すメモリの値を減算し、Dレジスタに格納、Borrowが発生した場合はDFレジスタに格納、Pレジスタをインクリメント |
| SMB | Dレジスタの値からXレジスタが示すメモリの値とDFレジスタの否定値を減算し、Dレジスタに格納、Borrowが発生した場合はDFレジスタに格納 |
| SMBI | Dレジスタの値からPレジスタが示すメモリの値とDFレジスタの否定値を減算し、Dレジスタに格納、Borrowが発生した場合はDFレジスタに格納、Pレジスタをインクリメント |
●論理・シフト演算命令
| ニーモニック | 動作 |
|---|---|
| AND | Xレジスタが示すメモリの値とDレジスタの値で論理積を取って、Dレジスタに格納 |
| ANI | Pレジスタが示すメモリの値とDレジスタの値で論理積を取って、Dレジスタに格納<してPレジスタをインクリメント |
| OR | Xレジスタが示すメモリの値とDレジスタの値で論理和を取って、Dレジスタに格納 |
| ORI | Pレジスタが示すメモリの値とDレジスタの値で論理和を取って、Dレジスタに格納してPレジスタをインクリメント |
| XOR | Xレジスタが示すメモリの値とDレジスタの値で排他的論理和を取って、Dレジスタに格納 |
| XRI | Pレジスタが示すメモリの値とDレジスタの値で排他的論理和を取って、Dレジスタに格納してPレジスタをインクリメント |
| SHR | Dレジスタの値を論理右シフトし、最下位bit(LSB)をDFレジスタに格納 |
| SHRC | Dレジスタの値を右シフトし、DFレジスタの値を最上位bit(MSB)に、LSBをDFレジスタに格納 |
| RSHR | SHRCと同じ(コードも一緒) |
| SHL | Dレジスタの値同士を加算(2倍なので左シフトするのと結果は同じ)し、MSBをDFレジスタに格納 |
| SHLC | Dレジスタの値を左シフトし、DFレジスタの値をLSBに、MSBをDFレジスタに格納 |
| RSHL | SHLCと同じ(コードも一緒) |
●条件分岐命令 (Pレジスタ下位の値が変化することで256byteの絶対アドレス分岐となる)
| ニーモニック | 動作 |
|---|---|
| BR | Pレジスタが示すメモリの値をPレジスタ下位に転送(無条件分岐) |
| NBR | Pレジスタをインクリメント(次のアドレスをスキップ) |
| BZ | Dレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BNZ | Dレジスタの値が0以外の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BNF | DFレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BM | BNFと同じ(コードも一緒) |
| BL | BNFと同じ(コードも一緒) |
| BDF | DFレジスタの値が1の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BPZ | BDFと同じ(コードも一緒) |
| BGE | BDFと同じ(コードも一緒) |
| BQ | Qレジスタの値が1の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BNQ | Qレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| B1 | 入力ポートEF1の値が1の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BN1 | 入力ポートEF1の値が0の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| B2 | 入力ポートEF2の値が1の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BN2 | 入力ポートEF2の値が0の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| B3 | 入力ポートEF3の値が1の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BN3 | 入力ポートEF3の値が0の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| B4 | 入力ポートEF4の値が1の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
| BN4 | 入力ポートEF4の値が0の場合、Pレジスタが示すメモリの値をPレジスタ下位に転送 |
●絶対アドレス分岐命令 (Pレジスタが示すメモリの値が参照されるため、実質オペランドを持つ命令となる)
| ニーモニック | 動作 |
|---|---|
| LBR | Pレジスタが示すメモリの値をPレジスタの上位、次のメモリの値をPレジスタの下位に転送(16bit絶対アドレス分岐) |
| NLBR | Pレジスタの値を+2する(2byteスキップ) |
| LBZ | Dレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタに転送 |
| LBNZ | Dレジスタの値が0以外の場合、Pレジスタが示すメモリの値をPレジスタに転送 |
| LBNF | DFレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタに転送 |
| LBDF | DFレジスタの値が1の場合、Pレジスタが示すメモリの値をPレジスタに転送 |
| LBQ | Qレジスタの値が1の場合、Pレジスタが示すメモリの値をPレジスタに転送 |
| LBQF | Qレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタに転送 |
●スキップ命令 (同じ意味を持つ分岐命令と違うのはアドレス指定がないため命令長は1byteとして扱われる)
| ニーモニック | 動作 |
|---|---|
| SKP | Pレジスタをインクリメント(NBRとコードは同じ) |
| LSKP | Pレジスタの値を+2する(NLBRとコードは同じ) |
| LSZ | Dレジスタの値が0の場合、Pレジスタの値を+2する |
| LSNZ | Dレジスタの値が0以外の場合、Pレジスタの値を+2する |
| LSNF | DFレジスタの値が0の場合、Pレジスタの値を+2する |
| LSDF | DFレジスタの値が1の場合、Pレジスタの値を+2する |
| LSQ | Qレジスタの値が1の場合、Pレジスタの値を+2する |
| LSNQ | Qレジスタの値が0の場合、Pレジスタの値を+2する |
| LSIE | IEレジスタの値が1の場合、Pレジスタの値を+2する(IEレジスタを参照できる唯一の命令) |
●制御・入出力命令
| ニーモニック | 動作 |
|---|---|
| NOP | 何も行わない(スキップしないスキップ命令扱い) |
| IDL | DMA要求か割込を待つ |
| SEP | Nレジスタの値(命令下位4bit)をPレジスタに転送(サブルーチン分岐に利用) |
| SEX | Nレジスタの値をXレジスタに転送 |
| SEQ | Qレジスタに1を格納 |
| REQ | Qレジスタに0を格納 |
| SAV | Tレジスタの値をXレジスタが示すアドレスに格納(割込処理前の状態を保尊) |
| MARK | Xレジスタの値をTレジスタ、Pレジスタの値をR2レジスタが示すアドレスに格納し、Pレジスタの値をXレジスタに転送、R2レジスタをデクリメント(疑似割込) |
| RET | Xレジスタが示すメモリの値をXレジスタ、Pレジスタに転送、Xレジスタをインクリメント、IEレジスタに1を格納(割込処理復帰) |
| DIS | Xレジスタが示すメモリの値をXレジスタ、Pレジスタに転送、Xレジスタをインクリメント、IEレジスタに0を格納(割込禁止状態で割込処理復帰) |
| INP | 入力ポート(ポート番号に+8して命令下位4bitの値を指定)の値をXレジスタが示すアドレスとDレジスタに格納 |
| OUT | Xレジスタが示すメモリの値を出力ポート(命令下位4bitでポート番号指定)に出力し、Xレジスタをインクリメント |