さて、今回はLaboratoryテーマ10「マシン語処理中に走査線割り込みを使ってBGMを鳴らしたい」です。
MSXには「走査線割り込み」と言う機能があります。
「走査線割り込み」は簡単に言うと、プログラム実行中でも凡そ1/60秒毎に割り込みが掛かり、別処理を走らせる事が出来る機能です。
1/60秒毎と一定間隔なので、タイマーやBGM演奏などに使われます。
別処理が終わると、実行中プログラムの中断した位置から再開します。
今回は以前に公開した、Laboratoryテーマ6「
自機に向かって飛んでくる敵弾」と、Laboratoryテーマ14「
簡単にBGMを鳴らしたい」のサンプルプログラムを合体させ、ゲーム中にBGMを演奏させてみます。
流石にシューティングゲームのBGMに、「カエルの歌」はなかなかシュールです。
「IITVLSMPL.BAS」【
ダウンロード】
STSMPL.BASへの追加分のみ掲載します。
マシン語のサンプルです。
起動すると、ITVLSMPL.BINを作成します。
「BINSET.BAS」【
ダウンロード】
STSMPL.BINへの追加分のみ掲載します。
走査線割り込みがされると、特定のアドレス(&HFD9F)がコールされます。
&HFD9F~&HFDA3の5バイトが走査線割込み時の命令格納エリアとなっているので、ここにBGM演奏ルーチン部へのコール命令を設定する事で、走査線割り込みでBGMを演奏する事が出来ます。
因みに、通常はリターン(&HC9)のみ設定されています。
プログラムは、「走査線割り込み初期処理」(&HC310)、「走査線割り込み終了処理」(&HC338)、「割り込みBGM演奏処理」(&HC348)の3つに分かれます。
「走査線割り込み初期処理」は、BGM演奏開始前に一度実行して下さい。
走査線割込み時の命令格納エリアの内容を退避します。
これは周辺機器が取り付けられていたりすると、走査線割込み時の命令格納エリアに既に別処理が設定されている可能性があるためです。
「走査線割り込み終了処理」は、BGM演奏終了時に一度実行してください。
退避した走査線割込み時の命令格納エリアの内容を戻します。
「割り込みBGM演奏処理」は、ルーチン開始時に全てのレジスタを退避(PUSH)し、終了時に戻し(POP)ます。
通常のプログラム処理と、割り込み処理で同じレジスタを使うので、割り込み内でレジスタ変更すると、通常プログラムにも反映されてしまい、必ずバグるので忘れないように。