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