バイト数
まず大前提として、メモリに読み書きする場合、必ずバイト数を何バイトにするのかを決めないと処理できません。
PARコードでも、必ず書き込みバイト数が決められています。
MECCコードでも、この処理するバイト数が一番重要な事項になっています。
MECCコードの動作は、1行ごとに、
A:処理バイト数の決定(全ての項のバイト数の最大に合わせる) ↓ R:読み出し ↓ C:計算 ↓ W:書き込み
の基本4サイクルで動いていると思われます。(便宜的に名前をつけています)
そして、Aで決まった処理バイト数が、後のR・C・W全ての処理に対して制限を加えます。
※意図的に処理バイト数を明示した場合を除く
ポイントは、Cの計算処理にも、Aの処理バイト数が影響していることです。
当初は、このAの処理の存在が、見え隠れしていたために悩みました。
※計算に関しては次回します
ですが、3.110以降1本筋の通った仕様になっていますので、ここさえ押さえてしまえば、MECCコードが非常に理解しやすくなっていると思います。
例えば、
【例1】00XXXX @00YYYY - 01
この行で、MECCの動作を脳内トレースしてみると、
A処理
@00YYYY:可変項(他項のバイト数に合わせるが、可変項のみの場合は1バイト)
01:1バイトの16進数
→処理バイト数を「1」に決定(全ての項のバイト数の最大に合わせる)
R処理
@00YYYY:00YYYYから「1」バイトの数値を読み出す
C処理
@00YYYY – 01:「1」バイト数値同士で計算して結果を出す
W処理
00XXXX:求めた結果を00XXXXに「1」バイトで書き込む
という具合です。
もう1つ似た例で、
【例2】00XXXX @00YYYY - 0001
の場合ですと、
A処理
@00YYYY:可変項(他項のバイト数に合わせるが、可変項のみの場合は1バイト)
0001:2バイトの16進数
→処理バイト数を「2」に決定(全ての項のバイト数の最大に合わせる)
R処理
@00YYYY:00YYYYから「2」バイトの数値を読み出す
C処理
@00YYYY – 0001:「2」バイト数値同士で計算して結果を出す
W処理
00XXXX:求めた結果を00XXXXに「2」バイトで書き込む
となります。
この例2で、00YYYYが1バイトデータのメモリだった場合は、
【例3】00XXXX 1@00YYYY - 0001
と書きます。
A処理
1@00YYYY:1バイト読出し
0001:2バイトの16進数
→処理バイト数を「2」に決定(全ての項のバイト数の最大に合わせる)
R処理
1@00YYYY:00YYYYから「1」バイトの数値を読み出して「2」バイト数値にする。
・処理バイト数は「2」ですが、直接指定した「1」バイト指定が優先します。
・読み出した1バイトデータを、処理バイト数の「2」バイトに合わせます。
C処理
1@00YYYY – 0001:「2」バイト数値同士で計算して結果を出す
W処理
00XXXX:求めた結果を00XXXXに「2」バイトで書き込む
となります。
ここで「@00YYYY系」の書式をまとめますと、
@00YYYY:可変バイト数読出し 1@00YYYY:1バイト読出し 2@00YYYY:2バイト読出し 3@00YYYY:3バイト読出し 4@00YYYY:4バイト読出し
です。
逆に、例1で、00XXXXが2バイトデータのメモリだった場合は、
【例4】00XXXX @00YYYY - 01; SIZE=2;
と「Size=」オプションを付けて、書き込みバイト数を2バイトに変更します。
A処理
@00YYYY:可変項(他項のバイト数に合わせるが、可変項のみの場合は1バイト)
01:1バイトの16進数
→処理バイト数を「1」に決定(全ての項のバイト数の最大に合わせる)
R処理
@00YYYY:00YYYYから「1」バイトの数値を読み出す
C処理
@00YYYY – 01:「1」バイト数値同士で計算して結果を出す
W処理
00XXXX:求めた結果を00XXXXに「2」バイトで書き込む
・処理バイト数は「1」ですが、Size=指定があるとそのバイト数で書き込まれます。
「SIZE=系」の書式をまとめますと、
SIZE=1:1バイト書込み SIZE=2:2バイト書込み SIZE=3:3バイト書込み SIZE=4:4バイト書込み
となります。
例4は、例3と同じように見えますが、例3では計算が2バイトになるため、
状況によっては書き込まれる数値が変わってきます。
※計算に関しては次回します
バイト数、最後は「VALUE系」です。例えば、
【例5】00XXXX @00XXXX - 01 【例6】00XXXX 2@00XXXX - 01
このように、書き込むアドレスと読み出すアドレスが一緒の場合、
【例5’】00XXXX VALUE - 01 【例6’】00XXXX VALUE_2 - 01
と、読出し側のアドレスを省略して書くことができます。
VALUE系には、「VALUE」「VALUE_1」「VALUE_2」「VALUE_3」「VALUE_4」の、
5種類の書き方がありますが、それぞれ、
VALUE = @00XXXX:可変バイト数読み出し(MECC3.121以降) VALUE_1=1@00XXXX:1バイト読み出し VALUE_2=2@00XXXX:2バイト読み出し VALUE_3=3@00XXXX:3バイト読み出し VALUE_4=4@00XXXX:4バイト読み出し
のように対応しています。
いずれも、読出し命令を簡略記述するための書き方であって、書込みバイト数
を決定する命令ではありません。
これに関しては、サイトにも記述がありますが、例えば、
【例3’】00XXXX VALUE_1 - 0001
と書いた場合、
A処理
VALUE_1:1バイト読出し
0001:2バイトの16進数
→処理バイト数を「2」に決定(全ての項のバイト数の最大に合わせる)
R処理
VALUE_1:00XXXXから「1」バイトの数値を読み出して「2」バイト数値にする。
・処理バイト数は「2」ですが、直接指定した「1」バイト指定が優先します。
C処理
VALUE_1 – 0001:「2」バイト数値同士で計算して結果を出す
W処理
00XXXX:求めた結果を00XXXXに「2」バイトで書き込む
というように、1バイトを読み出したアドレスに2バイトで書き込みます。
1バイトで書き戻したい時には「SIZE=1」オプションを付けます。
以上、基本形の整理で終わってしまいましたが、おそらく大きく間違っては
いないと思います。
※バイト数に関係する「SIZE文」の話は変数の話の頃にします。
次はこれらを踏まえた上で、計算とMAX・MINオプションに関して整理しながら、
もう少し具体的な話になると思います。
ピンバック: 「MECC」という改造支援ソフト | VivaFan通信