『Mr.PC Technical Collection』に書かれている割り込み関連のI/Oポートは以下の通りです。
0xB8:割り込みベクタ(SUB-CPU)
0xB9:割り込みベクタ(JOYSTICK)
0xBA:割り込みベクタ(TIMER)
0xBB:割り込みベクタ(VOICE)
0xBC:割り込みベクタ(VRTC)
0xBD:割り込みベクタ(RS-232C)
0xBE:割り込みベクタ(Printer)
0xBF:割り込みベクタ(EXT INT)
0xFA:割り込みコントロール
bit7-0:1の時、割り込み禁止。0の時、割り込み許可。
0xFB:割り込みベクタコントロール
bit7-0:1の時、割り込みベクタイネーブル。0の時、割り込みベクタディセーブル。
bit0:SUB-CPU
bit1:JOYSTICK
bit2:TIMER
bit3:VOICE
bit4:VRTC
bit5:RS-232C
bit6:Printer
bit7:EXT INT
この割り込み関連の情報は、SRモードの時のみに機能します。mk2/66 の割り込みの制御は、代わりにポート0xF3、0xF4、0xF5、0xF7を使います。
上記の情報だけだと、何が何だか、という感じだと思います(まあ、あまり触らないトコロではありますが)。
実際にプログラムで動かしてみました。モード6のみです。
srint.zip
プログラムの内容は、
・割り込みの飛び先を0xD100〜に設定する(Iレジスタの設定)
・割り込みが発生した時の飛び先になる、割り込みベクタを設定する(0xB8〜0xBF)
・その後、無限ループに入る
です。
SUB-CPUを除く、それぞれの割り込みが発生したら、画面上に文字が表示されます。
SUB-CPUからの割り込みが発生した場合、SUB-CPUにデータを読み込みに行ってそのデータを画面に表示します(キーボードを押すと、その内容が画面に表示されます)。同時に、SUB-CPU以外の割り込みが発生した時の、画面上の文字を消します。
Printerからの割り込みを禁止していますが、これは後述します。
プログラムを動かして、何がトリガになっているかを調べました。
SUB-CPU:
トリガは、サブCPUの割り込み要求信号(SUB-nINT)。"L"のレベルで割り込み発生。
JOYSTICK:
トリガは、ジョイスティックの7ピン(JOY-7)。"L"のレベルで割り込み発生。
TIMER:
カスタムLSI内部のため、トリガは不明。
VOICE:
トリガは、uPD7752のREQ信号の反転(VO-nREQ)。"L"のレベルで割り込み発生。
VRTC:
トリガは、垂直同期信号(nVSYNC)。"L"→"H"の立ち上がりで割り込み発生。
RS-232C:
トリガは、RS-232CのポートのRxRDY。"L"のレベルで割り込み発生。
Printer:
トリガは、プリンタからのBUSY信号の反転(nBUSY)。"L"のレベルで割り込み発生。
EXT INT:
トリガは、拡張カートリッジコネクタの8ピンのnEXINT。"L"のレベルで割り込み発生。
外部からの入力が4本もあります。これらの信号は、すべてレベルで動作します。例えば、JOYSTICK をつないで、ボタンを押したら割り込むようにしても、押している間はずっと割り込みが掛かってしまいます。
さらに、Printer からの割り込み信号ですが、論理が間違っているようで、プリンタに接続していない場合、nBUSY="L"となるため、常に割り込みが発生します。
66SRも同じ構成なので同じような結果になるはずですが、SUB-CPU関連に関しては調べていません。
SUB-CPUから出力される割り込みベクタが追加されている(TVR、DATE)と思いますが、その辺りは別の機会に。