うぎゃー
触りだしたら止まらない、というか前々から気持ち悪かったのを「動いているものに触るな」と理性で押さえ込んでいたので、堰を切ったように変更してしまいました。とはいっても start.asm と cpu_support.asm は場所が場所だけに触るのも恐る恐るです。動作確認をしながらの変更です。当たり前か。
今日手を入れたのは両ファイルの即値ロード命令です。現在Blacfkinのアセンブラでは32ビット定数のロードは次のようにすることを推奨しています。
r0.H = hi( const ); r0.L = lo( const );
これはconstがラベルだろうが静式だろうが使える便利な方法です。以前の
r0.H = label; r0.L = label;
は便利ですしまだ対応していますが、静式の場合に使えないのが難点で、次のようにせざるを得ませんでした。
r0.H = ( const >> 16) & 0xFFFF; r0.L = const &0xFFFF;
この書き方は妙に黒魔術的で読む人にストレスを与えます。ですので、最初に紹介したhi(), lo()式が読みやすく便利、ということなのですが私のような粗忽者は編集中にあわてて次のようなプログラムを作ることがままあります。
r0.H = hi( const ); r0.L = hi( const );
で、謎の例外が発生して頭を抱える、と。
そこで国家百年の計*1のために32bit即値マクロの導入を行いました。
#define LOAD( reg, value ) reg##.h = hi( value ); reg##.l = lo( value );
使い方は簡単です。
LOAD( r0, const )
マクロは可読性を下げますのでちょっと良くないのですが、バグの入り込みを抑える効果が高いので良しとしました。本当はアセンブラが
r0 = const;
という32bitマクロ命令をでっち上げてくれればいいんですけどね。実際にこう書くと16bit値がロードされます。
*1:どの国家?