内蔵タイマーの確認を行ってみました。
内蔵タイマーは2チャンネルありますが、ここでは1チャンネルだけでLED
点滅(といっても 20mSの速さなので^^;点滅って言っていいのか迷うところですね^^)で確認してみます。

タイマー割り込みに関わる設定レジスターは次のようになってます。
1、内部割り込みテーブル
  8つの内部割込み要因を2バイト置きに配置されています
  この2バイトのデータは それぞれの割り込み処理プログラムの
  開始アドレスをセットします。
  たとえば、タイマー割り込みチャンネル0の割り込み処理開始アドレスを
  0x0080としたときは 下記のような設定となります。

   ;Interrupt Vevtor Table
.dw 0x0000 ;INT1
.dw 0x0000 ;INT2
.dw 0x0080 ;PRT(Programmable Reload Timer) Channel 0
.dw 0x0000 ;PRT(Programmable Reload Timer) Channel 1
.dw 0x0000 ;DMA Channel 0
.dw 0x0000 ;CSI/O
.dw 0x0000 ;ASCI Channel 0
.dw 0x0000 ;ASCI Channel 1

2、内部割り込みテーブルの開始アドレス
  内部割り込みテーブルの開始アドレスの設定は、IレジスターとILレジスタ
  で決定されます。
  16ビットのアドレスの上位アドレス8ビットをIレジスターで設定します
  下位8ビットは、上位3ビットをILレジスターの上位3ビットで設定します。
  残り5ビットはテーブルアドレスとなります。
  たとえば、内部割り込みアドレスをを0x0040に設定する場合は
  Iレジスタ = 0x00(デフォルト)
  ILレジスタ= 0x40 

3、タイマー割り込み関連レジスターの設定
 ・タイマーカウンタの初期値設定
  システムクロックを20分周したクロックパルスが来るたびに、レジスタ値
  (タイマデータレジスター)をダウンして、0になったら、割り込みがかかる
  ようになっています。0になったレジスター値は設定用のレジスタ(タイマリ
  ロードレジスタ)から値を読み込み再度カウントダウンします。
  チャンネル0の場合
  タイマデータレジスタ (上位8bit:TMDR0H、下位8bit:TMDR0L)
  タイマリロードレジスタ(上位8bit:RLDR0H、下位8bit:RLDR0L)
 
 ・割り込み開始とカウントダウン開始
  タイマ割り込み許可とタイマカウントダウンの許可は、タイマコントロールレジ
  スタ(TCR)で行います。
  タイマコントロールレジスタ(TCR)
   タイマ割り込み許可 CH0:D4(TIE0)  CH1:D5(TIE1)
   カウントダウン許可 CH0:D0(TDE0)  CH1:D1(TDE1) 

4、タイマ割り込みでのハマりどころ^^;
   タイマー割り込み処理プログラムの中で、次の順番で処理が必要です。
    ・タイマコントロールレジスタの呼び出し
    ・タイマデータレジスタの呼び出し(上位、下位どちらでもよいようです。)
   この処理をしないと、カウント0のフラグが1のままになるようで、常にカウント0での繰り返し割り込みとなってしまいます。

 次のプログラムは、クロック源として16MHz水晶を2倍速で動作させています。
 RTS0端子を 20mSごとにON/OFFさせています。

 1カウント時間=1/(16MHz*2)*20=0.625μS
 カウンター設定値=20000μS÷0.615μS=32000=0x7d00

[asm] ;assemblers ASxxxx and ASlink V5.10
;
; files is :led_t.asm
;$ asz80 -l -s -o led_t.asm
;$ aslink -i led_t
;$ sudo python hexwrite.py led_t.ihx
;

.z180

CNTLA0 .equ 0x00
TMDR0L .equ 0x0c
TMDR0H .equ 0x0d
RLDR0L .equ 0x0e
RLDR0H .equ 0x0f
TCR .equ 0x10
IL .equ 0x33
CMR .equ 0x1e
CCR .equ 0x1f

.area TEST (ABS)

.org 0x0000

jp start

.org 0x0040 ;Interrupt Vevtor Table
.dw 0x0000 ;INT1
.dw 0x0000 ;INT2
.dw 0x0080 ;PRT(Programmable Reload Timer) Channel 0
.dw 0x0000 ;PRT(Programmable Reload Timer) Channel 1
.dw 0x0000 ;DMA Channel 0
.dw 0x0000 ;CSI/O
.dw 0x0000 ;ASCI Channel 0
.dw 0x0000 ;ASCI Channel 1

.org 0x0080 ;PRT Channel 0 Interrput

;Timer 0 Interrput rutin
push af
in0 a,(TCR)
in0 a,(TMDR0L)
in0 a,(CNTLA0) ;RTS0 Toggle output
xor 0b00010000
out0 (CNTLA0),a
pop af
ei
reti

.org 0x0100
start:
ld sp,0x8000
di
in0 a,(CMR) ;XTAL*2
set 7,a
out0 (CMR),a
in0 a,(CCR) ;XTAL/1
set 7,a
out0 (CCR),a

ld a,0x40 ;Interrupt Vevtor Addr B7-B5 set IL reg
out0 (IL),a
ld a,0x7d
out0 (TMDR0H),a ;Timer Data Registers 0 H reg set
ld a,0x00
out0 (TMDR0L),a ;Timer Data Registers 0 L reg set
ld a,0x7d
out0 (RLDR0H),a ;Timer Reload Registers 0 H reg set
ld a,0x00
out0 (RLDR0L),a ;Timer Reload Registers 0 L reg set
ld a,0x11 ;Timer Control Register
out0 (TCR),a ;TIE0(Timer Interrupt Enable) CH0 set
;TDE0(Timer Down Count Enable) CH0 set

ei
loop: nop
nop
nop
nop
jr loop

[/asm]
おすすめの記事