第1部 BASIC 第1章 BASIC ここでは、MSXのBASICで、あまり知られていない機能について説明します。 1.1.1 エスケープシーケンス エスケープシーケンスは、主に通信などで使われますが、BASICのPRINT命 令、BIOSコールなどでも有効です。大抵の機能はほかのコントロールコードで代用 できるため、あまり使われていませんが、ESC+”K”,ESC+”L”などを使う と、テキスト画面を上下にスクロールさせることができます。巻末に一覧表を載せてお きましたので、いろいろと試してみてください。なお、なぜだか知りませんが、「MS X2テクニカルハンドブック」では、ESC+”l”の説明が抜け落ちています。 1.1.2 DISK−BASICの隠しコマンド MSXのBASICでは、DSKI$,DSKO$というコマンドがサポートされて います。これらを使うと、DISK−BASIC上で、ディスクをセクター単位で直接 読み書きできます。これらの機能は、余り説明されたことがありませんが、正式な仕様 書にはきちんと機能が定められているので、普通に使っても問題はないでしょう。 ●DSKI$(<ドライブ番号>,<論理セクター番号>) <ドライブ番号>で指定されたディスクドライブの<論理セクター番号>で指定され たセクターを読み込みます。 ●DSKO$ <ドライブ番号>,<論理セクター番号> <ドライブ番号>で指定されたディスクドライブの<論理セクター番号>で指定され たセクターに書き込みます。ライトプロテクトされていても何も表示しません。 両方とも、F351Hから2バイトの番地に書かれているアドレスに、1セクター単 位で読み書きします。この2バイトを書き換えると、違うアドレスに読み書きできるよ うです。このエリアは、OPEN,CLOSE,FILES,PRINT#などのディ スク関係のステートメントを実行したときに破壊されます。なお、ドライブ番号は、0 がディフォルトドライブで、1がA,2がBドライブといったような指定の仕方をしま す。 実際には、「A$=DSKI$(0,14)」というふうに使います。(A$はダミ ー) 第2章 RAMディスクスイッチ MSX2では、RAMディスク機能が追加され、あらかじめ「CALL MEMIN I」命令で領域を確保しておけば、裏RAM(RAMの、0000H番地から7FFF H番地までの、普段はBASIC−ROMに隠れて直接読み書きできない領域)をRA Mディスクとして使うことができます。実際にはアスキーファイルしか読み書きできな いうえ、フロッピーディスクよりもアクセスが遅くて、使い物になりませんでしたが、 ディスクドライブを持っていないMSX2のユーザーなどは実際に使っているようです。 ところで、ソフトの中には、裏RAMを直接読み書きして、機械語サブルーチンを置 いたり、データを置いたりしているものや、「MSXべーしっ君」(ログイン掲載版) などのように、拡張ステートメントをRAMのページ1(裏RAMの、4000Hから 7FFFH番地まで)に置いて、BASICのCALL文で拡張ステートメントを呼び 出すものがあります。これらのソフトとRAMディスク機能を同時に使用すると、裏R AMに置かれたプログラムが書き換えられて暴走します。これを防ぐためには、次のよ うな処理を行ないます。 ●機械語プログラムが裏RAMを使用する場合はMAIN−RAMのFD09H番地の ビット5をセットします。 こうすると、「CALL MEMINI」命令が実行できなくなります。 なお、FD09H番地のビット6がセットされているときは、RAMディスクが裏R AMを使っているので、機械語プログラムが裏RAMを使うことはできません。 このほかにも、裏RAMを機械語プログラムとRAMディスクが同時に使う方法もあ るようです。 第3章 BASICの拡張 MSXでBASICの機能を拡張する場合には、DEFUSR命令とUSR関数で機 械語サブルーチンを呼び出す方法が一般的です。しかし、いくつもの機械語サブルーチ ンを使う場合や、いくつもの引数を引き渡す機械語サブルーチンでは、変数が一つしか 使えないUSR関数では役不足です。 そこで、CALL文によってステートメントを拡張することになります.CMD命令 を拡張しているアプリケーションソフトもいくつかありますが、後で面倒なことが起こ らないように、CALL文を使ったほうがいいようです。 ところで、「MSX2テクニカルハンドブック」では、第5部7章3節で、CALL 文の拡張の方法が記されていますが、これはROMカートリッジがCALL文を拡張す る方法です。実際には1.2で述べたように、裏RAMにCALL文拡張ルーチンを置 くこともできます。もちろん、MSX1では、裏RAMに拡張ステートメントを置く場 合には、そのソフトウェアはRAM64Kの機械でないと動作しないことになります。 裏RAMに拡張ステートメントを置くときには、次のように起動させます。 ●裏RAMにCALL文拡張ステートメントを置く場合の起動方法 1.まず、裏RAMのあるスロットを探します。(裏RAMを探す方法は第2部第1 章で詳しく述べます。 2.拡張ステートメントのプログラムを、9000H−CFFFH番地にロードしま す。(別に9000H−CFFF番地でなくても、例えば8000H−BFFF 番地でも構いませんが、起動プログラムをBASICで書けるので、このように するのがよいでしょう) 3.拡張ステートメントのプログラムを、4000H−7FFFH番地に転送します。 (なぜ直接4000H番地にロードしないのかというと、BASICのBLOA D命令では、直接裏RAMにロードできないからです) 4.スロットアトリビュート(FCC9H+裏RAMの基本スロット番号*16+裏 RAMの拡張スロット番号*4+ページ番号[必ず1になる])に、20Hを書 き込みます。例えば、裏RAMが拡張スロット3−1にあった場合には、FCC 9H+3*16+1*4+1=FCFDH、つまり、FCFDH番地に20Hを 書き込めばいいことになります。 5.BASICのコマンドレベルに戻ります。 これで、CALL文拡張プログラムが裏RAMに置かれました。実際にCALL文を 使えるようになっているはずです。 ROMカートリッジでCALL文を拡張する場合には、BASICが電源投入時にス ロットアトリビュートに値を書き込んでくれるので、ユーザー側が値を書き込む必要は ありません。しかし、裏RAMに拡張プログラムを置く場合には、BASICが値を書 き込んだ後にプログラムをロードするわけですから、ユーザー側が値を書き込むことに なります。 CALL文拡張プログラムの作り方については、「MSX2テクニカルハンドブック」 の第5部7章に書かれています。スロットアトリビュートの詳しい意味について も、こちらを参考にしてください。 拡張されたCALL文中でBASICのエラーを起こす方法は以下のとおりです。 Eレジスタにエラー番号、HLレジスタに現在のテキストポインタの値を入れて、B ASICの406FH番地をインタースロットコールする エラーを起こす際、BIOSのCALBAS(0159H/MAIN)を使うと安全 です。
※個人的以外の使用および無断転載を禁止します。
Copyright(C) 1996 by ASCAT All rights reserved.