%第1版第15刷 P.83-87
5章 ソフトウェア開発上の諸注意
MSX用のソフトウェアを開発する際、それがどのようなMSX機種上でも問題なく動作するために、ぜひとも守って頂きたい事項がいくつかあります。本章ではそれらの事項について述べるとともに、その他のソフトウェア作成時に知っていると役立つ種々の情報を紹介します。
● BIOS
BIOSを使う目的は、ハードウェアとソフトウェアを分離し、万一ハードウェアが変更されたとしてもソフトウェアをそのまま使えるようにすることです。商用のアプリケーション・プログラムで入出力処理を行う際には、かならずBIOSを使用してください(ただしVDPに関してはこの限りではない)。
BIOSはMAIN-ROMの0000H番地から始まるジャンプテーブルを通して呼び出されます。MSX2のSUB-ROMにも同様のジャンプテーブルがあり、これは拡張機能の呼び出しに使われます。ジャンプテーブルの分岐先、つまりBIOSの内容はハードウェアの変更や機能の拡張のために変更される可能性がありますので、アプリケーション・プログラムがそこを直接呼び出してはいけません。本書の中にも、BIOSのジャンプテーブル以外のアドレスを呼び出しているような例がありますが、あくまでも参考とするにとどめておいてください(APPENDIX BIOS一覧表参照)。なお、マスパックおよび前述のステートメント拡張に関する内容ルーチンは、今後もアドレスを変更しないので、アプリケーションから呼び出してもかまいません。
● ワークエリア
MAIN-ROMのF380H〜FFFFH番地は、BIOSとBASICインタープリタのワークエリアですから、不用意に使わないでください。ワークエリア内の使われていない場所は将来の使用のために予約されているのでこちらも使用できません。なお、ディスクのワークエリアについては「3.1 ユーザーエリア」の項を参照してください。
● RAMとスタックポインタの初期化
電源投入時のRAMの内容は不定で、システムのワークエリア以外の領域は初期化されません。ワークエリアの初期化はアプリケーション・プログラム自身で行ってください。RAMの内容が00Hであることを期待しているために動かないソフトがあり、問題になりました。
ROMカートリッジのINITルーチン(第5部7章参照)が呼ばれた時のスタックポインタの値は不定で、ディスク・インターフェイスが先に初期化されたような場合にはそうでない場合よりもスタックポインタの値が小さくなります。スタックポインタの初期化を行わないプログラムがこのために暴走し、問題になりました。INITルーチンで起動し、そのまま処理が続く(つまりディスク等の周辺機器やBASICインタープリタを使う必要がない)プログラムはかならずスタックポインタを初期化してください。
● 拡張BIOSのワークエリア
拡張BIOSコールを使う時には、スロットが切り換えられてもCPUがワークエリアを参照できるように、スタックをC000H番地よりも上位に置いてください。同様の理由で、RS-232CのFCBも8000H番地より上位に置いてください。
● デバイスドライバなどのワークエリア
デバイスドライバやBASICから呼ばれるサブルーチンのように、他のプログラムと同時にメモリに存在するプログラムは、ワークエリアの確保に特に注意を要します。
カートリッジのINITルーチンがBOTTOM(FC48H)を書き換え、古いBOTTOMと新しいBOTTOMの間を自分のワークエリアとして予約し、さらに、そのワークエリアのアドレスをSLTWRK(FD09H)というスロット別に割り当てられた2バイトの領域に記録します。詳しくは第5部7章を参照してください。
● フック
たとえば、RS-232Cカートリッジが割り込み処理のためにフックを書き換えた場合、次のカートリッジが同じフックを書き換えるとRS-232Cのカートリッジは割り込みフックを使用することができなくなってしまいます。このようなことを防ぐために、フックを書き換える場合には以前のフック内容(例では、RS-232Cカートリッジの割り込み処理ルーチンへのインタースロットコール命令)を別の場所にコピーしておき、自分がフックから呼ばれた際にはかならずそれを呼び出すことで、そのフックを使おうとしているカートリッジすべてに制御が渡るようにしてください(図2.18)。詳しくは第5部7章を参照してください。
● VRAMの初期化
アプリケーション・プログラム起動時のVRAMの内容は不定ですからVRAMはかならず初期化してから使用してください。
● VRAMの容量
MODE(FAFCH)のビット1、ビット2でVRAM容量を知ることが出来ます(表2.24)。
[FAFCH] | VRAMの容量 | |
---|---|---|
ビット2 | ビット1 | |
0 | 0 | 16K(MSX1) |
0 | 1 | 64K(MSX2) |
1 | 1 | 128K(MSX2) |
表2 VRAM容量を知る方法
● BASICのバージョン番号
アプリケーション・プログラムがBASICのバージョン番号を知るためには、以下の方法があります。
1. MAIN-ROMの2DH番地の内容を読む(00H=ver1.0, 01H=ver2.0)
2. ver2.0以降ではEXBRSA(FAF8H)にSUB-ROMのスロットアドレスが入っている。入っていなければ(00h)ver1.0である
● インターナショナルMSX
MSXは世界各国で使うために多くの種類がありますが、以下の項目が国により大きく異なります。
・キーボード配列、文字セット、PRINT USINGの書式
・タイマ割り込みの周波数など
IDバイトというROM内の情報を読むことで(図2.19)、本体の種類がわかり、各国のMSXに対応することができます(表2.25)。
国名 | TVセット | 日付フォーマット | 初期画面モード | PRINT USING | ||
---|---|---|---|---|---|---|
文字列の長さ指定 | 文字の置き換え | 通貨シンボル | ||||
日本 | NTSC(60Hz) | 年/月/日 | SCREEN1 | & | @ | \(エン) |
イギリス | PAL(50Hz) | 日/月/年 | SCREEN0 | \ | & | £(ポンド) |
国際的 | PAL(50Hz) | 月/日/年 | SCREEN0 | \ | & | $(ドル) |
アメリカ | NTSC(60Hz) | 月/日/年 | SCREEN0 | \ | & | $(ドル) |
フランス | SECAM(50Hz) | 日/月/年 | SCREEN0 | \ | & | $(ドル) |
ドイツ | PAL(50Hz) | 日/月/年 | SCREEN0 | \ | & | $(ドル) |
ソビエト | NTSC(60Hz) | 月/日/年 | SCREEN0 | \ | & | $(ドル) |
スペイン | PAL(50Hz) | 月/日/年 | SCREEN0 | \ | & | $(ドル) |
表2.25 国別のMSX仕様
● エスケープシーケンス
MSXにはエスケープシーケンス機能がありますが(APPENDIX参照)、これはBASICのPRINT命令、BIOSおよびBDOSコール(MSX-DOS)のコンソール出力で利用できます。エスケープシーケンスの機能は、DEC製VT52ターミナルおよびヒースキット製H19ターミナルのサブセットになっています。
● BASICに戻る方法
・ウォームスタート
MAIN-ROMのスロットを選択した後、MAIN-ROMの409BH番地へジャンプしてください。BASICのワークエリアが壊れていなければ、BASICのコマンド入力状態になります。なお、ジャンプする時のレジスタやスタックの内容はいっさい無視されます。
もう1つの方法として、内部ルーチンであるNEWSTT(第2部4.4参照)で次の命令を実行することによっても行うことができます(図2.20)。
● オートスタート
BIOSやBASICのワークエリアを使用しないような単純なゲームカートリッジなどではROMのヘッダの“INIT”の場所にプログラム実行開始アドレスを書くことで、そのプログラムを起動することができます。しかし、この方法を使うと他のカートリッジの初期化設定が行われないために、ディスクドライブなどが使えなくなります。
それを避けるために、FEDAHに“H.STKE”というフックがありますから、カートリッジの“INIT”ルーチン実行時に起動させたいプログラムへのインタースロットコール命令をここに書き、RET命令でシステムに戻ってください。すると、すべてのカートリッジの初期設定が終わり、ディスクがあればDISK BASICの環境が整ってからそのフックが呼び出されますから、目的のプログラムを起動することができます。なお、この方法はディスクがない場合でも有効です(APPENDIX参照)。