絵の具模様

H8 マイコン技術メモ


 拡張命令「EXTU」の使い方

拡張命令「EXTS」の使い方

ビット操作命令の使い方(その1)

ビット操作命令の使い方(その2)

システム制御命令「STC」、「LDC」の使い方

システム制御命令「ORC」、「ANDC」の使い方

 バッファコピー&データ転送命令

バイナリー → ASCII変換

拡張命令「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)が入ります。

画材道具戻る
絵の具模様