落としてみましたが、ちょっと難解で修正するところまでいけませんでした。
とりあえず、一行に命令を書きすぎてるので分割した方がいいと思います。
IF BGGET()!=0 or BGGET()!=0 THEN
みたいのは
CH0=BGGET()
CH1=BGGET()
IF CH0!=0 or CH1!=0 THEN
にする等です。
壁との判定がキャラの1ドット外で行われているようですが、動いているときも止まっているときも同じ判定で行われているようです。
移動した時に壁に埋まっていたら元の場所に戻す、もしくは壁に埋まらないギリギリの位置を探すと言う風に処理する必要があります。
ループ開始時の座標とキー取得後の座標に違いが出たら判定するという処理の方がいいかもと思いました。