You are here

BASICの拡張法


カテゴリー:

以前68000 Tiny BASICの予約語で書いたように独自の命令を追加していました。

でもソースコードもあり自由に変更できたTiny BASICなどだけでなく、マスクROMが使用されソースコードも無い市販パソコンのBASICの命令拡張も良く行われていました。ちょっとした数十バイト程度のものから本格的なものまで当時の雑誌には頻繁に掲載されていたものです。

以下はある程度知っているN-BASIC, N80-BASICを例に書いてみます。

ところでマスクROMのBASICをどうやって拡張するのでしょう?

BASICによっては要所要所でRAM上の特定番地をCALLするようになっていました。そこは起動時にはRET命令が置かれているので、これを用意したルーチンへの分岐命令に書き換えることで動作に介入することができるのです。これを「フック」と読んでいました。

介入したい個所にピンポイントでフックが無い場合は少し手前のフックから目的個所までのROM内の処理を自分のルーチン内で行ない、さらに戻り番地を調整するなどを行ないます。

  1. 既存の予約語を利用する
    一番簡単なのは既存の予約語を利用する方法です。N-BASIC系ではDISK-BASIC(フロッピーディスク専用の命令はROMには書かれておらずRAM上にロードするようになっています)などで使用する命令は予約語テーブルまでは用意されていて処理ルーチンのアドレスはフックと同様にROM上の特定アドレスを指しています。ここにはRET命令の代わりにJP 1875H命令が置かれていて「Disk BASIC Feature」エラーが発生します。

    これを書き換えれば任意の処理を実行することができます。

    DISK-BASICはここを利用していますし、IEEE488のためと思われる命令も用意されています。自由な命令名を使えない代わりにアドレスを書き換えるだけなので簡単です。POLL命令なんかがよく使われましたね。
  2. 既存の予約語をプレフィックスにする
    これはN80-BASICで使われた方法です。
    N80-BASICはN-BASIC+拡張ROMの構成になっていて、ROM内ルーチンのエントリも変わっていません。予約語テーブルもそのままです。

    N80-BASICで追加された命令はみなCMD LINE, CMD CIRCLE, CMD PAINTのように先頭にCMDが付いています。

    このCMDはN-BASICの未使用予約語なのでフックを利用して拡張ROMに制御を移します。ここで後ろに続くものをパースして分岐するわけです。ここで面白いのはLINEはN-BASICの予約語なので中間コードになっていますが、PAINTは予約語テーブルにないので”P"+"A"+INTの中間コードの3バイトになっていることですね。

    先頭に既存の予約語を付けなくてはならないという制限はありますが、後ろはほぼ自由に決められます。

    NECはこの手法をPC-8801mk2のCMD SINGやFM音源ボードのCMD PLAYなどでも利用しています。

  3. 予約語テーブルをすり替える
    上のCMD LINEなどは高解像度グラフィックの命令は頭にCMDが必要というお約束と思えば納得できますが、例えばREPEATUNTILなどにCMDを付けてCMD REPEATCMD UNTILと言われたらかなり違和感があります。

    そうなると何とかしてROM内の予約語テーブルを書き換える必要が出てきます。

    これを実現したのが『I/O』1981年11月号に掲載されたN-BASIC Consolidatorです。珍しくダンプリストではなくアセンブラのリスティングが掲載されているので読むといろいろ発見があって面白いです。

    簡単に書くとテーブルのアドレスがレジスタにセットされた状態でフックが呼ばれるので、自分で用意したテーブルのアドレスに書き換えるわけです。自由度は高いのですがテーブルをRAM上に用意しないといけないのでメモリを喰ってしまいます。
  4. 裏RAMにコピーする
    ここからはかなり強引な方法です。

    PC-8001mk2などのようにROMと同じアドレスに裏RAMが存在する場合はRAMにコピーすれば自由に変更できます。
  5. ROMを交換する
    ROMライタを持っていれば変更したROMを焼いて交換すれば電源ONで使えます。
参考文献・関連図書: 
上田智章「N-BASIC Consolidator PC-8001用の強化ソフト」『I/O』1981年11月号, 工学社.

Comments

I/Oの83年6月号に掲載されたBASCALというN BASICを構造化BASICに拡張する記事が記憶に残っています。
X1全回路図が掲載された号のためか、結構なプレミアがついてる(笑)

残念ながらこの号は持っていないようです。
BASCALという名称からはPASCAL風にということだろうからWHILE~WEND, REPEAT~UNTILあたりの追加かな。あとはローカル変数は欲しいところですね。
昔N-BASICで再帰を書こうとして配列にスタックを作って対比させた記憶が。

仰った2点に加えて他には、ユーザー定義関数で任意の型が使えたり、GOTO,GOSUBでラベルと式が使えたり、ソースの文字列検索が出来たり、トレース機能が強化されたりしたようです。
あくまでN BASICの拡張であって、2文字以上の変数名識別は互換性が損なわれるので断念した、とありました。

わりと多機能ですね。
行番号の代わりに式が使えるのはTiny BASICでは当たり前でしたが、N-BASICだとRENUMで破綻するような。

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。