MECCコード説明書(1)

 

バイト数

まず大前提として、メモリに読み書きする場合、必ずバイト数を何バイトにするのかを決めないと処理できません。
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コード説明書(1)」への1件のフィードバック

  1. ピンバック: 「MECC」という改造支援ソフト | VivaFan通信

コメントをどうぞ