-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathi_mem.hs
601 lines (502 loc) · 19.5 KB
/
i_mem.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
;
; HSP help manager用 HELPソースファイル
; (先頭が「;」の行はコメントとして処理されます)
;
%type
内蔵命令
%ver
3.6
%note
ver3.6標準命令
%date
2009/08/01
%author
onitama
%url
http://hsp.tv/
%port
Win
Cli
%index
alloc
バッファを確保
%group
メモリ管理命令
%prm
p1,p2
p1=変数 : バッファを割り当てる変数名
p2=1〜(64) : バッファのサイズ(Byte単位)
%inst
メモリ上にバッファを作成して変数に割り当てます。
割り当てられた変数は、文字列型となります。
^
この命令は過去のHSP命令との互換を取るために用意されています。
通常は、sdim命令を使用することを推奨します。
^
※この命令は、マクロとしてhspdef.as内で定義されています。
%href
sdim
memexpand
%port+
Let
%index
dim
配列変数を作成
%group
メモリ管理命令
%prm
p1,p2...
p1=変数 : 配列を割り当てる変数名
p2=0〜 : 要素の最大
%inst
任意の要素を持つ配列変数を作成します。
^p
例:
dim a,20
^p
上の例では、変数aの要素を20個、つまり「a(0)」〜「a(19)」までをあらかじめ確保します。
^
パラメータを増やすことで多次元配列を作成することも可能です。
^p
例:
dim a,10,5 : 変数aは2次元配列
a(0,0)=1 : 要素(0,0)に1を代入
a(1,0)=2 : 要素(1,0)に2を代入
a(0,1)=3 : 要素(0,1)に3を代入
^p
上の例では、a(0,0)から、a(9,4)までを使用できるようになります。
多次元配列は、4次元まで確保することが可能です。
^
dim命令はスクリプト内のどこででも定義・再定義することが可能です。
また、配列変数を作成すると内容はすべて0にクリアされます。
%href
sdim
ddim
ldim
dimtype
%port+
Let
%index
dimtype
指定タイプの配列変数を作成
%group
メモリ管理命令
%prm
p1,p2,p3...
p1=変数 : 配列を割り当てる変数名
p2=型タイプ : 変数の型タイプ
p3=0〜 : 要素の最大
%inst
任意の要素を持つ配列変数を作成します。
dim命令と同様の動作ですが、dimtypeは変数の型を指定することができます。
p2には、変数型を示す型タイプ値を指定する必要があります。
型タイプ値は、vartype関数で型名文字列から取得することが可能です。
^p
例 :
dimtype a,vartype("double"),20
^p
上の例では、実数型変数aの要素を20個、つまり「a(0)」〜「a(19)」までをあらかじめ確保します。
dim命令と同様に多次元配列を確保することが可能です。
多次元配列は、4次元まで確保することが可能です。
%href
dim
sdim
ddim
ldim
vartype
%port+
Let
%index
poke
バッファに1byte書き込み
%group
メモリ管理命令
%prm
p1,p2,p3
p1=変数 : バッファを割り当てた変数名
p2=0〜 : バッファのインデックス(Byte単位)
p3(0) : バッファに書き込む値 または 文字列(Byte単位)
%inst
変数に保存されたデータメモリ上の任意の場所にある 1バイトの内容を書き換えます。
^
p1で指定した変数のバッファ上で、p2で指定したインデックスの場所にp3の値を書き込みます。値は0〜255までの1バイト(8bit)値になります。
^
p3に文字列を指定した場合には、文字列データをメモリに展開し、strsizeに、書き込まれた文字列の長さを返します。
%href
wpoke
lpoke
%port+
Let
%index
wpoke
バッファに2byte書き込み
%group
メモリ管理命令
%prm
p1,p2,p3
p1=変数 : バッファを割り当てた変数名
p2=0〜 : バッファのインデックス(Byte単位)
p3=0〜(0) : バッファに書き込む値(16bit整数値)
%inst
変数に保存されたデータメモリ上の任意の場所にある 2バイトの内容を書き換えます。
^
p1で指定した変数のバッファ上で、p2で指定したインデックスの場所にp3の値を書き込みます。値は0〜65535までの2バイト(16bit)値になります。
%href
poke
lpoke
%port+
Let
%index
lpoke
バッファに4byte書き込み
%group
メモリ管理命令
%prm
p1,p2,p3
p1=変数 : バッファを割り当てた変数名
p2=0〜 : バッファのインデックス(Byte単位)
p3=0〜(0) : バッファに書き込む値(32bit整数値)
%inst
変数に保存されたデータメモリ上の任意の場所にある 4バイトの内容を書き換えます。
^
p1で指定した変数のバッファ上で、p2で指定したインデックスの場所にp3の値を書き込みます。値は0〜$ffffffffまでの4バイト(32bit)値になります。
%href
poke
wpoke
%port+
Let
%index
sdim
文字列型配列変数を作成
%group
メモリ管理命令
%prm
p1,p2,p3...
p1=変数 : 配列を割り当てる変数名
p2=1〜 : デフォルト文字数
p3=0〜 : 要素の最大
%inst
文字列型の配列変数を作成します。
dim命令との違いは、 p2のパラメータは「文字列のデフォルト文字数」、p3のパラメータ以降に実際の配列要素の最大数を入れるところです。
^p
例 :
sdim a,5000 ; 変数aは5000文字ぶんのメモリをあらかじめ確保します
^p
上の例では、変数aは5000文字ぶんのメモリを確保し配列変数にはなりません。
デフォルト文字数は、あらかじめ確保しておくメモリを指定することで、自動拡張時に余計な処理がかからなくなるというものです。
デフォルト文字数が少ない場合には、長い文字列が代入されるたびに何度も文字列バッファの再確保が発生するため効率が落ちることがあります。
^
多次元配列の場合は、文字数とは別に4次元まで確保することが可能です。
sdim命令はスクリプト内のどこででも定義・再定義することが可能です。
また、配列変数を作成すると内容はすべて0にクリアされます。
%href
dim
ddim
ldim
dimtype
%port+
Let
%index
ddim
実数型配列変数を作成
%group
メモリ管理命令
%prm
p1,p2...
p1=変数 : 配列を割り当てる変数名
p2=0〜 : 要素の最大
%inst
実数型の配列変数を作成します。
パラメーターは、dim命令と同様に要素の最大数を指定します。
^p
例 :
ddim a,100 ; 変数aはa(0)〜a(99)までの実数型配列を確保します
^p
dim命令と同様に多次元配列を確保することが可能です。
多次元配列は、4次元まで確保することが可能です。
ddim命令はスクリプト内のどこででも定義・再定義することが可能です。
また、配列変数を作成すると内容はすべて0にクリアされます。
^
※この命令は、マクロとしてhspdef.as内で定義されています。
%href
dim
sdim
ldim
dimtype
%port+
Let
%index
memcpy
メモリブロックのコピー
%group
メモリ管理命令
%prm
p1,p2,p3,p4,p5
p1 : コピー先の変数
p2 : コピー元の変数
p3 : コピーするサイズ(1byte単位)
p4 : コピー先の変数メモリオフセット(省略時=0)
p5 : コピー元の変数メモリオフセット(省略時=0)
%inst
p1で指定された変数に割り当てられているメモリ領域に、
p2で指定された変数に割り当てられているメモリの内容をコピーします。
コピーするサイズ(1byte単位)は、p3で指定します。
大きな領域を変数に割り当てている場合などに高速なメモリコピーを行なうことができます。
p4,p5で、コピー先、コピー元の開始位置を1byte単位で調整することができます。
変数が確保している領域を越える指定がされている場合は、バッファオーバーフローのエラーになります。
%href
memset
memexpand
%port+
Let
%index
memset
メモリブロックのクリア
%group
メモリ管理命令
%prm
p1,p2,p3,p4
p1=変数 : 書き込み先の変数
p2=0〜255(0) : クリアする値(1byte)
p3=0〜(0) : クリアするサイズ(1byte単位)
p4=0〜(0) : 書き込み先の変数メモリオフセット
%inst
1byteの固定値でメモリブロックを埋めます。
p1で指定された変数に割り当てられているメモリ領域に、p2で指定された値を、p3のサイズだけ書き込みます。大きな領域に同じ値を書き込みたい時に有効です。p4で、メモリ開始位置を1byte単位で調整することができます。
変数が確保している領域を越える指定がされている場合は、バッファオーバーフローのエラーになります。
%href
memcpy
memexpand
%port+
Let
%index
dup
クローン変数を作成
%group
特殊代入命令
%prm
変数名1 , 変数名2
変数名1 : クローンを作成する変数名
変数名2 : クローン元の変数名
%inst
クローン元の変数が持つメモリを指している変数を作成します。
クローン変数は、クローン元のメモリ情報を参照するための変数として機能するようになります。
^
クローン元の型が変更されたり、配列の拡張、または文字列バッファの拡張が行なわれた場合には、クローンとしての動作は行なわれなくなります。
クローンが有効なのはクローン元の変数に代入が行なわれるまでの間だという点に注意してください。
dup命令は、以前のバージョンとの互換性維持と、 低レベルでの変数バッファ操作を行なうための機能として残されています。
また、メモリアドレスから直接クローン変数を作成するdupptr命令も用意されています。
初心者向けに、dup命令を推奨することはありません。
%href
mref
dupptr
%port+
Let
%index
dupptr
ポインタからクローン変数を作成
%group
特殊代入命令
%prm
変数名,p1,p2,p3
変数名 : クローンを作成する変数名
p1=0〜 : クローン元のメモリアドレス
p2=0〜 : クローン元のメモリサイズ
p3=1〜(4) : クローン変数の型指定
%inst
指定したアドレスポインタを指している変数を作成します。
クローン変数は、メモリ上の情報を参照するための数値型配列変数として機能するようになります。
^
p3で作成されるクローン変数の型を指定することができます。
p3の値は、vartype関数で取得される型を示す値と同じです。 p3を省略した場合は、4(整数型)となります。
^
クローン変数は、指し示しているメモリの位置が変更されてもそれを検知することはできません。
たとえば、変数に格納されているデータのメモリアドレスを指し示していたとしても、変数の型や内容が更新されてメモリ位置が変更された場合に正しく参照することはできません。
あくまでも、一時的なメモリ参照にのみ使用し、取り扱いには十分に注意してください。dupptr命令は、 DLL等の外部関数で取り交わすメモリ参照や低レベルでの変数バッファ操作を行なうための機能として用意されています。
初心者向けに、dupptr命令を推奨することはありません。
%href
mref
dup
%index
mref
特殊なメモリを変数に割り当てる
%group
特殊代入命令
%prm
p1,p2
p1=変数名 : 割り当てられる変数名
p2=0〜(0) : リソースID (割り当てるメモリ内容)
%inst
p1で指定された変数に、p2で指定したメモリ内容を割り当てます。
^p
値 : 対応するリソース
--------------------------------------------------
0〜 7 : ローカルパラメータ#1〜8(数値)
64 : システム変数stat
65 : システム変数refstr
66 : ウィンドウ内画像データ(VRAM)
67 : 現在のウィンドウ情報(BMSCR構造体)
68 : HSPのシステム情報(HSPCTX構造体)
69 : パレット情報
96〜 : ウィンドウID0〜の情報(BMSCR構造体)
^p
リソースID64,65のシステム変数は、たとえば「mref a,64」とした場合、変数aがシステム変数 statと同等になり、値を代入することができるようになります。これにより、ユーザー定義命令内の計算結果などをシステム変数に反映して、呼び出し元に返すことができます。
^
リソース66のウインドウ内画像データ(VRAMデータ)は、表示されている画像を内容とする配列変数になります。
これにより、 poke,peek命令などで画像データに直接アクセスが可能になります。
^
リソース67以降も同様に HSPの内部データに直接アクセスできるようにするものですが、通常は使う必要はありません。 DLLへ渡すためのパラメータ準備のためなど、ごく限られた用途のために用意されているもので、ほとんどの人は使うことはないはずです。
^
ローカルパラメータは、ユーザー定義命令(#deffunc)で新規に追加された命令のパラメータ内容を取得するためのものです。
パラメータのタイプ(数値、変数、文字列)に従って取得することが可能です。
ローカルパラメータ取得は、HSP2.xまでのパラメーター取得方法との互換のために用意されています。(一部のリソースタイプには互換性がありません。)
HSP3.0以降では、ユーザー定義命令(#deffunc)のエイリアス機能を使用することを推奨しています。
%href
dup
dupptr
#deffunc
%port+
Let
%portinfo
HSPLet時、stat/refstr のみ使用可能です。
関数の引数には使用できませんので、3.0 形式の受け取り方をしてください。
%index
newmod
モジュール型変数の作成
%group
メモリ管理命令
%prm
p1,p2,p3...
p1 : 変数名
p2 : モジュール名
p3... : 初期化パラメーター
%inst
p1で指定した変数をモジュール型として要素の追加を行ないます。
p1の変数がモジュール型でない場合は、モジュール型として初期化されます。
すでにモジュール型の場合は、配列変数として新しい要素を追加していきます。
p2ですでに登録されているモジュール名を指定し、p3以降に初期化パラメーターを指定することができます。
モジュール変数は、複数の変数やデータをまとめて管理することができる新しいデータ格納方法を提供します。
^p
例 :
#module a x,y,z
^p
上の例では、aというモジュールにx,y,zという3つの変数を持たせています。
aというモジュールの型を持つ変数は、x,y,zという変数すべてを内包したものになり、モジュール処理命令(#modfunc)で扱うことが可能になります。
^p
例 :
newmod v,a
^p
上の例では、モジュール「a」のための変数vを初期化します。
これで変数vには、モジュール「a」 が持つモジュール変数x,y,zという内容が丸ごと格納されることになります。
モジュールごとに初期化のための命令(#modinit)を用意している場合は、p3以降のパラメーターが初期化命令に渡されます。
^p
例 :
#module a x,y,z
#modinit int p1,int p2,int p3
x=p1:y=p2:z=p3
return
#global
newmod v,a,1,2,3
^p
モジュール型の変数は、newmod、delmod命令で要素の操作を行なうことができるほか、 foreach命令などとともに複雑なデータを簡潔に処理することができるようになります。
%href
#modfunc
#modinit
#modterm
delmod
foreach
%index
delmod
モジュール型変数の要素削除
%group
メモリ管理命令
%prm
p1
p1 : 変数名
%inst
p1で指定したモジュール型の変数の要素を削除します。
p1は、すでにモジュール型として設定されている変数である必要があります。
^p
例 :
delmod v.1
^p
delmod命令は、#modterm命令により解放ルーチン(デストラクタ)が定義されている場合は、自動的に呼び出しを行ないます。
モジュール型の変数についての詳細は、newmod命令のヘルプやプログラミングマニュアル(hspprog.htm)を参照してください。
%href
#modterm
newmod
%index
memexpand
メモリブロックの再確保
%group
メモリ管理命令
%prm
p1,p2
p1 = 変数 : 対象となる変数
p2 = 0〜(64) : 再確保サイズ(1byte単位)
%inst
p1で指定された変数が持つメモリ領域の再確保を行ないます。
代入時などのメモリ領域確保はシステムが自動的に行なっていますが、明示的にサイズを変更する場合に使用します。
再確保を行なった場合でも、以前までの内容は保持されます。
p2で、再確保サイズを指定します。p2の値が64より小さい場合は自動的に64に合わせられます。すでに確保されているサイズよりも小さな値を指定した場合は何も行われません。
p1で指定される変数は、 文字列型(str)のように動的にメモリ確保量を変更することが可能な型である必要があります。
再確保ができない型の場合には、エラーになります。
%href
memcpy
memset
alloc
%index
ldim
ラベル型配列変数を作成
%group
メモリ管理命令
%prm
p1,p2...
p1=変数 : 配列を割り当てる変数名
p2=0〜 : 要素の最大
%inst
ラベル型の配列変数を作成します。
パラメーターは、dim命令と同様に要素の最大数を指定します。
^p
例 :
ldim a,100 ; 変数aはa(0)〜a(99)までのラベル型配列を確保します
^p
dim命令と同様に多次元配列を確保することが可能です。
多次元配列は、4次元まで確保することが可能です。
ldim命令はスクリプト内のどこででも定義・再定義することが可能です。
また、配列変数を作成すると内容はすべて「未定義」の状態にクリアされます。
^
※この命令は、マクロとしてhspdef.as内で定義されています。
%href
dim
sdim
ddim
dimtype
%index
newlab
ラベル型変数を初期化
%group
メモリ管理命令
%prm
p1,p2
p1=変数 : 初期化する変数名
p2=参照元 : 参照されるラベルまたはオプション
%inst
指定されたラベルが代入されたラベル型の変数を初期化します。
p1で、初期化される変数名を指定します。
p2で、変数に保存されるラベルの参照元を指定します。
p2にラベルを指定した場合は、ラベルが示す場所を参照元とします。
この場合は、「変数=*ラベル名」と記述した場合と変わらない動作となります。
p2に数値を指定した場合は、以下の動作を行ないます。
^
値 : 参照されるラベル
--------------------------------------------------
0 次に実行されるプログラム位置を参照する
1 次の1ステートをスキップした後に実行されるプログラム位置を参照する
^
p2が1の場合は、newlab命令の後にreturn命令が存在することを前提としています。
「newlab命令、return命令の次にあたる位置」が参照されることになります。
newlab命令は、ラベル型変数を特殊な値により初期化するためのものです。
単純なラベルの保存であれば、通常の代入文を使用する形で構いません。
%href
ldim