H8 マイコン技術メモ |
拡張命令「EXTU」の使い方 |
U_DATAX番地の4バイトデータにU_DATAY番地の1バイトデータを加算し、結果をRESULTの4バイトに格納する。但し、データは符号なし2進数とする。 |
<説明> サイズの異なるデータを加算する場合、サイズを揃える操作が必要になります。つまり、バイトサイズのデータをロングワードサイズのデータに拡げる操作が必要です。符号なしデータの場合、この操作はEXTU命令で行います。 EXTU命令をワードサイズで使用すると、バイトサイズのデータをワードサイズに符号なしデータとして拡張できます。 EXTU.W Rd EXTU命令をロングワードサイズで使用すると、ワードサイズのデータをロングワードサイズに符号なしデータとして拡張できます。 EXTU.L ERd |
拡張命令「EXTS」の使い方 |
S_DATAX番地の4バイトデータにS_DATAY番地の1バイトデータを加算し、結果をRESULTの4バイトに格納する。但し、データは符号付き2進数とする。 |
<説明> サイズの異なるデータを加算する場合、サイズを揃える操作が必要になります。つまり、バイトサイズのデータをロングワードサイズのデータに拡げる操作が必要です。符号付きデータの場合、この操作はEXTS命令で行います。 EXTS命令をワードサイズで使用すると、バイトサイズのデータをワードサイズに符号付きデータとして拡張できます。 EXTS.W Rd EXTS命令をロングワードサイズで使用すると、ワードサイズのデータをロングワードサイズに符号付きデータとして拡張できます。 EXTS.L ERd |
ビット操作命令の使い方(その1) |
B_DATA番地の下位4ビットの値が、B'1100の場合はB_DATA番地の最上位ビットを'1'し、B'1100以外の場合は'0'にする。(B'は2進表示を表す)。 |
<説明> (1)複数ビットの同時判定は、AND命令とCMP命令を組み合わせて行ないます。下位4ビットの値が、B'1100か否かを判定する場合の書き方は、次の通りです。 AND #H'0F,Rd CMP.B #H'0C,Rd Bcc* シンボル 注)Bccのccには分岐条件を記述します。 ★CMP命令はバイトサイズ又はワードサイズです。そこで、判定対象外のビットがどんな値でもいいように、判定するビットだけを'1'としたイミディエイトデータとANDをとって、判定したいビットだけを取り出します。 ★CMP命令により、該当の値と等しいか否かを判断します。 ★BEQ命令又はBNE命令により条件分岐します。 (2)特定ビットのオン、オフはBSET命令、BCLR命令を使用します。命令の書き方は次の通りです。 BSET #xx:3,<EAd> BCLR #xx:3,<EAd> BSET命令等のビット操作命令では、操作対象のビットをビット番号(0〜7)で指定します。 |
ビット操作命令の使い方(その2) |
B_DATA番地の下位2ビットの値がB'01又はB'10の場合は、B_DATA番地の最上位ビットを'1'し、それ以外の場合は'0'にする。 |
<説明> B'01又はB'10を判定するのは、「同サンプルプログラム:CPU_5.SRC」を応用して2回判定を繰り返せば行なえます。しかし、H8/300Hシリーズの強力なビット操作命令を使えば、CMP命令を使わずに判定することができます。 この場合は、BLD命令とBXOR命令を使って判断します。 BLD #xx:3,<EAd> BXOR #xx:3,<EAd> Bcc シンボル (2)2つのデータの論理演算は次の通りです。 演算ビットの組合せ 結 果 A B AND命令 OR命令 XOR命令 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 両ビットのXORを取れば、B'01とB'10の場合に結果が'1'となります。 (3)BLD命令で、どちらかのビットをCCRのC(キャリフラグ)に転送します。 (4)BXOR命令で、他方のビットをCCRのCとXORを取りながらCCRのCに転送します。この結果CCRのCは、B'01とB'10の場合にのみ'1'となっています。従って、後はBCC命令又はBCS命令で条件分岐ができます。 |
システム制御命令「STC」、「LDC」の使い方 |
B_DATA番地の下位2ビットの値がB'01又はB'10の場合は、B_DATA番地の最上位ビットを'1'し、それ以外の場合は'0'にする。但し、システム制御命令のSTC命令、LDC命令を使って行う。 |
<説明> (1)Bcc命令の中には、CCRのN(ネガティブフラグ)とV(オーバフローフラグ)のXORをとって条件分岐を行うものがあります。 ニーモニック 機 能 条件分岐 BGE Greater or Equal N XOR V=0 BLT Less Than N XOR V=1 従って、CCRのNとVに判定したいビットを転送すれば、上記の命令で条件分岐が行えます。 (2)CCRのレジスタへの転送はSTC命令を使います。書き方は次の通りです。 STC CCR,Rd デスティネーション・オペランドには、バイトサイズの汎用レジスタを指定します。 (3)CCRへのデータライトはLDC命令を使います。書き方は次の通りです。 LDC #xx:8,CCR LDC Rs,CCR LDC命令では、イミディエイトデータと汎用レジスタの内容を転送することができます。ただし、転送できるサイズはバイトサイズなので、8ビットのイミディエイトデータか、バイトサイズの汎用レジスタを指定します。 |
システム制御命令「ORC」、「ANDC」の使い方 |
B_DATA番地の下位2ビットの値がB'01又はB'10の場合は、CCRのU(ユーザビット:ビット4)を'1'し、それ以外の場合はCCRのUを'0'にする。なお、CCRのC以外のビットは変更しないものとする。 |
<説明> (1)U等のCCR中の特定ビットのオン、オフを行うには、ORC命令やANDC命令を使います。 (2)CCR中の特定ビットのオンはORC命令を使います。ORC命令の書き方と動作は、OR命令と変わりありません。対象のレジスタがCCRに変わるだけです。以下に書き方を示します。 ORC #xx:8,CCR ORC Rs,CCR ソース・オペランドには、8ビットのイミディエイトデータかバイトサイズの汎用レジスタを書くことができます。 (3)CCR中の特定ビットのオフはANDC命令を使います。ANDC命令の書き方と動作は、AND命令と変わりありません。対象のレジスタがCCRに変わるだけです。以下に書き方を示します。 ANDC #xx:8,CCR ANDC Rs,CCR ソース・オペランドには、8ビットのイミディエイトデータかバイトサイズの汎用レジスタを書くことができます。 |
バッファコピー&データ転送命令 |
EEPMOV命令を使わないで、指定したバイト数だけバッファのコピーを行なうサブルーチンを作成する。コピー元バッファの先頭アドレス、コピー先バッファの先頭アドレス及びバイト数は、メインルーチンより、ER0、ER1、R2Hレジスタに設定して渡すものとする。 |
<説明> (1)EEPMOV命令を使わないで、バッファのコピーを行なうには次の作業が必要です。 ★コピー元バッファの内容をレジスタに転送する。 ★レジスタからコピー先のバッファに転送する。 ★コピー元バッファのアドレスを示すレジスタをインクリメントする。 ★コピー先バッファのアドレスを示すレジスタをインクリメントする。 このうち、「レジスタのインクリメント」と「レジスタからバッファへの転送」の作業はポストインクリメントレジスタ間接(@ERn+)を使用すれば、1つの命令で行なうことができます。しかし、このアドレッシングモードはソース・オペランドにしか使用できないため、「コピー先バッファのアドレスレジスタのインクリメント」と「レジスタからコピー先のバッファへの転送」の作業は別命令で行ないます。 従って、バッファのコピー作業は次のようになります。 MOV.B @ER0+,R2L ER0:コピー元のバッファアドレスを示す MOV.B R2L,@ER1 ER1:コピー先のバッファアドレスを示す ADDS #1,ER1 R2L:コピー作業用のワークレジスタ (2)ループの制御はDEC命令、INC命令を使うと簡単にできます。DEC命令の場合、指定した汎用レジスタの内容を"1"減算し、結果を汎用レジスタに格納します。この時、CCRのN、Z、Vの各フラグは減算した結果に伴って変化します。 従って、ループカウンタが"0"になった時点で終了するループのときは次のように書きます。 シンボル名: バッファコピー処理 DEC.B R2H BNE シンボル名 R2H:ループカウンタ用のレジスタ |
バイナリー → ASCII変換 |
1バイトのバイナリーデータを2バイトのASCIIデータに変換するサブルーチンを作成する。 バイナリーデータはメインルーチンがR0Lレジスタでサブルーチンに渡し、変換後のASCIIデータはR0レジスタでメインルーチンに返すものとする。 |
<説明> バイナリーからASCIIへの変換は、ASCIIテーブルを用いて変換を行なうと簡単にできます。 (1)0〜9、A〜FまでのASCIIコードが連続して設定されたASCIIコードテーブル(ASCTBL)を用意します。 (2)変換を行なう場合は、元のバイナリーデータ(4ビット)をデスプレースメントとし、ASCIIテーブル先頭アドレス+バイナリーデータが示すメモリの内容を値とします。 バイナリーデータで H'0000000A がER0レジスタに設定されているとして、次の命令を実行すると、 MOV.B @(ASCTBL,ER0),R1H R1HレジスタにはASCIIテーブルを参照してASCIIコードの'A'(H'41)が入ります。 |