さらに前回の続き。
特定のビットに対して、値をセットする関数を作る。こっちはちょっと面倒だった。
単純に考えると、特定のビットだけを0にして、そのビットとの和(OR)を取ればいいと思った。
まず、取得と同じ要領でマスクを作って、全ビットを反転。反転したマスクと元の値でANDを取る。
そうすれば、セットするビットだけを0にできそう。そして設定値とのORを取る。
と、書いては見たものの、結構処理が面倒w
んで、論理演算の偉い人に教えてもらって、割と楽に演算できた。
こんな感じ。
あとは、適当に値をセットすると、ビット数をオーバーする可能性があるので、limit関数で下限と上限を調整した。
これで、スプライトのESI_OPTIONの値を32ビット分使い分けできるようになった。
ま、32ビット目は符号フラグになるから、実質31ビットなわけだが、そこまでのビットは使わずに賄えた。
ソースにするとこんな感じ。
#defcfunc set_spOpt int p1,int p2,int p3 ;ESI_OPTIONに項目の値を設定するための関数 ;p1 ESI_OPTIONの現在の値 ;p2 OPTIONに設定する項目番号 ;p3 設定する値 ;項目定義(できるならモジュール変数にしたいのだが…) dim Optbit,5 ;各値のビット数 Optbit=3,3,3,1,3 dim Optbitpos,5 ;各値が右から何ビット目から始まるか Optbitpos=0,3,6,9,10 fun_ret=0 ;マスクパターンを生成する maskp=0 masknum=1 for i,0,Optbit(p2) maskp=maskp+masknum masknum=masknum*2 next ;設定する値がビット数の範囲内になるようにlimitで調整する fun_setnum=p3 fun_setnum=limit(p3,0,maskp) ;マスクを項目が始まるビット数まで左シフト maskp=maskp << Optbitpos(p2) ;設定値を項目が始まるビット数まで左シフト fun_setnum=fun_setnum << Optbitpos(p2) ;値を設定 ;前半の論理式でmaskpのビットを0にして、設定したい値とorを取る fun_ret=p1 & maskp ^ p1 | fun_setnum return fun_ret