Module
(HSP3.1)
システムのスタックを使わないgosub †
goto 命令とラベル型変数を使った gosub, return の互換命令を使用可能にします。
標準の gosub 命令と異なりシステムのスタックを使わないのでメモリの許す限り多重呼び出しができます。
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
|
|
#ifndef __M_NS_GOSUB__
#define global __M_NS_GOSUB__
#module __M_NS_GOSUB
#deffunc SetRetStat@__M_NS_GOSUB var p1
return p1
#define global ns_gosub( %1 ) \
%ttag_ns_gosub \
ns_stack@__M_NS_GOSUB( ns_sublev@__M_NS_GOSUB ) = *%i : ns_sublev@__M_NS_GOSUB++ : \
goto %1 : *%o
#define global ns_return( %1 = stat ) \
ns_retstat@__M_NS_GOSUB = %1 : SetRetStat@__M_NS_GOSUB ns_retstat@__M_NS_GOSUB : \
ns_sublev@__M_NS_GOSUB-- : goto ns_stack@__M_NS_GOSUB( ns_sublev@__M_NS_GOSUB )
#define global ns_sublev ns_sublev@__M_NS_GOSUB
#global
dimtype ns_stack@__M_NS_GOSUB, vartype( "label" ), 256
#endif
#if 0
maxlev = 0
limlev = 100
mes "test start"
ns_gosub *test
mes "test end"
stop
*test
if ( maxlev < ns_sublev ) { maxlev = ns_sublev : title "" + maxlev }
if ( maxlev < limlev ) { ns_gosub *test }
ns_return
#endif
|