復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第350回]
●Z8S180内蔵タイマーの割込みアドレス
前回からの続きです。
前回はMIDI演奏プログラムの概要について簡単に説明をしました。
今回からはプログラムの詳細について少しずつ説明をしていきます。
まずはのっけからZ8S180固有の仕様についての説明です。
当プログラムではZ8S180内蔵の16ビットタイマーによる割込みを利用してMIDIの演奏時間の処理を行なっています。
Z8S180の割り込みはZ80の割り込みを強化したものになっています。
Z8S180は、Z80のモード0〜モード2の割込みをそのまま同じように実行できますが、それ以外にモード2を拡張した割り込み処理が行なえます。
内蔵ペリフェラルによる割込みはそのモード2の割込みの拡張版により行なわれます。
モード2の割込みは、割込みプログラムへのジャンプアドレステーブルのアドレス上位をIレジスタに置き、下位アドレスはデータバスから入力します。
Z8S180のモード2の割り込みの拡張版では、割込みプログラムへのジャンプアドレステーブルの上位アドレスはZ80と同じようにIレジスタに与えますが、下位アドレスのうちのビット7〜ビット5は内蔵I/Oレジスタ(ILレジスタ。アドレス33H)によって与えます。
内蔵ペリフェラルの割込みはそのテーブルアドレスのうち下位5ビットが決まっています。
16ビットタイマー0の割込みアドレスを示すジャンプテーブルアドレスは
aaaaaaaa bbb00100
になります。
aaaaaaaaはIレジスタの値で、bbbはILレジスタの上位3ビットの値です。
ILレジスタの下位5ビットは使用されません。
つまり内蔵タイマー0の割込みアドレスが置かれるジャンプテーブルアドレスはIレジスタとILレジスタによって、メモリ上の任意の位置に置くことができますが、ただしそのアドレスの下位5ビットは00100に決められていることになります。
当プログラムでは、そのジャンプテーブルはプログラムの先頭に近い8004に置いています。
そのため、Iレジスタには80を、そしてILレジスタ(アドレス33H)には00を与えています。
実際の割込みプログラムはアドレス827FHにあります。
8000 C30680 JP START 8003 00 NOP ; 8004 7F82 DW INT;timer0 int address ; 8006 3E80 START:LD A,80 8008 ED47 LD I,A 800A AF XOR A 800B 013300 LD BC,$0033;ILregister 800E ED79 OUT (C),A |