## 第22章　LC86K命令概要

ここでは、個々の命令を説明する前に、フラグの動作、アドレッシングについてを説明します。

### 22-1　命令概要

#### 22-1-1　算術演算命令

算術演算命令は、アキュムレータを中心とした四則演算、インクリメント、またはデクリメントを行う命令です。四則演算の結果により、次のようにCY，AC，OVが設定されます。

#### CY（キャリーフラグ）

#### AC（補助キャリーフラグ）

#### OV（オーバーフローフラグ）

#### 22-1-2　論理演算命令

論理演算命令は、論理演算やローテートを行う命令です。RORC、ROLC命令実行時にはCYも影響を受けます。

#### 22-1-3　データ転送命令

データ転送命令は、RAM、特殊機能レジスタ（SFR）へのデータの書き込み、読み込み、データの退避または交換を行います。

#### 22-1-4　ジャンプ命令

ジャンプ命令は、無条件に目的の命令に制御を移す命令です。

#### 22-1-5　条件分岐命令

条件分岐命令は、命令が指定する条件が満たされている（真）か、いない（偽）かを判定し、真ならば目的の番地へ分岐します。偽ならば分岐は行われず、次の命令の実行に移ります。

BE，BNE命令は、8ビットデータどうしの比較によって分岐する命令で、比較結果により次のようにCYをセットまたはリセットします。

#### 22-1-6　サブルーチン命令

サブルーチン命令は、目的の命令に制御を移すための無条件分岐を行います。分岐後、復帰命令（RET、RETI）によってCALL命令に続く命令に制御を戻すために、スタックにアドレスを格納します。スタックはRAMにあり、スタックポインタ（SP）によって指定します。サブルーチンのネスティングレベルに応じてスタックに使用するRAM領域を確保しておく必要があります。

ビジュアルメモリのスタックは、RAMのバンク0に確保されます。また、アプリケーション起動時にシステムBIOSが、7FHに設定します。POP命令を実行すると、SPが+1された後データがストアされますので、実データは80H以降に格納されます。また、スタックは、7FHから0FFHへと上位へ向って消費されます。 内蔵時計機能もスタックを20バイト消費します。

#### 22-1-7　ビット操作命令

ビット操作命令は、指定したRAMまたは特殊機能レジスタ（SFR）の内容をビット単位で操作する命令です。

#### 22-1-8　その他の命令

何もせず1サイクルクロック消費するNOP命令があります。

#### 22-1-9　マクロ命令

専用の標準マクロ命令です。ROM内システムBIOSとフラッシュメモリのアプリケーションプログラムの実行を切り換えます。

#### 22-1-10　アドレッシング

フラッシュメモリやRAM、特殊機能レジスタ（SFR）のアドレッシングには、いくつかの方法があります。

#### 22-1-11　プログラムメモリのアドレッシング

ジャンプ命令や分岐命令、サブルーチン命令では、ジャンプ（分岐）先のプログラムROMのアドレスを命令コードで指定します。この場合、次のアドレッシングによってアドレスが指定されます。

#### r8（8ビット相対アドレッシング）

現在実行中の次の命令の先頭番地を中心として、−128〜＋127番地のアドレスの範囲内にジャンプ（分岐）が可能です。符号付きの8ビットデータで表されます。

［80H〜7FH：−128〜＋127］

#### r16（16ビット相対アドレッシング）

64Kバイトのフラッシュメモリ空間内のどこにでもジャンプが可能です。符号なしの16ビットデータで表されます。

［0000H〜FFFFH：＋0〜＋65535］

#### a12（12ビット絶対アドレッシング）

現在実行中の次の命令の先頭番地［PC15〜PC00］のPC15〜PC12（カレントページ）をそのままに、PC11〜PC00を12ビットのアドレッシングデータ［000H〜FFFH］で置き換えます。ページ（PC15〜PC12）内のジャンプが可能です。

JMP命令、CALL命令がページの最終部分にある場合は、カレントページが変わるので注意が必要です。

#### a16（16ビット絶対アドレッシング）

64Kバイトのフラッシュメモリ空間内のどこにでもジャンプが可能です。16ビットデータがそのままアドレスを表します。

［0000H〜FFFFH：0〜65535］

#### テーブルジャンプについて

スタックにジャンプ先のアドレスを設定しておき、RET命令でその値を強制的にプログラムカウンタ（PC）に入れることによって、ジャンプすることができます。

例1では、1行目でスタックポインタ（SP）を09Hに設定しています。ここでRET命令を実行すると、RAM08Hが上位バイト、RAM07Hが下位バイトとしたアドレスへジャンプするので、2，3行目でジャンプ先アドレスを設定します。

ジャンプ先をPC＝0C13Hとしているので、2行目では下位バイトの13Hを、3行目では上位バイトの0CHをセットしています。4行目のRET命令を実行すると、SPは07Hになり、0C13Hへジャンプします。しかし、例1ではSP値が既知でなければならないので、通常は例2に示すようにPUSH命令を用います。

#### 例1

>     MOV	#09H,SP
>     MOV	#13H,07H
>     MOV	#0CH,08H
>     RET

#### 例2

>     MOV	#13H,ACC
>     PUSH	ACC
>     MOV	#0CH,ACC
>     PUSH	ACC
>     RET

例3は、RAM70Hのデータによって00H〜7FHまで（128とおり）の分岐を行なっています。

1，2行目で分岐先の下位アドレスを、4行目では上位アドレスを設定しています。6行目のRET命令を実行することによって、7，8行目のジャンプテーブルへ分岐し、さらにそこに記述された分岐先へジャンプします。

このような手法を「テーブルジャンプ」といい、条件によって複数のアドレスへ分岐する場合に有効です。

#### 例3

>     A0:	LD	070H
>     	ROL
>     	ADD	#LOW(A1)
>     	PUSH	ACC
>     	MOV	#HIGH(A1),ACC
>     	PUSH	ACC
>     	RET
>     ;
>     	ORG	0C00H
>     A1:	JMP	B00	     ジャンプテーブル
>     		↓
>     	JMP	B7F
>     ;
>     B00:	XXXXXX

#### 22-1-12　RAMと特殊機能レジスタ（SFR）のアドレッシング

#### d9（直接アドレッシング）

d8〜d0の9ビットによりRAMまたはSFRを直接指定します。

アドレス　000H〜0FFH　……　RAMを指定します。
アドレス　100H〜1FFH　……　SFRを指定します。

#### b3（ビットアドレッシング）

ビット操作命令（SET1，CLR1，NOT1）とBP，BPC，BN命令ではd9（直接アドレッシング）と合わせて、3ビットのビットアドレッシングデータを使用し、RAMまたはSFRの特定のビットを指定します。

#### ＠Rj（間接アドレッシング）

間接アドレッシングとは、特定のRAMに、実際にアクセスするRAMまたはSFRのアドレスをあらかじめ設定しておき、その特定のRAMをアクセスすることによってRAMまたはSFRを指定することです。

間接アドレッシングについては『ビジュアルメモリハードウェアマニュアル』もあわせてご覧ください。

この特定のRAMを間接アドレスレジスタといい、＠R0，＠R1，＠R2，＠R3で表します。間接アドレスレジスタは、2ビットの間接アドレッシングデータ（j1，j0）を指定することにより＠R0〜＠R3のうち1つが使用されます。

各RAMバンクの先頭16バイト（00H〜0FH）には、次の表のとおりに4つの間接アドレスレジスタ群（バンク）が割り付けられています。このRAMバンクはRAMBK0（PSWのビット1）で設定します。また、間接アドレスレジスタのバンクはIRBK1，0（PSWのビット4，3）で設定します。

なお、間接アドレッシング命令実行時には、間接アドレスレジスタや間接アドレスレジスタで指定されるRAMとして、IRBK1，0とRAMBK0で設定されているRAMバンク上のRAMが使用されます。リセット時は、IRBK0，1共に’0’となり、またRAMBK0も’0’となるので、＠R0，＠R1，＠R2，＠R3の絶対アドレスはそれぞれRAMバンク0の00H，01H，02H，03Hになります。

間接アドレスレジスタ　……………………　＠R3　　＠R2　　＠R1　　＠R0
間接アドレッシングデータ（j1、j0）　…（11） （10）　（01）　（00）
間接アドレッシング レジスタ マップ

#### 間接アドレッシングの使用例

間接アドレスレジスタを用いた演算例です。

例1では、2行目でRAM（アドレス00H）にイミディエイトデータ68Hをセットしています。ここで間接アドレスレジスタとしてRAM（アドレス00H）を用いると、RAM（アドレス68H）がアクセスされます。たとえば、3行目では間接アドレスレジスタ（＠R0）で指定されるRAM（アドレス68H）にイミディエイトデータ10Hをセットしています。

また、5行目では間接アドレスレジスタ（＠R0）で指定されるRAM（アドレス68H）とアキュムレータ（ACC）を加算しています。

#### 例1

>     MOV	#055H,ACC
>     MOV	#068H,00H
>     MOV	#010H,@R0
>     ADD	#015H
>     ADD	@R0

次に、間接アドレッシングでSFRを指定した例を示します。

例2では1，2行目でPSWのビット4，3をクリアして、RAM00H〜03Hを間接アドレスレジスタとして使えるように設定しています。4行目ではRAM02Hにイミディエイトデータ02Hをセットします。ここで間接アドレスレジスタとしてRAM（アドレス02H）を用いると、RAM（アドレス02H）がアクセスされます。たとえば、5行目では間接アドレスレジスタ（＠R2）で指定されるSFR（アドレス02H：Bレジスタ）にイミディエイトデータ12Hをセットしています。また、6行目では間接アドレッシングされたBレジスタをインクリメントしています。

#### 例2

>     CLR1	PSW,4
>     CLR1	PSW,3
>     MOV	#0ACH,ACC
>     MOV	#002H,02H
>     MOV	#012H,@R2
>     INC	@R2

次に、PSWでバンクを換えて、間接アドレッシングでSFRを指定した例を示します。

例3では1，2行目でPSWのバンクを2にセットして、RAM08H〜0BHを間接アドレスレジスタとして使えるように設定しています。4行目では、RAM0BHにイミディエイトデータ02Hをセットします。ここで間接アドレスレジスタとしてRAM（アドレス0BH）を用いると、RAM（アドレス02H）がアクセスされます。たとえば、5行目では間接アドレスレジスタ（＠R2）で指定されるSFR（アドレス02H：Bレジスタ）にイミディエイトデータ12Hをセットしています。また、6行目では間接アドレッシングされたBレジスタをインクリメントしています。

#### 例3

>     SET1	PSW,4
>     CLR1	PSW,3
>     MOV	#0ACH,ACC
>     MOV	#002H,0BH
>     MOV	#012H,@R2
>     INC	@R2

[←] | [INDEX] | [→]