[戻る]

ファミリーベーシックの制約事項とメモリ稼ぎ

ファミリーベーシックは、 ゲーム開発環境としては非常にチープです。 どのような制約があったのか、 またそれらを回避するため、 どのようなテクニックが利用されたのかを、 ここにまとめます。

ファミリーベーシックの制約事項

  • メインメモリが異様に少ない

  • 初期バージョンで 2K バイト。 後継バージョン(V3 と呼ばれる)でも 4K バイトしかありません。

    後の調査で分かったことなのですが、 ファミリーベーシックのメインメモリは、 ドラクエ III 以降の SAVE 用メモリと、同じ仕組み、同じ容量のものでした。 つまり、 作成可能なプログラムのサイズは、 ドラクエ III の復活の呪文保存用の RAM に収まるサイズ以下 ということです。

    従って、泥沼のメモリ稼ぎを強要されます。正規の空きメモリだけではなく、 インタプリタ用のワーク領域、ファンクションキー定義領域、スタックの深い場所 (といっても、スタック自体 256 バイトしかないですが)などなど、 ありとあらゆるメモリ領域を総動員しなければなりません。

  • 8*8 dot スプライトが画面上に 64 個まで表示可能

  • スプライトは 8*8 dot サイズのものが画面上に 64 個までしか出せません。 本来ファミコンは 8*16 dot サイズもサポートされているのですが、 ファミリーベーシックからは扱えませんでした。

  • キャラクターのグラフィック情報は書き換え不可能

  • キャラクターのグラフィック情報は ROM 上に乗っており、書き換え不可能でした。 マリオ、カメさん、カニさん、ハエ、そしてニタニタ。 コイツらを使う事を余儀なくされます。

    これらの既存のグラフィックを、パーツ単位(8*8 dot 単位)で分解・再合成することで、 例えばニタニタの顎を上下反転してロボの頭部に流用するというように、 工夫をしていく必要がありました。

メモリはこうやって稼げ

ファミリーベーシックと言えばメモリ稼ぎです。

一体どれほどの資料価値があるのか、いささか不明ですが、 メモリ稼ぎテクニックを一挙公開です。
  • 省略可能な記述を知れ

  • ファミリーベーシックには、省略可能な記述がいくつか存在します。

    まず、命令を区切るコロン(:)。これは存在しなくても動作します。 但し、新規行作成の際に、 コロンを省くことによってインタプリタが解釈できない記述である場合は、 省略不可能になってしまいます。

    次に、IF 文の THEN。これも省略できてしまいます。 これを略すと、Dr.D に叱られますが、躊躇していてはいけません。

    このようにしてガチガチに切りつめたコードは以下のような記述になります。
    	100 S=STICK(0)
    	100 IFS AND1X=X+1IFX>240X=240
    	110 IFS AND2X=X-1IFX<0X=0
    	120 IFS AND4Y=Y+1IFY>208X=208
    	130 IFS AND8Y=Y-1IFY<16Y=16
    S と AND の間にスペースがあるのは、 これをなくしてしまうと SAND という変数名と解釈されてしまうためです。 スペース分のメモリをロスしますが、断腸の思いで妥協せざるを得ません。

  • 使用する変数は必用最小限に留める

  • 変数を1個使用するごとに、何バイトずつかは失念しましたが、 メインメモリを消費します。変数の使用は必用最小限にしましょう。

    また変数名はなるべく 1 文字にします。 その方がメモリ消費量は少なくなるからです。 1 文字変数を多用しすぎると、 やはり Dr.D に叱られますが、躊躇してはいけません。

  • 禁断の空きメモリを活用する

  • ベーシックインタプリタがワークとして使っている領域の中には、 プログラム実行中は使用されていない領域が存在します。 また、特定の機能や操作をしない限りは、空き領域となっている 領域が多く存在します。これらを残さず動員します。

    記憶に基づき、それらを列挙します。

    • $22 $23 $2F $31 $43 $F1〜$FF

    • CPU6502 を用いる以上、何としても有効活用したい 0 ページメモリですが、 インタプリタがフル活用している関係から、 ユーザーが触れそうなのはここに列挙したモノのみです。

    • $100〜$1FF

    • CPU6502 がスタック領域として用いている場所です。 スタック領域は、GOSUB 1 重で 8 バイト、FOR〜NEXT 1 重で 14 バイト消費します。 これらの命令のネストがなるべく深くならないように注意すれば、 スタック領域の末端部分を空き領域として活用できます。 しかし、いつ上書きされるかわからないので、非常に危険な領域であると言えます。

    • $200〜$2FF

    • ファミリーベーシックでは、この領域をスプライト表示用に使っています。 ですが、スプライト表示を OFF にすれば、 一時的にテーブルを作成するような用途で活用できます。 ゲームではあまり使えません。 私はこの領域を、自作アセンブラのワークに利用していました。

    • $300〜$3FF

    • 新しい行を作成する時の、中間コード作成のために用いられています。 新しく行を作成しない限り、空き領域となります。 ゲーム動作中のワーク領域として使うのに適しています。

    • $400〜$47F

    • データーレコーダーからプログラムを LOAD する時に、 そのファイル名が格納されます。 それ以外の用途で使われているケースを確認した事が有りません。 この領域も、ゲーム動作中のワークとして使えます。 保守性が高いので、コードを置くのに適しています。 ただ、先頭 16 バイトほどは触るとまずかったような記憶があります。

    • $480〜$48F

    • ファンクションキーの定義内容が格納されています。 16 バイト置きに F1〜F8 の内容が並んでいます。 ファンクションキーの内容は、せいぜい数文字なので、 末端の数バイトは空き領域になっています。 不連続で細切れなのが難点ですが、使えない事はありません。

    • $600〜$6FF

    • MOVE 命令関係のワークのようです。 MOVE 命令を使わなければ完全に空き領域となります。 ところが、インタプリタが度々初期化するようなので注意が必用です。

    • $700〜$7FF

    • 文字列を扱う場合に、加工に用いられる領域です。 文字列を使わないプログラムなら、ここは完全な空き領域となります。 LIST を取る時にも、ここが使われているので注意です。

    はい。グっと来ましたね?来ないって?

    いずれも、インタプリタを解析した結果の判断ではないので、 ここに書かれている内容は無保証です。 無保証ですって言っても誰も困らないと思いますけど。

[戻る]