Wiki source code of hsp3code.txt

Last modified by John Stroy on 2012/06/10 08:38

Show last authors
1 = Notes =
2 Pulled from [[http://dev.onionsoft.net/svn/openhsp/trunk/package/win32/hspsdk/hsp3code.txt]].
3
4 = Contents =
5 ##
6 {{{
7
8 ------------------------------------------------------------------------------
9 HSP3データフォーマット資料 v0.2 HSP : Hot Soup Processor
10 ホットスーププロセッサ copyright 2011 (c) onion software
11 ------------------------------------------------------------------------------
12
13 ・はじめに
14
15 この資料は、Hot Soup Processor ver3.0以降のファイル仕様、内部動作に
16 ついて記述しています。
17
18 HSP3データフォーマット資料は、OpenHSPの一部として公開されており、
19 OpenHSPと同様のライセンスが適用されています。
20
21 資料およびソースコードは、個人の利用、研究用として自由に改編して
22 お使い下さい。改編したものをネット上で公開する場合や、商利用を行なう
23 など不特定多数に公開するものを作成する場合は、事前に作者までメールにて
24 ご連絡頂けると嬉しいです(義務ではありません)。
25 HSP2、HSP3を含むHot Soup Processor(ホットスーププロセッサー)の
26 言語仕様は、Onion Software/onitamaが中心となって保守管理を行なって
27 います。
28 現状のユーザーの利便性を優先し、混乱しない形で、HSPの仕様管理を
29 継続して行なうためにご協力頂ければ嬉しいです。
30
31 資料をもとに作成されたドキュメントやTIPSは、またはツールに関しては、
32 自由に公開していただいて構いません。
33
34 HSP3データフォーマット資料は、BSDライセンスを基本として自由に改編、
35 複製、公開、配布することができます。
36 派生物を公開する場合には、以下の著作権表示を明示するように
37 してください。
38 また、必要であれば、改編者の著作権表示も付加するようにしてください。
39
40 OpenHSP
41 Copyright (C) 1997-2011, Onion Software/onitama.
42 All rights reserved.
43
44 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
45
46 Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
47 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
48 Neither the name of the Onion Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
49
50 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51
52
53 ・hsp3コード出力
54
55 HSP3コードジェネレーター(hspcmp.dll)は、テキスト形式のHSP3ソース
56 コードを、ax形式ファイル(HSPオブジェクトファイル)に変換します。
57 その際に、ソースコードをhsp3中間コードに置き換えます。
58 プリプロセッサ命令やマクロ定義命令、ラベルや外部参照情報などは
59 変換時に解決され、適切な形式に変換されます。
60 HSPランタイム(hsp3.exe等)は、ax形式ファイルを読み込み、
61 hsp3中間コードを逐次読み出しながら実行を行ないます。
62
63 HSP3ソースコード(.hsp)
64
65 プリプロセス処理後に中間コード置き換え
66
67 ax形式ファイル(.ax)
68
69
70 ・axファイルフォーマット
71
72 ax形式ファイル(HSPオブジェクトファイル)には、以下のようなデータが格納
73 されています。それぞれのブロックは、AXヘッダ情報からオフセット参照
74 する形でファイル上の位置を特定することができます。
75
76 ┌───────────┐
77 │ AXヘッダ情報 │
78 ├───────────┤
79 │ Option Info(OPTBUF) │
80 ├───────────┤
81 │ Code Segment(CS) │
82 ├───────────┤
83 │ Data Segment(DS) │
84 ├───────────┤
85 │ Object Temp(OT) │
86 ├───────────┤
87 │ Debug Info(DINFO) │
88 ├───────────┤
89 │ Lib Info(LINFO) │
90 ├───────────┤
91 │ Func Info(FINFO) │
92 ├───────────┤
93 │ Module Info(MINFO) │
94 ├───────────┤
95 │ Func Info2(FINFO2) │
96 ├───────────┤
97 │ HPI Info(HPIBUF) │
98 └───────────┘
99
100 それぞれのデータ構造の内容は、以下の通りです。
101
102 ・AXヘッダ情報
103
104 AXヘッダ情報の詳細は、以下の構造体を参照してください。
105 (hsp3struct.hで定義)
106
107 typedef struct HSPHED
108 {
109 // HSP3.0 header structure
110 //
111
112 char h1; // magic code1
113 char h2; // magic code2
114 char h3; // magic code3
115 char h4; // magic code4
116 int version; // version number info
117 int max_val; // max count of VAL Object
118 int allsize; // total file size
119
120 int pt_cs; // ptr to Code Segment
121 int max_cs; // size of CS
122 int pt_ds; // ptr to Data Segment
123 int max_ds; // size of DS
124
125 int pt_ot; // ptr to Object Temp
126 int max_ot; // size of OT
127 int pt_dinfo; // ptr to Debug Info
128 int max_dinfo; // size of DI
129
130 int pt_linfo; // ptr to LibInfo(2.3)
131 int max_linfo; // size of LibInfo(2.3)
132 int pt_finfo; // ptr to FuncInfo(2.3)
133 int max_finfo; // size of FuncInfo(2.3)
134
135 int pt_minfo; // ptr to ModInfo(2.5)
136 int max_minfo; // size of ModInfo(2.5)
137 int pt_finfo2; // ptr to FuncInfo2(2.5)
138 int max_finfo2; // size of FuncInfo2(2.5)
139
140 int pt_hpidat; // ptr to HPIDAT(3.0)
141 short max_hpi; // size of HPIDAT(3.0)
142 short max_varhpi; // Num of Vartype Plugins(3.0)
143 int bootoption; // bootup options
144 int runtime; // ptr to runtime name
145
146 } HSPHED;
147
148 「ptr to~」が示しているのは、実際にデータが存在するファイル先頭からの
149 オフセット値です。
150 「size of~」が示しているのは、データブロックのサイズです。
151
152 magic code1~4は、「HSP3」の文字列コードが入ります。
153 versionは、コードジェネレーターのバージョンが入ります。
154 (3.1の場合は、0x0301となります。)
155
156 bootoptionは、以下のフラグが格納されます。
157
158 #define HSPHED_BOOTOPT_DEBUGWIN 1 // 起動時デバッグウインドゥ表示
159 #define HSPHED_BOOTOPT_RUNTIME 0x1000 // 動的ランタイムを有効にする
160
161 動的ランタイム指定時は、runtimeにランタイム名(ファイル名)のデータ
162 ブロックの位置(ファイル先頭からのオフセット)が格納されます。
163
164
165 ・Code Segment(CS)
166
167 ソースを展開したHSP中間コードフォーマットの情報が格納されています。
168 ソーススクリプトの先頭から順次、中間コードに置き換えられて格納されます。
169 コードの詳細は、「hsp3中間コードフォーマット」の項目を参照してください。
170
171 ・Data Segment(DS)
172
173 文字列などの固定データが格納されています。
174 サイズは不定で、文字列や実数データなどが順次格納されます。
175 以降、この項目を参照する場合、「DSオフセット値」と呼びます。
176
177 ・Object Temp(OT)
178
179 ラベルIDに対応したCS上のオフセット値が格納されています。
180
181 ・Debug Info(DINFO)
182
183 行番号に対応するCSの位置情報が格納されています。
184 詳しくは、「Debug Info(DINFO)詳細」を参照してください。
185
186 ・Lib Info(LINFO)
187
188 外部呼び出し(DLL等)の情報が格納されています。
189
190 ・Func Info(FINFO)
191 ・Func Info2(FINFO2)
192
193 モジュールやDLL定義等の構造に関する情報が格納されています。
194
195 ・Mod Info(MINFO)
196
197 モジュールに関する情報が格納されています。
198
199 ・HPI Info(HPIBUF)
200
201 HSP3拡張プラグインに関する情報が格納されています。
202 情報は、HPIDAT構造体(hsp3struct.hで定義)の配列として書き込まれます。
203
204 typedef struct HPIDAT {
205 short flag; // flag info
206 short option;
207 int libname; // lib name index (DS)
208 int funcname; // function name index (DS)
209 void *libptr; // lib handle
210 } HPIDAT;
211
212 libnameとfuncnameは、DLL名、初期化関数名を示すDSオフセット値になります。
213 libptrは、ランタイム実行時に書き込むための予約領域です。
214 HPIDAT構造体は、あくまでもHSP3拡張プラグインのための情報で、
215 HSP2.x互換のプラグインは外部DLL呼び出し扱いとなり、ここには
216 含まれていません。
217
218 ・Option Info(OPTBUF)
219
220 コンパイル時に指定されたランタイムなどのオプション情報が格納されています。
221
222
223 ・hsp3中間コードフォーマット
224
225 HSPは、ソーススクリプトを中間コードに変換した後に実行を行なうインタプリタです。
226 スクリプトに含まれるキーワード、文字列、数値などを中間コードに変換しています。
227 hsp3中間コードフォーマットは、hsp2で使用されていたフォーマットに近い形で
228 作成されています。
229
230 中間コードには、取り扱う値の範囲に合わせた2種類の形式が存在します。
231
232
233 [32bit code]
234 MSB LSB
235 ┌─┬──┬──┬──┬──────┐
236 │ 0│ Ex2│ Ex1│ Ex0│ Type │
237 └─┴──┴──┴──┴──────┘
238 +
239 ┌─────────────────┐
240 │  Code(16bit)    │
241 └─────────────────┘
242
243 [48bit code]
244 MSB LSB
245 ┌─┬──┬──┬──┬──────┐
246 │ 1│ Ex2│ Ex1│ Ex0│ Type │
247 └─┴──┴──┴──┴──────┘
248 +
249 ┌─────────────────┐
250 │  Code(32bit)    │
251 └─────────────────┘
252
253 基本は16bit(short)値が1つの単位となります。
254 Type値は、bit0~bit11 (0~0xfff)。(CSTYPEマクロでマスク値を定義)
255 Ex0値は、bit12 (0x1000)。(EXFLG_0マクロで値を定義)
256 Ex1値は、bit13 (0x2000)。(EXFLG_1マクロで値を定義)
257 Ex2値は、bit14 (0x4000)。(EXFLG_2マクロで値を定義)
258 Code値が、0x0000~0xffff(符号なし)までの場合は、サイズ削減のために
259 32bitcode形式で格納されます。
260 Code値が、0x10000以上の場合は、48bit形式で32bitフルに格納されます。
261 48bit形式の場合は、最初の16bitにあるbit15(0x8000)がONになります。
262
263 Type値は、格納されるコードの種類を特定します。
264
265 Type | マクロ | 種類
266 -----------------------------------------------------------
267 0 | TYPE_MARK | 記号(code=文字コード)
268 1 | TYPE_VAR | ユーザー定義変数(code=変数ID)
269 2 | TYPE_STRING | 文字列(code=DSオフセット)
270 3 | TYPE_DNUM | 実数値(code=DSオフセット)
271 4 | TYPE_INUM | 整数値(code=値)
272 5 | TYPE_STRUCT | モジュール変数・構造体(code=minfoID)
273 6 | TYPE_XLABEL | 未使用
274 7 | TYPE_LABEL | ラベル名(code=OTオフセット)
275 8 | TYPE_INTCMD | HSP内部(コア)命令(code=コマンドID)
276 9 | TYPE_EXTCMD | HSP拡張(機種依存)命令(code=コマンドID)
277 10 | TYPE_EXTSYSVAR | HSP拡張(機種依存)システム変数(code=コマンドID)
278 11 | TYPE_CMPCMD | 比較命令(code=コマンドID)
279 12 | TYPE_MODCMD | ユーザー拡張命令・関数(code=コマンドID)
280 13 | TYPE_INTFUNC | HSP内部(コア)関数(code=コマンドID)
281 14 | TYPE_SYSVAR | HSP内部(コア)システム変数(code=コマンドID)
282 15 | TYPE_PROGCMD | プログラム制御命令(code=コマンドID)
283 16 | TYPE_DLLFUNC | 外部DLL拡張命令・関数(code=コマンドID)
284 17 | TYPE_DLLCTRL | 拡張DLLコントロールコマンド(code=コマンドID)
285 18 | TYPE_USERDEF | HSP3拡張プラグインコマンド(code=コマンドID)
286
287
288 Ex1値は、行頭であることを示すフラグ(1ならば行頭となる)、
289 Ex2値は、パラメーターの区切りであることを示すフラグ(1ならば区切り)
290 となっています。
291 Ex0値は、パラメーターが演算や変数を含まない単一の値であることを示す
292 フラグとして使用されます(HSP3.3以降で追加)。
293
294 TYPE_USERDEFタイプ以降は、プラグインによって拡張された命令などで使用
295 されていきます。(タイプ値の最大は、0x1fffになります)
296
297 HSPに標準で設定されている予約キーワードのtypeとコードは以下の通りです。
298 (コードジェネレーターのhspcmd.cppから抜粋)
299
300 char s_rec[1]= "", *hsp_prestr[] =
301 {
302 //
303 // label check
304 // | opt value
305 // | |
306 // | | type
307 // | | | keyword
308 // | | | |
309 // | | | |
310 // "$000 8 goto",
311 //
312 s_rec,
313
314 // program control commands (ver3.0)
315
316 "$000 15 goto",
317 "$001 15 gosub",
318 "$002 15 return",
319 "$003 15 break",
320 "$004 15 repeat",
321 "$005 15 loop",
322 "$006 15 continue",
323 "$007 15 wait",
324 "$008 15 await",
325
326 "$009 15 dim",
327 "$00a 15 sdim",
328 // "$00d 15 skiperr", // delete
329 "$00b 15 foreach", // (ver3.0)
330 // "$00c 15 eachchk", // (ver3.0) hidden
331 "$00d 15 dimtype", // (ver3.0)
332 "$00e 15 dup",
333 "$00f 15 dupptr", // (ver3.0)
334
335 "$010 15 end",
336 "$011 15 stop",
337 "$012 15 newmod", // (ver3.0)
338 // "$013 15 setmod", // (ver3.0)
339 "$014 15 delmod", // (ver3.0)
340 // "$015 15 alloc", // (changed 3.0)
341 "$016 15 mref", // (ver2.5)
342 "$017 15 run",
343 "$018 15 exgoto", // ver2.6
344 "$019 15 on", // ver2.6
345 "$01a 15 mcall", // (ver3.0)
346 "$01b 15 assert", // (ver3.0)
347 "$01c 15 logmes", // (ver3.0)
348 "$01d 15 newlab", // (ver3.2)
349 "$01e 15 resume", // (ver3.2)
350 "$01f 15 yield", // (ver3.2)
351
352 // "$015 15 logmode", // (ver2.55)
353 // "$016 15 logmes", // (ver2.55)
354
355 // enhanced command (ver2.6)
356
357 "$10000 8 onexit",
358 "$10001 8 onerror",
359 "$10002 8 onkey",
360 "$10003 8 onclick",
361 "$10004 8 oncmd",
362
363 "$011 8 exist",
364 "$012 8 delete",
365 "$013 8 mkdir",
366 "$014 8 chdir",
367
368 "$015 8 dirlist",
369 "$016 8 bload",
370 "$017 8 bsave",
371 "$018 8 bcopy",
372 "$019 8 memfile", // (changed on ver2.6*)
373
374 // no macro command (ver2.61)
375 //
376 "$000 11 if",
377 "$001 11 else",
378
379 // normal commands
380
381 "$01a 8 poke",
382 "$01b 8 wpoke",
383 "$01c 8 lpoke",
384 "$01d 8 getstr",
385 "$01e 8 chdpm", // (3.0)
386 "$01f 8 memexpand", // (3.0)
387 "$020 8 memcpy", // (ver2.55)
388 "$021 8 memset", // (ver2.55)
389
390 "$022 8 notesel", // (changed on ver2.55)
391 "$023 8 noteadd", // (changed on ver2.55)
392 "$024 8 notedel", // (changed on ver2.55)
393 "$025 8 noteload", // (changed on ver2.6*)
394 "$026 8 notesave", // (changed on ver2.6*)
395 "$027 8 randomize", // (changed on ver3.0)
396 "$028 8 noteunsel", // (changed on ver3.0)
397 "$029 8 noteget", // (changed on ver2.55)
398 "$02a 8 split", // (ver3.2)
399
400 // enhanced command (ver2.2)
401
402 "$10000 9 button",
403
404 "$001 9 chgdisp",
405 "$002 9 exec",
406 "$003 9 dialog",
407
408 // "$007 9 palfade", // delete
409 // "$009 9 palcopy", // delete
410
411 "$008 9 mmload",
412 "$009 9 mmplay",
413 "$00a 9 mmstop",
414 "$00b 9 mci",
415
416 "$00c 9 pset",
417 "$00d 9 pget",
418 "$00e 9 syscolor", // (ver3.0)
419
420 "$00f 9 mes",
421 "$00f 9 print",
422 "$010 9 title",
423 "$011 9 pos",
424 "$012 9 circle", // (ver3.0)
425 "$013 9 cls",
426 "$014 9 font",
427 "$015 9 sysfont",
428 "$016 9 objsize",
429 "$017 9 picload",
430 "$018 9 color",
431 "$019 9 palcolor",
432 "$01a 9 palette",
433 "$01b 9 redraw",
434 "$01c 9 width",
435 "$01d 9 gsel",
436 "$01e 9 gcopy",
437 "$01f 9 gzoom",
438 "$020 9 gmode",
439 "$021 9 bmpsave",
440
441 // "$022 9 text", // delete
442
443 "$022 9 hsvcolor", // (ver3.0)
444 "$023 9 getkey",
445
446 "$024 9 listbox",
447 "$025 9 chkbox",
448 "$026 9 combox",
449
450 "$027 9 input",
451 "$028 9 mesbox",
452 "$029 9 buffer",
453 "$02a 9 screen",
454 "$02b 9 bgscr",
455
456 "$02c 9 mouse",
457 "$02d 9 objsel",
458 "$02e 9 groll",
459 "$02f 9 line",
460
461 "$030 9 clrobj",
462 "$031 9 boxf",
463
464 // enhanced command (ver2.3)
465
466 "$032 9 objprm",
467 "$033 9 objmode",
468 "$034 9 stick",
469 // "$041 9 objsend", // delete
470 "$035 9 grect", // (ver3.0)
471 "$036 9 grotate", // (ver3.0)
472 "$037 9 gsquare", // (ver3.0)
473 "$038 9 gradf", // (ver3.2)
474 "$039 9 objimage", // (ver3.2)
475 "$03a 9 objskip", // (ver3.2)
476 "$03b 9 objenable", // (ver3.2)
477 "$03c 9 celload", // (ver3.2)
478 "$03d 9 celdiv", // (ver3.2)
479 "$03e 9 celput", // (ver3.2)
480
481 // enhanced command (ver3.0)
482
483 "$000 17 newcom",
484 "$001 17 querycom",
485 "$002 17 delcom",
486 "$003 17 cnvstow",
487 "$004 17 comres",
488 "$005 17 axobj",
489 "$006 17 winobj",
490 "$007 17 sendmsg",
491 "$008 17 comevent",
492 "$009 17 comevarg",
493 "$00a 17 sarrayconv",
494 //"$00b 17 variantref",
495
496 "$100 17 callfunc",
497 "$101 17 cnvwtos",
498 "$102 17 comevdisp",
499 "$103 17 libptr",
500
501 // 3.0 system vals
502
503 "$000 14 system",
504 "$001 14 hspstat",
505 "$002 14 hspver",
506 "$003 14 stat",
507 "$004 14 cnt",
508 "$005 14 err",
509 "$006 14 strsize",
510 "$007 14 looplev", // (ver2.55)
511 "$008 14 sublev", // (ver2.55)
512 "$009 14 iparam", // (ver2.55)
513 "$00a 14 wparam", // (ver2.55)
514 "$00b 14 lparam", // (ver2.55)
515 "$00c 14 refstr",
516 "$00d 14 refdval", // (3.0)
517
518 // 3.0 internal function
519 "$000 13 int",
520 "$001 13 rnd",
521 "$002 13 strlen",
522 "$003 13 length", // (3.0)
523 "$004 13 length2", // (3.0)
524 "$005 13 length3", // (3.0)
525 "$006 13 length4", // (3.0)
526 "$007 13 vartype", // (3.0)
527 "$008 13 gettime",
528 "$009 13 peek",
529 "$00a 13 wpeek",
530 "$00b 13 lpeek",
531 "$00c 13 varptr", // (3.0)
532 "$00d 13 varuse", // (3.0)
533 "$00e 13 noteinfo", // (3.0)
534 "$00f 13 instr",
535 "$010 13 abs", // (3.0)
536 "$011 13 limit", // (3.0)
537
538 // 3.0 string function
539 "$100 13 str",
540 "$101 13 strmid",
541 "$103 13 strf",
542 "$104 13 getpath",
543 "$105 13 strtrim", // (3.2)
544
545 // 3.0 math function
546 "$180 13 sin",
547 "$181 13 cos",
548 "$182 13 tan",
549 "$183 13 atan",
550 "$184 13 sqrt",
551 "$185 13 double",
552 "$186 13 absf",
553 "$187 13 expf",
554 "$188 13 logf",
555 "$189 13 limitf",
556 "$18a 13 powf", // (3.3)
557
558 // 3.0 external sysvar,function
559
560 "$000 10 mousex",
561 "$001 10 mousey",
562 "$002 10 mousew", // (3.0)
563 "$003 10 hwnd", // (3.0)
564 "$004 10 hinstance", // (3.0)
565 "$005 10 hdc", // (3.0)
566
567 "$100 10 ginfo",
568 "$101 10 objinfo",
569 "$102 10 dirinfo",
570 "$103 10 sysinfo",
571
572 "$ffffffff 5 thismod",
573
574 "*"
575 };
576
577
578 ・hsp3中間コード展開(パラメーター)
579
580 hsp3中間コードでは、命令に続いてパラメーターの記述が行なわれます。
581 パラメーターは、逆ポーランド法によりスタックとの演算が行なわれます。
582
583 ランタイムが実際のパラメーター演算時に行なう手順は以下の通りです。
584
585 パラメーターが、変数や固定値だった場合(TYPE_VAR、TYPE_INUM等)は、
586 その値をスタックに積みます。
587 パラメーターが演算子を示すものであった場合(TYPE_MARK)は、
588 スタックに積まれている2要素の演算を行ない、結果をスタックに積みます。
589 演算子として解釈されるCode値は、以下の通りです。
590
591 Code値 マクロ名 内容
592 --------------------------------------------------------------
593 0 CALCCODE_ADD 加算(+)
594 1 CALCCODE_SUB 減算(-)
595 2 CALCCODE_MUL 積算(*)
596 3 CALCCODE_DIV 除算(/)
597 4 CALCCODE_MOD 余剰(\)
598 5 CALCCODE_AND 論理積(&)
599 6 CALCCODE_OR 論理和(|)
600 7 CALCCODE_XOR 排他的論理和(^)
601 8 CALCCODE_EQ 同一比較(=)
602 9 CALCCODE_NE 非同一比較(!)
603 10 CALCCODE_GT より大きい(<)
604 11 CALCCODE_LT より小さい(>)
605 12 CALCCODE_GTEQ 以上(<=)
606 13 CALCCODE_LTEQ 以下(>=)
607 14 CALCCODE_RR ビットシフト右(>>)
608 15 CALCCODE_LR ビットシフト左(<<)
609
610 特殊なCode値として、0x3f(63)が使用されることがあります。
611 これは、パラメーターの省略を行なった場合に、ダミーのコードとして
612 挿入されるものです。
613 (「1,,2」のような省略を含むパラメーターの指定時には、
614 「1」「ダミー」「2」のような形でダミーが挿入されます。)
615
616
617 ・hsp3中間コード展開(変数)
618
619 中間コードで、TYPE_VARのタイプを持つパラメーターは、変数の指定を
620 示しています。このタイプのCode値は、変数IDを示します。
621
622 変数IDは、ランタイムが持つコンテキスト(HSPCTX構造体)内の、
623 mem_varメンバが保持する変数情報配列の要素になります。
624 つまり、hspctx->mem_var[0]がID0の変数になります。
625
626 また、配列の指定が行なわれている場合には、直後に
627 TYPE_MARKタイプで'('のCodeを持つ中間コードが続きます。
628 その後、配列要素がパラメーターと同様に展開され、
629 最後にTYPE_MARKタイプで')'のCodeを持つ中間コードが現われます。
630
631 行頭(最初の中間コード)に、TYPE_VARのタイプを持つコードが
632 ある場合は、変数代入を示します。
633 変数に続いて、代入演算子がTYPE_VARのタイプを持つパラメーターとして
634 指定されます。代入演算子のコードは、パラメーターと同様のマクロ
635 (CALCCODE_*)を利用することが可能です。
636
637
638 ・hsp3中間コード展開(比較)
639
640 中間コードで、TYPE_CMPCMDのタイプを持つコードは、比較命令を
641 示しています。
642 このタイプのCode値は、0の場合if命令を、1の場合else命令を示します。
643
644 比較命令の場合に限り、中間コードの直後に16bit長のオフセット値が
645 埋め込まれています。
646 オフセット値は、比較命令が正しくなかった時(if命令以降をスキップする
647 場合)のCS内ジャンプ先が相対値として記録されています。
648
649
650 ・Debug Info(DINFO)詳細
651
652 Debug Info(DINFO)セグメントには、スクリプトのデバッグに関する情報が
653 格納されています。主に、ランタイム上でエラーの表示や、デバッグ
654 ウィンドウ上での表示補助に利用されます。
655 (DINFOのデータは、HSP2.xのデバッグデータの上位互換になっています。)
656 Debug Info(DINFO)は、リリース時(exeファイル作成時)のオブジェクトには
657 含まれない。
658
659 DINFOのデータは、符号なし8bitデータの列が続いています。
660
661 値 内容
662 --------------------------------------------------------------
663 255 データ列の終端
664 254 ソースファイル指定(*1)
665 253 変数名データ指定(*2)
666 252 次の16bit値が、次行までのCSオフセット
667 その他 次行までのCSオフセット値
668
669 *1
670 次の24bit値がソースファイル名を示すDSオフセット値となる。
671 さらに続く16bit値が参照される行番号の値となる。
672 DSオフセット値が0の場合は行番号のみの指定となる。
673 *2
674 次の24bit値が変数名へのDSオフセット値となる。
675 さらに続く16bit値はダミー値として0が格納されている。
676 このデータは、変数IDの順にDebug Info(DINFO)セグメント内に
677 連続して設定されている。
678
679
680 ・更新履歴
681
682 2011/05/12 ver0.2
683
684 HSP3.3に合わせて一部改訂。
685
686 2007/11/01 ver0.1
687
688 最初のバージョン。
689
690
691 ・連絡先
692
693 OpenHSPに関するお問い合わせ、感想、ご意見などは以下のメールアドレスまでお寄せ下さい。
694 メールの返信につきましては、時間がかかる場合がありますので予めご了承下さい。
695
696 Homepage: http://www.onionsoft.net/openhsp/
697 http://hsp.tv/
698 e-mail : onitama@onionsoft.net
699
700 -------------------------------------------------------------------------------
701 HSP users manual / end of file
702 -------------------------------------------------------------------------------
703
704
705 }}}
706 ##