return_plus命令を考案自作してみた。
returnが色々戻れるようになったのでその機能を使ってdouble_returnを実装したのを見て、もっと汎用的にreturn_plus命令を考えてみた。
命令
- return_plus
- 引数に1以上の数値を指定し、その数値と同じだけgosubのスタックを抜ける。return_plus 1 は 通常のreturnと同じ効果を発揮する。
- return_plus2
- return_plusに加え、第二引数にラベルを指定し、スタックを抜けた後、そのラベルに飛ぶ。
どちらも数値が1未満であれば、何もせずに処理を返しreturn_plusの次の行へ進むので、注意が必要。
Aパート
define節game以上
numalias return_count,xxx ; xxxに他と被らない数値を指定 defsub return_plus defsub return_plus2
Bパート
game以下start節以上
*return_plus mov $return_count,"" getparam %return_count goto *return_plus_common *return_plus2 getparam %return_count,$return_count goto *return_plus_common *return_plus_common if %return_count<1 return ; 指定数値が1未満なら、何もしない。 return *return_plus_main ; これで呼び出したルーチンと同じスタック深さになる。 *return_plus_main ; これがメインルーチン if %return_count>1 dec %return_count:return *return_plus_main ; %return_countが1になるまでreturnし続ける。 if $return_count="" return ; 指定ラベルがなければ、普通にreturnする。 return $return_count ; そうでなければ、指定ラベルにreturn