演算子コード
【注釈】
- i
- 定数
- x
- 変数(定数以外,実際にメモリに存在する数値。0Bに加え、キャラデータ(05or07)・アイテムデータ(0D 0x~)に格納された数値も含む)
- m
- 実行時に確保されている一時演算用アドレス(0B専用)
- また、このページでは一時演算用変数の表記として下のような独特な表現をしている。
X[nn]
Xは B,W,D のいずれかの値を取り、変数のサイズを示す。
B:'(BYTE)' 1BYTE
W:'(WORD)' 2BYTE
D:'(DWORD)' 4BYTE
nnは、メモリ上のアドレスを指す(X が W or D の場合、先頭BYTEのアドレス)。
mem |
20 |
21 |
22 |
23 |
値の範囲 |
B[20] |
|
|
|
|
0~255(-128~127) |
W[20] |
|
|
|
|
0~65535(-32768~32767) |
D[20] |
|
|
|
|
0~4294967295(-2147483648~2147483647) |
B は 1BYTE境界、W は2BYTE境界、D は4BYTE境界から使用すること!
【算術演算子】
四則演算 - 変数に対して、定数で
00・40・80■代入
定数代入演算子。
*0 *0 00 *1
にて、対象 *0 へ 定数 *1 を代入する。
【構文例】
0B 20 00 00
この例では、演算用一時アドレス B[20] に 00 を代入する。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
01・41・81■加算
定数加算代入演算子。
*0 *0 01 *1
にて、対象 *0 へ 定数 *1 を加算する。
【構文例】
0B 20 00 02 0B 00 01 08
この例では、02 で初期化した演算用一時アドレス B[20] に 08 を加算する。
結果は 0B == 0x0A
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
02・42・82■減算
定数減算代入演算子。
*0 *0 02 *1
にて、対象 *0 から 定数 *1 を減算する。
【構文例】
05 4C 42 01
この例では使用者の現在HPを1減らす。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
03・43・83■BitOR
定数 Bit OR 代入演算子。
*0 *0 03 *1
にて、対象 *0 へ 定数 *1 をbitORする。
【構文例】
05 42 03 40
この例では 使用者を“レビテート”状態にしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
04・44・84■BitAND
定数 Bit AND 代入演算子。
*0 *0 04 *1
にて、対象 *0 の値から 定数 *1 で立っていないビットを排除する。
【構文例】
05 41 04 FE
この例では 使用者の“石化”状態(01)を解除(& ~0x01)している。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
05・45・85■BitXOR
定数 Bit XOR 代入演算子。
*0 *0 05 *1
にて、対象 *0 の値から 定数 *1 で立っているビットを反転する。
【構文例】
06 17 05 01
この例では 対象の“アンデッド”特性を交互にON/OFFしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
06・46・86■乗算
定数乗算代入演算子。
*0 *0 06 *1
にて、対象 *0 の値に 定数 *1 の値を乗算する。
【構文例】
03 54 86 03
この例では使用者のY(縦移動=ジャンプ)速度を3倍にしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
07・47・87■除算
定数除算代入演算子。
*0 *0 07 *1
にて、対象 *0 の値を 定数 *1 の値で割る。
【構文例】
06 32 47 05
この例では対象の物理防御力(DF)を 1/5 にしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0で割らないよう注意。
08・48・88■剰余
定数除算余代入演算子。
*0 *0 08 *1
にて、対象 *0 の値を 定数 *1 の値で割った余りにする。
【構文例】
0B 20 08 20
この例では 一時計算用領域 B[20] にある値を 0~31 までの範囲に納めている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。0で割らないよう注意。
09・49・89■左シフト
定数 Bit左シフト 代入演算子。
ビット(2進数)で見た時、ビット列が一桁左にずれるごとに 値は2倍になる。
*0 *0 09 *1
にて、対象 *0 の値を 定数 *1 の値分、左にシフトする。
【構文例】
05 38 49 01
この例では 使用者の魔法攻撃力(MAT)を2倍している。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0A・4A・8A■右シフト
定数 Bit右シフト 代入演算子。
ビット(2進数)で見た時、ビット列が一桁右にずれるごとに 値は 1/2 になる。
*0 *0 0A *1
にて、対象 *0 の値を 定数 *1 の値分、右にシフトする。
【構文例】
06 30 4A 02
この例では 使用者の物理攻撃力(AT)を 1/4 にしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0B・4B・8B■乱数発生 - 定数で範囲指定
乱数発生。
0以上、指定した値未満の 範囲でランダムな値を 変数にセット。
*0 *0 0B *1
にて、対象 *0 の値を 0~定数 *1 までの範囲のランダムな値にする。
【構文例】
0B 20 4B FF 05 32 59 20
この例では 0~254 の値をランダムで防御力に加算している。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
四則演算 - 計算用領域に対し、変数で
0C・4C・8C■代入
計算領域へpush(積む)。
変数の値を 指定した 一時計算用アドレスにコピー。
*0 *0 0C *1
にて、演算元 *0 の値を 変数 *1 にコピーする。
【構文例】
03 33 0C 20
この例では使用者の“向き”を 一時計算用アドレス B[20] にコピーしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0D・4D・8D■加算
加算プッシュ。
変数の値を 指定した一時計算用アドレスの値に 加算。
*0 *0 0D *1
にて、演算元 *0 の値を 変数 *1 に加算する。
【構文例】
05 26 4C 20 05 2C 4D 20
この例では使用者の速さ(Agl)と運(Lck)の合計を一時計算用アドレス W[20] セットしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0E・4E・8E■減算
減算プッシュ。
変数の値を 指定した一時計算用アドレスの値から 減算。
*0 *0 0E *1
にて、演算元 *0 の値を 変数 *1 から減算する。
【構文例】
03 50 8C 20 04 50 8E 20
この例では使用者と対象のX速度の差を D[20] にセットしている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0F・4F・8F■BitOR
Bit ORプッシュ。
変数の値を 指定した一時計算用アドレスの値に OR する。
*0 *0 0F *1
にて、演算元 *0 の値を 変数 *1 へbitORする。
【構文例】
06 14 8C 20 05 14 8F 20
この例では使用者と対象の種族ビットを合わせている。
この例では余り意味はないが、例えば『存在している敵の中に1体でもアンデッドがいると発動しない』などの条件を設定可能。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
10・50・90■BitAND
Bit ANDプッシュ。
変数の値を 指定した一時計算用アドレスの値と AND する。
*0 *0 10 *1
にて、変数 *1 から、演算元 *0 で立っていないビットを排除する。
【構文例】
0B 20 00 80 06 17 10 20
この例では対象が『ボス』か調べている。
もし B[20] が 00 であればその対象はボスではない。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
11・51・91■BitXOR
Bit XORプッシュ。
変数の値を 指定した一時計算用アドレスの値と XOR する。
*0 *0 11 *1
にて、変数 *1 から、演算元 *0 で立ってるビットを反転する。
XOR を こうやって使う意味というのは計りかねるが…。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
12・52・92■乗算
x *= m;
乗算プッシュ。
変数の値を 指定した一時計算用アドレスの値と乗算。
*0 *0 12 *1
にて、変数 *1 に、演算元 *0 の値を乗算する。
【構文例】
05 18 0C 20 05 44 52 20
この例では使用者の 火属性値 に LV をかけている。
ここでは触れていないが、サイズの異なる変数を扱う時は転送先の変数(ここでは B[20])を大きい方のサイズで 00 による初期化を行っておくこと。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
13・53・93■除算
除算プッシュ。
変数の値で 指定した一時計算用アドレスの値を割る。
*0 *0 12 *1
にて、変数 *1 を、演算元 *0 の値で除算する。
【構文例】
06 30 4C 20 05 44 53 20
この例では対象の物理攻撃力を 使用者の LV で割っている。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0 で割らないよう注意。
14・54・94■剰余
除算余プッシュ。
変数の値で 指定した一時計算用アドレスの値を割った余りを出す。
…どう使えと…?
*0 *0 14 *1
にて、変数 *1 を、演算元 *0 の値で割った余りにする。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。。
0 で割らないよう注意。
15・55・95■左シフト
Bit左シフト プッシュ。
指定した一時計算用アドレスの値を変数の値分左へシフト。
*0 *0 15 *1
にて、変数 *1 を、演算元 *0 の値だけ左へbitシフトする。
これも使いどころが難しい。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
16・56・96■右シフト
Bit右シフト プッシュ。
指定した一時計算用アドレスの値を変数の値分右へシフト。
*0 *0 16 *1
にて、変数 *1 を、演算元 *0 の値だけ右へbitシフトする。
これも使いどころが難しい。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
17・57・97■乱数生成 - 変数の値で範囲指定
x = rand() % m;
指定した一時計算用アドレスに 0以上、変数の値未満の乱数をセット。
*0 *0 17 *1
にて、変数 *1 に、0~演算元 *0 の乱数値をセットする。
【構文例】
07 00 57 20
この例では 0~受けたダメージ-1 の乱数が W[20] にセットされる。
例えば、この値を 使用者MPに加算代入する?
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
四則演算 - 変数に対し、計算用領域で
18・58・98■代入
ポップ。
指定した一時計算用アドレスの値を 変数に代入。
主に結果をセットする状況で使用する。
*0 *0 18 *1
にて、対象 *0 に、変数 *1 の値をコピーする。
【構文例】
03 33 18 20
この例では B[20] の値を 使用者の向き に代入している。
あらかじめ B[20] に向きを保存しておけば、終了時にこうして元の向きに戻してやることが可能。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
19・59・99■加算
加算ポップ。
指定した一時計算用アドレスの値を 変数に加算代入。
主に結果をセットする状況で使用する。
*0 *0 19 *1
にて、対象 *0 に、変数 *1 の値を加算する。
【構文例】
05 4C 59 20
計算で求めた W[20] を使用者の現在HPに加算。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
1A・5A・9A■減算
減算ポップ。
指定した一時計算用アドレスの値を 変数に減算代入。
主に結果をセットする状況で使用する。
*0 *0 1A *1
にて、対象 *0 から、変数 *1 の値を減算する。
【構文例】
05 4E 5A 20
計算で求めた W[20] を使用者の現在MPから減算。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
1B・5B・9B■BitOR
m |= x;
Bit ORポップ。
指定した一時計算用アドレスの値を 変数に OR。
主に結果をセットする状況で使用する。
*0 *0 1B *1
にて、対象 *0 に、変数 *1 の値をBitORする。
【構文例】
05 40 9B 20
計算で求めた D[20] を使用者の状態変化へビット合成。
こういう使い方は本当は良くない(変化持続時間をセットできない為)。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
1C・5C・9C■BitAND
Bit ANDポップ。
指定した一時計算用アドレスの値を 変数と AND。
*0 *0 1C *1
にて、対象 *0 の値から、変数 *1 の立っていないBitを排除する。
【構文例】
05 40 9C 20
計算で求めた D[20] を使用者の状態変化へセット。
場合によっては状態変化が解除される。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
1D・5D・9D■BitXOR
Bit XORポップ。
指定した一時計算用アドレスの値を 変数と XOR。
*0 *0 1D *1
にて、対象 *0 から、変数 *1 の値の立っているビットを反転する。
【構文例】
05 40 9D 20
計算で求めた D[20] を使用者の状態変化へ排他的ビット合成。
えーと、修正前『エターナルドリームス』の一部なんだけど、こういう外道な真似はしちゃいけません。
斬るたびに状態がころころ変わり、石化したり治ったりと大変な事になります(その上自然治癒無し)。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
1E・5E・9E■乗算
乗算ポップ。
指定した一時計算用アドレスの値を 変数にかける。
主に結果をセットする状況で使用する。
*0 *0 1E *1
にて、対象 *0 に、変数 *1 の値を乗算する。
【構文例】
05 30 5E 20
使用者の攻撃力を W[20]倍。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
1F・5F・9F■除算
除算ポップ。
指定した一時計算用アドレスの値で 変数の値を割る。
主に結果をセットする状況で使用する。
*0 *0 1F *1
にて、対象 *0 を、変数 *1 の値で除算する。
【構文例】
07 00 5F 20
受けたダメージを 1 / W[20]倍。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0 で割らないよう注意。
20・60・A0■剰余
除算余ポップ。
指定した一時計算用アドレスの値で 変数の値を割った余りを出す。
主に結果をセットする状況で使用する。
*0 *0 20 *1
にて、対象 *0 を、変数 *1 の値で割ってその余りをセットする。
ちとサンプルは難しい。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
0 で割らないよう注意。
21・61・A1■左シフト
Bit左シフトポップ。
指定した一時計算用アドレスの値分、 変数の値を左にシフト。
主に結果をセットする状況で使用する。
*0 *0 21 *1
にて、対象 *0 を、変数 *1 の値分だけ←シフトする。
ちとサンプルは難しい。
シフト演算はちょっとした値でもべらぼうな値になるので変数によるシフトは注意が必要。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
22・62・A2■右シフト
Bit右シフトポップ。
指定した一時計算用アドレスの値分、 変数の値を右にシフト。
*0 *0 20 *1
にて、対象 *0 を、変数 *1 の値分だけ右シフトする。
主に結果をセットする状況で使用する。
ちとサンプルは難しい。
シフト演算はちょっとした値でもべらぼうな値になるので変数によるシフトは注意が必要。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
23・63・A3■乱数発生 - 計算用領域の値で範囲指定
0以上 指定した一時保存用アドレスの値未満の乱数を 変数にセット。
*0 *0 23 *1
にて、対象 *0 に、変数 *1 の値をコピーする。
【構文例】
07 04 63 20
魔法発動時の消費MPに、 0~計算で W[20] にセットされた値-1 の値をセットする。
【補足】
- 0x40 +0x80 した演算子はそれぞれ 2BYTE用・4BYTE用になる。
【比較演算子】
24・64・A4
定数と比較して 値が同一の場合 そのまま、
異なる場合、 終了 or 02 コード。
*0 *0 24 *1 02 *2 *2
にて、左辺 *0 の値と、右辺定数 *1 の値が同一でなければ *2 へジャンプ。
【構文例】
07 02 24 00 02 90 00
受けた攻撃が無属性なら真。
25・65・A5
定数と比較して 値が異なる場合 そのまま、
同一の場合、 終了 or 02 コード。
*0 *0 25 *1 02 *2 *2
にて、左辺 *0 の値と、右辺定数 *1 の値が同一なら *2 へジャンプ。
【構文例】
07 02 25 00 02 90 00
受けた攻撃が無属性でないなら真。
26・66・A6
定数のほうが大きい場合 そのまま、
小さい場合、 終了 or 02 コード。
*0 *0 26 *1 02 *2 *2
にて、左辺 *0 の値が、右辺定数 *1 の値以上なら *2 へジャンプ。
【構文例】
06 44 66 FA 02 90 00
敵のレベルが250以下なら真。
if( !(x>i) )と等価。
27・67・A7
定数のほうが小さい場合 そのまま、
大きい場合、 終了 or 02 コード。
*0 *0 27 *1 02 *2 *2
にて、左辺 *0 の値が、右辺定数 *1 の値以下なら *2 へジャンプ。
【構文例】
06 44 67 FA 02 90 00
敵のレベルが250以上なら真。
if( !(x<i) )と等価。
28・68・A8
定数のほうが大きい場合 そのまま、
小さい場合、 終了 or 02 コード。
*0 *0 28 *1 02 *2 *2
にて、左辺 *0 の値が、右辺定数 *1 の値より大きいなら *2 へジャンプ。
【構文例】
06 44 68 F0 02 90 00
敵のレベルが250未満なら真。
if( !(x>=i) )と等価。
29・69・A9
定数のほうが小さい場合 そのまま、
大きい場合、 終了 or 02 コード。
*0 *0 29 *1 02 *2 *2
にて、左辺 *0 の値が、右辺定数 *1 の値より小さいなら *2 へジャンプ。
【構文例】
06 44 69 F0 02 90 00
敵のレベルが250より上なら真。
if( !(x<=i) )と等価。
2A・6A・AA
xのビット列中にiのビットが全て含まれていれば真。
*0 *0 2A *1 02 *2 *2
にて、左辺 *0 の値を右辺定数 *1 でマスクし、の *1 のbitと一致しない場合 *2 へジャンプ。
2B・6B・AB
xのビット列中にiのビットが全て含まれていなければ真。
*0 *0 2B *1 02 *2 *2
にて、左辺 *0 の値を右辺定数 *1 でマスクし、の *1 のbitと一致する場合 *2 へジャンプ。
2C・6C・AC
xの中にiと重なるBitが立っていれば真。
*0 *0 2C *1 02 *2 *2
にて、左辺 *0 の値中に、右辺定数 *1 のbitが含まれて居ない場合 *2 へジャンプ。
2D・6D・AD
xの中にiと重なるBitが立っていなければ真。
*0 *0 2D *1 02 *2 *2
にて、左辺 *0 の値中に、右辺定数 *1 のbitが含まれている場合 *2 へジャンプ。
2E・6E・AE
余りが出る(x が i の倍数ではない)とき真。
*0 *0 2E *1 02 *2 *2
にて、左辺 *0 の値を右辺定数 *1 で割りきれない場合 *2 へジャンプ。
2F・6F・AF
余りが出ない(x が i の倍数)とき真。
*0 *0 2F *1 02 *2 *2
にて、左辺 *0 の値を右辺定数 *1 で割りきれる場合 *2 へジャンプ。
30・70・B0
24 と同じ。
*0 *0 30 *1 02 *2 *2
にて、左辺 *0 の値が右辺変数 *1 と一致しない場合 *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
31・71・B1
25 と同じ。
*0 *0 31 *1 02 *2 *2
にて、左辺 *0 の値が右辺変数 *1 と一致する場合 *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
32・72・B2
26 と同じ。
*0 *0 32 *1 02 *2 *2
にて、左辺 *0 の値が、右辺変数 *1 の値以上なら *2 へジャンプ。異なるのは 一時計算アドレスの値と 変数 を比較する点。
33・73・B3
27 と同じ。
*0 *0 33 *1 02 *2 *2
にて、左辺 *0 の値が、右辺変数 *1 の値以下なら *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
34・74・B4
28 と同じ。
*0 *0 34 *1 02 *2 *2
にて、左辺 *0 の値が、右辺変数 *1 の値より大きいなら *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
35・75・B5
29 と同じ。
*0 *0 35 *1 02 *2 *2
にて、左辺 *0 の値が、右辺変数 *1 の値より小さいなら *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
36・76・B6
2A と同じ。
*0 *0 76 *1 02 *2 *2
にて、左辺 *0 の値中に、右辺定数 *1 のbitが含まれて居ない場合 *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
37・77・B7
2B と同じ。
*0 *0 77 *1 02 *2 *2
にて、左辺 *0 の値中に、右辺変数 *1 のbitが含まれている場合 *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
38・78・B8
2C と同じ。
*0 *0 78 *1 02 *2 *2
にて、左辺 *0 の値を右辺変数 *1 でマスクし、の *1 のbitと一致しない場合 *2 へジャンプ。
異なるのは 一時計算アドレスの値と 変数 を比較する点。
39・79・B9
2D と同じ。
*0 *0 79 *1 02 *2 *2
にて、左辺 *0 の値を右辺変数 *1 でマスクし、の *1 のbitと一致する場合 *2 へジャンプ。異なるのは 一時計算アドレスの値と 変数 を比較する点。
COMMENT
- 書き写し完了。ついでに算術演算のみcontents用に見出し追加。 -- Y’s (2006-04-06 14:43:13)
- 注釈に軽く補足 -- Y’s (2007-11-13 15:10:42)
- 比較演算子26と27で構文例の「以上」と「以下」が逆なのと、250がF0だったので直してみました。FF 05 44 66 FA 02 90 00 09 BA 00 01 FF←こういうコード組んで実際に振ってみると自分のLVが250「以下」でないと剣波出ませんからね。InternetArchiveでここのデータ元の葉月サンのHPの演算子解説ページに行き確認してみても「・26 xx 値xx≧[zz]であるかを判定」 とありますので、LV(ZZ)が定数(xx)以下なら真ということで実際の挙動と合っています。 -- あーぬ (2024-03-08 19:26:48)
最終更新:2024年03月20日 13:17