3Dダンジョンロールプレイングゲーム 第26.5回目です。
またか!?と、思われるかも知れませんが、またです。
今回は私のハンドアセンブルのやり方、BASICのDATA文をPOKEでマシン語に書き込んでいくやり方の上限にぶつかりました。
どういうことか?
この説明をするには、MSXのメモリマップの説明が必要になります。
MSXのメモリマップを図にします。(64kb)
エリア名 | 説明 |
BASICインタプリタ | 主にBASIC言語のプログラムを翻訳しながら実行するためのプログラムが入っているエリア。 |
テキストエリア | BASIC言語のプログラムが入るエリア。プログラムが大きくなればなるほど、矢印方向に広がっていく。 |
変数エリア | 使用された変数の値などの情報が入るエリア。プログラムが実行され新しい変数が使用されるたびに、矢印方向に広がっていく。 |
フリーエリア | 空きエリア。BASIC言語のプログラムが大きくなったり、変数をたくさん使ったり、CLEAR文で文字列エリアを大きく取ったりして、このエリアがなくなると「Out Of Memory」エラーとなる。 |
文字列エリア | 文字変数の内容である文字列が入るエリア。CLEAR文で文字列エリアの大きさが決められ、大きく取れば取るほど、矢印方向に広がっていく。 |
マシン語エリア(ユーザーエリア) | 主にマシン語のプログラムを入れるのに使うエリア。CLEAR文で大きさを決められる。 |
ワークエリア | BASICがプログラムを実行中に色々なことに使うエリア。 |
今作は、&HC000からマシン語のプログラムに使うので、テキストエリア〜文字列エリアが&H8000~&HBFFFまでしか使えません。
しかし、私のハンドアセンブル方法では、BASIC言語のプログラムが長くなり、テキストエリア〜文字列エリアの部分が&HC000に達してしまい、マシン語エリアを侵食し暴走してしまいました。
追加でプログラムを組み込んで、テスト実行した際暴走するので、ただのプログラムミスだと思い込み、ありもしないプログラミングミスをしばらく探していました。
今回はMSXプログラミングが久しぶりだったので、この上限に達した状態だと気付くのに時間が掛かりました。
昔ならすぐに察する事が出来たと思います。(大体&HCD00くらいが一旦の上限。)
解決法は簡単。
マシン語プログラムを2本に分ければ解決します。
1本目は&HC000~&HCCFFまでの「.BIN」ファイル作成。
2本目は&HCD00~&HCFFFまでの「.BI2」ファイル作成。
とすれば、解決です。
あとは、本当の上限&HCFFFに達した時にどうするか?ですが、まだ悩んでます。