古川制御日記

佐賀県武雄市の組み込み開発屋ブログ

CC-RXのBIT操作の挙動

#include "platform.h" // for PORTF

// 引数をそのままBITフィールド値にセットする方法
void dio_F5_set(int x) {
    PORTF.PODR.BIT.B5 = x;
    /* 一回読み出してORして書き戻すので排他が必要
       MOV.L #000000DFH, R15
       MOV.L #0008C02FH, R14
       AND [R14].UB, R15
       SHLL #05H, R1
       AND #20H, R1
       OR R1, R15
       MOV.B R15, [R14]
       RTS*/
}

// 定数1をBITフィールドにセットする方法
static inline void dio_F5_ON(void) {
    PORTF.PODR.BIT.B5 = 1;
    /* 定数を代入する分にはBSET命令に展開される。
       MOV.L #0008C02FH, R14
       BSET #05H, [R14].B
       RTS
    */
}

// 定数0をBITフィールドにセットする方法
static inline void dio_F5_OFF(void) {
    PORTF.PODR.BIT.B5 = 0;
    /* 定数を代入する分にはBCLRに展開される
       MOV.L #0008C02FH, R14
       BCLR #05H, [R14].B
       RTS
   */
}

// 引数で事前に条件分岐して定数を書く方法
void dio_F5_set2(int x) {
    if (x) {
        PORTF.PODR.BIT.B5 = 1;
    } else {
        PORTF.PODR.BIT.B5 = 0;
    }
    /*
       これならBSET,BCLRが呼ばれるため排他不要で使い勝手が良さそう
       CMP #00H, R1
       MOV.L #0008C02FH, R14
       BNE L356
L355:  ; if_else_bb
       BCLR #05H, [R14].B
       RTS
L356:  ; if_then_bb
       BSET #05H, [R14].B
       RTS

   */
}

void dio_F5_set3(int x) {
    if (x) {
        dio_F5_ON();
    } else {
        dio_F5_OFF();
    }
}