Chapter.16 割り込み処理
[Chapter16 制作物]

今回は割り込み処理ルーチンを作成します。

■割り込み処理とは?
CPU の外部にある回路から、特別なタイミングを通知するのに用いられるのが割り込み処理です。
その通知のことを割り込み信号と呼びます。
CPU は、割り込み信号を受け取ると、実行していたプログラムを中断して、割り込み処理ルーチンを call します。
もちろん、call なので、ret で元のプログラムに復帰することが出来ます。

MSX の場合、その割り込み信号を発生するのが、VDP しかないので簡単です。


■VDP の割り込み信号はどんなモノがある?
VDP は、テレビモニタに対して、常に表示信号を計算・出力しています。
左から右へという走査を、上から下へ順々に繰り返していって、画面全部を更新します。
この1画面の信号を送り終えるのにかかる時間が 1/59.94[秒] (※NTSC圏の場合, 日本は NTSC圏) です。

この「1画面分の表示を終えたタイミング」で、テレビに対して垂直同期信号を発生させます。
昔のアナログテレビは、この同期信号を読み取って、前の画面と次の画面がずれないように表示させていたわけです。

VDP は、この垂直同期信号のタイミングを CPU にも通知してくれます。
これが、CPU にとっては、割り込みとして受け取れるように配線されています。
これを垂直同期割り込みと呼ぶことにします。

MSX には、タイマーと呼べる回路は搭載されていません(※turboR除く)。
しかし、VDP が決まった時間間隔で割り込みを発生させるので、この垂直同期割り込みをタイマーとして利用しています。
便宜上、垂直同期割り込みのことを、タイマー割り込みとも呼ぶことにします。
たとえば、ゲームなどで、BGM がテンポを崩さずにしっかり再生されるとか、敵の出現数に関わらず処理速度が一定に保たれているとか
そういうのは、このタイマー割り込みを利用することでタイミングを取っているわけです。


VDP には、デフォルトで OFF になっている水平同期割り込み機能もあるのですが、今回は使用しないので、説明を省きます。
まぁ、勘のいい人なら、名前から自ずと想像できますよね (^_^;

■具体的な処理
Z80 では、割り込み処理が発生したとき、0x0038番地が call されます。
(※厳密には Z80 には3種類の割り込みモードがありますが、MSX では IM1 を利用しています。他のモードは使いません。)

0x0038番地は、MAIN-ROM なので書き換えることは出来ませんが、そのルーチンには、jp H.TIMI というコードが埋め込まれています。
H.TIMI は、0xFD9F で、RAM上にあるため、ここを書き換えてしまえば、割り込みルーチンを、自分の割り込みルーチンへすり替えることが出来ます。

このような仕組みをフックと呼びます。H.TIMI の H. は、hook の意味です。
BIOS は、ROM上にありますが、いったん RAMのフックを経由するように作られており、このフックを書き換えることで、標準とは違う動作をするように
BIOS 自体を拡張できるようになっています。
割り込みだけでなく、ディスク制御を追加したり、BASICの命令を拡張したりと、結構いろいろなフックが用意されています。

話を戻すと、H.TIMI に「jp 自分の割り込み処理」という命令を書き込んでしまえば、次からは 1/59.94[sec]毎に自分の割り込み処理が呼ばれるように
なります。
jp命令は、0xC3 です。これに自分の割り込み処理のアドレスを続けてやれば、「jp 自分の割り込み処理」という命令になります。



工事中



ただし、不用意に H.TIMI を書き換えてはいけません。
たとえば、0xC3 を書き込んだ直後に割り込みが入ってしまうと、jp xxxx の xxxx が元々書き込んであった値で解釈され、アドレスとも限らないため、
とんでもないアドレスへ飛んでいって、暴走してしまう危険性があります。しかも、実行のタイミングによって発生したりしなかったりする不可解なバグ
に繋がります。

ここで登場するのが、割り込み禁止命令です。di (disable interrupt)。逆に割り込み禁止を解除するのは ei (enable interrupt) です。
di してから ei するまでの間に、VDP から割り込み通知が来ても、Z80 は無視し続けます。
VDP は、Z80 から「割り込みを受理しました」という指示があるまで、割り込み通知を出しっぱなしにするので、もし di から ei の間で割り込み通知が来ても
しても、ei した直後にしっかり割り込みが入るわけです。
従って、di 〜 ei の間は、割り込みが保留になると思って貰った方が良いですね。






工事中






[▲トップページへ]