これはuPD78C10で一般的なシュリンク64ピンDIPのもの。
命令はビット操作を中心に省略されたものがありますがuPD7807とほぼ共通で、マイクロプロセッサ部分の機能についてはほぼ共通です。ただし、命令でuPD7807に存在してuPD7810にないものは、
EXR 全MAINレジスタとALTレジスタの一括交換の8種類。なお(bit)は特別なビットアドレスモードで指定されたビットを表し、Vレジスタで修飾されたメモリ上の一部ビットと、I/Oに関係する一部の特殊レジスタのビットを指定できます。CYはキャリーフラグで、ビット操作命令のアキュムレータとして使われています。
AND CY <- CY & (bit)
OR CY <- CY | (bit)
XOR CY <- CY ^ (bit)
SETB (bit) <- 1
CLR (bit) <- 0
NOT (bit) <- !(bit)
CMC CY <- !CY
MOV CY <- (bit)あるいは(bit) <- CYの3命令で、ビット操作命令に分類される機能が省略されています。8 bitデータ転送命令としてのMOV、PSWのフラグに対するスキップ命令としてのSK, SKN命令はそのまま利用可能です。
SK (bit) == 1ならスキップ
SKN (bit) == 0ならスキップ
BIT ワーキングレジスタの特定のビットが1ならスキップがあります。
STOP ストップモードへの遷移ストップモードに入ると、クロックが停止しマイクロコンピュータ動作が一切中断されます。しかしレジスタとRWMの内容は保証されます。消費電流は10 uA程度まで低下します。NMIかリセットの発生によって、通常動作に復帰します。
8 bitデータ転送命令には以下のものがあります。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
MOV r1, A
00011rrr
4 r1 <- A
MOV A, r1
00001rrr
4 A <- r1
MOV sr, A
01001101 110sssss
10* sr <- A
MOV A, sr1 01001100
11ssssss 10*
A <- sr1
MOV r, addr 01110000
01101rrr al ah 17
A <- (addr)
MOV addr, r 01110000
01111rrr al ah 17
(addr) <- A
MVI r, byte 01101rrr
dddddddd 7*
r <- byte
MVI sr2, byte 01100100 s0000sss
dd 14
sr2 <- byte
MVIW wa, byte 01110001 wwwwwwww
dd 13*
(V.wa) <- byte
MVIX rpa1, byte 010010aa dddddddd
10* (rpa1) <- byte
STAW wa
01100011 wwwwwwww
10* (V.wa) <- A
LDAW wa
00000001 wwwwwwww
10* A <- (V.wa)
STAX rpa2
a0111aaa dddddddd(*1) 7/13*
(rpa2) <- A
LDAX rpa2
a0101aaa dddddddd(*1) 7/13*
A <- (rpa2)
EXX
00001001*
4 BC DE HL入れ替え
EXA
00001000*
4 VA EA入れ替え
EXH
01010000*
4 HL入れ替え
BLOCK
00110001*
13(C+1) (DE)+ <- (HL)+, C <- C - 1, until CY
uPD78C10には最大4 Byte命令があります。ここでは第1バイトと第2バイトは2進数表記、第3バイトと第4バイトは16進数的2桁表記で示します。uPD7807とは命令コードが異なるものについては命令の第1バイトの直後に*マークを入れました。state欄は命令実行時のステート数で、1ステートが3クロックに相当します。たとえば12
MHzクロックで動作しているとき、1ステートは250 nsですからMOV r1, A命令の場合には1
usの実行時間となります。state欄の数値の後についている'*'マークはスキップ時のステート数計算の例外を表していますが詳細については命令表の末尾に説明します。skipはスキップ条件を表しますが、8
bitデータ転送命令にはスキップ条件付きの命令はありませんので、空欄になっています。命令オペランドのr1,
sr, sr1などは命令表の後にあるオペランドの表を参照してください。ここで使われているオペランドのうち、大文字はレジスタそのものを表します。addrは16
bitアドレス定数、byteはイミディエートデータ、waはVレジスタと併用される8
bitアドレス定数です。上位アドレスをVレジスタの内容、下位アドレスを8 bit定数でアクセスするアドレッシングモードをワーキングレジスタアドレッシングと呼び、メモリ上の任意の256
Byteページに設定できる256本のワーキングレジスタセットと考えているので、waと呼びます。
MOV命令は一般的な8 bitデータ転送命令です。ただ、8080系列のプロセッサと異なり、レジスタ・レジスタ間転送は自由に行えず、必ず片方がAレジスタになります。つまり、MOV
B, CのようなことはuPD78C10では実行できません。ダイレクトアドレッシングでメモリとのデータ転送を行うのもMOV命令の機能のうちです。8080ならSTA命令やLDA命令の役割ですが、Aレジスタにしか転送できない8080と異なり、uPD7810では任意のスクラッチパッドレジスタに直接転送できるようになっているのでMOVのニーモニックが与えられているようです。ダイレクトアドレッシングでは16
bitアドレスを用いますが、下位バイト(al)の方が命令の第3バイトに、上位バイト(ah)が命令の第4バイトに配置されます。
MVI命令は普通のレジスタ以外に特殊レジスタの主だったものに直接定数をロードできます。MVIW命令はワーキングレジスタに定数をロードする命令で、MVIX命令はポインタアドレッシングで指定されるアドレスに定数をロードする命令です。
STAWとLDAW命令はアキュムレータとワーキングレジスタとのデータ転送です。
STAXとLDAX命令はポインタアドレッシングやさまざまなインデックス修飾のできる命令です。定数オフセットを必要とするアドレッシングモードの場合にだけ、第2バイトが必要となります。つまり表の中で(*1)となっているddddddddはアドレッシングモードによって省略される場合もあります。命令ステート数は1
Byte命令のときに7ステート、2 Byte命令のときに13ステートという意味になります。
EXX, EXA, EXHの各命令はそれぞれ関係するレジスタのALT側とMAIN側を入れ替える命令です。uPD7807とは命令コード自体が異なっていて、uPD7807が2
Byte命令なのに対してこちらは1 Byte命令になっています。
BLOCK命令もuPD7807とは仕様が異なり、uPD7807のBLOCK D+命令相当のものしかuPD78C10には装備されていません。命令コードも変更されています。
16 bitデータ転送命令には以下のものがあります。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
DMOV rp3, EA 101101pp
4 rp3 <- EA
DMOV EA, rp3 101001pp
4 EA <- rp3
DMOV sr3, EA 01001000
1101001u 14
sr3 <- EA
DMOV EA, sr4 01001000
1100000v 14
EA <- sr4
SBCD addr
01110000 00011110 al ah 20
(addr) <- C, (addr + 1) <- B
SDED addr
01110000 00101110 al ah 20
(addr) <- E, (addr + 1) <- D
SHLD addr
01110000 00111110 al ah 20
(addr) <- L, (addr + 1) <- H
SSPD addr
01110000 00001110 al ah 20
(addr) <- SPl, (addr + 1) <- SPh
STEAX rpa3 01001000
1001aaaa dd(*2) 14/20 (rpa3) <- EA
LBCD addr
01110000 00011111 al ah 20
C <- (addr), B <- (addr + 1)
LDED addr
01110000 00101111 al ah 20
E <- (addr), D <- (addr + 1)
LHLD addr
01110000 00111111 al ah 20
L <- (addr), H <- (addr + 1)
LSPD addr
01110000 00001111 al ah 20
SPl <- (addr), SPh <- (addr + 1)
LDEAX rpa3 01001000
1000aaaa dd(*2) 14/20 EA <- (rpa3)
PUSH rp1
10110ppp
13 (SP - 1) <- rp1h, (SP - 2) <-
rp1l, SP <- SP - 2
POP rp1
10100ppp
10 rp1l <- (SP), rp1h <- (SP
+ 1), SP <- SP + 2
LXI rp2, word 0ppp0100 wwwwwwwl
wh 10* rp2
<- word
TABLE
01001000 10101000
17 C <- (PC + 3 + A), B <- (PC
+ 3 + A + 1)
このグループに含まれる命令は、DMOVのオペランドのsr4に含まれる特殊レジスタが異なっていることを除けば、uPD7807と共通です。
DMOV命令は16 bit転送で対象がEAレジスタのMOV命令です。特殊レジスタに対するDMOV命令は、16
bitアクセスが必要なレジスタにのみ適用可能になっています。
SBCDからSSPDおよびLBCDからLSPD命令はダイレクトアドレッシングによるレジスタペア・メモリ間データ転送です。
STEAX命令とLDEAX命令は8 bitデータ転送命令のSTAX命令およびLDAX命令と対応したものです。(*2)の付いている第3バイトは、やはり8
bit定数修飾のあるアドレッシングモードにだけ存在します。2 Byte命令か3 Byte命令かに応じて実行ステート数も14ステートと20ステートの差が生じます。なお、DMOV命令やSTEAX命令とLDEAX命令でメモリ上のデータ配置は、他のレジスタペアの場合と同じく、EAの下位バイトが小さなメモリアドレスに対応します。
PUSH命令とPOP命令は8080命令と同様にレジスタペア単位でスタックに出し入れします。スタック上のデータ配置も、小さなアドレスにレジスタの下位バイトが対応します。
LXI命令はレジスタペア用のMVI命令です。
TABLE命令は、Aレジスタの内容と16 bitデータとのコード変換を行う命令で、プログラムコードの中に定数表を埋め込めるようになっています。
次はレジスタ用の8 bit演算命令の表です。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
ADD A, r
01100000 11000rrr
8 A <- A + r
ADD r, A
01100000 01000rrr
8 r <- r + A
ADC A, r
01100000 11010rrr
8 A <- A + r + CY
ADC r, A
01100000 01010rrr
8 r <- r + A + CY
ADDNC A, r 01100000
10100rrr 8
!CY A <- A + r
ADDNC r, A 01100000
00100rrr 8
!CY r <- r + A
SUB A, r
01100000 11100rrr
8 A <- A - r
SUB r, A
01100000 01100rrr
8 r <- r - A
SBB A, r
01100000 11110rrr
8 A <- A - r - CY
SBB r, A
01100000 01110rrr
8 r <- r - A - CY
SUBNB A, r 01100000
10110rrr 8
!CY A <- A - r
SUBNB r, A 01100000
00110rrr 8
!CY r <- r - A
ANA A, r
01100000 10001rrr
8 A <- A & r
ANA r, A
01100000 00001rrr
8 r <- r & A
ORA A, r
01100000 10011rrr
8 A <- A | r
ORA r, A
01100000 00011rrr
8 r <- r | A
XRA A, r
01100000 10010rrr
8 A <- A ^ r
XRA r, A
01100000 00010rrr
8 r <- r ^ A
GTA A, r
01100000 10101rrr
8 !CY A - r - 1
GTA r, A
01100000 00101rrr
8 !CY r - A - 1
LTA A, r
01100000 10111rrr
8 CY A - r
LTA r, A
01100000 00111rrr
8 CY r - A
NEA A, r
01100000 11101rrr
8 !Z A - r
NEA r, A
01100000 01101rrr
8 !Z r - A
EQA A, r
01100000 11111rrr
8 Z A - r
EQA r, A
01100000 01111rrr
8 Z r - A
ONA A, r
01100000 11001rrr
8 !Z A & r
OFFA A, r
01100000 11011rrr
8 Z A & r
このグループの命令もuPD7807とまったく同一です。
ADD, ADC, SUB, SBB, ANA, ORA, XRAの各命令は、Aレジスタがディスティネーションとなるかソースになるかの違いによって、2種類の命令パターンがあります。その点以外は、ごく一般的な演算命令です。
ADDNC命令とSUBNB命令は、スキップ条件付きの加減算命令です。表のskipの欄に!CYとあるのは、条件にNOTが含まれていることを表す'!'マークとスキップ対象のCYフラグを組み合わせたものです。つまり桁上がりがなければスキップということです。演算と一種の条件分岐が組み合わされた複合命令です。
GTA, LTA, NEA, EQA命令は比較命令で、演算結果は残らずにフラグだけが変化して、それに合わせてスキップが生じます。NEA命令とEQA命令ではディスティネーションとソースを入れ替える必要はないように思えるかもしれませんが、CYフラグの変化が異なります。たとえばNEA命令でふたつのオペランドが等しいかテストしてから、ただちにSK命令で大小判定を行うこともありますから、2種類用意されている意味はきちんと存在します。
ONA命令とOFFA命令は、論理積演算でマスクした後のビットがすべて0かどうかをテストする命令で、Aとrの順序を入れ替えても同じ意味となるので、一方の命令パターンしか存在しません。
次はメモリ用の8 bit演算命令です。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
ADDX rpa
01110000 11000aaa
11 A <- A + (rpa)
ADCX rpa
01110000 11010aaa
11 A <- A + (rpa) + CY
ADDNCX rpa 01110000
10100aaa 11
!CY A <- A + (rpa)
SUBX rpa
01110000 11100aaa
11 A <- A - (rpa)
SBBX rpa
01110000 11110aaa
11 A <- A - (rpa) - CY
SUBNBX rpa 01110000
10110aaa 11
!CY A <- A - (rpa)
ANAX rpa
01110000 10001aaa
11 A <- A & (rpa)
ORAX rpa
01110000 10011aaa
11 A <- A | (rpa)
XRAX rpa
01110000 10010aaa
11 A <- A ^ (rpa)
GTAX rpa
01110000 10101aaa
11 !CY A - (rpa) - 1
LTAX rpa
01110000 10111aaa
11 CY A - (rpa)
NEAX rpa
01110000 11101aaa
11 !Z A - (rpa)
EQAX rpa
01110000 11111aaa
11 Z A - (rpa)
ONAX rpa
01110000 11001aaa
11 !Z A & (rpa)
OFFAX rpa
01110000 11011aaa
11 Z A & (rpa)
このグループの命令もuPD7807とまったく同一です。
レジスタ用の8 bit演算命令と同じことを、ソースをメモリ上のデータとして実行します。ディスティネーションはAレジスタに限定されています。オペランドがrpaで表されている通り、BC,
DE, HLをポインタレジスタとして使えるほか、DEとHLのオートインクリメントやオートデクリメントアドレッシングも利用可能で、複数バイトデータの加減算などが容易になっています。
イミディエートデータ用演算命令は、このようになっています。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
ADI A, byte 01000110
dddddddd 7*
A <- A + byte
ADI r, byte 01110100
01000rrr dd 11
r <- r + byte
ADI sr2, byte 01100100 s1000sss
dd 20
sr2 <- sr2 + byte
ACI A, byte 01010110
dddddddd 7*
A <- A + byte + CY
ACI r, byte 01110100
01010rrr dd 11
r <- r + byte + CY
ACI sr2, byte 01100100 s1010sss
dd 20
sr2 <- sr2 + byte + CY
ADINC A, byte 00100110 dddddddd
7* !CY A <- A + byte
ADINC r, byte 01110100 00100rrr
dd 11 !CY r <- r + byte
ADINC sr2, byte 01100100 s0100sss
dd 20 !CY sr2 <- sr2 + byte
SUI A, byte 01100110
dddddddd 7*
A <- A - byte
SUI r, byte 01110100
01100rrr dd 11
r <- r - byte
SUI sr2, byte 01100100 s1100sss
dd 20
sr2 <- sr2 - byte
SBI A, byte 01110110
dddddddd 7*
A <- A - byte - CY
SBI r, byte 01110100
01110rrr dd 11
r <- r - byte - CY
SBI sr2, byte 01100100 s1110sss
dd 20
sr2 <- sr2 - byte - CY
SUINB A, byte 00110110 dddddddd
7* !CY A <- A - byte
SUINB r, byte 01110100 00110rrr
dd 11 !CY r <- r - byte
SUINB sr2, byte 01100100 s0110sss
dd 20 !CY sr2 <- sr2 - byte
ANI A, byte 00000111
dddddddd 7*
A <- A & byte
ANI r, byte 01110100
00001rrr dd 11
r <- r & byte
ANI sr2, byte 01100100 s0001sss
dd 20
sr2 <- sr2 & byte
ORI A, byte 00010111
dddddddd 7*
A <- A | byte
ORI r, byte 01110100
00011rrr dd 11
r <- r | byte
ORI sr2, byte 01100100 s0011sss
dd 20
sr2 <- sr2 | byte
XRI A, byte 00010110
dddddddd 7*
A <- A ^ byte
XRI r, byte 01110100
00010rrr dd 11
r <- r ^ byte
XRI sr2, byte 01100100 s0010sss
dd 20
sr2 <- sr2 ^ byte
GTI A, byte 00100111
dddddddd 7*
!CY A - byte - 1
GTI r, byte 01110100
00101rrr dd 11 !CY r -
byte - 1
GTI sr2, byte 01100100 s0101sss
dd 14 !CY sr2 - byte - 1
LTI A, byte 00110111
dddddddd 7*
CY A - byte
LTI r, byte 01110100
00111rrr dd 11 CY
r - byte
LTI sr2, byte 01100100 s0111sss
dd 14 CY sr2 - byte
NEI A, byte 01100111
dddddddd 7*
!Z A - byte
NEI r, byte 01110100
01101rrr dd 11 !Z
r - byte
NEI sr2, byte 01100100 s1101sss
dd 14 !Z sr2 - byte
EQI A, byte 01110111
dddddddd 7*
Z A - byte
EQI r, byte 01110100
01111rrr dd 11 Z
r - byte
EQI sr2, byte 01100100 s1111sss
dd 14 Z sr2 - byte
ONI A, byte 01000111
dddddddd 7*
!Z A & byte
ONI r, byte 01110100
01001rrr dd 11 !Z
r & byte
ONI sr2, byte 01100100 s1001sss
dd 14 !Z sr2 & byte
OFFI A, byte 01010111
dddddddd 7*
Z A & byte
OFFI r, byte 01110100
01011rrr dd 11 Z
r & byte
OFFI sr2, byte 01100100 s1011sss
dd 14 Z sr2 &
byte
uPD78C10にはuPD7807と異なり読み出し専用のPTポートがないためにsr5という特殊レジスタグループがありません。そのため、テスト命令のオペランドもすべてsr2に統一されています。それとsr2に含まれる特殊レジスタが完全に同一でないことを除けば、命令コードや実行ステート数などは同一です。
特殊レジスタを直接操作できることとAレジスタ専用の短い形式の命令が用意されていることを除けば、今まで出てきた演算命令をイミディエートアドレッシングモードにしたものになっています。
次はワーキングレジスタ用演算命令です。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
ADDW wa
01110100 11000000 ww 14
A <- A + (V.wa)
ADCW wa
01110100 11010000 ww 14
A <- A + (V.wa) + CY
ADDNCW wa
01110100 10100000 ww 14
!CY A <- A + (V.wa)
SUBW wa
01110100 11100000 ww 14
A <- A - (V.wa)
SBBW wa
01110100 11110000 ww 14
A <- A - (V.wa) - CY
SUBNBW wa
01110100 10110000 ww 14
!CY A <- A - (V.wa)
ANAW wa
01110100 10001000 ww 14
A <- A & (V.wa)
ORAW wa
01110100 10011000 ww 14
A <- A | (V.wa)
XRAW wa
01110100 10010000 ww 14
A <- A ^ (V.wa)
GTAW wa
01110100 10101000 ww 14
!CY A - (V.wa) - 1
LTAW wa
01110100 10111000 ww 14
CY A - (V.wa)
NEAW wa
01110100 11101000 ww 14
!Z A - (V.wa)
EQAW wa
01110100 11111000 ww 14
Z A - (V.wa)
ONAW wa
01110100 11001000 ww 14
!Z A & (V.wa)
OFFAW wa
01110100 11011000 ww 14
Z A & (V.wa)
ANIW wa, byte 00000101 wwwwwwww
dd 19* (V.wa)
<- (V.wa) & byte
ORIW wa, byte 00010101 wwwwwwww
dd 19* (V.wa)
<- (V.wa) | byte
GTIW wa, byte 00100101 wwwwwwww
dd 13* !CY (V.wa) - byte - 1
LTIW wa, byte 00110101 wwwwwwww
dd 13* CY (V.wa) - byte
NEIW wa, byte 01100101 wwwwwwww
dd 13* !Z (V.wa) - byte
EQIW wa, byte 01110101 wwwwwwww
dd 13* Z (V.wa) - byte
ONIW wa, byte 01000101 wwwwwwww
dd 13* !Z (V.wa) & byte
OFFIW wa, byte 01010101 wwwwwwww
dd 13* Z (V.wa) & byte
このグループの命令もuPD7807とまったく同一です。
Aレジスタとワーキングレジスタ間の演算は、Aレジスタがディスティネーションとなっています。標準的な15種類の演算が用意されています。
イミディエート演算の場合には、当然ながらワーキングレジスタがディスティネーションになります。こちらはビット演算2種類と比較6種類の合計8命令だけが使えるようになっています。イミディエートでも3
Byte命令にするために、オペコードを1 Byteに限定したので15種類を割り当てることができなかったのかもしれません。
uCOM-87アーキテクチャでは、8 bitデータの記憶場所の階層をCPUにもっとも近い方から並べてみると、Aレジスタ、その他のスクラッチパッドレジスタ、ワーキングレジスタ、一般のメモリという順になります。先に出てきた方が演算に便利でしかも高速に扱える傾向があります。つまり、ワーキングレジスタはスクラッチパッドレジスタにも納めきれなかったデータの置き場なわけで、それを考えると適切な演算命令が選択されて、それらしい命令長になっているようにも思われます。なお、ワーキングレジスタは後述の増減命令のオペランドとなることもできて、ループカウンタをスクラッチパッドレジスタに納めきれない場面でも、その代わりに使えるように配慮されています。
次は16 bit演算命令と乗除算命令をまとめて紹介します。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
EADD EA, r2 01110000
110000rr 11
EA <- EA + r2
DADD EA, rp3 01110100
110001pp 11
EA <- EA + rp3
DADC EA, rp3 01110100
110101pp 11
EA <- EA + rp3 + CY
DADDNC EA, rp3 01110100 101001pp
11 !CY EA <- EA + rp3
ESUB EA, r2 01110000
011000rr 11
EA <- EA - r2
DSUB EA, rp3 01110100
111001pp 11
EA <- EA - rp3
DSBB EA, rp3 01110100
111101pp 11
EA <- EA - rp3 - CY
DSUBNB EA, rp3 01110100 101101pp
11 !CY EA <- EA - rp3
DAN EA, rp3 01110100
100011pp 11
EA <- EA & rp3
DOR EA, rp3 01110100
100111pp 11
EA <- EA | rp3
DXR EA, rp3 01110100
100101pp 11
EA <- EA ^ rp3
DGT EA, rp3 01110100
101011pp 11
!CY EA - rp3 - 1
DLT EA, rp3 01110100
101111pp 11
CY EA - rp3
DNE EA, rp3 01110100
111011pp 11
!Z EA - rp3
DEQ EA, rp3 01110100
111111pp 11
Z EA - rp3
DON EA, rp3 01110100
110011pp 11
!Z EA & rp3
DOFF EA, rp3 01110100
110111pp 11
Z EA & rp3
MUL r2
01001000 001011rr
32 EA <- A * r2
DIV r2
01001000 001111rr
59 EA <- EA / r2, r2 <- EA %
r2
このグループの命令もuPD7807とまったく同一です。
以上の命令のディスティネーションはすべてEAレジスタに固定されています。
EADD命令とESUB命令はソースが8 bitレジスタになっています。
それ以外の、Dで始まる命令が16 bit演算で、8 bit演算に許されている15種類と同じ演算や比較操作が可能になっています。やはりディスティネーションがEAレジスタで、ソースの方はBC,
DE, HLのレジスタペアです。
MUL命令とDIV命令が乗除算命令で、8 bit×8 bitの演算と、16 bit/8 bitの演算が許されています。さすがに他の命令とは別格の時間が必要となっていますね。
次は増減命令です。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
INR r2
010000rr
4 CY r2 <- r2 + 1
INRW wa
00100000 wwwwwwww
16* CY (V.wa) <- (V.wa) + 1
INX rp
00pp0010
7 rp <- rp + 1
INX EA
10101000
7 EA <- EA + 1
DCR r2
010100rr
4 CY r2 <- r2 - 1
DCRW wa
00110000 wwwwwwww
16* CY (V.wa) <- (V.wa) - 1
DCX rp
00pp0011
7 rp <- rp - 1
DCX EA
10101001
7 EA <- EA - 1
このグループの命令もuPD7807とまったく同一です。
ここで特徴的なのが、8 bitの増減命令であるINR, INRW, DCR, DCRW命令がスキップ条件付きということと、その中でもレジスタオペランドのINR,
DCR命令がオペランドにr2をとるということです。
16 bitの増減命令のINX命令とDCX命令はオペランドにSP, BC, DE, HL, EAの16
bitレジスタをとります。こちらはスキップ動作を行いません。
以下はその他の演算命令です。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
DAA
01100001
4 BCD補正
STC
01001000 00101011
8 CY <- 1
CLC
01001000 00101010
8 CY <- 0
NEGA
01001000 00111010
8 A <- !A + 1
uPD7807にはこのグループにCYフラグの反転を行うCMC命令が備わっていますが、uPD78C10にはありません。uPD7807にはビット操作命令があって、その補助としてCMC命令も追加されているのでしょう。
DAA命令は加算命令の後でAレジスタの内容をBCD補正するものです。STC, CLC命令はCYフラグの操作を行います。NEGA命令はAレジスタの内容を符号付き2進数とした場合の符号反転命令です。
ローテーション・シフト命令には次のようなものがあります。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
RLD
01001000 00111000
17 Rotate Left Digit
RRD
01001000 00111001
17 Rotate Right Digit
RLL r2
01001000 001101rr
8 r2.(n+1) <- r2.n, r2.0 <- CY,
CY <- r2.7
RLR r2
01001000 001100rr
8 r2.(n-1) <- r2.n, r2.7 <- CY,
CY <- r2.0
SLL r2
01001000 001001rr
8 r2.(n+1) <- r2.n, r2.0 <- 0,
CY <- r2.7
SLR r2
01001000 001000rr
8 r2.(n+1) <- r2.n, r2.0 <- 0,
CY <- r2.7
SLLC r2
01001000 000001rr
8 CY r2.(n+1) <- r2.n, r2.0 <- 0, CY <- r2.7
SLRC r2
01001000 000000rr
8 CY r2.(n+1) <- r2.n, r2.0 <- 0, CY <- r2.7
DRLL EA
01001000 10110100
8 EA.(n+1) <- EA.n, EA.0 <- CY,
CY <- EA.7
DRLR EA
01001000 10110000
8 EA.(n-1) <- EA.n, EA.7 <- CY,
CY <- EA.0
DSLL EA
01001000 10100100
8 EA.(n+1) <- EA.n, EA.0 <- 0,
CY <- EA.7
DSLR EA
01001000 10100000
8 EA.(n+1) <- EA.n, EA.0 <- 0,
CY <- EA.7
このグループの命令もuPD7807とまったく同一です。
RLD, RRD命令はZ80 CPUでおなじみのBCD一桁分、4 bitをAレジスタの下位4
bitと(HL)の間でローテートさせる命令です。
RLL, RLR, SLL, SLRは、ごく一般的なローテート、シフト命令です。SLL命令とSLR命令にスキップ条件を付けたのがSLLC命令とSLRC命令で、RLL,
RLR, SLL, SLR命令を16 bitに拡張したのがDRLL, DRLR, DSLL, DSLR命令です。8
bitオペランドの命令はr2が対象ですが、16 bitオペランドの場合にはEAレジスタに固定されています。EAだけでなくレジスタペアを指定できたらと思うこともありますが、加減算などの他の16
bit演算命令もディスティネーションがEAレジスタに限られていますから、これだけ拡張してもしかたないかもしれません。
ジャンプ、コール、リターン命令をまとめて表にしました。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
JMP addr
01010100 aaaaaaal ah 10*
PC <- addr
JB
00100001
4 PC <- BC
JR addr
11jjjjjj
10 PC <- PC + 1 + jjjjjj
JRE addr
0100111j jjjjjjjj
10* PC <- PC + 2 + jjjjjjjjj
JEA
01001000 00101001
8 PC <- EA
CALL addr
01000000 aaaaaaal ah 16*
push PC + 3, PC <- addr
CALB
01001000 00101001
17 push PC + 2, PC <- BC
CALF addr
01111jjj jjjjjjjj
13* push PC + 2, PC <- 00001jjjjjjjjjjjB
CALT addr
100ttttt
16 push PC + 1, PC <- (80H + 2*ttttt)
SOFTI
01110010
16 push PSW, push PC + 1, PC <-
0060H
RET
10111000
10 pop PC
RETS
10111001
10 1 pop PC, skip
RETI
01100010
13 pop PC, pop PSW
このグループの命令もuPD7807とまったく同一です。
JMP命令は16 bit絶対アドレスをオペランドに持ち任意のアドレスにジャンプ可能な3
Byte命令です。JB命令はBCレジスタペアで示されるアドレスにジャンプする高速な1
Byte命令です。
JR命令は1 Byteの相対ジャンプ命令です。そのため、オフセットはjjjjjjで表されているように6
bitしかありません。JRE命令が標準的な2 Byteの相対ジャンプ命令ですが、オフセットが9
bit許されるようになっています。JR, JRE命令の両者とも、バイト数に関係なくJMP命令と同じ10ステートの実行時間を必要とします。
JEA命令はJB命令のEAレジスタ版で、EAレジスタの新設とともに追加された命令です。
CALL命令は標準的な3 Byte長のサブルーチン呼び出し命令で、CALB命令はJB命令と同様のBCレジスタペアによる呼び出し命令です。
CALF命令は少々変わっていて、2 Byte命令ですが下位11 bitのアドレスを命令コード中に持っていて、上位5
bitが00001に固定されています。つまり0800Hから0FFFHの間の2 KByteの範囲のサブルーチンを呼びだすことができる命令です。この範囲内に配置されたサブルーチンなら、CALL命令より1
Byteだけ短いコードで、しかも3ステート短い時間で呼び出せます。
もっと短いバイト数でサブルーチン呼び出しを行うのがCALT命令で、5 bitのベクタ番号を使用します。0080Hから始まる2
Byte単位でサブルーチンアドレスを登録したベクタテーブルのインデックスがベクタ番号となります。したがって、32種類のサブルーチンに限っては1
Byte長のコードで呼びだすことが可能です。
SOFTI命令はソフトウェア割り込みを発生させるもので、普通のサブルーチン呼び出しとはPSWがスタックに保存される点が異なります。スキップ条件に関してはSOFTI命令は特殊で、絶対にスキップされません。SOFTI命令の次に配置された命令がスキップされます。
RET命令はCALL, CALB, CALF, CALT命令で呼び出されたサブルーチンから戻るための命令です。
RETS命令は少々変わったRET命令で、戻った直後の命令をスキップします。つまり、たとえばCALL命令であるサブルーチンを呼び出したとき、そのサブルーチンからRETS命令で戻ると、CALL命令の次の命令がスキップされます。
RETI命令は割り込みサービスルーチンからの復帰用の命令で、PSWも復帰するほか、割り込みマスクや割込み制御回路の操作も同時に行います。
スキップ命令には次の5種類が含まれます。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
BIT bit, wa 01011bbb
wwwwwwww 10*
bit skip if (V.wa).bit = 1
SK f
01001000 00001fff
8 f skip if f = 1
SKN f
01001000 00011fff
8 !f skip if f = 0
SKIT irf
01001000 010fffff
8 irf skip if irf = 1, then reset irf
SKNIT irf
01001000 011fffff
8 !irf skip if irf = 0, or reset irf
以上の命令のうち、BIT命令はuPD7807には存在せず、uPD78C10やuPD7800などに存在する命令です。uPD7807はビット操作命令が大幅に追加されたので、BIT命令は不要だと判断されたのでしょう。(V.wa)で指定されたメモリ1
Byteのうち、bitで指定されたビット番号のビットが1ならスキップします。ビット番号はLSBが0、MSBが7となる0から7までの整数です。
残りの命令は指定されたフラグの状態によってスキップを行うものです。SK命令とSKN命令はプロセッサ内部の演算に関係したCY,
HC, Zフラグの判定を行います。HCフラグの判定ができるのは珍しい機能ですね。減算のBCD補正を比較的短いコードで実現できそうです。
SKIT命令とSKNIT命令は割り込みや特定のI/O機能に関係したフラグについて判定するものです。条件判定とともに、その対象フラグが1にセットされている場合には、リセットも同時に行います。SK,
SKN命令はSKフラグに影響を与えますが、CY, HC, Zフラグの状態を変更することはありません。
最後にCPU制御命令を示します。
命令
第1バイト 第2バイト 第3 第4 state skip 動作
NOP
00000000
4 no operation
EI
10101010
4 enable interrupt
DI
10111010
4 disable interrupt
HLT
01001000 00111011
11/12 halt
STOP
01001000 10111011
12 stop
uPD7807とはHLT命令のステート数が変更になっているのとSTOP命令が追加されている点が異なります。
NOP命令は単にプログラムカウンタを1進めるだけの命令ですが、すべて0のビットパターンが割り当てられています。
EIとDIは割り込み許可と禁止を行う命令です。
HLT命令はプログラム実行を停止する命令です。HLTモードではプログラム実行は停止しますが、I/O機能は動作しつづけ、メモリやレジスタの内容も保持されています。プログラム実行が停止する分だけ、消費電力が減少します。リセットかNMIでHLTモードから通常のプログラム実行状態に遷移します。uPD7810では11ステート、uPD78C10では12ステート動作となっています。
STOP命令はuPD7810には存在せず、uPD78C10にだけ追加された命令で、プログラム実行を停止するだけでなくクロック供給まで停止します。その結果、I/O機能も活動を停止します。ただしメモリやレジスタの内容は保持されています。クロックまで停止しているため、消費電流は劇的に減少します。リセットかNMIでSTOPモードから通常のプログラム実行状態に遷移します。
これまでの命令表のstateの項目に*印が記入されている命令がありました。これは命令がスキップされる場合の例外規定を意味しています。一般に、命令がスキップされる場合には命令のデコードまでは行われますが、実際の処理は行われません。そのため、表に記入したステート数と同じか短いステート数を消費することになります。で、実際のスキップ時に必要となるステート数を表にして示します。
命令種別 | ステート数 |
1 Byte命令 | 4 |
2 Byte命令*付き | 7 |
2 Byte命令 | 8 |
3 Byte命令*付き | 10 |
3 Byte命令 | 11 |
4 Byte命令 | 14 |
以上の命令表に含まれる命令コードの中に埋め込まれているレジスタやオペランド指定ビットを表にして説明します。
8 bit幅のレジスタオペランドにはr, r1, r2の3種類のグループがあります。それぞれ、表の右半分の3列に対応するレジスタ名が記入されています。r2には3種類のレジスタしか含まれません。
R2 | R1 | R0 | r | r1 | r2 |
0 | 0 | 0 | V | EAH | - |
0 | 0 | 1 | A | EAL | A |
0 | 1 | 0 | B | B | B |
0 | 1 | 1 | C | C | C |
1 | 0 | 0 | D | D | - |
1 | 0 | 1 | E | E | - |
1 | 1 | 0 | H | H | - |
1 | 1 | 1 | L | L | - |
I/Oポート用レジスタなどを含む特殊レジスタオペランドについてはsr, sr1, sr2, sr3, sr4の5種類のグループがあります。そのうちのsr, sr1, sr2については、次の表に示すレジスタを含み、S5 - S0のビットパターンで命令に表現されます。指定されているレジスタが書き込み専用か読み出し専用かなどによって異なる扱いを受けているわけです。
S5 | S4 | S3 | S2 | S1 | S0 | sr | sr1 | sr2 | レジスタの役割 |
0 | 0 | 0 | 0 | 0 | 0 | PA | PA | PA | port A, ポートAデータ |
0 | 0 | 0 | 0 | 0 | 1 | PB | PB | PB | port B, ポートBデータ |
0 | 0 | 0 | 0 | 1 | 0 | PC | PC | PC | port C, ポートCデータ |
0 | 0 | 0 | 0 | 1 | 1 | PD | PD | PD | port D, ポートDデータ |
0 | 0 | 0 | 1 | 0 | 1 | PF | PF | PF | port F, ポートEデータ |
0 | 0 | 0 | 1 | 1 | 0 | MKH | MKH | MKH | mask high, 割り込みマスクレジスタ上位 |
0 | 0 | 0 | 1 | 1 | 1 | MKL | MKL | MKL | mask low, 割り込みマスクレジスタ下位 |
0 | 0 | 1 | 0 | 0 | 0 | ANM | ANM | ANM | A/D channel mode, A/Dチャネルモードレジスタ |
0 | 0 | 1 | 0 | 0 | 1 | SMH | SMH | SMH | serial mode high, シリアルモードレジスタ上位 |
0 | 0 | 1 | 0 | 1 | 0 | SML | - | - | serial mode low, シリアルモードレジスタ下位 |
0 | 0 | 1 | 0 | 1 | 1 | EOM | EOM | EOM | timer/event counter output mode,
タイマ・イベントカウンタ出力モードレジスタ |
0 | 0 | 1 | 1 | 0 | 0 | ETMM | - | - | timer/event counter mode,
タイマ・イベントカウンタモードレジスタ |
0 | 0 | 1 | 1 | 0 | 1 | TMM | TMM | TMM | timer mode, タイマモードレジスタ |
0 | 1 | 0 | 0 | 0 | 0 | MM | - | - | memory mapping, メモリ割り付けレジスタ |
0 | 1 | 0 | 0 | 0 | 1 | MCC | - | - | mode control C, モードコントロールC |
0 | 1 | 0 | 0 | 1 | 0 | MA | - | - | mode A, ポートAモード |
0 | 1 | 0 | 0 | 1 | 1 | MB | - | - | mode B, ポートBモード |
0 | 1 | 0 | 1 | 0 | 0 | MC | - | - | mode C, ポートCモード |
0 | 1 | 0 | 1 | 1 | 1 | MF | - | - | mode F, ポートFモード |
0 | 1 | 1 | 0 | 0 | 0 | TXB | - | - | Tx buffer, シリアル送信バッファ |
0 | 1 | 1 | 0 | 0 | 1 | - | RXB | - | Rx buffer, シリアル受信バッファ |
0 | 1 | 1 | 0 | 1 | 0 | TM0 | - | - | timer register 0, タイマレジスタ0 |
0 | 1 | 1 | 0 | 1 | 1 | TM1 | - | - | timer register 1, タイマレジスタ1 |
1 | 0 | 0 | 0 | 0 | 0 | - | CR0 | - | A/D conversion result 0, A/D変換結果0 |
1 | 0 | 0 | 0 | 0 | 1 | - | CR1 | - | A/D conversion result 1, A/D変換結果1 |
1 | 0 | 0 | 0 | 1 | 0 | - | CR2 | - | A/D conversion result 2, A/D変換結果2 |
1 | 0 | 0 | 0 | 1 | 1 | - | CR3 | - | A/D conversion result 3, A/D変換結果3 |
1 | 0 | 1 | 0 | 0 | 0 | ZCM | - | - | zero cross mode, ゼロクロスモード |
U0 | sr3 | レジスタの役割 |
0 | ETM0 | timer/event counter register 0, タイマ・イベントカウンタレジスタ0 |
1 | ETM1 | timer/event counter register 1, タイマ・イベントカウンタレジスタ1 |
V0 | sr4 | レジスタの役割 |
0 | ECNT | timer/event counter upcounter, タイマ・イベントカウンタのアップカウンタ |
1 | ECPT | timer/event counter capture , タイマ・イベントカウンタのキャプチャレジスタ |
レジスタペアの指定には、rp, rp1, rp2, rp3の4種類のグループがあり、それぞれ次の表に記入されているレジスタペアを含みます。この表でSP / SPと記載されている欄は、前の方がアセンブリ言語表記で後の方が実際のレジスタペアを表します。つまりB / BCの項はアセンブリ言語でBと書くことになっていて、実際の操作対象がBCレジスタペアであることを示します。
P2 | P1 | P0 | rp | rp1 | rp2 | rp3 |
0 | 0 | 0 | SP / SP | V / VA | SP / SP | - |
0 | 0 | 1 | B / BC | B / BC | B / BC | B / BC |
0 | 1 | 0 | D / DE | D / DE | D / DE | D / DE |
0 | 1 | 1 | H / HL | H / HL | H / HL | H / HL |
1 | 0 | 0 | - | EA / EA | EA / EA | - |
アドレッシングモードの指定にはrpa, rpa1, rpa2, rpa3の3種類があります。rpa3は16 bitオペランド用のアドレッシングモードで、それ以外は8 bitオペランド用のアドレッシングモードです。ここでも/の左がアセンブリ言語表記で、/の右が実際の動作を意味します。ZilogのZ80 CPU的表記に慣れると省略し過ぎで変な表記と感じるかもしれませんが、Intel式の8080アセンブリ言語表記はこのようなものでしたから。
A3 | A2 | A1 | A0 | rpa | rpa1 | rpa2 | rpa3 | 動作 |
0 | 0 | 0 | 0 | - | - | - | - | - |
0 | 0 | 0 | 1 | B / (BC) | B / (BC) | B / (BC) | - | BCポインタ |
0 | 0 | 1 | 0 | D / (DE) | D / (DE) | D / (DE) | D / (DE) | DEポインタ |
0 | 0 | 1 | 1 | H / (HL) | H / (HL) | H / (HL) | H / (HL) | HLポインタ |
0 | 1 | 0 | 0 | D+ / (DE)+ | - | D+ / (DE)+ | D++ / (DE)++ | DEオートインクリメント |
0 | 1 | 0 | 1 | H+ / (HL)+ | - | H+ / (HL)+ | H++ / (HL)++ | HLオートインクリメント |
0 | 1 | 1 | 0 | D- / (DE)- | - | D- / (DE-) | - | DEオートデクリメント |
0 | 1 | 1 | 1 | H- / (HL)- | - | H- / (HL)- | - | HLオートデクリメント |
1 | 0 | 1 | 1 | - | - | D+byte / (DE+byte) | D+byte / (DE+byte) | DEベース定数オフセット |
1 | 1 | 0 | 0 | - | - | H+A / (HL+A) | H+A / (HL+A) | HLベースAオフセット |
1 | 1 | 0 | 1 | - | - | H+B / (HL+B) | H+B / (HL+B) | HLベースBオフセット |
1 | 1 | 1 | 0 | - | - | H+EA / (HL+EA) | H+EA / (HL+EA) | HLベースEAオフセット |
1 | 1 | 1 | 1 | - | - | H+byte / (HL+byte) | H+byte / (HL+byte) | HLベース定数オフセット |
SK命令とSKN命令で使われるフラグオペランドfにはPSW中に含まれる次の3種類があります。
F2 | F1 | F0 | f |
0 | 0 | 0 | - |
0 | 1 | 0 | CY |
0 | 1 | 1 | HC |
1 | 0 | 0 | Z |
F4 | F3 | F2 | F1 | F0 | irf | ビット略称 | フラグの役割 |
0 | 0 | 0 | 0 | 0 | FNMI | INTFNMI | NMI*端子の状態を表す |
0 | 0 | 0 | 0 | 1 | FT0 | INTFT0 | タイマ0のコンパレータ一致信号でセット |
0 | 0 | 0 | 1 | 0 | FT1 | INTFT1 | タイマ1のコンパレータ一致信号でセット |
0 | 0 | 0 | 1 | 1 | F1 | INTF1 | INT1端子への立ち上がりエッジ入力でセット |
0 | 0 | 1 | 0 | 0 | F2 | INTF2 | INT2*端子への立ち下がりエッジ入力でセット |
0 | 0 | 1 | 0 | 1 | FE0 | INTFE0 | タイマ・イベントカウンタのECNTとETM0レジスタ一致でセット |
0 | 0 | 1 | 1 | 0 | FE1 | INTFE1 | タイマ・イベントカウンタのECNTとETM1レジスタ一致でセット |
0 | 0 | 1 | 1 | 1 | FEIN | INTFEIN | タイマ・イベントカウンタのCI入力かTOの立ち下がりエッジでセット |
0 | 1 | 0 | 0 | 0 | FAD | INTFAD | A/Dコンバータの変換結果がCR0 - CR3のレジスタに転送後セット |
0 | 1 | 0 | 0 | 1 | FSR | INTFSR | シリアルの受信バッファフルでセット |
0 | 1 | 0 | 1 | 0 | FST | INTFST | シリアルの送信バッファエンプティでセット |
0 | 1 | 0 | 1 | 1 | ER | ER | シリアルのパリティ、フレーム、オーバーラン受信エラーでセット |
0 | 1 | 1 | 0 | 0 | OV | OV | タイマ・イベントカウンタのECNTオーバーフローでセット |
1 | 0 | 0 | 0 | 0 | AN4 | AN4 | AN4端子への立ち下がりエッジ入力でセット |
1 | 0 | 0 | 0 | 1 | AN5 | AN5 | AN5端子への立ち下がりエッジ入力でセット |
1 | 0 | 0 | 1 | 0 | AN6 | AN6 | AN6端子への立ち下がりエッジ入力でセット |
1 | 0 | 0 | 1 | 1 | AN7 | AN7 | AN7端子への立ち下がりエッジ入力でセット |
1 | 0 | 1 | 0 | 0 | SB | SB | Vdd端子の立ち上がり入力でセット |
I/O機能の手がかりとして、uPD7810でもピン配置から入ります。
PA0 1 64 Vcc
PA1 2 63 Vdd(STOP*)
PA2 3 62 PD7/AD7
PA3 4 61 PD6/AD6
PA4 5 60 PD5/AD5
PA5 6 59 PD4/AD4
PA6 7 58 PD3/AD3
PA7 8 57 PD2/AD2
PB0 9 56 PD1/AD1
PB1 10 55 PD0/AD0
PB2 11 54 PF7/AB15
PB3 12 53 PF6/AB14
PB4 13 52 PF5/AB13
PB5 14 51 PF4/AB12
PB6 15 50 PF3/AB11
PB7 16 49 PF2/AB10
PC0 17 48 PF1/AB9
PC1 18 47 PF0/AB8
PC2 19 46 ALE
PC3 20 45 WR*
PC4 21 44 RD*
PC5 22 43 AVdd
PC6 23 42 Varef
PC7 24 41 AN7
NMI* 25 40 AN6
INT1 26 39 AN5
MODE1 27 38 AN4
RESET* 28 37 AN3
MODE0 29 36 AN2
X2 30 35 AN1
X1 31 34 AN0
Vss 32 33 AVss
PA, PB, BC, PD, PFをはじめとして、ほとんどの端子はuPD7807と共通です。ただし、33番ピンから43番ピンまでが異なっています。また、63番ピンの機能はuPD7810についてはuPD7807と同じで内部RWMの一部のバックアップ用電源電圧供給端子ですが、CMOS版のuPD78C10ではSTOP*端子となって一種のスリープモードへ強制的に移行させる信号になっています。ちょうどSTOP命令を実行したかのようにスタンバイ状態に移行して、Vccからの電源供給が10
uA程度にまで低下します。
AN0からAN7まではA/Dコンバータ入力です。AVddとAVssはA/Dコンバータ用の電源で、変換精度を向上させるために普通よりはノイズの少ない電源に接続することが推奨されています。VarefはA/Dコンバータ用の基準電圧入力で、AVdd
- 0.5 V以上AVdd以下の電圧を与えます。簡単にはAVddに接続します。すると、AN入力にはAVssからVarefの間の電圧を入力することができて、それを8
bit分解能でA/D変換できます。変換時間はクロック周波数に依存しますが、約50
us程度です。制御用にA/Dチャネルモードレジスタ(ANM)を持ち、結果の格納用にCR0,
CR1, CR2, CR3のConversion Resultレジスタを持ちます。この、4個のCRxレジスタも特徴的で、普通にはない変換機能として利用されています。ANMの設定によってセレクトモード、つまり特定のAN端子を入力端子として選択するモードでは、連続して4回のA/D変換を行ってCR0,
CR1, CR2, CR3の順に格納して、CR3にデータを入れた後で割込みが発生します。スキャンモードの場合には、AN0,
AN1, AN2, AN3あるいはAN4, AN5, AN6, AN7の順に続けてA/D変換を行い、CR0,
CR1, CR2, CR3に順番にデータを格納します。どちらのANグループを使うかもANMに設定します。意外にも、この2モードしか許されず、単発のA/D変換が行えないというのも特徴と言えるでしょうか。AN4,
AN5, AN6, AN7についてはネガティブエッジ検出専用のロジック入力として使用することもできます。
PCの特殊機能割り当てもuPD7807と共通で、シリアルインターフェースやタイマ類も同一の機能を持ちます。ただし、ウオッチドッグタイマの機能はなくなっています。
Return to IC Collection