2.6からの新規命令
HSP2.55では分岐とジャンプは別々の処理でした(if命令で分岐しgoto,gosub命令でジャンプ)。
2.6ではこれらの処理を一命令で済ますことができるようになりました。
前々章に説明したマクロを目的としたexgoto命令も分岐とジャンプが混じったモノになると思いますが、
on命令と言うのが新たに作られた命令です。
このon命令の書式は「on p1 goto(gosub) ラベル0,ラベル1,ラベル2,…」となっています。
分岐した処理が同じような処理で命令のパラメータを変更するだけでいけるようなものはいいですが、
分岐後の処理が全く違うものの違う場合if,goto命令等で指定個数分分岐を用意しなければなりません。
			 :
	if flg = 0 : goto *process_zero
	if flg = 1 : goto *process_one
	if flg = 2 : goto *process_two
			 :
今までこうしていた処理を下記のようにも書けるようになったわけです。
			 :
	on flg goto *process_zero, *process_one, *process_two
			 :
p1の値が0の時はラベル0に、1の時はラベル1に、nの時はラベルnに飛ぶようになっています。 p1の値がマイナス値や値に対応するラベルがない時はエラーとはならずにon命令の次の処理から再開します。 また書式にあるようにジャンプはgotoだけでなくgosubのサブルーチンにすることもできます。 ただp1が●の場合はgotoで、▲の場合はgosubと言うような使い方はできません。 何分岐くらい出来るのか実験してみましたが、150分岐くらい試して辞めました。 限界があるのか謎だし、そこまで分岐する人もいないだろうと言うことで辞めたわけです。 on命令を使用しなくても2.55までif分岐でOKなので無理して使う必要ありません。 on命令は終わりとして、メモリデータを擬似的にファイルとして扱うメモリストリーム機能を紹介します。 使用する画像等を実行ファイルと共に出来ないのだが見られるのが嫌だと言う場合に暗号化しておき、 読み込み時にきちんとした画像に展開するといったことや、 独自のアーカイブを使用したいと言った場合にこの機能を使用します。 このメモリストリーム機能はmemfile命令によってどの変数に読み込むかを設定します。 書式は「memfile 読み込む変数,オフセット,読み出すサイズ」です。 まず使用するファイルをbload,noteload命令で変数に読み込みます。 次に読み込んだ変数をmemfile命令でストリーム設定します。 最後に例えば画像として表示させるには「picload MEM:xxx.bmp」とすればOK。 memfileで指定するサイズに0または省略をすると変数のサイズ分をストリーム対象とします。 オフセットとは今まであったのと同じ読み出し開始位置のことですね。省略で初めから読み込みます。 picload命令を書くときの注意ですが、xxxはなんでも構いません。 しかし拡張子は実際の拡張子と合わせてください。元々がJPGならabc.jpgといった感じに…。 コレが一致しないとエラーも出ずに落ちてしまうようです。 また、メモリストリームのオフセットが間違ってしまうと、 ファイルヘッダで正しいファイルかをチェックしているBMPやJPG等不正ファイルとして開けません。 当然終了位置もきちんとしていないと読み込むことが出来ても最後まできちんと表示されません。 暗号化したサンプルを示そうとしましたがうまくいかなかったので。 通常のファイルをメモリストリーム機能を使って利用する例を示します…。 画像はcharacter.bmpを利用したいと思います。
	file = "character.bmp"
	exist file
	size = strsize
	sdim buf, size + 1 // EOF分1バイト足す
	bload file, buf
	memfile buf
	picload "MEM:dummyname.bmp" // BMP以外だと表示できずに落ちる
	stop
サンプルのように画像として表示させる(picloadの)必要がない場合、 つまり単にロードする(メモリに読み込む)だけの場合は 拡張子やオフセットが合わなくても大丈夫です。 標準命令にはストリーム名(MEM:xxx)で渡すことが出来ますが拡張命令には渡せませんのでご注意ください。 この章最後の命令getpath命令に移ります。 2.55時代にファイルのパスを取得する命令はありましたが、加工する命令はありませんでした。 やりたければせいぜいDLLを利用するか自分でモジュールを作るくらいです。 上級者には簡単にモジュールを作れることでしょうが使い始めて間もない人には酷な事ですね。 2.6で出現したgetpath命令を利用すれば簡単にパスを色々加工できるようになりました。 書式は「getpath 加工した文字列を代入する変数,取得元の文字列変数,タイプ」です。 タイプを0又は省略をすると取得文字列をそのままp1の加工後の変数に代入します。 1で拡張子までのファイル名を代入します。フルパス指定の場合はドライブ・フォルダ名も入ります。 2でファイルの拡張子「.」以下が入ります。以下ですので「.」も入りますよ。 8でフルパス指定でも最後にある「\」以降が入ります。 16でパス内に英字があれば小文字にして変数に入ります。 32でパスの最後にある「\」までのドライブ・フォルダ名が入ります。 このタイプは複数選択することが出来ます。 複数選択したい時は利用したいタイプのパラメータ値をすべて足します。 矛盾するような組み合わせ(フォルダのみ+フォルダ部分除去etc)はやめましょうね。 全部試したわけじゃないのですが1と2を併せるとエラーメッセージが出ますが他のは出ないようですね。 後、私の環境では1と32を併せると結果がおかしくなりました。
	sdim name, 256
	sdim getname, 256
	dim type, 6
	type = 0, 1, 2, 8, 16, 32
	dialog "", 16
	name = refstr
	repeat 6
		getpath getname, name, type.cnt
		mes getname
	loop
	stop