3.3 ビット・アクセス

CC-RLは,CA78K0Rのビット・アクセス(SFR及びsaddr変数に対して,ピリオドに続けてビット位置を指定する形式)に対応していません。CcnvCA78K0Rでは,SFR及びsaddr変数に対するビット・アクセスを,ビットフィールドの型宣言とマクロで置き換えます。

 

-

ファイル先頭に型宣言およびマクロを出力し,アクセス箇所では,マクロ呼び出しに変更します。

-

ビット・アクセスでは,ビット位置に応じて8,16ビットのビットフィールドを作成します。ビット位置が8〜15を含む場合は,b8〜b15を追加したビットフィールドを,16ビット用として別途作成します。

 

[例]

-

ビット位置が0〜7のみの場合

変換前

void func(void)
{
  i = var.3;
  var.5 = 0;
}

変換後

#ifndef __BIT8
typedef struct {
  unsigned int b0:1;
  unsigned int b1:1;
  unsigned int b2:1;
  unsigned int b3:1;
  unsigned int b4:1;
  unsigned int b5:1;
  unsigned int b6:1;
  unsigned int b7:1;
} __Bits8;
#define __BIT8(name,bit) (((volatile __near __Bits8*)&name)->b##bit)
#endif
 
void func(void)
{
  i = __BIT8(var,3);
  __BIT8(var,5) = 0;
}

 

-

ビット位置が8〜15を含む場合

変換前

void func(void)
{
  i = var2.10;
  var2.12 = 0;
}

変換後

#ifndef __BIT16
  typedef struct {
  unsigned int b0:1;
  unsigned int b1:1;
  unsigned int b2:1;
  unsigned int b3:1;
  unsigned int b4:1;
  unsigned int b5:1;
  unsigned int b6:1;
  unsigned int b7:1;
  unsigned int b8:1;
  unsigned int b9:1;
  unsigned int b10:1;
  unsigned int b11:1;
  unsigned int b12:1;
  unsigned int b13:1;
  unsigned int b14:1;
  unsigned int b15:1;
} __Bits16;
#define __BIT16(name,bit) (((volatile __near __Bits16*)&name)->b##bit)
#endif
 
void func(void)
{
  i = __BIT16(var2,10);
  __BIT16(var2,12) = 0;
}