INTMSK = 1 の状態で8253のチャネル2の出力がHになると、CPUに割り込みがかかります。
8253をタイマ割り込み源として使用する際は、チャネル1をモード2に設定、チャネル2をモード0に設定します。割り込みの周期は 約15.7kHz を (チャネル1のカウント設定値)×(チャネル2のカウント設定値+1) で割ったものになります。チャネル2のカウント設定値が+1される理由は、モード0ではカウント値をチャネルに書き込んだ後の最初の入力クロックの有効エッジで書き込んだカウント値がカウンタにロードされ(注)、次の入力クロックの有効エッジで初めてカウントダウンされるためです。
1, 2の両チャネルで最低でも2分周されるため、最短の割り込み周期は15.7kHzの1/4、約 3.925kHz となります。
モード1における割り込みの応答時間は 13CPUクロック(RST 38hの実行に11クロック+ウェイト2クロック)です。
ROMモニタの0038h番地には“JP 1038h”が置かれており、割り込みが発生すると1038hにジャンプします。
DI ; 割り込みを禁止 IM 1 ; Z80 割り込みモード1 LD HL, 0E007h ; 8253 コントロールポート LD (HL), 0B0h ; チャネル2, モード0, 下位バイト→上位バイトの順にカウンタを設定 LD (HL), 074h ; チャネル1, モード2, 下位バイト→上位バイトの順にカウンタを設定 DEC L ; 8253 チャネル2 LD (HL), CNT2L ; チャネル2のカウント値の下位バイトを設定 LD (HL), CNT2H ; チャネル2のカウント値の上位バイトを設定 DEC L ; 8253 チャネル1 LD (HL), CNT1L ; チャネル1のカウント値の下位バイトを設定 LD (HL), CNT1H ; チャネル1のカウント値の上位バイトを設定 LD A, 05h ; INTMSK = 1 に設定し、8253からの割り込みを許可する LD (0E003h), A ; 8255 ビットセット EI ; 割り込みを許可 |
(レジスタ保存) LD HL, 0E006h ; 8253 チャネル2 LD (HL), CNT2L ; チャネル2のカウント値の下位バイトを設定 LD (HL), CNT2H ; チャネル2のカウント値の上位バイトを設定 (割り込み処理) (レジスタ復帰) EI ; 割り込みを許可 RET ; メインの処理に戻る |
チャネル | 設定値 | 備考 |
---|---|---|
1 | 131 | 1画面分のラスタ(262本)の1/2 |
2 | 1 | モード0で設定可能な最小カウント値(2分周) |
8253を垂直ブランキング割り込み源として設定するサンプルを以下に示します。
LD HL, 0E007h ; 8253 コントロールポート LD (HL), 90h ; チャネル2, モード0, 下位バイトのみでカウンタを設定 LD (HL), 54h ; チャネル1, モード2, 下位バイトのみでカウンタを設定 DEC L ; 8253 チャネル2 LD (HL), 1+1 ; チャネル2のカウント値+1を設定 (注) XOR A LD L, 02h ; 8255 ポートC L1: OR (HL) ; /VBLKをチェック JP P, L1 ; /VBLK=Hになるまで待つ L2: AND (HL) ; /VBLKをチェック JP M, L2 ; /VBLK=Lになるまで待つ LD L, 05h ; 8253 チャネル1 LD (HL), 131 ; チャネル1のカウント値を設定 |
垂直ブランキング割り込みの代用など、カウント値を設定するタイミングを調整することで表示回路に同期する割り込みをかける場合、上記の仕様を考慮しないと期待どおりの結果になりません。垂直ブランキング割り込みのサンプルでは、チャネル2のカウント値設定時には入力クロックがHであるため、カウント値を+1して設定しています。また、割り込み応答直後は入力クロックがLであるため、Hになる前に素早くカウント値を再設定する必要があります。(約140クロック以内)