このページの目次

式の処理

式は !=^Expression とすると式の値を ebx レジスタに返すコードを生成します。rvtl は演算子に優先順位がなく左から右に順に評価するため、比較的簡単にコード生成できます。

  式=項+項[+項...]

   +の部分には色々な演算子が入ります。

「括弧で囲まれた式」は「項」となります。また配列は「項」ですがインデックスは「式」であるため、再帰呼び出しを考えたコードを生成する必要があります。

項は式の最小単位で eax レジスタに値を返すコードを生成します。

項の処理

rvtlのコマンドは式の値を変数に代入する形式が基本となっています。したがって、いろいろな機能を式に埋め込む必要があるため、項には演算以外の機能があります。

16480 :----------------------------------------------------------
16490 :  項の処理
16500 :  値を eax に返す。ebx を保存する必要がある
16510 :----------------------------------------------------------
16520 ^Term
16530    ;=D>1 "<Term>"
16540    c=C(I) I=I+1
16550    ;=((c>='0')&(c<='9'))+(c='$') !=^TermNum #=^TermExit
16560    ;=(c=$27) !=^TermChar    #=^TermExit  : '
16570    ;=(c='(') !=^TermBracket #=^TermExit
16580    ;=(c='`') !=^TermRandom  #=^TermExit
16590    ;=(c='-') !=^TermNeg     #=^TermExit
16600    ;=(c='+') !=^TermAbs     #=^TermExit
16610    ;=(c='@') !=^TermRealKey #=^TermExit
16620    ;=(c=';') !=^TermPop     #=^TermExit
16630    ;=(c='^') !=^TermLabel   #=^TermExit
16640    ;=(c='.') !=^TermWinSize #=^TermExit
16650    ;=(c='_') !=^TermTime    #=^TermExit
16660    ;=(c='?') !=^TermInput   #=^TermExit
16670    ;=(c='\') !=^TermArg     #=^TermExit
16680    !=^TermVar : その他の変数,配列参照
16690 ^TermExit
16700 ]
16710 :

1行入力

入力された行のバッファ先頭アドレスを eax に返すコードを生成します。

13660 :----------------------------------------------------------
13670 : 1行入力 =$$ バッファ先頭アドレスを返す
13680 :----------------------------------------------------------
13690 ^LineInput
13700    ;=D>1 "<LineInput>"
13710    I=I+1
13720    !=^PushBX
13730    : eax:バッファサイズ, ebx:バッファ先頭
13740    : eax に入力文字数を返す
13750    +=43     !=^CallLib            : StringInput
13760    +=$C931  !=^PutObj2            : XOR ECX,ECX
13770    !=^XchgAXBX                    : eax バッファ先頭
13780    +=$B1    !=^PutObj1            : MOV CL, '%'
13790    +='%'    !=^PutObj1
13800    +=$89    !=^PutObj1            : MOV [ESI+ECX*4],EBX
13810    +=$8E1C  !=^PutObj2
13820    !=^PopBX
13830 ]
13840 :

1文字入力

入力された文字コードを eax に返すコードを生成します。

13850 :----------------------------------------------------------
13860 : 1文字入力 =$
13870 :----------------------------------------------------------
13880 ^CharInput
13890    ;=D>1 "<CharInput>"
13900    +=22 !=^CallLib                : CALL InChar
13910 ]
13920 :

数値

ソースから10進定数、16進定数を読んで値を eax に設定するコードを生成します。文字入力($)、行入力($$)の場合は、それぞれCharInput、LineInputに処理を渡します。

13930 :----------------------------------------------------------
13940 : 項 数値
13950 :----------------------------------------------------------
13960 ^TermNum
13970    +r
13980    ;=(c='$')&(C(I)='$') !=^LineInput -r ]
13990    ;=(c='$')&((C(I)=' ')|(C(I)=0)) !=^CharInput -r ]
14000    ;=D>1 "<Num>"
14010    I=I-1
14020    !=^GetNo
14030    ;=C(I-1)='$' ]
14040    +=$B8 !=^PutObj1               : MOV  EAX,r
14050    +=r !=^PutObj4
14060    -r
14070 ]
14080 :

文字定数

文字定数(1-4バイト)を eax に設定するコードを生成します。

14090 :----------------------------------------------------------
14100 : 項 1文字
14110 :----------------------------------------------------------
14120 ^TermChar
14130    +r
14140    ;=D>1 "<Char>"
14150    r=0
14160    @
14170      c=C(I)
14180      ;=c<>$27 r=r<<8+c
14190      I=I+1
14200    @=(c=$27)
14210    +=$B8 !=^PutObj1               : MOV  EAX,r
14220    +=r !=^PutObj4
14230    -r
14240 ]
14250 :

カッコ

式の左側(処理済み)はebxに入っているので、ebx をスタックに退避(push ebx)した後、式の処理を行い、結果をEAXに転送して、ebx を復帰(pop ebx)します。

14260 :----------------------------------------------------------
14270 : 項 括弧
14280 :----------------------------------------------------------
14290 ^TermBracket
14300    ;=D>1 " ("
14310    !=^PushBX
14320    !=^Expression
14330    !=^XchgAXBX
14340    !=^PopBX
14350    ;=D>1 ") "
14360    ;=(C(I)<>')') !=^Com_Error : ERROR_CLOSE_BRACKET
14370    I=I+1
14380 ]
14390 :

乱数

Mersenne Twister で生成した整数を eax に返すコードを生成します。

14400 :----------------------------------------------------------
14410 : 項 乱数
14420 :----------------------------------------------------------
14430 ^TermRandom
14440    ;=D>1 "<Rand>"
14450    +=36 !=^CallLib                : CALL genrand
14460 ]
14470 :

項の処理をした後、正負を反転するコードを生成します。

14480 :----------------------------------------------------------
14490 : 項 負
14500 :----------------------------------------------------------
14510 ^TermNeg
14520    ;=D>1 "<Neg>"
14530    !=^Term
14540    +=$D8F7 !=^PutObj2             : NEG EAX
14550 ]
14560 :

絶対値

項の処理をした後、絶対値を求め eax に設定するコードを生成します。

14570 :----------------------------------------------------------
14580 : 項 絶対値
14590 :----------------------------------------------------------
14600 ^TermAbs
14610    ;=D>1 "<Abs>"
14620    !=^Term
14630    +=$C009 !=^PutObj2             : OR EAX,EAX
14640    +=$027D !=^PutObj2             : JAE  02
14650    +=$D8F7 !=^PutObj2             : NEG EAX
14660 ]
14670 :

数値入力

入力された数値を eax に返すコードを生成します。

14680 :----------------------------------------------------------
14690 : 項 数値入力
14700 :----------------------------------------------------------
14710 ^TermInput
14720    ;=D>1 "<NumInput>"
14730    !=^PushBX
14740    +=42 !=^CallLib                : CALL NumInput
14750    !=^XchgAXBX                    : eax = number
14760    !=^PopBX
14770 ]
14780 :

リアルタイム文字入力

キーが押されていたら押された文字コードを eax に返すコードを生成します。

14790 :----------------------------------------------------------
14800 : 項 リアルタイム文字入力
14810 :----------------------------------------------------------
14820 ^TermRealKey
14830    ;=D>1 "<RealKey>"
14840    +=30 !=^CallLib                : CALL RealKey
14850 ]
14860 :

変数スタック取出し

変数スタックのトップを取り出して eax に設定するコードを生成します。

14870 :----------------------------------------------------------
14880 : 項 変数スタック Pop
14890 :----------------------------------------------------------
14900 ^TermPop
14910    ;=D>1 "<pop>"
14920    +=$C781 !=^PutObj2             : ADD EDI,4
14930    +=04    !=^PutObj4
14940    +=$078B !=^PutObj2             : MOV EAX,[EDI]
14950 ]
14960 :

ラベル参照

GOTO(#=)やGOSUB(!=)の飛び先をラベルとした場合、ラベル宣言した行の次の行のアドレスを eax に返すコードを生成します。

14970 :----------------------------------------------------------
14980 : 項 ラベル     ラベル文字列 最大11文字まで
14990 :----------------------------------------------------------
15000 ^TermLabel
15010    +nr
15020    ;=D>1 "<Label>"
15030    r=0
15040    ;=Q=1 @ I=I+1 @=((C(I)=' ')|(C(I)=0))
15050    ;=Q>1 !=^SearchLabel n=r+1     : ラベルの次行を探す
15060    ;=r<0 / "Label not Found!" !=^Com_Error
15070    ;=Q>1 !=^SearchLine
15080    +=$B8 !=^PutObj1               : MOV  EAX,r
15090    +=r !=^PutObj4
15100    -rn
15110 ]
15120 :

ウィンドウサイズ取得

現在使用しているコンソールの桁数を eax の上位16ビット、行数を eax の下位16ビットに返すコードを生成します。

15130 :----------------------------------------------------------
15140 : 項 ウィンドウサイズ
15150 :----------------------------------------------------------
15160 ^TermWinSize
15170    ;=D>1 "<WinSize>"
15180    +=31 !=^CallLib                : WinSize
15190 ]
15200 :

時刻取得

現在時刻(UNIX時間:1970年1月1日から経過した秒数)が eax に返ります。マイクロ秒を変数%に代入します。

15210 :----------------------------------------------------------
15220 : 項 時間
15230 :----------------------------------------------------------
15240 ^TermTime
15250    ;=D>1 "<Time>"
15260    +=37 !=^CallLib                : GetTime
15270    +=$C889  !=^PutObj2            : MOV EAX,ECX
15280    +=$C931  !=^PutObj2            : XOR ECX,ECX
15290    +=$B1    !=^PutObj1            : MOV CL, '%'
15300    +='%'    !=^PutObj1
15310    +=$89    !=^PutObj1            : MOV [ESI+ECX*4], EDX
15320    +=$8E14  !=^PutObj2
15330 ]
15340 :

コマンドライン引数参照

指定した番号のコマンドライン引数文字列の先頭アドレスを eax に返すコードを生成します。「\0」とした場合には1番目のコマンドライン引数文字列(argv[1])が返ります。

15350 :----------------------------------------------------------
15360 : 項 コマンドライン引数
15370 :----------------------------------------------------------
15380 ^TermArg
15390    ;=(c='\')&(C(I)='\') !=^TermEnv ]
15400    +r
15410    ;=D>1 "<Arg>"
15420    !=^PushBX
15430    !=^Expression
15440    +=$43    !=^PutObj1            : INC EBX (argv[1]から)
15450    +=44     !=^CallLib            : GetArg
15460    !=^PopBX
15470    -r
15480 ]
15490 :

環境変数参照

指定した番号の環境変数文字列の先頭アドレスを eax に返すコードを生成します。

15500 :----------------------------------------------------------
15510 : 項 環境変数
15520 :----------------------------------------------------------
15530 ^TermEnv
15540    ;=D>1 "<Env>"
15550    I=I+1
15560    +r
15570    !=^PushBX
15580    !=^Expression
15590    +=45     !=^CallLib            : GetEnv
15600    !=^PopBX
15610    -r
15620 ]
15630 :

変数と配列

変数の値または配列の値を eax に設定するコードを生成します。配列の参照は、最初に ebx をスタックに退避した後、配列のインデックスの式を処理します。配列のサイズを乗じた後、配列変数の内容(アドレス)に加えたアドレスから読み出したものを eax に転送します。最後に ebx を復帰します。

15640 :----------------------------------------------------------
15650 : 配列 1バイト : 値を EAX に返す
15660 :----------------------------------------------------------
15670 ^Array1
15680    +c
15690    ;=D>1 "<Array1>"
15700    !=^PushBX
15710    !=^Expression
15720    -c
15730    +=$8E8B  !=^PutObj2
15740    +=c*4    !=^PutObj4             : MOV ECX,[ESI+c*4]
15750    +=$C031  !=^PutObj2             : XOR EAX, EAX
15760    +=$8A    !=^PutObj1
15770    +=$1904  !=^PutObj2             : MOV AL,[ECX+EBX*4]
15780    !=^PopBX
15790    I=I+1
15800 ]
15810 :
15820 :----------------------------------------------------------
15830 : 配列 2バイト : 値を EAX に返す
15840 :----------------------------------------------------------
15850 ^Array2
15860    +c
15870    ;=D>1 "<Array2>"
15880    !=^PushBX
15890    !=^Expression
15900    -c
15910    +=$8E8B  !=^PutObj2
15920    +=c*4    !=^PutObj4             : MOV ECX,[ESI+c*4]
15930    +=$C031  !=^PutObj2             : XOR EAX, EAX
15940    +=$8B66  !=^PutObj2
15950    +=$5904  !=^PutObj2             : MOV AX,[ECX+EBX*4]
15960    !=^PopBX
15970    I=I+1
15980 ]
15990 :
16000 :----------------------------------------------------------
16010 : 配列 4バイト : 値を EAX に返す
16020 :----------------------------------------------------------
16030 ^Array4
16040    +c
16050    ;=D>1 "<Array4>"
16060    !=^PushBX
16070    !=^Expression
16080    -c
16090    +=$8E8B  !=^PutObj2
16100    +=c*4    !=^PutObj4             : MOV ECX,[ESI+c*4]
16110    +=$8B    !=^PutObj1
16120    +=$9904  !=^PutObj2             : MOV EAX,[ECX+EBX*4]
16130    !=^PopBX
16140    I=I+1
16150 ]
16160 :
16170 :----------------------------------------------------------
16180 : 変数の冗長部分の読み飛ばし
16190 :   英文字以外の最初の文字がIに返る
16200 :----------------------------------------------------------
16210 ^SkipAlfa
16220    +c
16230    I=I-1
16240    @
16250      I=I+1 c=C(I)
16260    @=(((c<'A')+(c>'Z'))&((c<'a')+(c>'z')))
16270    -c
16280 ]
16290 :
16300 :----------------------------------------------------------
16310 : 変数項 : 値を EAX に返す cに変数名
16320 :----------------------------------------------------------
16330 ^TermVar
16340    +d
16350    ;=D>1 "<Var>"
16360    !=^SkipAlfa
16370    d=C(I)
16380    ;=(d='(') I=I+1 !=^Array1 #=^var     : Array 1 byte
16390    ;=(d='{') I=I+1 !=^Array2 #=^var     : Array 2 byte
16400    ;=(d='[') I=I+1 !=^Array4 #=^var     : Array 4 byte
16410    +=$868B !=^PutObj2             : Simple Var
16420    +=c*4 !=^PutObj4               : MOV EAX,[ESI + c]
16430  ^var
16440    : I=I+1
16450    -d
16460 ]
16470 :

式の値(項と項を演算した結果)を ebx レジスタに値を返すコードを生成します。

式の処理

演算子の左側の項(または複数の項間の演算)の値を ebx に置き、右側の項の値を eax に設定して演算、結果を ebx に残すコードを生成します。

18360 :----------------------------------------------------------
18370 :  式の処理                   項 + 項
18380 :  前の項の値を ebx にコピーし、eax に変える次の項の値と演算、
18390 :  結果を ebx に返すコードを生成
18400 :----------------------------------------------------------
18410 ^Expression
18420    ;=D>1 "<Expr>"
18430    +f
18440    !=^Term               : 1st term --> AX
18450    !=^XchgAXBX           : BX <-----> AX
18460    f=0
18470    @
18480      c=C(I) I=I+1
18490      ;=(c='+') !=^ExpAdd   #=^exp
18500      ;=(c='-') !=^ExpSub   #=^exp
18510      ;=(c='*') !=^ExpMul   #=^exp
18520      ;=(c='/') !=^ExpDiv   #=^exp
18530      ;=(c='=') !=^ExpEqu   #=^exp
18540      ;=(c='|') !=^ExpOr    #=^exp
18550      ;=(c='&') !=^ExpAnd   #=^exp
18560      ;=(c='^') !=^ExpXor   #=^exp
18570      ;=(c='\') !=^ExpUDiv  #=^exp
18580      ;=(c='<') !=^ExpLess  #=^exp
18590      ;=(c='>') !=^ExpGreater  #=^exp
18600      I=I-1
18610      f=1       : end of expresion
18620      ^exp
18630    @=(f)
18640    -f
18650 ]
18660 :

演算

一般的な演算を行います。

加算

これまで演算を行った式の左側(ebx)と右側の項(eax)を加算します。

16720 :----------------------------------------------------------
16730 :  式 加算
16740 :----------------------------------------------------------
16750 ^ExpAdd
16760    ;=D>1 "<+>"
16770    !=^Term                        : 2nd term --> EAX
16780    +=$C301 !=^PutObj2             : ADD EBX,EAX
16790 ]
16800 :
減算

これまで演算を行った式の左側(ebx)から右側の項(eax)を減算します。

16810 :----------------------------------------------------------
16820 :  式 減算
16830 :----------------------------------------------------------
16840 ^ExpSub
16850    ;=D>1 "<->"
16860    !=^Term                        : 2nd term --> EAX
16870    +=$C329 !=^PutObj2             : SUB EBX,EAX
16880 ]
16890 :
乗算

これまで演算を行った式の左側(ebx)と右側の項(eax)を乗算します。

16900 :----------------------------------------------------------
16910 :  式 乗算
16920 :----------------------------------------------------------
16930 ^ExpMul
16940    ;=D>1 "<*>"
16950    !=^Term                        : 2nd term --> EAX
16960    !=^XchgAXBX
16970    +=$EBF7 !=^PutObj2             : IMUL EBX
16980    !=^XchgAXBX
16990 ]
17000 :
除算

これまで演算を行った式の左側(ebx)を右側の項(eax)で除算します。商を eax、剰余を「%」に設定します。

17010 :----------------------------------------------------------
17020 :  式 除算
17030 :----------------------------------------------------------
17040 ^ExpDiv
17050    ;=D>1 "</>"
17060    !=^Term                        : 2nd term --> EAX
17070    !=^XchgAXBX
17080    +=$99    !=^PutObj1            : CDQ
17090    +=$FBF7  !=^PutObj2            : IDIV EBX
17100    +=$C931  !=^PutObj2            : XOR ECX,ECX
17110    +=$B1    !=^PutObj1            : MOV CL, '%'
17120    +='%'    !=^PutObj1
17130    +=$89    !=^PutObj1            : MOV [ESI+ECX*4], EDX
17140    +=$8E14  !=^PutObj2
17150    !=^XchgAXBX
17160 ]
17170 :
無符号除算

これまで演算を行った式の左側(ebx)を右側の項(eax)で無符号除算します。商を eax、剰余を「%」に設定します。

17180 :----------------------------------------------------------
17190 :  式 無符号除算 \
17200 :----------------------------------------------------------
17210 ^ExpUDiv
17220    ;=D>1 "<\>"
17230    !=^Term                        : 2nd term --> EAX
17240    !=^XchgAXBX
17250    +=$D231  !=^PutObj2            : XOR EDX,EDX
17260    +=$F3F7  !=^PutObj2            : DIV EBX
17270    +=$C931  !=^PutObj2            : XOR ECX,ECX
17280    +=$B1    !=^PutObj1            : MOV CL, '%'
17290    +='%'    !=^PutObj1
17300    +=$89    !=^PutObj1            : MOV [ESI+ECX*4], EDX
17310    +=$8E14  !=^PutObj2
17320    !=^XchgAXBX
17330 ]
17340 :
OR

これまで演算を行った式の左側(ebx)と右側の項(eax)のビット論理和を求めます。

17350 :----------------------------------------------------------
17360 :  式 OR
17370 :----------------------------------------------------------
17380 ^ExpOr
17390    ;=D>1 "<|>"
17400    !=^Term    : 2nd term --> EAX
17410    +=$C309 !=^PutObj2             : OR EBX, EAX
17420 ]
17430 :
AND

これまで演算を行った式の左側(ebx)と右側の項(eax)のビット論理積を求めます。

17440 :----------------------------------------------------------
17450 :  式 AND
17460 :----------------------------------------------------------
17470 ^ExpAnd
17480    ;=D>1 "<&>"
17490    !=^Term                        : 2nd term --> EAX
17500    +=$C321 !=^PutObj2             : AND EBX,EAX
17510 ]
17520 :
XOR

これまで演算を行った式の左側(ebx)と右側の項(eax)の排他的論理和を求めます。

17530 :----------------------------------------------------------
17540 :  式 XOR
17550 :----------------------------------------------------------
17560 ^ExpXor
17570    ;=D>1 "<^>"
17580    !=^Term                        : 2nd term --> EAX
17590    +=$C331 !=^PutObj2             : XOR EBX,EAX
17600 ]
17610 :
比較演算

「<」と「>」は比較だけでなくシフト演算にも使うため少し複雑です。比較演算は演算結果が真なら「1」、偽なら「0」を返します。

17620 :----------------------------------------------------------
17630 :  比較演算子
17640 :    >, >=, <, <=, <>, =
17650 :    ebx と eax を比較して値を ebx に返すコードを生成
17660 :----------------------------------------------------------
17670 ^OpRelative
17680    -w
17690    +=$C339 !=^PutObj2             : CMP EBX,EAX
17700    +=$BB   !=^PutObj1             : MOV EBX,0001
17710    +=$0001 !=^PutObj4
17720    +=w     !=^PutObj1             : Jcc 02 (skip xor)
17730    +=$02   !=^PutObj1
17740    +=$DB31 !=^PutObj2             : XOR EBX,EBX
17750 ]
17760 :
17770 :----------------------------------------------------------
17780 :  式 比較 等しい
17790 :----------------------------------------------------------
17800 ^ExpEqu
17810    ;=D>1 "<=>"
17820    !=^Term
17830    +=$74
17840    !=^OpRelative                  : JZ
17850 ]
17860 :
17870 :----------------------------------------------------------
17880 :  式 比較 より小さい <, <=, <<, <>
17890 :----------------------------------------------------------
17900 ^ExpLess
17910    ;=D>1 "<<->"
17920    c=C(I)
17930    ;=(c='>') I=I+1 !=^Term +=$75 !=^OpRelative ] : JNZ
17940    ;=(c='=') I=I+1 !=^Term +=$7E !=^OpRelative ] : JLE
17950    ;=(c='<') I=I+1 !=^Term !=^ShiftLeft ]
17960    !=^Term +=$7C !=^OpRelative    : JL
17970 ]
17980 :
18250 :----------------------------------------------------------
18260 :  式 比較 より大きい >, >=, >>
18270 :----------------------------------------------------------
18280 ^ExpGreater
18290    ;=D>1 "<>->"
18300    c=C(I)
18310    ;=(c='=') I=I+1 !=^Term +=$7D !=^OpRelative ]   : JGE xx
18320    ;=(c='>') I=I+1 !=^Term !=^ShiftRight ]
18330    !=^Term +=$7F !=^OpRelative    : JG  xx
18340 ]
18350 :
シフト

シフト演算を行います。シフト量が32ビットを超える場合は ebx の値を0にします。

17990 :----------------------------------------------------------
18000 :  式 右シフト >>
18010 :----------------------------------------------------------
18020 ^ShiftRight
18030     +=$C189 !=^PutObj2            : MOV ECX, EAX
18040     +=$80   !=^PutObj1            : CMP CL, 32
18050     +=$20F9 !=^PutObj2
18060     +=$7E   !=^PutObj1            : JLE 02
18070     +=$02   !=^PutObj1
18080     +=$DB31 !=^PutObj2            : XOR EBX,EBX
18090     +=$EBD3 !=^PutObj2            : SHR EBX,CL
18100 ]
18110 :
18120 :----------------------------------------------------------
18130 :  式 左シフト <<
18140 :----------------------------------------------------------
18150 ^ShiftLeft
18160     +=$C189 !=^PutObj2            : MOV ECX, EAX
18170     +=$80   !=^PutObj1            : CMP CL, 32
18180     +=$20F9 !=^PutObj2
18190     +=$7E   !=^PutObj1            : JLE 02
18200     +=$02   !=^PutObj1
18210     +=$DB31 !=^PutObj2            : XOR EBX,EBX
18220     +=$E3D3 !=^PutObj2            : SHL EBX, CL
18230 ]
18240 :

少しだけ最適化

xchg eax,ebx が連続する場合と、pop ebx, push ebx と連続する場合は命令を出力しません。

13430 :----------------------------------------------------------
13440 : EBX(式の結果)を退避
13450 :----------------------------------------------------------
13460 ^XchgAXBX
13470    ;=Obj(P-1)=$93 P=P-1 ]         : if XCHG  EAX,EBX
13480    +=$93 !=^PutObj1               : XCHG  EAX,EBX
13490 ]
13500 :
13510 :----------------------------------------------------------
13520 : EBX(式の結果)を退避 PUSH EBX
13530 :----------------------------------------------------------
13540 ^PushBX
13550    ;=Obj(P-1)=$5B P=P-1 ]         : if POP EBX
13560    +=$53 !=^PutObj1               : PUSH EBX
13570 ]
13580 :
13590 :----------------------------------------------------------
13600 : EBX(式の結果)を復帰 POPH EBX
13610 :----------------------------------------------------------
13620 ^PopBX
13630    +=$5B !=^PutObj1               : PUSH EBX
13640 ]
13650 :

[前] [目次] [次]