CC-RX向けの2進数リテラル表記もどきマクロを作ってみた(binary literal macro)

こんにちは。NoMaYです。

CC-RXで 0b10101010 のような表記が出来るようにするマクロが思い浮かんだので投稿しておきます。こんな感じで使います。(ネットのどこかに同じか同様のものがあるでしょうけれども、、、)

    val = B8_(0b10101010);
    val = B4_(0b1010);

以下、ソースです。

sim_rx130_bin_number.c

3005.sim_rx130_bin_number.c.20200824.txt
#include <stdint.h>
#include <machine.h>

#define B_Helper(bin, bit) (((0x##bin) >> ((4 * (bit)) - (bit))) & (1 << (bit)))
#define B4_(bin) (\
    B_Helper(bin, 0) |\
    B_Helper(bin, 1) |\
    B_Helper(bin, 2) |\
    B_Helper(bin, 3) )
#define B8_(bin) (\
    B_Helper(bin, 0) |\
    B_Helper(bin, 1) |\
    B_Helper(bin, 2) |\
    B_Helper(bin, 3) |\
    B_Helper(bin, 4) |\
    B_Helper(bin, 5) |\
    B_Helper(bin, 6) |\
    B_Helper(bin, 7) )

uint32_t val;

void main(void)
{
    val = B4_(0b0000);
    nop();
    val = B4_(0b0001);
    nop();
    val = B4_(0b0101);
    nop();
    val = B4_(0b1010);
    nop();
    val = B4_(0b1110);
    nop();
    val = B4_(0b1111);
    nop();

    val = B8_(0b00000000);
    nop();
    val = B8_(0b00000001);
    nop();
    val = B8_(0b01010101);
    nop();
    val = B8_(0b10101010);
    nop();
    val = B8_(0b11111110);
    nop();
    val = B8_(0b11111111);
    nop();
}


以下、デバッグ中のCS+の画面コピーです。



[関連リンク]

関連というか1つ目のスレッドでぼんやりとイメージが浮かび2つ目のスレッドで確定/デバッグです。(ネットのどこかに同じか同様のものがあるでしょうけれども、、、)

C++でビルドエラー「E0520018:Expected a ")"」「E0520020:Identifier "__func__" is undefined」(RX231/CS+(CC-RX)/北斗電子製評価ボード)
japan.renesasrulz.com/cafe_rene/f/forum5/6196/c-e0520018-expected-a-e0520020-identifier-__func__-is-undefined-rx231-cs-cc-rx/34249#34249

H8/3694からRX130への移行
japan.renesasrulz.com/cafe_rene/f/002-2095199602/6376/h8-3694-rx130/36356#36356
 

  • こんにちは。NoMaYです。

    もっと早くに気付けば良かったのですが、このマクロは16bit長では使えないですね。でも、16bit長までなら、以下のようにすれば使えます。ですが、32bit長は無理ですね。

    16bit長までなら

    #define B_Helper(bin, bit) ((((uint64_t)0x##bin) >> ((4 * (bit)) - (bit))) & (1 << (bit)))
    #define B16_(bin) (\
        B_Helper(bin, 0) |\
        B_Helper(bin, 1) |\
        B_Helper(bin, 2) |\
        B_Helper(bin, 3) |\
        B_Helper(bin, 4) |\
        B_Helper(bin, 5) |\
        B_Helper(bin, 6) |\
        B_Helper(bin, 7) |\
        B_Helper(bin, 8) |\
        B_Helper(bin, 9) |\
        B_Helper(bin, 10) |\
        B_Helper(bin, 11) |\
        B_Helper(bin, 12) |\
        B_Helper(bin, 13) |\
        B_Helper(bin, 14) |\
        B_Helper(bin, 15) )

        val = B16_(0000000000000000);
        val = B16_(0000000000000001);
        val = B16_(0101010101010101);
        val = B16_(1010101010101010);
        val = B16_(1111111111111110);
        val = B16_(1111111111111111);