; ; HSP help manager用 HELPソースファイル ; (先頭が「;」の行はコメントとして処理されます) ; %type 内蔵命令 %ver 2.61 %note ver2.61標準命令 %date 2004/03/01 %author onitama %url http://www.onionsoft.net/ %index #define 新規マクロを登録する %group プリプロセッサ命令 %prm マクロ名 マクロ定義 %inst マクロ名で指定されたキーワードを指定された定義に置き換えられるようにプリプロセッサに登録をします。 #defineマクロは、あくまで個人がスクリプトを書きやすくカスタマイズしたい 場合に使うもので、初心者向きではありません。ここで説明した機能も、 頻繁に利用するものではありませんので、必要な場合にのみ参照してください。 #defineマクロは、基本的に置き換え文字列を登録します。 ^p 例: #define hyouji mes hyouji "AAAAA..." ↓(展開後) mes "AAAAA..." ^p #define、#const命令の直後に「global」を入れることで、すべてのモジュールで 永続的に利用することのできるマクロを作成することができます。 ^p 例: #module #define global test 0x1234 #global a=test ; aに0x1234が代入される ^p 通常は、モジュール内で#defineを定義した場合には、それ以外のモジュール およびグローバルなエリアでは、同じ名前は認識されません。 global指定を入れることで、それ以降のすべての場所で定義した名前を マクロで置き換えることができるようになります。 ^ 単純な置き換えマクロの他に、引数付きの展開が可能です。 引数は、マクロ名の後にカッコで囲んだ%1,%2,%3…の引数名で指定を 行ないます。 引数は必ず「%数値」で指定する必要があり、数値は1から順番に記述 してください。CやC++のプリプロセッサのようにシンボル名では指定 できないので注意してください。 ^p 例: #define hyouji(%1) mes "prm="+%1 hyouji "AAAAA..." ↓(展開後) mes "prm="+"AAAAA..." ^p また、引数に初期(デフォルト)値を設定することが可能です。 ^p 例: #define hyouji(%1="PRM=",%2=123) mes %1+%2 hyouji "AAA",a hyouji "BBB" hyouji ,b ↓(展開後) mes "AAA"+a mes "BBB"+123 mes "PRM="+b ^p 初期(デフォルト)値は、マクロを使用した時に省略された場合に 自動的に補完される値です。初期値を省略された場合は、補完されません。 マクロ引数の指定では#defineで指定する側では、カッコで囲んで いますが、実際に使用する時にはカッコなしで指定してください。 ^p #define hyouji(%1) mes "prm="+%1 hyouji("AAAAA...") ^p のような記述はエラーになるので注意してください。 ただし、ctypeオプションを使用することで以下のようなカッコ付き記述が 可能になります。 ^p #define ctype kansu(%1) %1*5+1 a=kansu(5) ^p このオプションは、計算式など命令部分以外にマクロを使用したい時に 有効です。一見、C言語などの関数のように振舞いますが、実際にはマクロで 置き換えているだけなので、応用範囲は狭いので注意してください。 この記述方法は、本来のHSP文法とは異なるため自分のスタイルで記述したい というカスタマイズ用途以外での利用は推奨していません。 ^ マクロの展開時に特殊な動作を行なうキーワードを設定することが可能です。 この特殊キーワードは、主にことなるマクロ間でパラメータを共有したり、 入れ子構造をスタックによって実現するためのものです。 ^p #define start(%1) %tstart %s1 mes "START" #define owari %tstart mes %o ^p ここで指定されている「%s1」や「%o」などが特殊展開マクロです。 これを使ったサンプルは、以下のように展開されます。 ^p start "OK" → mes "START" owari → mes "OK" ^p このように、異なるマクロ間でデータを共有させることが可能になります。 特殊展開マクロは、以下の種類と機能があります。 ^p マクロ 機能 -------------------------------------------------------- %t タグ名を設定する %n ユニークなラベル名を生成する %i ユニークなラベル名を生成してスタックに積む %o スタックに積まれた文字列を取り出す %p スタックに積まれた文字列を取り出す(スタック維持) %s 引数パラメーターをスタックに積む %c 改行を行なう ^p 特殊展開マクロは、「%」に続けて英文字1文字+パラメータで表現します。 以降のキーワードと識別するために、特殊展開マクロの後には半角スペースを 入れて下さい。「%tabc aaa」のようスペースを含む部分までが特殊展開マクロ と判断されます。 特殊展開マクロでは、一般的なスタック(First In Last Out)を持っています。 このスタックは、同じタグ名を持つマクロで共有させることができます。 タグ名は、「%tタグ名」のように「%t」に続けて半角英文字16字以内で指定 します。先の例では「%tstart」と指定された「start」がタグ名にあたります。 「%s」は、引数パラメーターをスタックに積むための特殊展開マクロです。 「%s1」と指定すると、「%1」のパラメータをスタックに1段積みます。 スタックに積まれた文字列を取り出す場合は、「%o」を使用します。 「%o」は、スタックに積まれた文字列を取り出して展開します。スタックなので、 最後に積まれたものが最初に取り出されます。「%o0」と指定すると、 スタックを取り出しますが文字列の展開は行ないません(スタック取り出しのみ)。 スタックを戻さずに内容だけを取り出すのが「%p」です。「%p0」は、次に 取り出されるスタックの内容を展開します。「%p1」は、もう一段深いスタック を取り出します。以降、「%p0」〜「%p9」までを指定することが可能です。 ラベル生成の例を以下に示します。 ^p #define start %tstart *%i #define owari %tstart await 20:stick a:if a=0 : goto *%o ^p これを使ったサンプルは、以下のように展開されます。 ^p start → *_start_0000 owari → await 20:stick a:if a=0 : goto *_start_0000 ^p 「%i」は、他と重ならないようなユニークなラベル名を生成してスタックに 1段積みます。「%i0」と指定するとラベル名をスタックに1段積みますが、 展開は行ないません。また、「%n」は、ユニークなラベル名を生成して展開 するだけで、スタックには積みません。 上の例では、ラベル名生成によってラベルを新しく作成して、ループ構造を 実現しています。この方法を使えば、入れ子になってもラベル名が重なる ことのないループ構造を構築することができます。 また、1つのソーススクリプトファイル内ですべてのスタックが取り出されて いなかったマクロ(タグ名)は、コンパイル時にエラーが報告されます。 かならず、すべてのスタックが取り出されて終わるようなマクロ命令の構成に しておいてください。 HSP ver2.6で追加された標準定義マクロのwhile〜wend、do〜until、for〜next は特殊展開マクロによって作られています。 %href #const #ifdef #ifndef %index #func 外部DLL呼び出し命令登録 %group プリプロセッサ命令 %prm 新規名称 関数名 タイプ %inst 外部DLLを呼び出すための新しい命令をコンパイラに登録します。 ^ 新規名称、関数名、タイプをスペースで区切って書きます。関数名は 大小文字を含めて厳密に書かなければなりません。 func命令が処理されると、コンパイラに新規名称で指定した命令が追加 されます。新しい命令は、他のHSP命令と同様に処理されます。 ^ つまり、 ^p 新規命令 p1,p2,p3,p4 ^p のようにパラメータを4つまで渡すことのできる命令となります。 パラメータのp1,p2,p3,p4の内容はタイプによって異なります。 ^ タイプは、呼び出しパラメータのバリエーションに対応した数値で設定します。 タイプの数値には以下のような種類があります。 ^p (p1〜p3までのパラメータ) タイプ0 : 新規命令 p1,p2,p3,p4 ( p1=int, p2=int, p3=int ) タイプ1 : 新規命令 p1,p2,p3,p4 ( p1=変数バッファへのポインタ, p2=int, p3=int ) タイプ2 : 新規命令 p2,p3,p4 ( p1=BMSCR構造体へのポインタ, p2=int, p3=int ) タイプ3 : 新規命令 p1,p2,p3,p4 ( p1=変数情報PVAL構造体へのポインタ, p2=int, p3=int ) タイプ4 : 新規命令 p2,p3,p4 ( p1=int, p2=str, p3=int ) タイプ5 : 新規命令 p1,p2,p3,p4 ( p1=変数バッファへのポインタ, p2=str, p3=int ) タイプ6 : 新規命令 p2,p3,p4 ( p1=BMSCR構造体へのポインタ, p2=str, p3=int ) タイプ7 : 新規命令 p1,p2,p3,p4 ( p1=変数情報PVAL構造体へのポインタ, p2=str, p3=int ) (p4のパラメータ) 各タイプ+$00 : p4=int 各タイプ+$10 : p4=システム変数refstrへのポインタ 各タイプ+$20 : p4=ファイルハンドルdpminfoへのポインタ 各タイプ+$30 : p4=パレットデータrgbptrへのポインタ (その他) 各タイプ+$80 : ver2.5専用のPVAL構造体を使用する 各タイプ+$100 : HSP終了時に自動的に呼び出される関数 (クリーンアップ関数)の指定 ^p パラメータの表記で、intは数値、strは文字列となります。 intのパラメータが省略されている場合は、0がDLLに渡されます。 それ以外のパラメータの省略はできません。 p1が、BMSCR構造体へのポインタの場合はパラメータの数が1つ少なく なるので注意してください。 ^ 外部DLLへのリンクは、HSP2.EXEの起動時に行なわれます。もし、指定 したDLL名や、そこに含まれている関数名が1つでも見つからなかった 時には、「DLL not found」というエラーが表示されHSPは終了します。 %href #uselib %index #include 別ファイルを結合 %group プリプロセッサ命令 %prm "filename" "filename" : 結合するファイル名 %inst インクルードするファイルを指定します。 ここで指定されたファイルは、もとのファイルに結合してコンパイルされます。 %index #uselib 外部DLLの指定 %group プリプロセッサ命令 %prm "filename" "filename" : 外部DLLファイル名 %inst HSPから呼び出す外部DLLのファイル名を指定します。 DLLのファイル名は、拡張子も含めて完全に書く必要があります。 %href #func %index #global モジュールの終了 %group プリプロセッサ命令 %prm %inst モジュール区間を終了し、以降を通常のプログラム領域に戻します。 モジュールについての詳細は、#module命令を参照してください。 %href #module #deffunc %index #module モジュールの開始 %group プリプロセッサ命令 %prm "モジュール名" "モジュール名" : 新規モジュール名 %inst #module以降の区間をモジュールとして別な空間に割り当てます。 モジュール内の変数やラベルは、モジュール外のものからは独立したものに なります。 ^ "モジュール名"は、複数のモジュールを名前で区分けする時につけることの できる名前で、モジュール名が同じもの同士は、変数名やラベル名を共有 します。モジュール名が違うものの間では、変数名やラベル名はまったく 違うものとして扱われます。 ^ "モジュール名"を省略した場合は、他とは違う名前が自動的に割り当て られます。 ^ モジュールは、必ず「#module」で開始を指示し、「#global」で終了 しなければなりません。このようにモジュールの区間を指定することにより、 その中を他から独立した空間にすることができます。 "モジュール名"は、18文字以内の長さでなければなりません。 また、スペースや記号を含まない文字列を指定するようにしてください。 (モジュール名で使用できる文字種は、a〜zまでのアルファベット、0〜9までの数字、「_」記号となります。変数として使用できる文字列と同等です。) %href #global #deffunc %index #deffunc 新規命令を割り当てる %group プリプロセッサ命令 %prm p1 p2,p3… p1=命令名 : 割り当てられる命令の名前 p2〜p9 : バラメータタイプ名 %inst ユーザーによる新規命令を指定します。 p1に新規命令の名前を、p2以降に呼び出しパラメータタイプを指定します。 #deffunc命令で定義した位置より以降は、指定された名前を命令語として 使用することが可能です。 ^ 新規命令は、#deffuncで指定された行以降が実行される内容になります。 実行はgosub命令と同じくサブルーチンジャンプとして行なわれ、 return命令でもとの実行位置に戻ります。 ^ 追加された新規命令では8つまでのパラメータを指定できるようになります。 それぞれのパラメータに指定できる型はp2〜p9で指定します。 指定するパラメータタイプには以下のものがあります。 ^p パラメータタイプ名 内容 --------------------------------------------------- int 数値 str 255文字以下の文字列 val 変数 ^p たとえば、 ^p #deffunc test val,str,int ^p のように指定すると、以降はtestという命令が使えるようになり、 ^p test 変数, 文字列, 数値 ^p のようにパラメータを指定できるようになります。 ただし、バラメータタイプの指定には、いくつかの制限があります。 ^p 1. strタイプで渡せる文字列は255文字以下 モジュールに文字列を渡す場合には、基本的に255文字以下 となります。それ以上の文字数を持つ文字列を渡す場合は、 変数を経由するようにしてください。 2. val,strタイプは、最初の2つのみ指定可能 valおよび、strのタイプ指定は最初の2つにのみ可能です。 つまり、3番目以降のパラメータはすべてintとなります。 ^p それぞれのパラメータは、mref命令のローカルパラメータとして取り出す ことが可能です。mref命令については、mref命令詳細を参照してください。 ^p #deffunc 名前 onexit ^p のように、引数を記述する部分に「onexit」を入れることで、 HSPのプログラムが終了した場合に、その命令が自動的に実行されます。 ただし、この命令内では以下の点に注意してください。 ^ ・end、stop、wait、await、dialogなど時間待ちが起こる命令は使用できません ・mesなど画面に出力する命令は機能しません ^ つまり最低限のメモリ解放や外部DLLの呼び出しなど最終的に行なわれる作業だけを 記述するものと考えて下さい。 同様の動作をするものにonexit命令がありますが、システムの処理としては ^p [HSPのプログラムを中断] ↓ [onexit命令の飛び先を実行] ↓ [モジュールのクリーンアップ先を実行] ↓ [HSPリソースの完全な破棄] ^p という順番になっています。 onexit命令の飛び先では、プログラムを中断すること自体を中止することも 可能ですが、クリーンアップ機能の場合は中断はできません。 また、複数のモジュールや、複数のクリーンアップ命令が登録された場合には、 登録された順番とは逆順に辿って次々に実行されていきます。 %href #global #module mref %index #fpbit 固定小数値bit数の指定 %group プリプロセッサ命令 %prm p1 p1 : 固定小数値の小数部bit数(0〜31) %inst スクリプト中で固定小数値を記述した場合に変換される 固定小数部のビット数を設定します。デフォルトは16bitになっています。 たとえば、「1.0k」という小数を指定したとすると、固定小数では 「65536」という整数として扱われます。 ^ スクリプト内での固定小数の記述は、 ^p 「1.23k」、「0.5k」、「10k」 ^p のように識別子を含む形で書いてください。小数点は省略が可能です。 ただし「0.5」を「.5」と書くことはできません。数字で始まり、数字で終わり 小数点を含んでいる必要があります。 %href %index #pack PACKFILE追加ファイル指定 %group プリプロセッサ命令 %prm "filename" "filename" : PACKFILEに追加されるファイル %inst 実行ファイル自動作成(ctrl+F9)で、packfileに追加されるファイルを 指定します。指定されたファイルは、実行ファイル作成時に リソースとして一緒にパックされます。 #packは、通常の形式でパックします。暗号化してパックしたい場合は#epackをお使い下さい。 重複したファイルを追加しようとした場合には、無視されます。 「start.ax」は、実行ファイル自動作成の際に自動的に追加 されるため特に追加ファイルとして指定する必要はありません。 ^p 例: #pack "a.txt" ^p 上の例では、「a.txt」というファイルを実行ファイルと一緒にパックします。 %href #epack #packopt %index #epack PACKFILE追加ファイル指定 %group プリプロセッサ命令 %prm "filename" "filename" : PACKFILEに追加されるファイル %inst 実行ファイル自動作成(ctrl+F9)で、packfileに追加されるファイルを 指定します。指定されたファイルは、実行ファイル作成時に リソースとして一緒にパックされます。 #epackは、指定ファイルを暗号化してパックします。 暗号化を行なう必要がない場合は#packをお使い下さい。 重複したファイルを追加しようとした場合には、無視されます。 「start.ax」は、実行ファイル自動作成の際に自動的に追加 されるため特に追加ファイルとして指定する必要はありません。 ^p 例: #epack "a.bmp" ^p 上の例では、「a.bmp」というファイルを暗号化して実行ファイルと一緒にパックします。 %href #pack #packopt %index #packopt 自動作成オプション指定 %group プリプロセッサ命令 %prm p1,p2 p1 : キーワード p2 : 設定内容 %inst 実行ファイル自動作成の動作を指定します。 キーワード名、の後スペース又はTABを入れてパラメーター (文字列の場合は「"strings"」のように指定)を記述して下さい。 #packoptで指定できるキーワードは以下の通りです。 ^p キーワード | 内容 | 初期値 --------------------------------------------------------- name | 実行ファイル名 | "hsptmp" runtime | 使用するランタイム | "hsprt" type | 実行ファイルのタイプ | 0 | (0=EXEファイル) | | (1=フルスクリーンEXE) | | (2=スクリーンセーバー) | xsize | 初期ウインドゥXサイズ | 640 ysize | 初期ウインドゥYサイズ | 480 hide | 初期ウインドゥ非表示SW | 0 orgpath | 初期ディレクトリ維持SW | 0 --------------------------------------------------------- ^p 以下の例では、「test.scr」というスクリーンセーバーを 「hsp2c.hrt」というランタイムを使用して作成します。 ^p 例: #packopt type 2 #packopt name "test" #packopt runtime "hsp2c.hrt" ^p 今まで通りに、「packfile編集」からパックされるファイルを選択して 実行ファイルを作成することも可能です。 「実行ファイル自動作成」を行なうと、packfileが自動的に作成されるため、 それまで保存されていたpackfileの情報は上書きされるので注意して下さい。 尚、「start.ax」はデフォルトで暗号化されたものがpackfileに追加されます。 また、「#packopt runtime "ランタイムファイル名"」で指定された ランタイムファイル(拡張子がhrtのもの)は、hspcmp.dllと同じディレクトリか、 または、runtimeディレクトリに置かれているものが使用されます。 %href #pack #epack %index #const マクロ名の定数定義 %group プリプロセッサ命令 %prm マクロ名 定数式 %inst 指定されたマクロ名に置換え文字列を設定します。 #defineと同様ですが、#constは定数(数値)の置き換えを行なう場合に あらかじめ計算を行なった結果を置き換えます。 ^p 例: #const KAZU 100+50 a=KAZU ↓(展開後) a=150 ^p あらかじめソース内で使用する値が確定している場合、ソースの 高速化に有効です。すでに定義されているマクロを含めることも可能 なので、 ^p 例: #const ALL 50 #const KAZU 100*ALL a=KAZU ↓(展開後) a=5000 ^p のように使用することができます。 計算式は、整数のみで演算子および数値の記述スタイルは、HSPと 同様のものが使えます。ただし、ver2.xのHSPとは異なり、演算子の 優先順位を考慮しますので注意してください。 ^p 例: #const KAZU $5+3*10 a=KAZU ↓(展開後) a=35 ^p 演算子の優先順位は、 ^p [*,/]>[+,-]>[比較演算子,<<,>>]>[!]>[&,|,^] ^p となっています。カッコによる順位の指定も可能です。 %href #define %index #undef マクロ名の取り消し %group プリプロセッサ命令 %prm マクロ名 %inst すでに登録されているマクロ名を取り消します。 登録されていないマクロ名に対して指定してもエラーにはならず 無視されます。 %href #define %index #if 数値からコンパイル制御 %group プリプロセッサ命令 %prm 数値式 %inst コンパイルのON/OFFを指定します。 #ifは指定した数値が0ならば以降のコンパイル出力をOFFにして コンパイル結果を無視します(プログラムとして実行されません)。 数値が0以外の場合は、出力がONとなります。 このコンパイル制御は、#endifが出るまでの区間を対象にします。 #if、#ifdef、#ifndefのいずれかには、#endifがペアで存在している 必要があります。 ^p 例: #if 0 mes "ABC" ; この部分は無視されます a=111 ; この部分は無視されます mes "DEF" ; この部分は無視されます #endif ^p #ifの指定には式を使うことも可能なので、 ^p 例: #define VER 5 #if VER<3 mes "ABC" ; この部分は無視されます a=111 ; この部分は無視されます mes "DEF" ; この部分は無視されます #endif ^p のような使い方もできます。計算式の記述および演算子の注意点などは、 #const命令と同様です。 また、#if〜#endifのプロックを入れ子にすることも可能です。 ^p 例: #ifdef SW #ifdef SW2 mes "AAA" ; SWとSW2が定義されている場合 #else mes "BBB" ; SWが定義されている場合 #endif #endif ^p 基本的にCやC++のプリプロセッサに近い使い方ができるようになっています。 プリプロセッサは、通常のコンパイルで自動的に適用されます。 %href #else #endif #ifdef #ifndef #define #const %index #ifdef マクロ定義からコンパイル制御 %group プリプロセッサ命令 %prm マクロ名 %inst コンパイルのON/OFFを指定します。 #ifは指定したマクロが定義されていなければ以降のコンパイル出力をOFFにして コンパイル結果を無視します。定義されている場合は、出力がONとなります。 このコンパイル制御は、#endifが出るまでの区間を対象にします。 コンパイル制御についての詳細は、#if命令のリファレンスを参照してください。 %href #if #ifndef #else #endif %index #ifndef マクロ定義からコンパイル制御 %group プリプロセッサ命令 %prm マクロ名 %inst コンパイルのON/OFFを指定します。 #ifは指定したマクロが定義されていれば以降のコンパイル出力をOFFにして コンパイル結果を無視します。定義されていない場合は、出力がONとなります。 このコンパイル制御は、#endifが出るまでの区間を対象にします。 コンパイル制御についての詳細は、#if命令のリファレンスを参照してください。 %href #if #ifdef #else #endif %index #else コンパイル制御を反転 %group プリプロセッサ命令 %inst #if、#ifdef、#ifndefなどのコンパイル制御区間内で、ON/OFFを反転します。 コンパイル制御についての詳細は、#if命令のリファレンスを参照してください。 %href #if #ifdef #ifndef #endif %index #endif コンパイル制御ブロック終了 %group プリプロセッサ命令 %inst #if、#ifdef、#ifndefなどのコンパイル制御区間を終了します。 コンパイル制御についての詳細は、#if命令のリファレンスを参照してください。 %href #if #ifdef #ifndef #else