ユーザー定義命令のOUTはあくまで値を返すためのもので、それは関数内で設定してあげないといけないのです。 今だと関数内でPXとPYを使ったり返したりしてますが、それが初期化(設定)されてないのでおかしなことになってます。(ちなみに引数の変数名が関数外と同じでも関数とそれ以外の変数は別々の元のして扱われます) なので、この場合は、引数で受け取ったXとYを初期化に使えば良いので、11行目の位置で、 PX =X:PY=Y とすれば意図した動作になると思いますよ。 また呼び出し側もCALL命令を使わないでも、 P_MOVE PX,PY OUT PX,PY と書くだけで大丈夫です。CALLは呼び出す命令を文字変数で動的に変更するなどの特殊な用途以外ではあまり使わない命令じゃないかなって思います。