ワンポイントテクニック No.024(投稿:ミッピュ) G800シリーズ対応

BASICでPUSH、POPを使う


機械語にはPUSH,POPという命令があります。
PUSHはスタックエリア内にデーターを上積みしていくような命令で、POPはその逆で上から取り出していくような命令です。
これは機械語のプログラムを組むときにはとても重宝するものですが、こんな便利なものをBASICで使わないなんてなんとももったいない話しです。
そうは言ってもそんな命令なんてBASIC言語にはありません。
そこでこの働きをシミュレートしてみようというのが今回のテーマです。

こんな感じで使います。

REM /// MAIN ///

GOSUB *INIT
 :
A=☆
GOSUB *PUSH
 :
A=★
GOSUB *PUSH
 :
GOSUB *POP
X=A
 :
GOSUB *POP
Y=A
 :
END


REM /// SUB ///

*INIT
P=100:DIM S(Pー1)
RETURN

*PUSH
P=P-1:S(P)=A
RETURN

*POP
A=S(P):P=P+1
RETURN


変数Aの値をスタックエリアS(P)にPUSHして蓄えておき、必要な時にスタックエリアS(P)からPOPして取り出します。


実際の話、どんな時に使えるかと言いますと、、、
例えばゲーム。。。
『迷路』などで、今の場所をPUSHして記録をしながら進んで行き、POPをしながら来た道を戻って行く。という使い方があります。

今回は配列変数へ格納しましたが、POKE,PEEKを使用して格納場所をメモリにしても良いでしょうし、文字変数にしても良いと思います。
また、機械語と同様、スタックポインタPを直接操作することも可能です。

この使い方をマスターすれば、機械語を始めた際、すぐに応用が利かせられると思いますからぜひ皆さんも試してみてね!


(補足:御茶目菜子)
 私はBASICでゲームを作る場合、いかに処理速度を上げるかとかいかにメモリ節約をするかという二択で作っているためにマシン語への移植性は一切考慮してないのですが、このような方法を使えば移植も楽になるのでいいかもしれませんね。


RETURN

inserted by FC2 system