第22章 LC86K命令概要 |
ここでは、個々の命令を説明する前に、フラグの動作、アドレッシングについてを説明します。
算術演算命令は、アキュムレータを中心とした四則演算、インクリメント、またはデクリメントを行う命令です。四則演算の結果により、次のようにCY,AC,OVが設定されます。
論理演算命令は、論理演算やローテートを行う命令です。RORC、ROLC命令実行時にはCYも影響を受けます。
データ転送命令は、RAM、特殊機能レジスタ(SFR)へのデータの書き込み、読み込み、データの退避または交換を行います。
条件分岐命令は、命令が指定する条件が満たされている(真)か、いない(偽)かを判定し、真ならば目的の番地へ分岐します。偽ならば分岐は行われず、次の命令の実行に移ります。
BE,BNE命令は、8ビットデータどうしの比較によって分岐する命令で、比較結果により次のようにCYをセットまたはリセットします。
サブルーチン命令は、目的の命令に制御を移すための無条件分岐を行います。分岐後、復帰命令(RET、RETI)によってCALL命令に続く命令に制御を戻すために、スタックにアドレスを格納します。スタックはRAMにあり、スタックポインタ(SP)によって指定します。サブルーチンのネスティングレベルに応じてスタックに使用するRAM領域を確保しておく必要があります。
![]() ビジュアルメモリのスタックは、RAMのバンク0に確保されます。また、アプリケーション起動時にシステムBIOSが、7FHに設定します。POP命令を実行すると、SPが+1された後データがストアされますので、実データは80H以降に格納されます。また、スタックは、7FHから0FFHへと上位へ向って消費されます。 内蔵時計機能もスタックを20バイト消費します。 |
ビット操作命令は、指定したRAMまたは特殊機能レジスタ(SFR)の内容をビット単位で操作する命令です。
専用の標準マクロ命令です。ROM内システムBIOSとフラッシュメモリのアプリケーションプログラムの実行を切り換えます。
フラッシュメモリやRAM、特殊機能レジスタ(SFR)のアドレッシングには、いくつかの方法があります。
ジャンプ命令や分岐命令、サブルーチン命令では、ジャンプ(分岐)先のプログラムROMのアドレスを命令コードで指定します。この場合、次のアドレッシングによってアドレスが指定されます。
現在実行中の次の命令の先頭番地を中心として、−128〜+127番地のアドレスの範囲内にジャンプ(分岐)が可能です。符号付きの8ビットデータで表されます。
[80H〜7FH:−128〜+127]
64Kバイトのフラッシュメモリ空間内のどこにでもジャンプが可能です。符号なしの16ビットデータで表されます。
[0000H〜FFFFH:+0〜+65535]
現在実行中の次の命令の先頭番地[PC15〜PC00]のPC15〜PC12(カレントページ)をそのままに、PC11〜PC00を12ビットのアドレッシングデータ[000H〜FFFH]で置き換えます。ページ(PC15〜PC12)内のジャンプが可能です。
![]() JMP命令、CALL命令がページの最終部分にある場合は、カレントページが変わるので注意が必要です。 |
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命令を用います。
MOV #09H,SP MOV #13H,07H MOV #0CH,08H RET
MOV #13H,ACC PUSH ACC MOV #0CH,ACC PUSH ACC RET
例3は、RAM70Hのデータによって00H〜7FHまで(128とおり)の分岐を行なっています。
1,2行目で分岐先の下位アドレスを、4行目では上位アドレスを設定しています。6行目のRET命令を実行することによって、7,8行目のジャンプテーブルへ分岐し、さらにそこに記述された分岐先へジャンプします。
このような手法を「テーブルジャンプ」といい、条件によって複数のアドレスへ分岐する場合に有効です。
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
d8〜d0の9ビットによりRAMまたはSFRを直接指定します。
ビット操作命令(SET1,CLR1,NOT1)とBP,BPC,BN命令ではd9(直接アドレッシング)と合わせて、3ビットのビットアドレッシングデータを使用し、RAMまたはSFRの特定のビットを指定します。
間接アドレッシングとは、特定の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になります。
間接アドレスレジスタを用いた演算例です。
例1では、2行目でRAM(アドレス00H)にイミディエイトデータ68Hをセットしています。ここで間接アドレスレジスタとしてRAM(アドレス00H)を用いると、RAM(アドレス68H)がアクセスされます。たとえば、3行目では間接アドレスレジスタ(@R0)で指定されるRAM(アドレス68H)にイミディエイトデータ10Hをセットしています。
また、5行目では間接アドレスレジスタ(@R0)で指定されるRAM(アドレス68H)とアキュムレータ(ACC)を加算しています。
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レジスタをインクリメントしています。
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レジスタをインクリメントしています。