第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.

ホームページに戻る 目次に戻る