2020年9月12日土曜日

Z8536 CIO

 Z8536の初期化手順と割込み処理のメモです。カウンタタイマ3で10mS周期の割り込みをかけます。

Z8536にはRESETピンがなく、ハードウェアリセットはRDピンとWRピンを同時にLにすることで行います。今回はハードウェアを手抜きしているので、ソフトウェアでリセットしています。A0, A1ピンをHにしてリードし、つづいて、レジスタ0に1を書き込んだのちレジスタ0に0を書き込みます。これで初期化されます。

レジスタのアクセスは、A0, A1ピンをHにしアクセスするレジスタ番号を書き込み、つづいて目的のレジスタに書き込みか読み込みをします。Z8536を初期化するのにレジスタ設定の順番を変えたりすると、なぜか動かなくなったりします。正しい手順はよく理解できていないのですが、手探りで見つけた手順が下のコードです。


	.equ	CIOPRTC, 0x0011
	.equ	CIOPRTB, 0x0015
	.equ	CIOPRTA, 0x0019
	.equ	CIOCTRL, 0x001d


init_cio:
	ld	r1, #CIOCTRL
	inb	rl0, #CIOCTRL
	lda	r2, ciocmds
	ld	r3, #(ciocmde - ciocmds)
	otirb	@r1, @r2, r3
	ret

ciointr:
	push	@r15, r0	! レジスタ保存
	push	@r15, r1

	! 割り込み処理
	!
	!
	
	ldb	rl0, #0x0c
	outb	#CIOCTRL, rl0
	ldb	rl0, #0x24
	outb	#CIOCTRL, rl0	! Clear IP and IUS
	
	pop	r1, @r15	! レジスタ復帰
	pop	r0, @r15
	iret

!------------------------------------------------------------------------------

ciocmds:
	.byte	0x00, 0x01		! Reset
	.byte	0x00, 0x00		! Clear reset
	.byte	0x01, 0x00		! Reset PortC and C/T3
	.byte	0x01, 0x10		! Enable PortC and C/T3
	.byte	0x1e, 0xc2		! Continuous, Ext Output, Square wave
	.byte	0x1a, 0x30		! Set timer constant
	.byte	0x1b, 0xd4		! Set timer constant
	.byte	0x00, 0x84		! MIE and VIS
	.byte	0x04, 0x00		! Set Interupt vector
	.byte	0x0c, 0xc0		! Set Interupt Enable bit
	.byte	0x0c, 0x06		! Gate and Triger
ciocmde:


割り込み処理は、最後にレジスタ12のIPとIUSをクリアして戻れば、続けて割り込みが発生します。これを忘れると、割り込みが単発になったり、他のチップからの割り込みが発生しなくなります。

Z8530もそうでしたが、Zilogの周辺チップはプログラムが難しい印象です。さらにデータシートが不親切で、読んだだけでは理解できないことが多々あります。ネット上にもあまり情報がないので、手探りがで動かすことになるのですが、動いた時の高揚感は格別です。

0 件のコメント:

コメントを投稿