>>591
結論はあってるけど途中経過がおかしい
C++やHSPでは0が偽、0以外は全て真と扱われる。
比較演算子は比較の結果が真のとき1を返すが、1以外の値でも0でなければ真。
HSPでは&も&&もandも全てビットごとの論理積なので、
keyが2でaが0の時、((Key&2) and (a=0))は、((2) and (1))になって最終的に0になるから偽。
ビットごとの論理積では( 真 & 真 )が必ずしも真にはならない。

バグの原因は数値をそのまま論理値として使ってるせいだから、↓のように一度比較演算子を通すといい
if ((key&1) != 0) and (a=0) : end
if ((key&2) != 0) and (a=0) : end