TLCS-870/C1 シリーズ CPU セミコンダクター社 TLCS-870/C1 CMOS 8 ビット マイクロコンピュータ TLCS-870/C1 シリーズ TLCS-870/C1 シリーズは、東芝オリジナルのコンパクトで高速 / 高機能 , 低消費電力の 8 ビットシング ルチップマイクロコンピュータです。 特長 • 直交性のある豊富な命令セット : 133 種 732 命令 東芝オリジナルマイクロコントローラ TLCS-870/C とバイナリレベルでのコンパチビリティを 持たせており、小規模システム向けに最適化した命令セットで、C コンパイラに向いています。 - 乗除算 (8 ビット × 8 ビット , 16 ビット ÷ 8 ビット ) - ビット操作 (Set/Clear/Complement/Load/Store/Test/Exclusive OR) - 16 ビット演算 / 転送 - 1 バイト長のジャンプ / コール (Short relative jump/Vector call) • レジスタ構成 ( メモリ空間から独立 ) 8 ビット /16 ビット汎用レジスタを 2 バンク化 - 汎用レジスタ : 8 ビット幅 8 本 (16 ビット幅 4 本としても使用可 ) × 2 - 16 ビット汎用レジスタ : 16 ビット幅 2 本× 2 - プログラムカウンタ : 16 ビット幅 1 本 - スタックポインタ : 16 ビット幅 1 本 - プログラムステータスワード : 7 ビット幅 1 本 • メモリ空間 • コード領域 : 最大 64K バイト • データ領域 : 最大 64 K バイト • メモリマップド I/O 方式 • 割り込み - 最大 62 要因まで対応可 ( リセットを除く ) - エッジ選択、ノイズ除去機能付き外部割り込み入力 • 低消費電力動作モード ( 最大 9 種のモード ) - STOP モード : 動作停止 ( バッテリー / コンデンサバックアップ ) - SLOW1 モード : 低周波クロックによる低周波動作 ( 高周波停止 ) - SLOW2 モード : 低周波クロックによる低周波動作 ( 高周波発振 ) - IDLE0 モード : CPU 停止、周辺ハードウエアのうち、タイムベースタイマのみ動作 ( 高周波 クロック ) 継続し、タイムベースタイマ設定の基準時間経過により解除。 - IDLE1 モード : CPU 停止、周辺ハードウエアのみ動作 ( 高周波クロック )、割り込みにより 解除 (CPU 再起動 )。 - IDLE2 モード : CPU 停止、周辺ハードウエアのみ動作 ( 高周波 / 低周波クロック )、割り込 みにより解除 (CPU 再起動 )。 - SLEEP0 モード : CPU 停止、周辺ハードウエアのうち、タイムベースタイマ (TBT) のみ動作 ( 低周波クロック ) 継続し、タイムベースタイマ設定の基準時間経過により解除。 - SLEEP1 モード : CPU 停止、周辺ハードウエアのみ動作 ( 低周波クロック )、割り込みにより 解除。 • クロックギア ( 逓倍・分周 ) • 高速処理 RA003 Page 1 TLCS-870/C1 • 低電圧 / 高速動作 • フェイルセーフ機能 - ウォッチドッグタイマ ( リセット or 割り込み ) - システムクロックリセット - 未定義命令割り込み - ソフトウエア割り込み ブロック図 CPUࠦࠕ ࠺࠲ࡃࠬ PSW ࠫࠬ࠲ ࡈࠣ 4$5 ALU ࠺ࠦ࠳ ᳢↪ࠫࠬ࠲ W A W A B C B C D E D E L H H IX L IX SP IY IY PC $#0- $#0- ഀࠅㄟߺ ᓮ࿁〝 ࠕ࠼ࠬࡃࠬ ࠪࠬ࠹ࡓ ࠢࡠ࠶ࠢ ࠲ࠗࡒࡦࠣ ࠫࠚࡀ࠲ ᒛഀࠅㄟߺ ᓮ࿁〝 േࡕ࠼ ᓮ࿁〝 ㄝ࿁〝 ࠙ࠜ࠶࠴ ࠼࠶ࠣ࠲ࠗࡑ ࠲ࠗࡓࡌࠬ ࠲ࠗࡑ ㄝ࿁〝 ᵈ) PSW: ࡊࡠࠣࡓࠬ࠹࠲ࠬࡢ࠼ RA003 Page 2 RAM ROM TLCS-870/C1 第1章 動作説明 1.1 CPU コア機能 1.1.1 メモリマップ TLCS-870/C1 シリーズのメモリマップは、コード領域とデータ領域の 2 つに分けられます。 1.1.1.1 コード領域 コード領域は最大 64K バイトの領域で、命令のオペコード,オペランドの他に、ベクタコー ル命令用ベクタテーブル、割り込みベクタテーブルが格納されます。 ࠕ࠼ࠬ 0x0000 ࠦ࠼㗔ၞߩౝኈ 㧦 ࠦ࠼㗔ၞߩౝኈߣ ࠦ࡞/ഀࠅㄟߺ/࠶࠻ 0xFF5F 0xFF60 ഀࠅㄟߺࡌࠢ࠲(ਅ) 0x62 INTXXX ; PC φ 0xD862 CALLV 0H ; PC φ 0xC856 INTXXX ; PC φ 0xD368 RESET ; PC φ 0xC03E 0xFF61 ഀࠅㄟߺࡌࠢ࠲() 0xD8 0xFF62 0xFF9F 0xFFA0 0xFFA1 ഀࠅㄟߺࡌࠢ࠲(ਅ) 0x56 ഀࠅㄟߺࡌࠢ࠲() 0xC8 0xFFA2 0xFFBF 0xFFC0 ഀࠅㄟߺࡌࠢ࠲(ਅ) 0x68 0xFFC1 ഀࠅㄟߺࡌࠢ࠲() 0xD3 0xFFC2 0xFFFD 0xFFFE ࠶࠻ࡌࠢ࠲(ਅ) 0x3E 0xFFFF ࠶࠻ࡌࠢ࠲() 0xC0 図 1-1 コード領域 ( メモリスタイル:64K バイト時 ) RA003 Page 3 第 1 章 動作説明 1.1 CPU コア機能 TLCS-870/C1 ࠕ࠼ࠬ ࠦ࠼㗔ၞߩౝኈ 0x10000 㧦 ࠦ࠼㗔ၞߩౝኈߣ ࠦ࡞/ഀࠅㄟߺ/࠶࠻ 0x1FF5F 0x1FF60 ഀࠅㄟߺࡌࠢ࠲(ਅ) 0x62 INTXXX ; PC φ 0xD862 CALLV 0H ; PC φ 0xC856 INTXXX ; PC φ 0xD368 RESET ; PC φ 0xC03E 0x1FF61 ഀࠅㄟߺࡌࠢ࠲() 0xD8 0x1FF62 0x1FF9F 0x1FFA0 0x1FFA1 ഀࠅㄟߺࡌࠢ࠲(ਅ) 0x56 ഀࠅㄟߺࡌࠢ࠲() 0xC8 0x1FFA2 0x1FFBF 0x1FFC0 ഀࠅㄟߺࡌࠢ࠲(ਅ) 0x68 0x1FFC1 ഀࠅㄟߺࡌࠢ࠲() 0xD3 0x1FFC2 0x1FFFD 0x1FFFE ࠶࠻ࡌࠢ࠲(ਅ) 0x3E 0x1FFFF ࠶࠻ࡌࠢ࠲() 0xC0 図 1-2 コード領域 ( メモリスタイル:96K, 128K バイト時 ) (1) ベクタコール命令用ベクタテーブル ベクタコール命令用ベクタテーブルは、ベクタコール命令 [CALLV n] 用のベクタ ( サブ ルーチン エントリーアドレス , 2 バイト / ベクタ ) を格納するテーブルで、16 ベクタありま す。ベクタコール命令用ベクタテーブルは、メモリスタイルに従って以下の領域に割り当 てられます。 メモリスタイル ベクタコール命令用ベクタテーブル領域 64K バイト 0xFFA0 ~ 0xFFBF 96K バイト 0x1FFA0 ~ 0x1FFBF 128K バイト 通常コール命令 [CALL mn] は、一つの命令に 3 バイト長の ROM 容量が必要ですが、ベ クタコール命令 [CALLV n] は 1 バイト長の命令のため、使用頻度の高いサブルーチンコー ルに使うことによりメモリ効率を上げることができます。 CALLV 命令 1 箇所から CALL 1 + 2 = 3 バイト CALL 命令 3 バイト → CALLV と CALL の効率同じ → CALLV の方が効率良い 2 箇所から CALL 2 + 2 = 4 バイト 6 バイト 3 箇所から CALL 3 + 2 = 5 バイト 9 バイト 4 箇所から CALL 4 + 2 = 6 バイト 12 バイト *CALLV の +2 はベクタコール領域に配置されたジャンプ先アドレスの 2 バイト RA003 Page 4 TLCS-870/C1 ( プログラム例 ) ベクタコール ( メモリスタイルが 64K バイトの場合 ) CALLV で呼ばれる定数を 2 倍して 0xFFA0 を加えた値をアドレスとするメモリから 呼び出した 16 ビットアドレスにジャンプします。 CALLV PSUB _ 2: 0x02 : : : : : : : : LD (HL),A DEC A : : : : : : : : VECTOR _ CALL section code abs = 0xFFA0 DW PSUB _ 0 ; 0x00 DW PSUB _ 1 ; 0x01 DW PSUB _ 2 ; 0x02 : : DW ( プログラム例 ) : 最大 16 個 : PSUB _ F ; 0x0F ベクタコール ( メモリスタイルが 96K, 128K バイトの場合 ) CALLV で呼ばれる定数を 2 倍して 0x1FFA0 を加えた値をアドレスとするメモリか ら呼び出した 16 ビットアドレスにジャンプします。 CALLV PSUB _ 2: 0x02 : : : : : : : : LD (HL),A DEC A : : : : : : : : VECTOR _ CALL section code abs = 0x1FFA0 DW code _ addr(PSUB _ 0) ; 0x00 DW code _ addr(PSUB _ 1) ; 0x01 DW code _ addr(PSUB _ 2) ; 0x02 : : DW : 最大 16 個 : code _ addr(PSUB _ F) ; 0x0F (2) 割り込みベクタテーブル 割り込みベクタテーブルは、リセットおよび割り込みのベクタ (2 バイト / ベクタ ) を格 納するテーブルで、最大 63 ベクタあります。割り込みベクタテーブルは、メモリスタイル に従って以下の領域に割り当てられます。ベクタには、リセット解除からのスタートアド レス , 割り込みサービスルーチンのエントリアドレスを格納します。 メモリスタイル 割り込みベクタテーブル領域 64K バイト 0xFF60 ~ 0xFF9F, 0xFFC0 ~ 0xFFFF 96K バイト 0x1FF60 ~ 0x1FF9F, 0x1FFC0 ~ 0x1FFFF 128K バイト 1.1.1.2 データ領域 データ領域には転送命令、演算命令などのソースまたはディスティネーションとしてアクセ スされるデータが格納されます。 なお、データ領域のアドレス 0x00000 ~ 0x000FF ( メモリスタイルが 64K バイトのときは 0x0000 ~ 0x00FF) はダイレクト領域となっています。この領域に対しては、実行時間を短縮した命令に よる処理が可能です。 RA003 Page 5 第 1 章 動作説明 1.1 CPU コア機能 TLCS-870/C1 ࠕ࠼ࠬ 0x0000 0x003F 0x0040 0x0E3F 0x0E40 0x0EFF 0x0F00 0x0FFF SFR1 (64byte) RAM (3584byte) SFR3 (192byte) SFR2 (256byte) 0x1000 ROM (61440byte) 0xFFFF 図 1-3 データ領域 ( メモリスタイル:64K バイト時 ) ࠕ࠼ࠬ 0x00000 0x0003F 0x00040 0x00E3F 0x00E40 0x00EFF 0x00F00 0x00FFF SFR1 (64byte) RAM (3584byte) SFR3 (192byte) SFR2 (256byte) 0x01000 ROM (61440byte) 0x0FFFF 図 1-4 データ領域 ( メモリスタイル:96K, 128K バイト時 ) RA003 Page 6 TLCS-870/C1 1.1.2 汎用レジスタ TLCS-870/C1は、8つの 8ビット汎用レジスタW, A, B, C, D, E, H, Lを各BANKに1組づつ、 計2BANK 内蔵しています。各レジスタは、WA, BC, DE, HLのペアで、16ビットレジスタとしても使用できます。 汎用レジスタはアドレス空間にはマッピングされていません。また、汎用レジスタは電源投入時 及びリセット時の値は不定となります。 BANK0 BANK1 W A W A B C B C D E D E H L H L 8ࡆ࠶࠻ 8ࡆ࠶࠻ 16ࡆ࠶࠻ 16ࡆ࠶࠻ 図 1-5 汎用レジスタ W, A, B, C, D, E, H, L は 8 ビットの転送・演算に、WA, BC, DE, HL は 16 ビットの転送・演算に用 いられます。また、汎用レジスタとしての機能のほかに、次の機能を有しています。 1.1.2.1 A レジスタ A レジスタは、レジスタ間接ビット指定のビット操作命令における、ビット指定レジスタと して使用されます。 ( プログラム例 ) ① SET (0x56).A ; 0x00056 番地 ( メモリスタイルが 64K バイトのとき は 0x0056 番地 ) の、A の内容で指定されるビットを、 “1” にセットします。 ② CPL (IX + 0x03).A ; IX に即値 0x03 を符号拡張加算した値で指定される アドレスのメモリの、A の内容で指定されるビットを 反転します。 また、レジスタオフセット相対アドレッシング (PC + A) のオフセットレジスタとしても使用 されます。 ( プログラム例 ) LD A, (PC + A) ; PC に A の内容を符号拡張加算した値で指定される アドレスのメモリの内容を A にロードします。 1.1.2.2 C レジスタ C レジスタは、除算命令における除数レジスタとして使用されます。除算命令実行後に被除 数の上位バイトに余りが、被除数の下位バイトに商がそれぞれ格納されます。 ( プログラム例 ) DIV RA003 WA, C ; A ← WA ÷ C, W ← 余り Page 7 第 1 章 動作説明 1.1 CPU コア機能 TLCS-870/C1 また、レジスタオフセット相対アドレッシング (HL + C) オフセットレジスタとしても使用さ れます。 ( プログラム例 ) LD A, (HL + C) ; HL に C の内容を符号拡張加算した値で指定される アドレスのメモリの内容を A にロードします。 1.1.2.3 DE レジスタ DE レジスタは、レジスタ間接アドレッシングのアドレス指定レジスタとして使用されます。 ( プログラム例 ) LD ; DE で指定されるアドレスのメモリの内容を A に A, (DE) ロードします。 1.1.2.4 HL レジスタ HLレジスタは、レジスタ間接アドレッシングのアドレス指定レジスタ, インデックスアドレッ シングのインデックスレジスタとして使用されます。 ( プログラム例 ) ① LD ; HL で指定されるアドレスのメモリの内容を A, (HL) A にロードします。 ② LD A, (HL + 0x52) ; HL に即値 0x52 を符号拡張加算した値で指定される アドレスのメモリの内容を A にロードします。 ③ LD A, (HL + C) ; HL に C の内容を符号拡張加算した値で指定される アドレスのメモリの内容を A にロードします。 1.1.3 16 ビット汎用レジスタ (IX, IY) TLCS-870/C1 は、2 つの 16 ビット汎用レジスタ IX, IY を各 BANK に 1 組づつ、計 2BANK 内蔵し ています。これらは 16 ビット長のレジスタで、レジスタ間接アドレッシングのアドレス指定レジス タ , インデックスアドレッシングのインデックスレジスタとして使用されます。 16 ビット汎用レジスタは、電源投入時及びリセット時の値は不定となります。 BANK0 BANK1 IX IX IY IY 16ࡆ࠶࠻ 16ࡆ࠶࠻ 図 1-6 16 ビット汎用レジスタ RA003 Page 8 TLCS-870/C1 ( プログラム例 ) ① LD A, (IX) ; IX で指定されるアドレスのメモリの内容を A に ロードします。 ② LD A, (IY + 0x52) ; IY に即値 0x52 を符号拡張加算した値で指定される アドレスのメモリの内容を A にロードします。 また、16 ビット長の汎用レジスタとして、転送・演算に使用することもできます。 ( プログラム例 ) ① LD IX, (0x3A) ; IX に 0x0003A, 0x0003B 番地の内容をロードします。 ( メモリスタイルが 64K バイトのときは 0x003A, 0x003B) ② RA003 ADD IX, 0x5678 ; IX に即値 0x5678 を加算し、結果を IX に格納します。 Page 9 第 1 章 動作説明 1.1 CPU コア機能 TLCS-870/C1 プログラムステータスワード (PSW) 1.1.4 プログラムステータスワードは、 • ジャンプステータスフラグ (JF) • ゼロフラグ (ZF) • キャリーフラグ (CF) • ハーフキャリーフラグ (HF) • サインフラグ (SF) • オーバフローフラグ (VF) • レジスタバンクセレクタ (RBS) の 7 つのフラグから構成され、SFR 内の 0x0003F 番地 ( メモリスタイルが 64K バイトのとき は 0x003F) に割り付けられています。 PSW のアクセスは、専用命令で行います。また、メモリアクセス命令で読み出すこともできます。 PSW の構成 PSW (0x003F) 7 6 5 4 3 2 1 0 JF ZF CF HF SF VF RBS - フラグは、命令で指定される条件に従いセット / クリアされます。また、レジスタバンクセレクタ と、ハーフキャリーフラグ以外のフラグは条件付きジャンプ命令 [JR cc, a], [JRS cc, a] のジャンプ条 件 cc となり得ます。 意味 cc RA003 条件 T True JF = 1 F False JF = 0 Z Zero ZF = 1 NZ Not zero ZF = 0 CS Carry set CF = 1 CC Carry clear CF = 0 VS Overflow set VF = 1 VC Overflow clear VF = 0 M Minus SF = 1 P Plus SF = 0 EQ Equal ZF = 1 NE Not equal ZF = 0 LT Unsigned less than CF = 1 GE Unsigned greater than or equal CF = 0 LE Unsigned less than or equal (CF ∨ ZF) = 1 GT Unsigned greater than (CF ∨ ZF) = 0 SLT Signed less than (SF ∨ VF) = 1 SGE Signed greater than or equal (SF ∨ VF) = 0 SLE Signed less than or equal ZF ∨ (SF ∨ VF) = 1 SGT Signed greater than ZF ∨ (SF ∨ VF) = 0 Page 10 TLCS-870/C1 ( プログラム例 ) ① LD PSW, 0x00 ; PSW に 0x00 を書き込む ② PUSH PSW ; PSW の内容をスタックに退避 ③ POP PSW ; スタックの内容を PSW にリストア ④ LD A, (0x3F) ; A レジスタに PSW の内容を転送 ⑤ LD RBS, 1 ; PSW の RBS に 1 を書き込む (BANK1 に切り替え ) ⑥ LD RBS, 0 ; PSW の RBS に 0 を書き込む (BANK0 に切り替え ) ⑦ LD PSW, 0x02 ; PSW の RBS に 1 を書き込む (BANK1 に切り替え。全フラグを 0 にクリア。) ⑧ LD PSW, 0x00 ; PSW の RBS に 0 を書き込む (BANK0 に切り替え。全フラグを 0 にクリア ) LD PSW,n 命令を実行した場合、レジスタバンクの値だけでなく各フラグの値も変更されます。 よってフラグの値に影響を与えずレジスタバンクを変更する場合は、LD PSW,n 命令では無く LD RBS,0 または LD RBS,1 命令を使用してください。 (0x3F) に対し、メモリアクセス命令での書き込みを行った場合、データは書き込まれず、その命 令で定まった変化をします。 ( プログラム例 ) LD (0x3F), 0x00 ; PSW = 0x00 にはならず、[LD (x), n] 命令の指定に従い JF が “1” になり、ほかのフラグは変化しません。 割り込み受け付け時、PSW はプログラムカウンタとともにスタックに退避されます。また、割り 込みリターン命令 [RETI], [RETN] の実行によりスタック上のデータが PSW にリストアされます。 PSW の RBS を除く各種フラグは、電源投入時及びリセット時の値は不定となります。RBS はリ セットで初期化され、レジスタバンクは "0" が選択されます。 1.1.4.1 ゼロフラグ (ZF) 演算結果または転送データが 0x00 (8 ビット演算 / 転送時 ) / 0x0000 (16 ビット演算時 ) のとき “1” にセットされ、その他のときは “0” にクリアされます。ビット操作命令では、指定ビットの 内容が “0” のとき “1” にセットされ、指定ビットの内容が “1” のとき “0” にクリアされます ( ビットテスト )。乗算命令の場合、積の上位 8 ビットが 0x00 のとき、除算命令の場合、剰余 が 0x00 のとき、“1” にセットされ、その他のときは “0” にクリアされます。 1.1.4.2 キャリーフラグ (CF) 演算時のキャリーまたはボローがセットされます。除算命令の場合、除数が 0x00 のとき (Divided by zero error)、または商が 0x100 以上のとき (Quotient-overflow error)、“1” にセットされ ます。シフト / ローテート命令では、レジスタからシフトアウトされるデータがセットされます。 ビット操作命令では、1 ビット長のレジスタ ( ブーリアンアキュムレータ ) として機能します。 また、キャリーフラグ操作命令によりセット / クリア / 反転ができます。 RA003 Page 11 第 1 章 動作説明 1.1 CPU コア機能 TLCS-870/C1 ( プログラム例 )0x0007 番地のビット 5 の内容と 0x009A 番地のビット 0 の内容とで排他的論理 和をとり、結果を 0x0001 番地のビット 2 に書き込みます。 ( メモリスタイルが 64K バイトの場合 ) LD CF, (0x07).5 XOR CF, (0x9A).0 LD (0x01).2, CF ; (0x0001).2 ← (0x0007).5 ∨ (0x009A).0 ( プログラム例 )0x00007 番地のビット 5 の内容と 0x0009A 番地のビット 0 の内容とで排他的論 理和をとり、結果を 0x00001 番地のビット 2 に書き込みます。 ( メモリスタイルが 96K, 128K バイトの場合 ) 1.1.4.3 LD CF, (0x07).5 XOR CF, (0x9A).0 LD (0x01).2, CF ; (0x00001).2 ← (0x00007).5 ∨ (0x0009A).0 ハーフキャリーフラグ (HF) 8 ビット演算時、4 ビット目へのキャリーまたは 4 ビット目からのボローがセットされます。 HF は、BCD データの加減算の際の十進補正用のフラグです ( [DAA r], [DAS r] 命令による十 進補正 )。 ( プログラム例 )BCD 演算 (A = 0x19, B = 0x28 のとき、次の命令を実行すると、A は 0x47 に なります )。 1.1.4.4 ADD A, B ; A ← 0x41, HF ← 1, CF ← 0 DAA A ; A ← 0x41 + 0x06 = 0x47 ( 十進補正 ) サインフラグ (SF) 算術演算の演算結果の MSB が “1” のとき、“1” にセットされ、その他のときは “0” にクリア されます。 1.1.4.5 オーバフローフラグ (VF) 算術演算の演算結果にオーバフローが生じたときに “1” にセットされ、その他のときは “0” に クリアされます。例えば、加算命令で 2 つの正の数を加算した結果が負の数になった場合、あ るいは 2 つの負の数を加算した結果が正の数になった場合に、VF は “1” にセットされます。 RA003 Page 12 TLCS-870/C1 1.1.4.6 ジャンプステータスフラグ (JF) 通常、“1” にセットされるフラグで、命令に従いゼロまたはキャリー情報がセットされ、条件 付きジャンプ命令 [JR T/F, a], [JRS T/F, a] (T, F は条件コード ) のジャンプ条件となります。 ( プログラム例 ) ジャンプステータスフラグと条件付きジャンプ命令 ( メモリスタイルが 64K バイト の場合 ) INC A JRS : ( プログラム例 ) ; 直前の演算命令で桁上げが発生した場合ジャンプします。 T,SLABEL1 : : : LD A,(HL) JRS T,SLABEL2 ; 直前の命令で JF は "1" にセットされますので、無条件ジャンプと見 なされます。 ジャンプステータスフラグと条件付きジャンプ命令 ( メモリスタイルが 96K, 128K バイトの場合 ) INC A JRS : T,code _ addr(SLABEL1) : : ; 直前の演算命令で桁上げが発生した場合ジャンプします。 : LD A,(HL) JRS T,code _ addr(SLABEL2) ; 直前の命令で JF は "1" にセットされますので、無条件ジャンプと見 なされます。 例 : WA レジスタ , HL レジスタ , データメモリの 0x000C5 番地 , CF, HF, SF, VF の内容がそれ ぞれ “0x219A”, “0x00C5”, “0xD7”, “1”, “0”, “1”, “0” のとき、下記命令を実行すると、A, WA レジ スタおよび各フラグは次のようになります。 命令 1.1.4.7 実行後の アキュム レータ PSW JF ZF CF HF SF VF ADDC A, (HL) 72 1 0 1 1 0 1 SUBB A, (HL) C2 1 0 1 0 1 0 CMP A, (HL) 9A 0 0 1 0 1 0 AND A, (HL) 92 0 0 1 0 1 0 LD A, (HL) D7 1 0 1 0 1 0 ADD A, 0x66 00 1 1 1 1 0 0 INC A 9B 0 0 1 0 1 0 ROLC A 35 1 0 1 0 1 0 RORC A CD 0 0 0 0 1 0 ADD WA, 0xF508 16A2 1 0 1 0 0 0 MUL WA 13DA 0 0 1 0 1 0 SET A.5 BA 1 1 1 0 1 0 レジスタバンクセレクタ (RBS) 汎用レジスタバンクを選択する 1 ビットのレジスタです。例えば RBS=1 の時、バンク 1 が現 在選択されていることになります。リセット時、RBS は "0" に初期化され、バンク 0 が選択さ れます。RBS を操作する命令としては、即値設定及びプッシュ/ ポップの専用命令[LD RBS,n]、 RA003 Page 13 第 1 章 動作説明 1.1 CPU コア機能 TLCS-870/C1 [LD PSW,n]、 [PUSH PSW]、 [POP PSW]が用意されていますが、 [LD PSW,n]、 [PUSH PSW]命令は RBS に加えフラグも上書きしますので、RBS だけを変更したい場合は[LD RBS,n]命令を使用してください。 割り込み受付時、RBS は PSW の他のフラグと一緒にスタックに退避されます。その際、RBS は値を変更されません。また、割り込みリターン命令[RETI],[RETN]の実行により、退避 されていた PSW の 1 ビットとして復帰され、レジスタバンクも復帰された値にしたがって切り 替わります。 1.1.5 スタック、スタックポインタ 1.1.5.1 スタック スタックは、サブルーチンコール命令実行時または割り込み受け付け時に、その処理ルーチ ンへジャンプするのに先立ってプログラムカウンタの内容 (戻り番地) やプログラムステータス ワードの内容などをセーブするエリアです。 サブルーチンコール命令 [CALL mn], [CALLV n] 実行時、戻り番地が ( 上位バイト、下位バ イトの順に ) スタックに退避 ( プッシュダウン ) されます。ソフトウエア割り込み命令 [SWI] 実 行時および割り込み受け付け時は、まずプログラムステータスワードの内容がスタックに退避 され、次に戻り番地が退避されます。 処理ルーチンから復帰する場合、サブルーチンリターン命令 [RET] を実行することによりス タックからプログラムカウンタへ、割り込みリターン命令 [RETI], [RETN] を実行することによ りスタックからプログラムカウンタおよびプログラムステータスワードへ、それぞれの内容が リストア ( ポップアップ ) されます。 スタックは、データ領域内の任意のエリアに設定できます。 1.1.5.2 スタックポインタ スタックポインタは、スタックの先頭番地を指す 16 ビットのレジスタです。スタックポイン タは、サブルーチンコール、プッシュ命令実行時、および割り込み受け付け時にポストデクリ メントされ、リターン、ポップ命令実行時にプリインクリメントされます。従って、スタック はアドレスの若い方に向かって深くなります。 SP 16 図 1-7 スタックポインタ スタックのアクセスとスタックのポインタの変化を図 1-8 に示します。 スタックポインタは、ハードウエアリセットで 0x00FF に初期化されます。 スタックポインタは、インデックスレジスタと同様に転送・演算命令で操作できるほか、イ ンデックスアドレッシングのインデックスレジスタとして使用できます。 ( プログラム例 ) RA003 ① LD SP, 0x043F ; SP ← 0x043F ② LD HL, SP ; HL ← SP ③ LD SP, SP+0x04 ; SP ← SP + 0x04 ④ ADD SP, 0x5678 ; SP ← SP + 0x5678 Page 14 TLCS-870/C1 ( プログラム例 ) ⑤ LD ; A ← アドレス (SP + 0x12) のメモリの内容 A, (SP+0x12) ഀࠅㄟߺฃߌઃߌ SWIታⴕᤨ CALL CALLVታⴕᤨ 0x0013C 0x0013C 0x0013D 0x0013D PCL RETI RETNታⴕᤨ RETታⴕᤨ 0x0013C 0x0013C Ԛ 0x0013D 0x0013D PCL Ԙ 0x0013E PCL ԙ 0x0013E PCH ԙ 0x0013E PCL Ԙ 0x0013E PCH ԙ 0x0013F PCH Ԙ 0x0013F PSW Ԙ 0x0013F PCH ԙ 0x0013F PSW Ԛ ታⴕ೨ ߩSP 0x013F ታⴕ೨ ߩSP 0x013F ታⴕ೨ ߩSP 0x013D ታⴕ೨ ߩSP 0x013C ታⴕᓟ ߩSP 0x013D ታⴕᓟ ߩSP 0x013C ታⴕᓟ ߩSP 0x013F ታⴕᓟ ߩSP 0x013F (a) ࠬ࠲࠶ࠢߩࠕࠢࠬ (ࡊ࠶ࠪࡘ/ࡐ࠶ࡊ) 0x00040 ࠬ࠲࠶ࠢߩ ᷓᐲ 0x0FFFF (b) ࠬ࠲࠶ࠢߩᷓᐲ 図 1-8 スタック 1.1.6 プログラムカウンタ (PC) プログラムカウンタは、次に実行すべき命令の格納されているコード領域のアドレスを指す 16 ビットのレジスタです。リセット解除時、ベクタテーブル (0x1FFFF, 0x1FFFE (0xFFFF, 0xFFFE) 番 地:MCU モード時 ) に格納されているリセット ベクタがプログラムカウンタにロードされますの で、任意のアドレスからプログラムの実行を開始することができます。例えば、0x1FFFF, 0x1FFFE (0xFFFF, 0xFFFE) 番地にそれぞれ、0xC0, 0x3E が格納されている場合、リセット解除後 0x1C03E (0xC03E) 番地から実行開始します。 TLCS-870/C1 シリーズは、パイプライン処理 ( 命令先行フェッチ ) を行っていますので、プログラ ムカウンタは、常に 2 アドレス先を指します。例えば、0x1C123 (0xC123) 番地に格納されている 1 バイト命令の実行中、プログラムカウンタの内容は 0x1C125 (0xC125) です。 注 ) 括弧内はメモリスタイルが 64K バイトのときのアドレスを示します。 MSB LSB 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ࡊࡠࠣࡓࠞ࠙ࡦ࠲ a a+1 a+2 a+3 a a+1 ࡊࡠࠣࡓࠞ࠙ࡦ࠲ (PC) PCH PCL ታⴕࠨࠗࠢ࡞ (a) ᭴ᚑ a 2 1 (b) ࡊࡠࠣࡓࠞ࠙ࡦ࠲ߣታⴕࠨࠗࠢ࡞ 図 1-9 プログラムカウンタ RA003 a Page 15 第 1 章 動作説明 1.1 CPU コア機能 1.1.6.1 TLCS-870/C1 ジャンプ命令とプログラムカウンタの関係 ジャンプ命令には相対ジャンプ命令と絶対ジャンプ命令があり、コード領域内へジャンプし ます。データ領域へのジャンプはできません。 以下にジャンプ命令とプログラムカウンタの関係の例を示します。 1. 5 ビット相対ジャンプ命令 [JRS cc, $ + 2 + d] 0x1E8C4 (0xE8C4) : JRS T, $ + 2 + 0x08 の場合 JF = 1 のとき、プログラムカウンタの内容に 0x08 を加算した 0x1E8CE (0xE8CE) に ジャンプします ( プログラムカウンタの内容は実行命令の置かれたアドレス +2 になっ ています。従って、この場合のプログラムカウンタの値は 0x1E8C4 (0xE8C4) + 2 = 0x1E8C6 (0xE8C6) となります )。 2. 8 ビット相対ジャンプ命令 [JR cc, $ + 2 + d]/[JR cc, $ + 3 + d] 0x1E8C4 (0xE8C4) : JR Z, $ + 2 + 0x80 の場合 ZF = 1 のとき、プログラムカウンタの内容に 0x1FF80 (0xFF80) (-128) を加算し た 0x1E846 (0xE846) にジャンプします。 3. 16 ビット絶対ジャンプ命令 [JP a] 0x1E8C4 (0xE8C4) : JP 0x1C235 (0xC235) の場合 無条件に 0x1C235 (0xC235) 番地にジャンプします。絶対ジャンプ命令はコード領域 64 K バイト内の任意のアドレスにジャンプできます。 注 ) 括弧内はメモリスタイルが 64K バイトのときのアドレスを示します。 RA003 Page 16 TLCS-870/C1 1.2 修正履歴 修正内容 Rev 16 進数の表記を H から 0x に、2 進数の表記を B から 0y に修正しました。 「図 1-2 コード領域 ( メモリスタイル:96K, 128K バイト時 )」を修正しました。 RA001 「1.1.4 プログラムステータスワード (PSW)」のプログラム例、文章を修正しました。 「1.1.4.7 レジスタバンクセレクタ (RBS)」の文章を修正しました。 「図 1-2 コード領域 ( メモリスタイル:96K, 128K バイト時 )」の CALLV アドレスに誤りがあったのを修正 RA002 「図 1-4 データ領域 ( メモリスタイル:96K, 128K バイト時 )」に SFR3 を追加 最小命令実行時間の記述を削除。最低電源電圧の記述を削除。( 製品によって異なるため ) RA003 メモリスタイル別の表記に変更しました。 「1.1.4.6 ジャンプステータスフラグ (JF)」表中の「実行フラグ」を「PSW」に修正しました。 RA003 Page 17 第 1 章 動作説明 1.1 CPU コア機能 RA003 TLCS-870/C1 Page 18