2020年9月30日水曜日

Z8530 SCC

 Z8530 SCCを制御するコードも上げておきます。

先ずは初期化のコードです。送受信の割り込みが処理できるように初期化しています。この石もかなり曲者で初期化手順を間違うとうまく動きません。

発生させる割り込み込みベクタは0x10からで、チャンネルAの送信が0x18で、受信が0x1cになります。

	.equ	SCCAC, 0x0009
	.equ	SCCAD, 0x000D

init_scc:
	ld	r2, #(scccmde - scccmds)	! initialize Z8530
	ld	r3, #SCCAC
	ld	r4, #scccmds
	otirb	@r3, @r4, r2
	ret

scccmds:
	.byte	9, 0xc0		! Reset
	.byte	4, 0x44		! x16, 1stop-bit, non-parity
	.byte	3, 0xe0		! Receive  8bit/char, rts auto         
	.byte	5, 0xe2		! Send 8bit/char, dtr rts

	.byte	2, 0x10		! Interrupt vector
	.byte	1, 0x12		! Interruprt on Rx All character and Tx Int
	.byte	9, 0x09		! MIE, VIS, Status=Low 

	.byte	11, 0x50	! BG use for receiver and transmiter
	.byte	12, 30		! 4800bps at 5MHz clock
	.byte	13, 00
	.byte	14, 0x02	! PCLK for BG
	.byte	14, 0x03	! BG enable

	.byte	3, 0xe1		! Receiver enable
	.byte	5, 0xea		! Transmiter enable

scccmde:

割り込みハンドラーは、次のようなコードです。リングバッファ処理部分は端折ってあります。Z8536と同じで割り込み処理の終了処理を正しく行わないと、優先順位の低い割り込みがかからなくなったりします。

scc_rxint:				! Rx InterruptHandler
	push	@r15, r0
	push	@r15, r1
1:	
	inb	rl0, #SCCAC
	andb	rl0, #0x01
	jr	z, 1b 
	inb	rh0, #SCCAD		! Read a data from Rx buffer
	
    !
	!
    
	ldb	rl0, #0x38		! Enable IUS
	outb	#SCCAC, rl0
	pop	r1, @r15
	pop	r0, @r15
	iret

scc_txint:				! Tx Interrupt Handler
	push	@r15, r0
	push	@r15, r1

	!
    !
    
	outb	#SCCAD, rl0 ! Write a data to Tx buffer
	
	ldb	rl0, #0x28		! Clear Tx interrupt pendinng 
	outb	#SCCAC, rl0
	ldb	rl0, #0x38		! Enable IUS
	outb	#SCCAC, rl0
	
    pop	r1, @r15
	pop	r0, @r15
	iret

0 件のコメント:

コメントを投稿