投稿日: Mar 13, 2017 4:36:2 PM
プロトタイプ宣言をしたくないばかりにマクロで済ませてきましたがさすがにちょっとパリティ算出をマクロにするとバイナリサイズにも影響してきそうなのでしぶしぶプロトタイプ宣言しました。ファンクション追加、getParity。
一行書くだけなんだから面倒くさがるなって感じですけども。
unsigned char cpu::getParity(unsigned short value){ value ^= value >> 4; value ^= value >> 2; value ^= value >> 1; return value & 0x01; }
こんな感じで。
1が立っているビットの数が偶数なら0がかえるので、ADDの
if( buf % 2 == 0 ) r_f |= ( 1 << p_bit );
これを
if(getParity(buf) == 0) r_f |= ( 1 << p_bit );
こう書き換えてやって無事終了。多分。
よし、次こそは残りの7命令をいっきにやっちゃうわよ!
#ところでフラグのリセットタイミングっていつなんだろう…。
おかしいな、睡眠時間がどんどん減って行くよ?
パリティの算出について知ったことがあるというか、gccのビルトインファンクションっていうのがあって、上のコードは
return __builtin_parity(value);
これだけで済むんですね。
なんてことでしょう。
RPiでコーディングしていて、RPi上で動作させているのでマイコンで動かなきゃ意味が無いavrgccとかでは対応してるの?って試したら対応してるようです。 なんという便利な。
ほかにもビルトインファンクションはあれこれあって、avrgccの場合だと更にavr向けのファンクションなんかもあるようです。みんながやってる__asm__("nop");なんてのもnopを呼ぶためのファンクションを使えばわかりやすく置き換えられるし…。 まだまだ知らないことがたくさんあるなあ。
フラグのリセットタイミングはフラグ走査時なんだろうなーっていうぼやけた実感に基づいて、そんなことも反映したADDのコードがこちら。
三項演算はいろいろと言う人が居る為あまり使わないようにしていたのだけど、よくよく調べてみるとそんな言うほど悪いもんじゃないじゃん? ってことで使うことにしてみた。
このケースだといまいちだけど、まあ、わるいもんじゃないってことで(たいせつなことなのd