TMS9995

レジスタ

PC 16bitプログラムカウンタ
ST 16bitステータスレジスタ
WP 16bitワークスペースポインタ
R0 - R15 16bitワークスペースレジスタ※1
※1 R0-R15は専用のレジスタを持っているのではなく、WPレジスタ+(ワークスペースレジスタ番号×2)のメモリに対して読み書きを行うためのインデックス番号 (WP=0xFF00時にR1を指定した場合、メモリの0xFF02が対象)

1. ステータスレジスタ

0 1 2 34 5 678910 1112131415
L>A>EQCOVOPX***OVEN* INTERRUPT MASK
L> 符号なし0より大きいフラグ
1符号なしで0と比較した時に、0より大きい(1-65535)
0上記以外
A> 符号あり0より大きいフラグ
1符号ありで0と比較した時に、0より大きい(1-32767)
0上記以外
EQ イコールフラグ
1比較対象が同じ、またはTB命令の結果が0
0上記以外
C キャリーフラグ
1演算結果が符号なしの最大範囲(0 - 65535)を超えた
0上記以外
OV オーバーフローフラグ
1演算結果が符号ありの最大範囲(-32768 - 32767)を超えた
0上記以外
OP パリティーフラグ
1演算結果を2進数で足すと奇数
0上記以外
X XOP命令処理フラグ
1XOP命令を実行中
0上記以外
* 未使用※1
OV EN オーバーフロー割り込み有効フラグ
1オーバーフロー割り込み有効
0オーバーフロー割り込み無効
INTERRUPT MASK 割り込みマスク(0で割り込み禁止)
※1演算などの影響は受けないため、ユーザーが自由に使用可


命令一覧表

記号の説明

1. ニーモニック欄

Rn ワークスペースレジスタR0-R15。
SA 操作対象元のアドレスで、アドレッシングモードによる指定。
DA 操作対象先のアドレスで、アドレッシングモードによる指定。
#4 符号なし4bit値(0-15)。
#16符号なし16bit値(0-65535)。
#d 相対アドレス(-256 - 254)。

2. アドレッシングモード

SA/DAで指定するアドレッシングモードは以下の5つ。

表記 TS/TD値説明
Rn 0 ワークスペースレジスタアドレス。
ワークスペースレジスタ値を、アドレスとして使用。
*Rn 1 ワークスペースレジスタ間接アドレス。
ワークスペースレジスタ値の指すアドレスのメモリから取得した値を、アドレスとして使用。
@LABEL 2 直接アドレス。
16bitの定数。
@TABLE(Rn)2 インデックスアドレス。
16bitの定数+指定のワークスペースレジスタ値を、アドレスとして使用。
※R0を直接アドレス(@LABEL)として使用するため、指定できるのはR1-R15。
*Rn+ 3 オートインクリメントありワークスペースレジスタ間接アドレス。
*Rnの後、参照したワークスペースレジスタ値を、1バイトアクセス時は+1、2バイトアクセス時は+2する。

3. 機能欄

*SA / *DASA/DAの指すメモリアドレスの内容。
@SA / @DASA/DAの指すCRUアドレスの内容。
R0R1 R0を上位16bit、R1を下位16bitとした32bit値。
RnRm Rnで指定したワークスペースレジスタ番号を上位16bit、Rnに+1した指定したレジスタ番号を下位16bitとした32bit値。
[:] ビット

4. フラグ欄(LAECVPXIM)

LL>フラグ
AA>フラグ
EEQフラグ
CCフラグ
VOVフラグ
POPフラグ
XXフラグ
IOV ENフラグ
MINTERRUPT MASK
-変化なし
*命令の実行により変化

5. 命令形式

形式0123456789101112131415
1 OPCODE B TD D TS S
2 OPCODE D TS S
3 OPCODE TS S
4 OPCODE C TS S
5 OPCODE 符号あり8bit値
6 OPCODE C W
7 OPCODE 0 W
16bit値
8 OPCODE 0
16bit値
9 OPCODE W
10 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
11 OPCODE 0 0 0 0 0

6. ステート欄

1ステート = 4クロック

ここで書いているのはC1のみで、C2/W/XM1/XM2は含めない。
16bitバスで接続されていないオフチップへのアクセスは+1、また一部命令がオフチップへのアクセス時に補正が掛かる(たぶん)


命令

(1)転送
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
LI Rn,#16Rn ← #16 ***------7 4 3
MOV SA,DA *DA ← *SA ***------1 2 3
MOVB SA,DA *DA[0:7] ← *SA[0:7] ***--*---1 2 3
CLR SA *SA ← 0 ---------3 2 3
SETO SA *SA ← 0xffff ---------3 2 3
LWPI #16 WP ← #16 ---------8 4 4
LIMI #16 ST.IM ← #16[12:15] --------*8 4 5
STST Rn Rn ← ST ---------9 2 3
LST Rn ST ← Rn *********9 2 5
STWP Rn Rn ← WP ---------9 2 3
LWP Rn WP ← Rn ---------9 2 4

(2)交換
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
SWPB SA *SA[0:7] ⇔ *SA[8:15] ---------3 2 13

(3)算術演算
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
AI #16,RnRn ← Rn + #16 *****----7 4 4
A SA,DA *DA ← *DA + *SA *****----1 2 4
AB SA,DA *DA[0:7] ← *DA[0:7] + *SA[0:7] ******---1 2 4
CI #16,Rn Rn - #16 ***------7 4 4
C SA,DA *SA - *DA ***------1 2 4
CB SA,DA *SA[0:7] - *DA[0:7] ***--*---1 2 4
S SA,DA *DA ← *DA - *SA *****----1 2 4
SB SA,DA *DA[0:7] ← *DA[0:7] - *SA[0:7] ******---1 2 4
INC SA *SA ← *SA + 1 *****----3 2 3
INCT SA *SA ← *SA + 2 *****----3 2 3
DEC SA *SA ← *SA - 1 *****----3 2 3
DECT SA *SA ← *SA - 2 *****----3 2 3
MPY SA,Rn RnRm ← *SA * Rn ---------2 2 23 符号なし乗算
MPYS SA R0R1 ← *SA * R0 ***------3 2 25 符号あり乗算
DIV SA,Rn Rn ← RnRm / *SA
Rm ← RnRm % *SA
----*----2 2 6/28 符号なし剰余算
DIVS SA R0 ← R0R1 / *SA
R1 ← R0R1 % *SA
***-*----3 2 10/33 符号あり剰余算
ABS SA if *SA < 0 then
 if *SA <> -32768 then
  *SA* ← -*SA
 else
  ST.O ← 1
*****----3 2 3

(3) 論理演算
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
ANDI #16,RnRn ← Rn and #16 ***------7 4 4
ORI #16,RnRn ← Rn or #16 ***------7 4 4
SOC SA,DA *DA ← *DA or *SA ***------1 2 4
SOCB SA,DA *DA[0:7] ← *DA[0:7] or *SA[0:7] ***--*---1 2 4
XOR SA,Rn Rn ← *SA xor Rn ***------2 2 4
INV SA *SA ← not *SA ***------3 2 3
NEG SA *SA ← 0 - *SA *****----3 2 3
SZC SA,DA *DA ← *DA and (not *SA) ***------1 2 4
SZCB SA,DA *DA[0:7] ← *DA[0:7] and (not *SA[0:7]) ***--*---1 2 4

(4) ジャンプ・コール・リターン
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
B SA PC ← SA ---------3 2 3
BL SA R11 ← PC+2
PC ← SA
---------3 2 5
BLWP SA R13 ← WP
R14 ← PC+2
R15 ← ST
WP = *(SA+0)
PC = *(SA+2)
---------3 2 11
RTWP ST ← R15
PC ← R14
WP ← R13
*********10 2 6
XOP SA,#4 R11 = SA
R13 = WP
R14 = PC+2
R15 = ST
WP = (0x0040 + #4*4)
PC = (0x0042 + #4*4)
------**-2 2 15
JEQ #d if (ST.EQ = 1) then
 PC ← PC+2+#d
---------5 2 3
JGT #d if (ST.A> = 1) then
 PC ← PC+2+#d
---------5 2 3
JH #d if (ST.L> = 1) and (ST.EQ = 0) then
 PC ← PC+2+#d
---------5 2 3
JHE #d if (ST.L> = 1) or (ST.EQ = 1) then
 PC ← PC+2+#d
---------5 2 3
JL #d if (ST.L> = 0) and (ST.EQ = 0) then
 PC ← PC+2+#d
---------5 2 3
JLE #d if (ST.L> = 0) or (ST.EQ = 1) then
 PC ← PC+2+#d
---------5 2 3
JLT #d if (ST.A> = 0) and (ST.EQ = 0) then
 PC ← PC+2+#d
---------5 2 3
JMP #d PC ← PC+2+#d ---------5 2 3
JNC #d if (ST.C = 0) then
 PC ← PC+2+#d
---------5 2 3
JNE #d if (ST.EQ = 0) then
 PC ← PC+2+#d
---------5 2 3
JNO #d if (ST.OV = 0) then
 PC ← PC+2+#d
---------5 2 3
JOC #d if (ST.C = 1) then
 PC ← PC+2+#d
---------5 2 3
JOP #d if (ST.OP = 1) then
 PC ← PC+2+#d
---------5 2 3

(5) ローテイト・シフト
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
SLA Rn,#4 rl *****----6 2 5+C/23/7+N
SRA Rn,#4 rlc****-----6 2 5+C/23/7+N
SRC Rn,#4 rr ****-----6 2 5+C/23/7+N
SRL Rn,#4 rrc****-----6 2 5+C/23/7+N

(6) ビット・CRU操作
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
COC SA,Rn if *SA = (*SA and Rn) then
 ST.EQ ← 1
--*------2 2 4
CZC SA,Rn if *SA = (*SA and (not Rn)) then
 ST.EQ ← 1
--*------2 2 4
TB #d ST.EQ = @(R12+#d) --*------5 2 8
SBO #d @(R12+#d) ← 1 ---------5 2 8
SBZ #d @(R12+#d) ← 0 ---------5 2 8
LDCR SA,#4 A = R12
B = *SA
while (#4+1)
 @A ← B[0]
 A ← A + 2
 B ← B << 1
***--*---4 2 41/9+2C
STCR SA,#4 @SA ← #4 ***--*---4 2 43/19+C/27+C
RSET ST.IM ← 0 --------*11 2 7

(7) 特殊演算・CPU制御
ニーモニック 機能 LAECVPXIM命令形式命令長ステート(C1) 補足
X SA SAの命令を実行 ---------3 2 2
IDLE 割り込みが発生するまで停止 ---------11 2 28
CKOF ???? ---------11 2 7
CKON ???? ---------11 2 7
LREX ???? ---------11 2 7


命令コードマップ

色の説明

1. 文字・背景色

実装済み
未実装
未定義
オペコードが8bit以上のため別テーブル

命令コード([0-7]bit)

H/L 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 $00 $01 $02 $03 $04 $05 $06 $07 SRA SRL SLA SRC
1 JMP JLT JLE JEQ JHE JGT JNE JNC JOC JNO JL JH JOP SBO SBZ TB
2 COC CZC XOR XOP
3 LDCRC STCR MPY DIV
4 SZC DA,Rn SZC DA,*Rn SZC DA,@LABEL/@TABLE(Rn) SZC DA,*Rn+
5 SZCB DA,Rn SZCB DA,*Rn SZCB DA,@LABEL/@TABLE(Rn) SZCB DA,*Rn+
6 S DA,Rn S DA,*Rn S DA,@LABEL/@TABLE(Rn) S DA,*Rn+
7 SB DA,Rn SB DA,*Rn SB DA,@LABEL/@TABLE(Rn) SB DA,*Rn+
8 C DA,Rn C DA,*Rn C DA,@LABEL/@TABLE(Rn) C DA,*Rn+
9 CB DA,Rn CB DA,*Rn CB DA,@LABEL/@TABLE(Rn) CB DA,*Rn+
A A DA,Rn A DA,*Rn A DA,@LABEL/@TABLE(Rn) A DA,*Rn+
B AB DA,Rn AB DA,*Rn AB DA,@LABEL/@TABLE(Rn) AB DA,*Rn+
C MOV DA,Rn MOV DA,*Rn MOV DA,@LABEL/@TABLE(Rn) MOV DA,*Rn+
D MOVB DA,Rn MOVB DA,*Rn MOVB DA,@LABEL/@TABLE(Rn) MOVB DA,*Rn+
E SOC DA,Rn SOC DA,*Rn SOC DA,@LABEL/@TABLE(Rn) SOC DA,*Rn+
F SOCB DA,Rn SOCB DA,*Rn SOCB DA,@LABEL/@TABLE(Rn) SOCB DA,*Rn+

12bit オペコード([8:11]bit)

[0:7] 0 1 2 3 4 5 6 7 8 9 A B C D E F
$00 LST LWP
$02 LI AI ANDI ORI CI STWP STST LWPI
$03 LIMI IDLE RSET RTWP CKON CKOF LREX

10bit オペコード([8:9]bit)

[0:7] 0 1 2 3
$01 DIVS MPYS
$04 BLWP B X CLR
$05 NEG INV INC INCT
$06 DEC DECT BL SWPB
$07 SETO ABS