2024-04-22 17:47 — asano
カテゴリー:
以前68000 Tiny BASICの予約語で書いたように独自の命令を追加していました。
でもソースコードもあり自由に変更できたTiny BASICなどだけでなく、マスクROMが使用されソースコードも無い市販パソコンのBASICの命令拡張も良く行われていました。ちょっとした数十バイト程度のものから本格的なものまで当時の雑誌には頻繁に掲載されていたものです。
以下はある程度知っているN-BASIC, N80-BASICを例に書いてみます。
ところでマスクROMのBASICをどうやって拡張するのでしょう?
BASICによっては要所要所でRAM上の特定番地をCALL
するようになっていました。そこは起動時にはRET
命令が置かれているので、これを用意したルーチンへの分岐命令に書き換えることで動作に介入することができるのです。これを「フック」と読んでいました。
介入したい個所にピンポイントでフックが無い場合は少し手前のフックから目的個所までのROM内の処理を自分のルーチン内で行ない、さらに戻り番地を調整するなどを行ないます。
- 既存の予約語を利用する
一番簡単なのは既存の予約語を利用する方法です。N-BASIC系ではDISK-BASIC(フロッピーディスク専用の命令はROMには書かれておらずRAM上にロードするようになっています)などで使用する命令は予約語テーブルまでは用意されていて処理ルーチンのアドレスはフックと同様にROM上の特定アドレスを指しています。ここにはRET
命令の代わりにJP 1875H
命令が置かれていて「Disk BASIC Feature」エラーが発生します。
これを書き換えれば任意の処理を実行することができます。
DISK-BASICはここを利用していますし、IEEE488のためと思われる命令も用意されています。自由な命令名を使えない代わりにアドレスを書き換えるだけなので簡単です。POLL
命令なんかがよく使われましたね。 - 既存の予約語をプレフィックスにする
これは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
などでも利用しています。 - 予約語テーブルをすり替える
上のCMD LINE
などは高解像度グラフィックの命令は頭にCMD
が必要というお約束と思えば納得できますが、例えばREPEAT
~UNTIL
などにCMD
を付けてCMD REPEAT
~CMD UNTIL
と言われたらかなり違和感があります。
そうなると何とかしてROM内の予約語テーブルを書き換える必要が出てきます。
これを実現したのが『I/O』1981年11月号に掲載されたN-BASIC Consolidatorです。珍しくダンプリストではなくアセンブラのリスティングが掲載されているので読むといろいろ発見があって面白いです。
簡単に書くとテーブルのアドレスがレジスタにセットされた状態でフックが呼ばれるので、自分で用意したテーブルのアドレスに書き換えるわけです。自由度は高いのですがテーブルをRAM上に用意しないといけないのでメモリを喰ってしまいます。 - 裏RAMにコピーする
ここからはかなり強引な方法です。
PC-8001mk2などのようにROMと同じアドレスに裏RAMが存在する場合はRAMにコピーすれば自由に変更できます。 - ROMを交換する
ROMライタを持っていれば変更したROMを焼いて交換すれば電源ONで使えます。
コメント
BASCAL
I/Oの83年6月号に掲載されたBASCALというN BASICを構造化BASICに拡張する記事が記憶に残っています。
X1全回路図が掲載された号のためか、結構なプレミアがついてる(笑)
Re BASCAL
残念ながらこの号は持っていないようです。
BASCALという名称からはPASCAL風にということだろうからWHILE~WEND, REPEAT~UNTILあたりの追加かな。あとはローカル変数は欲しいところですね。
昔N-BASICで再帰を書こうとして配列にスタックを作って対比させた記憶が。
Re BASCAL
仰った2点に加えて他には、ユーザー定義関数で任意の型が使えたり、GOTO,GOSUBでラベルと式が使えたり、ソースの文字列検索が出来たり、トレース機能が強化されたりしたようです。
あくまでN BASICの拡張であって、2文字以上の変数名識別は互換性が損なわれるので断念した、とありました。
Re BASCAL
わりと多機能ですね。
行番号の代わりに式が使えるのはTiny BASICでは当たり前でしたが、N-BASICだとRENUMで破綻するような。
コメントを追加