「別に自分はBASICしか使わないからいいや!」ってこのページを飛ばさないでください。たとえBASICしか使わなくてもフォント書き換えやOPASなどPOKE文を使用したテクニックを使うときにはこのマシン語エリアの確保が必須となります。
なぜ、わざわざ付属のリファレンスマニュアルにも書いているようなことをわざわざここで書くかというと、あのマニュアルの説明の日本語が変(?)なためマシン語エリアの確保の方法が理解できていない人がいるためです(笑)。
まず考えなくてはいけないのはE500シリーズのメモリ構成ですが、BFC00h(「h」は16進数を示す)以降はワークエリアなのでユーザーが自由に使用できないために、必ずBFBFFhが最終アドレスとなるようにマシン語エリアは確保されます。
マシン語エリアの確保が必要なときは大きく分けて以下の2通りになります。
パターン1
例えば、1234バイト確保しなければならないとします。これを6桁の16進数で表してみてください。
HEX 1234[RETURN]としとしてみてください(画面上には4D2と表示される)
つまり、4D2hバイト確保確保するわけですが、。これを6桁で表すには頭に「0」を3つつけて「0004D2」とすればよいですね。
それを2桁ずつ区切ってやると「00」「04」「D2」となります。これを以下の(a)(b)(c)に順に当てはめていけばよいのです。
POKE &BFE03,&1A,&FD,&B,(c),(b),(a) [RETURN]つまり、「POKE &BFE03,&1A,&FD,&B,&D2,&04,&00 [RETURN] CALL &FFFD8 [RETURN]」とすればよいのです。
CALL &FFFD8 [RETURN]
パターン2
これは、既製のマシン語プログラム(マシン語エリアを確保する必要があるBASICプログラムも含む)を入力するときや自作のBASICプログラムでPOKE文で書き込むアドレスを優先して決めたいときに用いられます。
例えば、開始アドレスがBF123hの場合、最終アドレスはBFBFFhで固定なので、
BFBFFh−BF123h+1=ADDh
(※「+1」するのを忘れないように!)
となるのでADDhバイト確保すればよいことが分かります。ここまで来るとあとはパターン1と全く同じなので省略します。
パターン1の簡易版
パターン1では単位が「バイト」でしたね。これが「K」バイトだったらどうでしょうか。15Kバイトだったら、「15×1024=15360」となり、それを16進数に直して・・・というようなことをする必要は全くないのです。例えばNキロバイト確保する(ただしN<64とする)場合は次のようになります。
POKE &BFE03,&1A,&FD,&B,&00,N*4,&00 [RETURN]つまり、15Kバイト確保する場合、「POKE &BFE03,&1A,&FD,&B,&00,60,&00 [RETURN] CALL &FFFD8 [RETURN]」とすればよいのです。
CALL &FFFD8 [RETURN]
POKEという命令はは全然難しいものではありません。しかし、使いかたを誤るとメモリ上のプログラムが破壊されてしまうという危険性をもっています。しかし、マシン語エリアの確保をきっちりおこなって間違いのないよう使用する分にはそれほど神経質になる必要はないのです。ただ、POKE文を使ったプログラム(マシン語エリアの確保が必要なもの)を他人に手渡すときや一般に公表するときはそのプログラムがマシン語エリアの確保が必要なことを明確にしてその手順もしっかり明記しておく義務があるでしょう。
PSSへの対応
PSS準拠のプログラムではマシン語エリアの確保が必要な場合、プログラム内で確保ができるようにしておくことが必須になっています。これは、全く難しいものではないのです。エリア確保に必要なPOKE文とCALLを適当な行に書き加えるだけなのです(厳密に言えばこれだけだと不十分であり下記のような確認も必要になる場合もある)。でも、これだけだとどの行を実行したらよいのか分からないので「*AREA」とラベルをつけておくのです。そうすることによりプレイヤーはプログラム内部で使われているPOKE文を意識せずに「RUN*AREA[RETURN]」とするだけで、そのプログラムが使用可能になります。
マシン語エリアの確認
マシン語エリアを確保する場合メモリが足らなくて確保できないことや確保してから他のプログラムを動作させ現状のマシン語エリアがどれだけ確保しているのか分からなくなる場合があると思います。しかし、心配は無用。マシン語エリアの開始アドレスはBFD1Ahからの3バイトに下位、中位、上位と記録されています。
A=PEEK &BFD1A
B=PEEK &BFD1B
C=PEEK &BFD1C
PRINT HEX$ C;RIGHT$ ("0"+HEX$ B,2);RIGHT$ ("0"+HEX$ A,2)
とすれば、現在のマシン語エリアの開始アドレスが分かります。
マシン語エリアを多く確保しなくてはならない場合、メモリ不足により確保されないことも十分考えられるので注意が必要です。確保の際にメモリが足りない場合であってもエラーメッセージは出ないために一見正常に確保の動作が行われてる(リセットしてメニュー画面表示が行われる)ように見えて確保されないのです。(確保はキャンセルされ現状を維持)
なお、PSS準拠のプログラムでは多くのマシン語エリアの確保(概ね10KB以上)が必要な場合はプログラム内で正常に確保されているかどうかをチェックする機能を推奨しています。それは、万一確保されてない場合にプログラムが破壊されてしまう可能性が高いからです。