戻る

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のピン配列

CLOCK1 40Vdd
WAIT2 39XTAL
CLEAR3 38DMA-IN
Q4 37DMA-OUT
SC15 36INT
SC06 35MWR
MRD7 34TPA
BUS78 33TPB
BUS69 32MA7
BUS510 31MA6
BUS411 30MA5
BUS312 29MA4
BUS213 28MA3
BUS114 27MA2
BUS015 26MA1
Vcc16 25MA0
N217 24EF1
N118 23EF2
N019 22EF3
Vss20 21EF4

●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)
DF1bit→Data Flag
IE1bit→Interrupt Enable Flag
P 4bit(Lower) →Program Counter(このレジスタが示す値のRレジスタを使用)
X 4bit(Higher)このレジスタが示す値のRレジスタが汎用ポインタレジスタとなる
T 8bit割込時にX,Pレジスタの内容が保持される
N 4bit実行中の命令下位4bitが設定される(ポインタレジスタ指定に使用)
I 4bit実行中の命令上位4bitが設定される
Q 1bitQポートへの出力内容が設定される
一般レジスタ [R(0).n〜R(F).n]
R(m).08bit(Lower) →Register
R(m).18bit(Higher)→Register

動作モードを持っており、入力ポート「CLEAR*」「WAIT*」の状態により変化する。

CLEAR*WAIT*mode説明
LLLOAD外部からDMA機能を介してプログラムをメモリに格納
LHRESETP,X,R(0)レジスタを0クリアし、Qレジスタをリセット、IEレジスタに1をセット
HLPAUSE内部クロックを停止し、実行を一時停止
HHRUN通常のプログラム動作モード

アドレッシングモードは以下の通りである。

●CDP1802の命令

基本的には命令(ニーモニック)のみの構成となっている。
(レジスタ指定時は命令の下位4bitが汎用レジスタ番号を示している)

Pレジスタを参照する命令は命令に続く1byteの値を参照(イミディエイト指定)するため、実質2byteの命令長となる。
絶対アドレス分岐命令は続く2byteの値が分岐先のアドレスになるため、実質3byteの命令長となる。

●データ転送命令 (Memory→Register)

ニーモニック動作
LDN R(n)が示すメモリからDレジスタに転送 (n≠0)
LDA LDNと同じ動作をした後、R(n)をインクリメント
LDX Xレジスタの値を汎用レジスタの番号として、その値が示すメモリからDレジスタに転送
LDXALDXと同じ動作をした後、汎用レジスタをインクリメント
LDI Xレジスタの値を汎用レジスタの番号として、その値が示すメモリからDレジスタに転送した後、汎用レジスタをインクリメント
STR DレジスタからR(n)が示すメモリに転送
STXDXレジスタの値を汎用レジスタの番号として、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レジスタに格納
SDBIPレジスタが示すメモリの値から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レジスタに格納
SMBIDレジスタの値から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レジスタに格納
SHRCDレジスタの値を右シフトし、DFレジスタの値を最上位bit(MSB)に、LSBをDFレジスタに格納
RSHRSHRCと同じ(コードも一緒)
SHL Dレジスタの値同士を加算(2倍なので左シフトするのと結果は同じ)し、MSBをDFレジスタに格納
SHLCDレジスタの値を左シフトし、DFレジスタの値をLSBに、MSBをDFレジスタに格納
RSHLSHLCと同じ(コードも一緒)

●条件分岐命令 (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絶対アドレス分岐)
NLBRPレジスタの値を+2する(2byteスキップ)
LBZ Dレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタに転送
LBNZDレジスタの値が0以外の場合、Pレジスタが示すメモリの値をPレジスタに転送
LBNFDFレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタに転送
LBDFDFレジスタの値が1の場合、Pレジスタが示すメモリの値をPレジスタに転送
LBQ Qレジスタの値が1の場合、Pレジスタが示すメモリの値をPレジスタに転送
LBQFQレジスタの値が0の場合、Pレジスタが示すメモリの値をPレジスタに転送

●スキップ命令 (同じ意味を持つ分岐命令と違うのはアドレス指定がないため命令長は1byteとして扱われる)

ニーモニック動作
SKP Pレジスタをインクリメント(NBRとコードは同じ)
LSKPPレジスタの値を+2する(NLBRとコードは同じ)
LSZ Dレジスタの値が0の場合、Pレジスタの値を+2する
LSNZDレジスタの値が0以外の場合、Pレジスタの値を+2する
LSNFDFレジスタの値が0の場合、Pレジスタの値を+2する
LSDFDFレジスタの値が1の場合、Pレジスタの値を+2する
LSQ Qレジスタの値が1の場合、Pレジスタの値を+2する
LSNQQレジスタの値が0の場合、Pレジスタの値を+2する
LSIEIEレジスタの値が1の場合、Pレジスタの値を+2する(IEレジスタを参照できる唯一の命令)

●制御・入出力命令

ニーモニック動作
NOP 何も行わない(スキップしないスキップ命令扱い)
IDL DMA要求か割込を待つ
SEP Nレジスタの値(命令下位4bit)をPレジスタに転送(サブルーチン分岐に利用)
SEX Nレジスタの値をXレジスタに転送
SEQ Qレジスタに1を格納
REQ Qレジスタに0を格納
SAV Tレジスタの値をXレジスタが示すアドレスに格納(割込処理前の状態を保尊)
MARKXレジスタの値を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レジスタをインクリメント

[TOPに戻る]